Compare commits

...

3 Commits

Author SHA1 Message Date
Lorenz Hilpert
5bddaa83d5 fix(tabs): correct singleton tabs interaction with new tab areas
- Fix tab name persistence when switching from Sortiment/Wareneingang to Retoure/Remission
- Prevent duplicate tab creation when clicking on new areas
- Ensure correct tab naming for Retoure and Remission areas
- Update side menu navigation to use consistent tab ID generation
- Add processResolverFn for backwards compatibility
- Simplify process bar navigation logic

Refs: #5345
2025-09-17 20:07:33 +02:00
Nino
dd9c60e0c0 Merge branch 'feature/5202-Praemie' into feature/5262-Praemie-Customer-Selection-Styling 2025-09-17 16:42:19 +02:00
Nino
09677e8df8 feat(reward-customer-card): improve styling and user experience
Replace basic HTML elements with proper UI components and apply
consistent design system styling. Update layout spacing and add
proper typography classes for better visual hierarchy.

Changes:
- Replace button with TextButtonComponent for consistent styling
- Add proper typography classes (isa-text-body-1-regular/bold)
- Improve layout spacing and alignment
- Add text color for better contrast
- Add null safety operators for card properties

Ref: #5262
2025-09-17 15:09:51 +02:00
7 changed files with 35 additions and 34 deletions

View File

@@ -35,6 +35,7 @@ import {
tabResolverFn,
TabService,
TabNavigationService,
processResolverFn,
} from '@isa/core/tabs';
import { provideScrollPositionRestoration } from '@isa/utils/scroll-position';
@@ -187,7 +188,7 @@ const routes: Routes = [
{
path: ':tabId',
component: MainComponent,
resolve: { process: tabResolverFn, tab: tabResolverFn },
resolve: { process: processResolverFn, tab: tabResolverFn },
canActivate: [IsAuthenticatedGuard],
children: [
{

View File

@@ -156,26 +156,7 @@ export class ShellProcessBarComponent implements OnInit {
processes = await this.processes$.pipe(delay(1), first()).toPromise();
if (processes.length === 0) {
this._router.navigate(['/kunde', 'dashboard']);
} else {
const lastest = processes.reduce(
(prev, current) =>
prev.activated > current.activated ? prev : current,
processes[0],
);
const crumb = await this._breadcrumb
.getLastActivatedBreadcrumbByKey$(lastest.id)
.pipe(first())
.toPromise();
if (crumb) {
this._router.navigate(coerceArray(crumb.path), {
queryParams: crumb.params,
});
} else {
this._router.navigate(['/kunde', lastest.id, 'product']);
}
}
this._router.navigate(['/kunde', 'dashboard']);
}
}

View File

@@ -111,7 +111,7 @@
*ifRole="'Store'"
class="side-menu-group-item"
(click)="closeSideMenu(); focusSearchBox()"
[routerLink]="['/', tabService.activatedTab()?.id || nextId(), 'return']"
[routerLink]="['/', tabId(), 'return']"
(isActiveChange)="focusSearchBox()"
>
<span class="side-menu-group-item-icon w-[2.375rem] h-12">
@@ -303,7 +303,7 @@
(click)="closeSideMenu(); focusSearchBox()"
[routerLink]="[
'/',
tabService.activatedTab()?.id || nextId(),
tabId(),
'remission',
]"
(isActiveChange)="focusSearchBox(); remissionExpanded.set($event)"

View File

@@ -1,3 +1,3 @@
:host {
@apply h-32 w-full flex flex-row gap-20 rounded-2xl bg-isa-neutral-400 p-6;
@apply h-32 w-full flex flex-row gap-20 rounded-2xl bg-isa-neutral-400 p-6 text-isa-neutral-900;
}

View File

@@ -1,13 +1,25 @@
<div class="flex flex-col gap-2">
<div class="flex flex-col gap-[0.125rem]">
<div class="flex flex-col gap-1">
<span>NAME {{ card().firstName }} - {{ card().lastName }} </span>
<span>{{ card().totalPoints }}</span>
<span class="isa-text-body-1-regular"
>{{ card()?.firstName }} {{ card()?.lastName }}
</span>
<span class="isa-text-body-1-bold"
>{{ card()?.totalPoints ?? 0 }} Lesepunkte</span
>
</div>
<button (click)="resetCustomer()" linkButton>Zurücksetzen</button>
<ui-text-button
class="self-start -ml-[0.6rem]"
type="button"
color="subtle"
size="small"
(click)="resetCustomer()"
>
Zurücksetzen
</ui-text-button>
</div>
<div class="flex flex-col gap-2">
<span>Prämien ausgewählt</span>
<span>0</span>
<span class="isa-text-body-1-regular">Prämien ausgewählt</span>
<span class="isa-text-body-1-bold">0</span>
</div>

View File

@@ -1,12 +1,10 @@
import {
ChangeDetectionStrategy,
Component,
linkedSignal,
inject,
input,
} from '@angular/core';
import { ButtonComponent } from '@isa/ui/buttons';
import { RouterLink } from '@angular/router';
import { TextButtonComponent } from '@isa/ui/buttons';
import { BonusCardInfo, SelectedCustomerFacade } from '@isa/crm/data-access';
import { injectTabId } from '@isa/core/tabs';
@@ -15,7 +13,7 @@ import { injectTabId } from '@isa/core/tabs';
templateUrl: './reward-customer-card.component.html',
styleUrl: './reward-customer-card.component.css',
changeDetection: ChangeDetectionStrategy.OnPush,
imports: [ButtonComponent, RouterLink],
imports: [TextButtonComponent],
})
export class RewardCustomerCardComponent {
tabId = injectTabId();

View File

@@ -26,3 +26,12 @@ export const tabResolverFn: ResolveFn<Tab> = (route) => {
return tab;
};
/// @deprecated use tabResolverFn instead
export const processResolverFn: ResolveFn<Tab> = async (route) => {
const tabService = inject(TabService);
await new Promise((resolve) => setTimeout(resolve, 0));
const id = parseInt(route.params['tabId']);
return tabService.entityMap()[id];
};