feat(platform): sprint 11.5 standardization
Some checks failed
Architecture Governance / architecture (push) Has been cancelled

This commit is contained in:
sdarbinyan
2026-07-09 02:29:12 +04:00
parent a16c856537
commit 8d652c8259
57 changed files with 2162 additions and 848 deletions

View File

@@ -1,5 +1,5 @@
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import { ChangeDetectionStrategy, Component, Input, inject } from '@angular/core';
import { NgComponentOutlet } from '@angular/common';
import { Router } from '@angular/router';
import { Observable } from 'rxjs';
@@ -9,6 +9,7 @@ import { ResolvedWidget } from '../../widgets/contracts/widget-component.contrac
import { WidgetHostService } from '../../dynamic-renderer/widget-host/widget-host.service';
import { LanguageService } from '../../services/language.service';
import { Category } from '../../core/categories/models/category-domain.model';
import { AuthService } from '../../services/auth.service';
@Component({
selector: 'app-dynamic-page-layout',
@@ -34,10 +35,19 @@ import { Category } from '../../core/categories/models/category-domain.model';
[style.--section-align]="section.layout?.align ?? null"
>
@for (widget of section.widgets; track widget.id) {
@if (isWidgetPermitted(widget.source)) {
<div
class="dynamic-widget"
[attr.data-widget-type]="widget.type"
[attr.data-widget-title]="widget.source.title ?? null"
[attr.data-widget-subtitle]="widget.source.subtitle ?? null"
[attr.data-widget-animation]="widget.source.animation?.name ?? null"
[style.--widget-padding]="widget.padding ?? null"
[style.--widget-animation-duration]="widget.source.animation?.duration ?? null"
[style.--widget-animation-delay]="widget.source.animation?.delay ?? null"
[style.--widget-animation-timing]="widget.source.animation?.timingFunction ?? null"
[style.animation-name]="widget.source.animation?.name ?? null"
[ngStyle]="widget.source.style ?? null"
[class.dynamic-widget--desktop-hidden]="widget.visibility?.desktop === false"
[class.dynamic-widget--tablet-hidden]="widget.visibility?.tablet === false"
[class.dynamic-widget--mobile-hidden]="widget.visibility?.mobile === false"
@@ -50,6 +60,7 @@ import { Category } from '../../core/categories/models/category-domain.model';
}
}
</div>
}
}
</div>
</div>
@@ -82,6 +93,9 @@ import { Category } from '../../core/categories/models/category-domain.model';
.dynamic-widget {
padding: var(--widget-padding, 0);
animation-duration: var(--widget-animation-duration, initial);
animation-delay: var(--widget-animation-delay, initial);
animation-timing-function: var(--widget-animation-timing, initial);
}
.dynamic-section[data-section-layout='grid'] .dynamic-section__content {
@@ -116,6 +130,8 @@ import { Category } from '../../core/categories/models/category-domain.model';
export class DynamicPageLayoutComponent {
@Input() model: PageRenderModel | null = null;
private readonly authService = inject(AuthService);
constructor(
private readonly widgetHost: WidgetHostService,
private readonly router: Router,
@@ -129,4 +145,17 @@ export class DynamicPageLayoutComponent {
onCategorySelected(category: Category): void {
this.router.navigate([`/${this.languageService.currentLanguage()}/catalog`, category.id]);
}
isWidgetPermitted(widget: WidgetRenderNode['source']): boolean {
const permissions = widget.permissions;
if (!permissions) {
return true;
}
if (permissions.requireAuthenticated && !this.authService.isAuthenticated()) {
return false;
}
return true;
}
}