diff --git a/src/app/core/state/base-store.ts b/src/app/core/state/base-store.ts index 1c9cc04..e675997 100644 --- a/src/app/core/state/base-store.ts +++ b/src/app/core/state/base-store.ts @@ -197,11 +197,7 @@ export abstract class EntityStore< // @ts-ignore // @TODO: check to familiar with ts this.setState({ - loading: false, - error: null, - entity: null, - initialized: false, - isRefreshing: false, + ...defaultBaseStateData, }); } } diff --git a/src/app/domains/consumer/modules/accounts/store/account.store.ts b/src/app/domains/consumer/modules/accounts/store/account.store.ts index b92b34b..959d67e 100644 --- a/src/app/domains/consumer/modules/accounts/store/account.store.ts +++ b/src/app/domains/consumer/modules/accounts/store/account.store.ts @@ -1,4 +1,4 @@ -import { EntityState, EntityStore } from '@/core/state'; +import { defaultBaseStateData, EntityState, EntityStore } from '@/core/state'; import { computed, inject, Injectable } from '@angular/core'; import { MenuItem } from 'primeng/api'; import { catchError, finalize } from 'rxjs'; @@ -17,11 +17,7 @@ export class AccountStore extends EntityStore { private readonly service = inject(AccountsService); constructor() { super({ - loading: false, - error: null, - entity: null, - initialized: false, - isRefreshing: false, + ...defaultBaseStateData, breadcrumbItems: [], }); } @@ -64,11 +60,7 @@ export class AccountStore extends EntityStore { override reset(): void { this.setState({ - loading: false, - error: null, - entity: null, - initialized: false, - isRefreshing: false, + ...defaultBaseStateData, breadcrumbItems: [], }); } diff --git a/src/app/domains/consumer/modules/businessActivities/store/businessActivity.store.ts b/src/app/domains/consumer/modules/businessActivities/store/businessActivity.store.ts index 8cd8d8f..7836d8e 100644 --- a/src/app/domains/consumer/modules/businessActivities/store/businessActivity.store.ts +++ b/src/app/domains/consumer/modules/businessActivities/store/businessActivity.store.ts @@ -1,4 +1,4 @@ -import { EntityState, EntityStore } from '@/core/state'; +import { defaultBaseStateData, EntityState, EntityStore } from '@/core/state'; import { computed, inject, Injectable } from '@angular/core'; import { MenuItem } from 'primeng/api'; import { catchError, finalize } from 'rxjs'; @@ -20,11 +20,7 @@ export class BusinessActivityStore extends EntityStore< private readonly service = inject(BusinessActivitiesService); constructor() { super({ - loading: false, - error: null, - entity: null, - initialized: false, - isRefreshing: false, + ...defaultBaseStateData, breadcrumbItems: [], }); } @@ -68,11 +64,7 @@ export class BusinessActivityStore extends EntityStore< override reset(): void { this.setState({ - loading: false, - error: null, - entity: null, - initialized: false, - isRefreshing: false, + ...defaultBaseStateData, breadcrumbItems: [], }); } diff --git a/src/app/domains/consumer/modules/businessActivities/store/complex.store.ts b/src/app/domains/consumer/modules/businessActivities/store/complex.store.ts index f7c7649..26da7e8 100644 --- a/src/app/domains/consumer/modules/businessActivities/store/complex.store.ts +++ b/src/app/domains/consumer/modules/businessActivities/store/complex.store.ts @@ -1,4 +1,4 @@ -import { EntityState, EntityStore } from '@/core/state'; +import { defaultBaseStateData, EntityState, EntityStore } from '@/core/state'; import { computed, inject, Injectable } from '@angular/core'; import { MenuItem } from 'primeng/api'; import { catchError, finalize } from 'rxjs'; @@ -17,11 +17,7 @@ export class ConsumerComplexStore extends EntityStore { private readonly service = inject(ConsumerPosesService); constructor() { super({ - loading: false, - error: null, - entity: null, - initialized: false, - isRefreshing: false, + ...defaultBaseStateData, breadcrumbItems: [], }); } @@ -64,11 +60,7 @@ export class PosStore extends EntityStore { override reset(): void { this.setState({ - loading: false, - error: null, - entity: null, - initialized: false, - isRefreshing: false, + ...defaultBaseStateData, breadcrumbItems: [], }); } diff --git a/src/app/domains/consumer/modules/customers/store/customer.store.ts b/src/app/domains/consumer/modules/customers/store/customer.store.ts index 8e224cf..f45839d 100644 --- a/src/app/domains/consumer/modules/customers/store/customer.store.ts +++ b/src/app/domains/consumer/modules/customers/store/customer.store.ts @@ -1,4 +1,4 @@ -import { EntityState, EntityStore } from '@/core/state'; +import { defaultBaseStateData, EntityState, EntityStore } from '@/core/state'; import { computed, inject, Injectable } from '@angular/core'; import { MenuItem } from 'primeng/api'; import { catchError, finalize } from 'rxjs'; @@ -17,11 +17,7 @@ export class ConsumerCustomerStore extends EntityStore {} @@ -16,11 +17,7 @@ export class ConsumerStore extends EntityStore { private readonly service = inject(PartnerComplexesService); constructor() { super({ - loading: false, - error: null, - entity: null, - initialized: false, - isRefreshing: false, + ...defaultBaseStateData, breadcrumbItems: [], }); } @@ -71,11 +67,7 @@ export class ComplexStore extends EntityStore { override reset(): void { this.setState({ - loading: false, - error: null, - entity: null, - initialized: false, - isRefreshing: false, + ...defaultBaseStateData, breadcrumbItems: [], }); } diff --git a/src/app/domains/partner/modules/consumers/store/consumer.store.ts b/src/app/domains/partner/modules/consumers/store/consumer.store.ts index e761fed..7da341a 100644 --- a/src/app/domains/partner/modules/consumers/store/consumer.store.ts +++ b/src/app/domains/partner/modules/consumers/store/consumer.store.ts @@ -1,4 +1,4 @@ -import { EntityState, EntityStore } from '@/core/state'; +import { defaultBaseStateData, EntityState, EntityStore } from '@/core/state'; import { computed, inject, Injectable } from '@angular/core'; import { MenuItem } from 'primeng/api'; import { catchError, finalize } from 'rxjs'; @@ -17,11 +17,7 @@ export class ConsumerStore extends EntityStore { private readonly service = inject(PartnerPosesService); constructor() { super({ - loading: false, - error: null, - entity: null, - initialized: false, - isRefreshing: false, + ...defaultBaseStateData, breadcrumbItems: [], }); } @@ -74,11 +70,7 @@ export class PosStore extends EntityStore { override reset(): void { this.setState({ - loading: false, - error: null, - entity: null, - initialized: false, - isRefreshing: false, + ...defaultBaseStateData, breadcrumbItems: [], }); } diff --git a/src/app/domains/partner/modules/customers/store/customer.store.ts b/src/app/domains/partner/modules/customers/store/customer.store.ts index a903fdb..52e5d10 100644 --- a/src/app/domains/partner/modules/customers/store/customer.store.ts +++ b/src/app/domains/partner/modules/customers/store/customer.store.ts @@ -1,4 +1,4 @@ -import { EntityState, EntityStore } from '@/core/state'; +import { defaultBaseStateData, EntityState, EntityStore } from '@/core/state'; import { computed, inject, Injectable } from '@angular/core'; import { MenuItem } from 'primeng/api'; import { catchError, finalize } from 'rxjs'; @@ -17,11 +17,7 @@ export class PartnerCustomerStore extends EntityStore +
+ + + + + + + diff --git a/src/app/domains/partner/modules/profile/components/form.component.ts b/src/app/domains/partner/modules/profile/components/form.component.ts new file mode 100644 index 0000000..54aaa80 --- /dev/null +++ b/src/app/domains/partner/modules/profile/components/form.component.ts @@ -0,0 +1,65 @@ +import { Maybe } from '@/core'; +import { AbstractFormDialog } from '@/shared/abstractClasses'; +import { CodeComponent, NameComponent, SharedDialogComponent } from '@/shared/components'; +import { FormFooterActionsComponent } from '@/shared/components/formFooterActions/form-footer-actions.component'; +import { onSelectFileArgs } from '@/shared/components/uploadFile/model'; +import { SharedUploadFileComponent } from '@/shared/components/uploadFile/upload-file.component'; +import { fieldControl } from '@/shared/constants'; +import { buildFormData } from '@/utils'; +import { Component, inject, Input, signal } from '@angular/core'; +import { ReactiveFormsModule } from '@angular/forms'; +import { IProfileRequestPayload, IProfileResponse } from '../models'; +import { ProfileService } from '../services/main.service'; + +@Component({ + selector: 'partner-profile-form', + templateUrl: 'form.component.html', + imports: [ + ReactiveFormsModule, + FormFooterActionsComponent, + SharedDialogComponent, + NameComponent, + CodeComponent, + SharedUploadFileComponent, + ], +}) +export class PartnerProfileFormComponent extends AbstractFormDialog< + IProfileRequestPayload, + IProfileResponse +> { + @Input() partnerId?: string; + private service = inject(ProfileService); + + private initForm() { + const formConfig = { + name: fieldControl.name(this.initialValues?.name || ''), + code: fieldControl.code(this.initialValues?.code || ''), + }; + + const form = this.fb.group(formConfig); + + return form; + } + + logo = signal>(null); + + form = this.initForm(); + + changeFile(payload: onSelectFileArgs) { + this.logo.set(payload.file); + } + + override ngOnChanges() { + this.form = this.initForm(); + this.form.patchValue((this.initialValues ?? {}) as Partial>); + if (this.editMode && !this.partnerId) { + throw 'missing some arguments'; + } + } + + override submitForm(payload: IProfileRequestPayload) { + const formData = buildFormData(this.form, { logo: this.logo() }); + + return this.service.updateProfile(formData); + } +} diff --git a/src/app/domains/partner/modules/profile/components/reset-password-card.component.html b/src/app/domains/partner/modules/profile/components/reset-password-card.component.html new file mode 100644 index 0000000..70ce531 --- /dev/null +++ b/src/app/domains/partner/modules/profile/components/reset-password-card.component.html @@ -0,0 +1,11 @@ + +
+ + + +
diff --git a/src/app/domains/partner/modules/profile/components/reset-password-card.component.ts b/src/app/domains/partner/modules/profile/components/reset-password-card.component.ts new file mode 100644 index 0000000..2ac8dd8 --- /dev/null +++ b/src/app/domains/partner/modules/profile/components/reset-password-card.component.ts @@ -0,0 +1,46 @@ +import { ToastService } from '@/core/services/toast.service'; +import { MustMatch } from '@/core/validators'; +import { AppCardComponent, SharedPasswordInputComponent } from '@/shared/components'; +import { fieldControl } from '@/shared/constants'; +import { Component, inject, signal } from '@angular/core'; +import { FormBuilder, ReactiveFormsModule } from '@angular/forms'; +import { ButtonDirective } from 'primeng/button'; +import { finalize } from 'rxjs'; +import { ProfileService } from '../services/main.service'; + +@Component({ + selector: 'partner-reset-password-card', + templateUrl: './reset-password-card.component.html', + imports: [ReactiveFormsModule, AppCardComponent, SharedPasswordInputComponent, ButtonDirective], +}) +export class PartnerResetPasswordCardComponent { + private readonly service = inject(ProfileService); + private readonly fb = inject(FormBuilder); + private readonly toastService = inject(ToastService); + + readonly loading = signal(false); + + form = this.fb.group( + { + password: fieldControl.password(), + confirmPassword: fieldControl.confirmPassword(), + }, + { validators: [MustMatch('password', 'confirmPassword')] }, + ); + + submit() { + if (this.form.invalid) { + this.form.markAllAsTouched(); + return; + } + + this.loading.set(true); + this.service + .resetPassword({ password: this.form.value.password as string }) + .pipe(finalize(() => this.loading.set(false))) + .subscribe(() => { + this.form.reset(); + this.toastService.success({ text: 'گذرواژه با موفقیت به‌روز شد.' }); + }); + } +} diff --git a/src/app/domains/partner/modules/profile/constants/apiRoutes/index.ts b/src/app/domains/partner/modules/profile/constants/apiRoutes/index.ts new file mode 100644 index 0000000..7f359c6 --- /dev/null +++ b/src/app/domains/partner/modules/profile/constants/apiRoutes/index.ts @@ -0,0 +1,7 @@ +const baseUrl = '/api/v1/partner'; + +export const PARTNER_PROFILE_API_ROUTES = { + info: () => `${baseUrl}`, + updateInfo: () => `${baseUrl}`, + resetPassword: () => `${baseUrl}/update-password`, +}; diff --git a/src/app/domains/partner/modules/profile/constants/index.ts b/src/app/domains/partner/modules/profile/constants/index.ts new file mode 100644 index 0000000..ee61bd7 --- /dev/null +++ b/src/app/domains/partner/modules/profile/constants/index.ts @@ -0,0 +1,2 @@ +export * from './apiRoutes'; +export * from './routes'; diff --git a/src/app/domains/partner/modules/profile/constants/routes/index.ts b/src/app/domains/partner/modules/profile/constants/routes/index.ts new file mode 100644 index 0000000..81a54a4 --- /dev/null +++ b/src/app/domains/partner/modules/profile/constants/routes/index.ts @@ -0,0 +1,18 @@ +import { NamedRoutes } from '@/core'; +import { Routes } from '@angular/router'; + +export type TPartnerProfileRouteNames = 'profile'; + +export const partnerProfileNamedRoutes: NamedRoutes = { + profile: { + path: 'profile', + loadComponent: () => + import('../../views/single.component').then((m) => m.PartnerProfileComponent), + meta: { + title: 'پروفایل', + pagePath: () => '/partner/profile', + }, + }, +}; + +export const PARTNER_PROFILE_ROUTES: Routes = [partnerProfileNamedRoutes.profile]; diff --git a/src/app/domains/partner/modules/profile/models/index.ts b/src/app/domains/partner/modules/profile/models/index.ts new file mode 100644 index 0000000..d7b593e --- /dev/null +++ b/src/app/domains/partner/modules/profile/models/index.ts @@ -0,0 +1 @@ +export * from './io.d'; diff --git a/src/app/domains/partner/modules/profile/models/io.d.ts b/src/app/domains/partner/modules/profile/models/io.d.ts new file mode 100644 index 0000000..3ae1790 --- /dev/null +++ b/src/app/domains/partner/modules/profile/models/io.d.ts @@ -0,0 +1,16 @@ +import { IPartnerRawResponse } from '@/domains/partner/models'; + +export interface IProfileResponse extends IPartnerRawResponse {} + +export interface IProfileRequestPayload { + first_name?: string; + last_name?: string; + mobile_number?: string; + national_code?: string; + company_name?: string; + registration_number?: string; +} + +export interface IResetPasswordRequest { + password: string; +} diff --git a/src/app/domains/partner/modules/profile/services/main.service.ts b/src/app/domains/partner/modules/profile/services/main.service.ts new file mode 100644 index 0000000..8ba9203 --- /dev/null +++ b/src/app/domains/partner/modules/profile/services/main.service.ts @@ -0,0 +1,22 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { PARTNER_PROFILE_API_ROUTES } from '../constants'; +import { IProfileResponse, IResetPasswordRequest } from '../models'; + +@Injectable({ providedIn: 'root' }) +export class ProfileService { + constructor(private readonly http: HttpClient) {} + + getInfo(): Observable { + return this.http.get(PARTNER_PROFILE_API_ROUTES.info()); + } + + updateProfile(payload: FormData): Observable { + return this.http.patch(PARTNER_PROFILE_API_ROUTES.updateInfo(), payload); + } + + resetPassword(payload: IResetPasswordRequest): Observable { + return this.http.put(PARTNER_PROFILE_API_ROUTES.resetPassword(), payload); + } +} diff --git a/src/app/domains/partner/modules/profile/views/single.component.html b/src/app/domains/partner/modules/profile/views/single.component.html new file mode 100644 index 0000000..d0f181d --- /dev/null +++ b/src/app/domains/partner/modules/profile/views/single.component.html @@ -0,0 +1,15 @@ +
+ +
+ + + +
+
+ + + + @if (editing()) { + + } +
diff --git a/src/app/domains/partner/modules/profile/views/single.component.ts b/src/app/domains/partner/modules/profile/views/single.component.ts new file mode 100644 index 0000000..44d4e7d --- /dev/null +++ b/src/app/domains/partner/modules/profile/views/single.component.ts @@ -0,0 +1,31 @@ +import { PartnerStore } from '@/domains/partner/store/main.store'; +import { AppCardComponent, KeyValueComponent } from '@/shared/components'; +import { Component, computed, inject, signal } from '@angular/core'; +import { PartnerProfileFormComponent } from '../components/form.component'; +import { PartnerResetPasswordCardComponent } from '../components/reset-password-card.component'; + +@Component({ + selector: 'partner-profile', + templateUrl: './single.component.html', + imports: [ + AppCardComponent, + KeyValueComponent, + PartnerResetPasswordCardComponent, + PartnerProfileFormComponent, + ], +}) +export class PartnerProfileComponent { + private readonly store = inject(PartnerStore); + + readonly profile = computed(() => this.store.entity()); + + editing = signal(false); + + edit() { + this.editing.set(true); + } + + onEditSuccess() { + this.store.getData(); + } +} diff --git a/src/app/domains/partner/routes.ts b/src/app/domains/partner/routes.ts index ac46eb7..ed53d58 100644 --- a/src/app/domains/partner/routes.ts +++ b/src/app/domains/partner/routes.ts @@ -2,6 +2,7 @@ import { Route } from '@angular/router'; import { PARTNER_ACCOUNTS_ROUTES } from './modules/accounts/constants'; import { PARTNER_CONSUMERS_ROUTES } from './modules/consumers/constants'; import { PARTNER_LICENSES_ROUTES } from './modules/licenses/constants'; +import { PARTNER_PROFILE_ROUTES } from './modules/profile/constants'; export const PARTNER_ROUTES = { path: 'partner', @@ -15,5 +16,6 @@ export const PARTNER_ROUTES = { ...PARTNER_ACCOUNTS_ROUTES, ...PARTNER_CONSUMERS_ROUTES, ...PARTNER_LICENSES_ROUTES, + ...PARTNER_PROFILE_ROUTES, ], } as Route; diff --git a/src/app/domains/partner/store/main.store.ts b/src/app/domains/partner/store/main.store.ts index 1f3d736..385b26b 100644 --- a/src/app/domains/partner/store/main.store.ts +++ b/src/app/domains/partner/store/main.store.ts @@ -1,8 +1,9 @@ -import { EntityState, EntityStore } from '@/core/state'; +import { defaultBaseStateData, EntityState, EntityStore } from '@/core/state'; import { LayoutService } from '@/layout/service/layout.service'; import { inject, Injectable } from '@angular/core'; import { catchError, finalize } from 'rxjs'; import { IPartnerResponse } from '../models'; +import { partnerProfileNamedRoutes } from '../modules/profile/constants'; import { PartnerService } from '../services/main.service'; interface PartnerState extends EntityState {} @@ -16,11 +17,7 @@ export class PartnerStore extends EntityStore { constructor() { super({ - loading: false, - error: null, - entity: null, - initialized: false, - isRefreshing: false, + ...defaultBaseStateData, }); } @@ -39,19 +36,17 @@ export class PartnerStore extends EntityStore { ) .subscribe((entity) => { this.layoutService.setPanelInfo({ - title: `پنل مدیریتی ${entity.partner.name}`, + title: `پنل مدیریتی ${entity.name}`, }); + + this.layoutService.setProfilePageRoute(partnerProfileNamedRoutes.profile.meta!.pagePath!()); this.setEntity(entity); }); } override reset(): void { this.setState({ - loading: false, - error: null, - entity: null, - initialized: false, - isRefreshing: false, + ...defaultBaseStateData, }); } } diff --git a/src/app/domains/superAdmin/modules/partners/store/partner.store.ts b/src/app/domains/superAdmin/modules/partners/store/partner.store.ts index 5ecbf8f..58223bf 100644 --- a/src/app/domains/superAdmin/modules/partners/store/partner.store.ts +++ b/src/app/domains/superAdmin/modules/partners/store/partner.store.ts @@ -1,4 +1,4 @@ -import { EntityState, EntityStore } from '@/core/state'; +import { defaultBaseStateData, EntityState, EntityStore } from '@/core/state'; import { inject, Injectable } from '@angular/core'; import { catchError, finalize } from 'rxjs'; import { IPartnerResponse } from '../models'; @@ -13,11 +13,7 @@ export class PartnerStore extends EntityStore { private readonly service = inject(PartnersService); constructor() { super({ - loading: false, - error: null, - entity: null, - initialized: false, - isRefreshing: false, + ...defaultBaseStateData, }); } diff --git a/src/app/domains/superAdmin/modules/users/store/user.store.ts b/src/app/domains/superAdmin/modules/users/store/user.store.ts index 1dbaa34..4e11e54 100644 --- a/src/app/domains/superAdmin/modules/users/store/user.store.ts +++ b/src/app/domains/superAdmin/modules/users/store/user.store.ts @@ -1,4 +1,4 @@ -import { EntityState, EntityStore } from '@/core/state'; +import { defaultBaseStateData, EntityState, EntityStore } from '@/core/state'; import { inject, Injectable } from '@angular/core'; import { catchError, finalize } from 'rxjs'; import { IUserResponse } from '../models'; @@ -13,11 +13,7 @@ export class UserStore extends EntityStore { private readonly service = inject(UsersService); constructor() { super({ - loading: false, - error: null, - entity: null, - initialized: false, - isRefreshing: false, + ...defaultBaseStateData, }); } @@ -38,14 +34,4 @@ export class UserStore extends EntityStore { this.patchState({ entity }); }); } - - override reset(): void { - this.setState({ - loading: false, - error: null, - entity: null, - initialized: false, - isRefreshing: false, - }); - } } diff --git a/src/app/layout/default/app.topbar.component.html b/src/app/layout/default/app.topbar.component.html index d3b0d37..c50c177 100644 --- a/src/app/layout/default/app.topbar.component.html +++ b/src/app/layout/default/app.topbar.component.html @@ -40,7 +40,7 @@
- +
diff --git a/src/app/layout/default/app.topbar.component.ts b/src/app/layout/default/app.topbar.component.ts index 0c40f91..870a8c2 100644 --- a/src/app/layout/default/app.topbar.component.ts +++ b/src/app/layout/default/app.topbar.component.ts @@ -25,7 +25,7 @@ export class AppTopbar { @Input() centerTemplate?: TemplateRef | null = null; @Input() endTemplate?: TemplateRef | null = null; - constructor(public layoutService: LayoutService) {} + readonly layoutService = inject(LayoutService); private authService: AuthService = inject(AuthService); readonly logo = images.logo; @@ -34,20 +34,20 @@ export class AppTopbar { this.layoutService.layoutConfig.update((state) => ({ ...state, darkTheme: !state.darkTheme })); } - username = computed(() => this.authService.currentAccount()?.username || 'کاربر ناشناس'); - panelTitle = computed( - () => this.layoutService.panelInfo()?.title || 'پنل مدیریت صورت‌حساب‌های مالیاتی', - ); + readonly username = computed(() => this.authService.currentAccount()?.username || 'کاربر ناشناس'); + readonly profilePageRoute = computed(() => this.layoutService.profilePageRoute()); + readonly panelTitle = computed(() => this.layoutService.panelInfo()?.title); - logout = () => { + readonly logout = () => { this.authService.logout(); }; - profileMenuItems: MenuItem[] = [ + profileMenuItems = computed(() => [ { label: this.username(), icon: 'pi pi-user', - disabled: true, + disabled: !this.profilePageRoute(), + routerLink: this.profilePageRoute(), }, { label: 'راهنمای سامانه', @@ -59,5 +59,5 @@ export class AppTopbar { icon: 'pi pi-sign-out', command: this.logout, }, - ]; + ]); } diff --git a/src/app/layout/service/layout.service.ts b/src/app/layout/service/layout.service.ts index d659ae5..8cbe32c 100644 --- a/src/app/layout/service/layout.service.ts +++ b/src/app/layout/service/layout.service.ts @@ -23,6 +23,7 @@ interface LayoutState { menuHoverActive?: boolean; isFixedContentSize?: boolean; isFullPage?: boolean; + profilePageRoute?: string; } interface MenuChangeEvent { @@ -51,6 +52,7 @@ export class LayoutService { menuHoverActive: false, isFixedContentSize: true, isFullPage: false, + profilePageRoute: '', }; layoutConfig = signal(this._config); @@ -68,7 +70,7 @@ export class LayoutService { public menuItems = signal([]); public panelInfo = signal({ - title: 'پنل مدیریت صورت‌حساب‌های مالیاتی', + title: '', }); menuSource$ = this.menuSource.asObservable(); @@ -95,6 +97,7 @@ export class LayoutService { isFixedContentSize = computed(() => this.layoutState().isFixedContentSize); isFullPage = computed(() => this.layoutState().isFullPage); + profilePageRoute = computed(() => this.layoutState().profilePageRoute || ''); transitionComplete = signal(false); @@ -264,4 +267,10 @@ export class LayoutService { setTopbarEndSlot(tpl: TemplateRef | null) { this.topbarEndSlot.next(tpl); } + setProfilePageRoute(route: string) { + this.layoutState.update((prev) => ({ + ...prev, + profilePageRoute: route, + })); + } } diff --git a/src/app/shared/components/key-value.component/key-value.component.html b/src/app/shared/components/key-value.component/key-value.component.html index 017ec2b..aad9ec2 100644 --- a/src/app/shared/components/key-value.component/key-value.component.html +++ b/src/app/shared/components/key-value.component/key-value.component.html @@ -10,7 +10,13 @@ }" > - @if (valueType() === "tag") { + @if (type === "thumbnail") { +
+ @if (valueToShow()) { + + } +
+ } @else if (valueType() === "tag") { } @else { {{ valueToShow() }}