@smartsoft001-mobilems/articles-shell-angular 2.109.0 → 2.111.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -612,8 +612,8 @@ class ArticleDetailsBaseComponent extends ArticlesItemComponent {
|
|
|
612
612
|
this.fileUrlService = inject(FileUrlService);
|
|
613
613
|
this.museumSeoService = inject(MuseumSeoService);
|
|
614
614
|
this.articlesService = inject(ArticlesService);
|
|
615
|
-
this.
|
|
616
|
-
this.
|
|
615
|
+
this.detailsParentTitle = inject(PARENT_TITLE_TOKEN);
|
|
616
|
+
this.detailsPlatformId = inject(PLATFORM_ID);
|
|
617
617
|
/** Translation key of the site name in the SEO title. */
|
|
618
618
|
this.siteNameKey = 'MODEL.mainTitle';
|
|
619
619
|
this.article = computed(() => this.item(), /* @ts-ignore */
|
|
@@ -640,14 +640,14 @@ class ArticleDetailsBaseComponent extends ArticlesItemComponent {
|
|
|
640
640
|
/** Rounded `estimatedReadingTime` in minutes, `0` when unknown. */
|
|
641
641
|
this.readingMinutes = computed(() => Math.round(Number(this.article()?.estimatedReadingTime) || 0), /* @ts-ignore */
|
|
642
642
|
...(ngDevMode ? [{ debugName: "readingMinutes" }] : /* istanbul ignore next */ []));
|
|
643
|
-
this.museumSeoService.applyForSsr(() => this.
|
|
643
|
+
this.museumSeoService.applyForSsr(() => this.detailsFetchSsrSeo());
|
|
644
644
|
effect(() => {
|
|
645
645
|
const item = this.item();
|
|
646
646
|
if (!item)
|
|
647
647
|
return;
|
|
648
|
-
this.
|
|
648
|
+
this.detailsParentTitle.set(this.altTitle());
|
|
649
649
|
this.museumSeoService.apply(this.buildSeoMetadata(item));
|
|
650
|
-
if (isPlatformBrowser(this.
|
|
650
|
+
if (isPlatformBrowser(this.detailsPlatformId)) {
|
|
651
651
|
window.scrollTo({ top: 0, behavior: 'instant' });
|
|
652
652
|
void this.articlesService.logVisit(item.id).catch(() => undefined);
|
|
653
653
|
}
|
|
@@ -666,7 +666,7 @@ class ArticleDetailsBaseComponent extends ArticlesItemComponent {
|
|
|
666
666
|
type: 'article',
|
|
667
667
|
};
|
|
668
668
|
}
|
|
669
|
-
async
|
|
669
|
+
async detailsFetchSsrSeo() {
|
|
670
670
|
const id = this.route.snapshot.paramMap.get('id');
|
|
671
671
|
if (!id)
|
|
672
672
|
return null;
|
|
@@ -736,11 +736,11 @@ class ArticlesCatalogBaseComponent extends ArticlesListComponent {
|
|
|
736
736
|
super();
|
|
737
737
|
this.ListMode = ListMode;
|
|
738
738
|
this.translateService = inject(TranslateService);
|
|
739
|
-
this.
|
|
740
|
-
this.
|
|
741
|
-
this.
|
|
742
|
-
...(ngDevMode ? [{ debugName: "
|
|
743
|
-
this.
|
|
739
|
+
this.catalogSeoService = inject(MuseumSeoService);
|
|
740
|
+
this.catalogPlatformId = inject(PLATFORM_ID);
|
|
741
|
+
this.catalogListContainer = viewChild('listContainer', /* @ts-ignore */
|
|
742
|
+
...(ngDevMode ? [{ debugName: "catalogListContainer" }] : /* istanbul ignore next */ []));
|
|
743
|
+
this.catalogScrollAfterLoad = false;
|
|
744
744
|
const { seo, ...catalogOptions } = options;
|
|
745
745
|
this.catalog = createCatalog({ ...catalogOptions, facade: this.facade });
|
|
746
746
|
// After a page change from the bottom pagination scroll to the list top
|
|
@@ -748,10 +748,10 @@ class ArticlesCatalogBaseComponent extends ArticlesListComponent {
|
|
|
748
748
|
effect(() => {
|
|
749
749
|
const loading = this.catalog.isLoading();
|
|
750
750
|
if (!loading &&
|
|
751
|
-
this.
|
|
752
|
-
isPlatformBrowser(this.
|
|
753
|
-
this.
|
|
754
|
-
setTimeout(() => this.
|
|
751
|
+
this.catalogScrollAfterLoad &&
|
|
752
|
+
isPlatformBrowser(this.catalogPlatformId)) {
|
|
753
|
+
this.catalogScrollAfterLoad = false;
|
|
754
|
+
setTimeout(() => this.catalogListContainer()?.nativeElement.scrollIntoView({
|
|
755
755
|
behavior: 'smooth',
|
|
756
756
|
block: 'start',
|
|
757
757
|
}));
|
|
@@ -762,7 +762,7 @@ class ArticlesCatalogBaseComponent extends ArticlesListComponent {
|
|
|
762
762
|
}
|
|
763
763
|
/** The list root element (`#listContainer`), e.g. to move focus. */
|
|
764
764
|
get listContainerElement() {
|
|
765
|
-
return this.
|
|
765
|
+
return this.catalogListContainer()?.nativeElement;
|
|
766
766
|
}
|
|
767
767
|
onSortChange(sort) {
|
|
768
768
|
this.catalog.setSort(sort);
|
|
@@ -778,7 +778,7 @@ class ArticlesCatalogBaseComponent extends ArticlesListComponent {
|
|
|
778
778
|
this.catalog.setPage(page);
|
|
779
779
|
}
|
|
780
780
|
bottomPageChange(page) {
|
|
781
|
-
this.
|
|
781
|
+
this.catalogScrollAfterLoad = true;
|
|
782
782
|
this.pageChange(page);
|
|
783
783
|
}
|
|
784
784
|
onListModeChange(mode) {
|
|
@@ -801,7 +801,7 @@ class ArticlesCatalogBaseComponent extends ArticlesListComponent {
|
|
|
801
801
|
if (this.catalog.searchEnabled())
|
|
802
802
|
return;
|
|
803
803
|
const t = (key) => capitalize(this.translateService.instant(key));
|
|
804
|
-
this.
|
|
804
|
+
this.catalogSeoService.apply({
|
|
805
805
|
title: `${t(seo.titleKey)} - ${t(seo.siteNameKey ?? 'MODEL.mainTitle')}`,
|
|
806
806
|
description: t(seo.descriptionKey),
|
|
807
807
|
type: 'website',
|
|
@@ -809,11 +809,11 @@ class ArticlesCatalogBaseComponent extends ArticlesListComponent {
|
|
|
809
809
|
});
|
|
810
810
|
}
|
|
811
811
|
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: ArticlesCatalogBaseComponent, deps: "invalid", target: i0.ɵɵFactoryTarget.Directive }); }
|
|
812
|
-
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "22.1.3", type: ArticlesCatalogBaseComponent, isStandalone: true, viewQueries: [{ propertyName: "
|
|
812
|
+
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "22.1.3", type: ArticlesCatalogBaseComponent, isStandalone: true, viewQueries: [{ propertyName: "catalogListContainer", first: true, predicate: ["listContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0 }); }
|
|
813
813
|
}
|
|
814
814
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.3", ngImport: i0, type: ArticlesCatalogBaseComponent, decorators: [{
|
|
815
815
|
type: Directive
|
|
816
|
-
}], ctorParameters: () => [{ type: undefined }], propDecorators: {
|
|
816
|
+
}], ctorParameters: () => [{ type: undefined }], propDecorators: { catalogListContainer: [{ type: i0.ViewChild, args: ['listContainer', { isSignal: true }] }] } });
|
|
817
817
|
|
|
818
818
|
/**
|
|
819
819
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"smartsoft001-mobilems-articles-shell-angular.mjs","sources":["../../../../../../packages/articles/shell/angular/src/lib/services/articles/articles.service.ts","../../../../../../packages/articles/shell/angular/src/lib/+state/articles.facade.ts","../../../../../../packages/articles/shell/angular/src/lib/+state/articles.reducer.ts","../../../../../../packages/articles/shell/angular/src/lib/components/list/list.component.ts","../../../../../../packages/articles/shell/angular/src/lib/components/list/list.component.html","../../../../../../packages/articles/shell/angular/src/lib/components/filters/filters.component.ts","../../../../../../packages/articles/shell/angular/src/lib/components/filters/filters.component.html","../../../../../../packages/articles/shell/angular/src/lib/components/components.module.ts","../../../../../../packages/articles/shell/angular/src/lib/services/index.ts","../../../../../../packages/articles/shell/angular/src/lib/articles.module.ts","../../../../../../packages/articles/shell/angular/src/lib/articles-shared.module.ts","../../../../../../packages/articles/shell/angular/src/lib/+state/articles.selectors.ts","../../../../../../packages/articles/shell/angular/src/lib/pages/list/list.component.ts","../../../../../../packages/articles/shell/angular/src/lib/pages/item/item.component.ts","../../../../../../packages/articles/shell/angular/src/lib/pages/preview/preview.component.ts","../../../../../../packages/articles/shell/angular/src/lib/tools/article-tags.ts","../../../../../../packages/articles/shell/angular/src/lib/catalog/article-card-base.component.ts","../../../../../../packages/articles/shell/angular/src/lib/catalog/article-cycle-tags.ts","../../../../../../packages/articles/shell/angular/src/lib/catalog/article-details-base.component.ts","../../../../../../packages/articles/shell/angular/src/lib/catalog/articles-catalog-base.component.ts","../../../../../../packages/articles/shell/angular/src/smartsoft001-mobilems-articles-shell-angular.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { catchError, firstValueFrom, map, Observable, of } from 'rxjs';\n\nimport { CrudBaseService } from '@smartsoft001-mobilems/angular';\nimport { Article } from '@smartsoft001-mobilems/articles-domain';\n\n/** Cards of `GET article/:id/related`, grouped as the API returns them. */\nexport interface IArticleRelated<\n O extends IArticleRelatedCard = IArticleRelatedCard,\n C extends IArticleRelatedCard = IArticleRelatedCard,\n A extends IArticleRelatedCard = IArticleRelatedCard,\n> {\n objects: O[];\n collections: C[];\n articles: A[];\n}\n\n/** The fields the related module relies on; the API sends full list cards. */\nexport interface IArticleRelatedCard {\n id?: string | number | null;\n image?: unknown;\n}\n\n/**\n * Cards with an image first (order within each group kept), so grey\n * placeholders do not open the module when the API has cards with images.\n */\nexport function withImagesFirst<T extends { image?: unknown }>(\n cards: readonly T[],\n): T[] {\n return [\n ...cards.filter((card) => !!card?.image),\n ...cards.filter((card) => !card?.image),\n ];\n}\n\n@Injectable()\nexport class ArticlesService extends CrudBaseService<Article> {\n getUrlNameForDetails(): string {\n return 'article';\n }\n\n getUrlNameForList(): string {\n return 'Article';\n }\n\n /** `POST api/article/:id/visit` — the visit counter of the details page. */\n logVisit(id: string | number): Promise<void> {\n return firstValueFrom(\n this.http.post<void>(`${this.config.apiUrl}api/article/${id}/visit`, {}),\n );\n }\n\n /**\n * `GET article/:id/related` — objects, collections and other articles with\n * images first, without the article itself. No data or an API error give\n * empty groups, so the details page works without the module.\n */\n getRelated<\n O extends IArticleRelatedCard = IArticleRelatedCard,\n C extends IArticleRelatedCard = IArticleRelatedCard,\n A extends IArticleRelatedCard = IArticleRelatedCard,\n >(id: string | number): Observable<IArticleRelated<O, C, A>> {\n return this.http\n .get<{\n data?: {\n objects?: O[] | null;\n collections?: C[] | null;\n articles?: A[] | null;\n } | null;\n }>(`${this.config.apiUrl}article/${id}/related`)\n .pipe(\n map((response) => ({\n objects: withImagesFirst(response?.data?.objects ?? []),\n collections: withImagesFirst(response?.data?.collections ?? []),\n articles: withImagesFirst(\n (response?.data?.articles ?? []).filter(\n (article) => String(article?.id) !== String(id),\n ),\n ),\n })),\n catchError(() => of({ objects: [], collections: [], articles: [] })),\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { CrudFacade } from '@smartsoft001/crud-shell-angular';\n\nimport { Article } from '@smartsoft001-mobilems/articles-domain';\n\nimport { ArticlesService } from '../services/articles/articles.service';\n\n@Injectable()\nexport class ArticlesFacade extends CrudFacade<Article> {\n protected service = inject(ArticlesService);\n\n async downloadPdf(item: { title: string; id: string }): Promise<void> {\n await this.service.downloadPdf(item.title, item.id);\n }\n}\n","import { Action } from '@ngrx/store';\nimport {\n State as SmartState,\n initialState as smartInitialState,\n getReducer as smartGetReducer,\n} from '@smartsoft001/crud-shell-angular';\n\nimport { Article } from '@smartsoft001-mobilems/articles-domain';\n\n// import {ArticlesFacade} from \"./articles.facade\";\n\nexport type State = SmartState<Article>;\n\nexport const initialState = {\n ...smartInitialState,\n};\n\nconst articlesReducer = (state = initialState, action: any) => {\n switch (action.type) {\n //case ArticlesFacade.name + ' test':\n // return {\n // ...state,\n // loaded: false,\n // }\n\n default:\n return smartGetReducer('articles')(state, action);\n }\n};\n\nexport function getReducer() {\n return (state: any, action: Action) => {\n return articlesReducer(state, action);\n };\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n TemplateRef,\n contentChild,\n inject,\n ChangeDetectionStrategy,\n} from '@angular/core';\n\nimport { ArticlesFacade } from '../../+state/articles.facade';\n\n@Component({\n selector: 'smart-mobilems-articles-list',\n templateUrl: './list.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [NgTemplateOutlet],\n})\nexport class ListComponent {\n private facade = inject(ArticlesFacade);\n\n list = this.facade.list;\n loading = this.facade.loading;\n\n itemTpl = contentChild<TemplateRef<any>>('itemTpl');\n loadingTpl = contentChild<TemplateRef<any>>('loadingTpl');\n}\n","@if (list(); as listData) {\n @if (listData && itemTpl()) {\n @for (item of listData; track item) {\n <ng-container\n *ngTemplateOutlet=\"itemTpl(); context: { $implicit: item }\"\n ></ng-container>\n }\n }\n}\n\n@if (loading()) {\n @if (loadingTpl()) {\n <ng-container *ngTemplateOutlet=\"loadingTpl()\"></ng-container>\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, ChangeDetectionStrategy } from '@angular/core';\n\nimport { FiltersBaseComponent } from '@smartsoft001-mobilems/angular';\nimport { Article } from '@smartsoft001-mobilems/articles-domain';\n\n@Component({\n selector: 'smart-mobilems-articles-filters',\n templateUrl: './filters.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [NgTemplateOutlet],\n})\nexport class FiltersComponent extends FiltersBaseComponent<Article> {}\n","<ng-container\n *ngTemplateOutlet=\"contentTpl(); context: { $implicit: context }\"\n></ng-container>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { FiltersComponent } from './filters/filters.component';\nimport { ListComponent } from './list/list.component';\n\nconst COMPONENTS = [FiltersComponent, ListComponent];\n\n@NgModule({\n imports: [CommonModule, COMPONENTS],\n exports: [...COMPONENTS],\n})\nexport class ComponentsModule {}\n","import { CrudService } from '@smartsoft001/crud-shell-angular';\n\nimport { ArticlesService } from './articles/articles.service';\n\nexport * from './articles/articles.service';\n\nexport const SERVICES = [\n ArticlesService,\n {\n provide: CrudService,\n useClass: ArticlesService,\n },\n];\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { FILE_SERVICE_CONFIG, IFileServiceConfig } from '@smartsoft001/angular';\nimport {\n CrudConfig,\n CrudFullConfig,\n CrudFullModule,\n ICrudModuleOptionsWithoutRoutng,\n} from '@smartsoft001/crud-shell-angular';\nimport { IEntity } from '@smartsoft001/domain-core';\n\nimport { SharedConfig } from '@smartsoft001-mobilems/angular';\nimport { SharedModule } from '@smartsoft001-mobilems/angular';\n\nimport { ArticlesFacade } from './+state/articles.facade';\nimport { getReducer } from './+state/articles.reducer';\nimport { ComponentsModule } from './components';\nimport { SERVICES } from './services';\n\n@NgModule({\n declarations: [],\n providers: [...SERVICES, ArticlesFacade],\n imports: [SharedModule, ComponentsModule, CrudFullModule],\n exports: [ComponentsModule],\n})\nexport class ArticlesModule {\n static forFeature<T extends IEntity<string>>(\n options: ICrudModuleOptionsWithoutRoutng<T>,\n ): ModuleWithProviders<ArticlesModule> {\n if (!options.config.reducerFactory)\n options.config.reducerFactory = getReducer;\n return {\n ngModule: ArticlesModule,\n providers: [\n {\n provide: SharedConfig,\n useValue: { apiUrl: options.config.apiUrl } as SharedConfig,\n },\n { provide: CrudConfig, useValue: options.config },\n { provide: CrudFullConfig, useValue: options.config },\n {\n provide: FILE_SERVICE_CONFIG,\n useValue: { apiUrl: options.config.apiUrl } as IFileServiceConfig,\n },\n ],\n };\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { FILE_SERVICE_CONFIG, IFileServiceConfig } from '@smartsoft001/angular';\nimport {\n CrudConfig,\n CrudFullConfig,\n CrudModule,\n ICrudModuleOptionsWithoutRoutng,\n} from '@smartsoft001/crud-shell-angular';\nimport { IEntity } from '@smartsoft001/domain-core';\n\nimport { SharedConfig } from '@smartsoft001-mobilems/angular';\nimport { SharedModule } from '@smartsoft001-mobilems/angular';\n\nimport { ArticlesFacade } from './+state/articles.facade';\nimport { getReducer } from './+state/articles.reducer';\nimport { ComponentsModule } from './components';\nimport { SERVICES } from './services';\n\n@NgModule({\n declarations: [],\n providers: [...SERVICES, ArticlesFacade],\n imports: [SharedModule, ComponentsModule, CrudModule],\n exports: [ComponentsModule],\n})\nexport class ArticlesSharedModule {\n static forFeature<T extends IEntity<string>>(\n options: ICrudModuleOptionsWithoutRoutng<T>,\n ): ModuleWithProviders<ArticlesSharedModule> {\n if (!options.config.reducerFactory)\n options.config.reducerFactory = getReducer;\n return {\n ngModule: ArticlesSharedModule,\n providers: [\n {\n provide: SharedConfig,\n useValue: { apiUrl: options.config.apiUrl } as SharedConfig,\n },\n { provide: CrudConfig, useValue: options.config },\n { provide: CrudFullConfig, useValue: options.config },\n {\n provide: FILE_SERVICE_CONFIG,\n useValue: { apiUrl: options.config.apiUrl } as IFileServiceConfig,\n },\n ],\n };\n }\n}\n","import {\n createFeatureSelector,\n //createSelector\n} from '@ngrx/store';\n\nimport { State } from './articles.reducer';\n\nexport const getArticlesState = createFeatureSelector<State>('articles');\n\n//export const getArticlesTest = createSelector(\n// getArticlesState,\n// (state) => state.test\n//);\n","import { inject, Directive, Signal } from '@angular/core';\nimport { CrudListPageBaseComponent } from '@smartsoft001/crud-shell-angular';\n\nimport { Article } from '@smartsoft001-mobilems/articles-domain';\n\nimport { ArticlesFacade } from '../../+state';\n\n@Directive()\nexport abstract class ArticlesListComponent extends CrudListPageBaseComponent<Article> {\n protected readonly facade = inject(ArticlesFacade);\n\n list = this.facade.list as Signal<Article[]>;\n loading = this.facade.loading;\n filter = this.facade.filter;\n}\n","import { Directive, effect, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute } from '@angular/router';\nimport { CrudItemPageBaseComponent } from '@smartsoft001/crud-shell-angular';\n\nimport { SeoService, TranslationService } from '@smartsoft001-mobilems/angular';\nimport { Article } from '@smartsoft001-mobilems/articles-domain';\n\nimport { ArticlesFacade } from '../../+state';\n\n@Directive()\nexport abstract class ArticlesItemComponent extends CrudItemPageBaseComponent<Article> {\n protected readonly route = inject(ActivatedRoute);\n protected readonly seoService = inject(SeoService);\n protected readonly translationService = inject(TranslationService);\n protected readonly params = toSignal(this.route.params);\n\n override facade = inject(ArticlesFacade);\n\n readonly loading = this.facade.loading;\n readonly item = this.facade.selected;\n\n protected constructor() {\n super();\n\n effect(() => {\n const params = this.params();\n\n const id = params['id'];\n if (id) {\n this.facade.select(id);\n }\n });\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { HttpClient } from '@angular/common/http';\nimport {\n computed,\n Directive,\n effect,\n inject,\n PLATFORM_ID,\n signal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { catchError, map, of } from 'rxjs';\n\nimport { Article } from '@smartsoft001-mobilems/articles-domain';\nimport { ArticleWidget } from '@smartsoft001-mobilems/models';\n\n/** Query params the CMS appends when it opens `/article-preview`. */\nexport interface ArticlePreviewQueryParams {\n apiHost?: string;\n dataUrl?: string;\n pathUrl?: string;\n pageUrl?: string;\n mediaUrl?: string;\n templateName?: string;\n viewType?: string;\n}\n\n/**\n * CMS preview of an unpublished article.\n *\n * The CMS opens `/article-preview?dataUrl=...` in the editor's browser and the\n * page fetches `dataUrl` with the CMS session cookie, so the route must be\n * rendered on the client (`RenderMode.Client`). A `viewType=thematic-path`\n * preview is forwarded to `thematicPathRoute`. Subclass with the app's own\n * template; the subclass owns only the view.\n */\n@Directive()\nexport abstract class ArticlesPreviewComponent {\n protected readonly http = inject(HttpClient);\n protected readonly route = inject(ActivatedRoute);\n protected readonly router = inject(Router);\n protected readonly platformId = inject(PLATFORM_ID);\n protected readonly queryParams = toSignal(this.route.queryParams);\n\n /** Route a `thematic-path` preview is forwarded to; override per app. */\n protected readonly thematicPathRoute: string = '/sciezki-tematyczne';\n\n readonly loading = signal(true);\n readonly noQueryParams = signal(false);\n readonly noLogin = signal(false);\n readonly item = signal<Article | null>(null);\n\n readonly plainTitle = computed(() =>\n (this.item()?.title ?? '').replace(/<[^>]*>/g, ''),\n );\n\n readonly widgets = computed<ArticleWidget[]>(() => {\n const widgets = this.item()?.bottomWidgets;\n if (!widgets) return [];\n\n return [...widgets].sort((a, b) => a.position - b.position);\n });\n\n readonly authorsText = computed(\n () =>\n this.item()\n ?.authors?.map((author) => author.name)\n .filter(Boolean)\n .join(', ') ?? '',\n );\n\n protected constructor() {\n effect(() => {\n const params = (this.queryParams() ?? {}) as ArticlePreviewQueryParams;\n\n if (params.viewType === 'thematic-path' && params.pathUrl) {\n this.forwardThematicPath(params);\n return;\n }\n\n if (params.dataUrl) {\n this.fetchArticle(params.dataUrl);\n } else {\n this.noQueryParams.set(true);\n this.loading.set(false);\n }\n });\n\n effect(() => {\n if (this.item() && isPlatformBrowser(this.platformId)) {\n window.scrollTo({ top: 0, behavior: 'instant' });\n }\n });\n }\n\n private forwardThematicPath(params: ArticlePreviewQueryParams): void {\n const id = params.pathUrl?.split('/').pop();\n this.router.navigate([this.thematicPathRoute, id], {\n queryParams: {\n pathUrl: params.pathUrl,\n pageUrl: params.pageUrl,\n mediaUrl: params.mediaUrl,\n },\n });\n }\n\n private fetchArticle(dataUrl: string): void {\n this.loading.set(true);\n this.noLogin.set(false);\n\n this.http\n .get<{ data?: Article | null }>(dataUrl, { withCredentials: true })\n .pipe(\n map((response) => response?.data ?? null),\n catchError((error) => {\n console.error('Error fetching preview data:', error);\n this.noLogin.set(true);\n return of(null);\n }),\n )\n .subscribe((article) => {\n this.item.set(article);\n this.loading.set(false);\n });\n }\n}\n","import {\n IDictionaryEntry,\n normalizeCycleId,\n} from '@smartsoft001-mobilems/angular';\n\n/** Cykl artykułu (`cycles[]` z API) — tag tematyczny listy „Niezwykłe Historie”. */\nexport interface IArticleCycleTag {\n id: number;\n name: string;\n}\n\n/**\n * Cykle artykułu z pominięciem pustych wpisów, z id znormalizowanym do\n * liczby. `cycles: null` (albo brak pola) daje pustą tablicę, więc szablon\n * nie renderuje wtedy wiersza tagów (MOB-1605).\n */\nexport function articleCycleTags(\n item: { cycles?: unknown } | null | undefined,\n): IArticleCycleTag[] {\n const cycles = item?.cycles;\n if (!Array.isArray(cycles)) return [];\n\n return cycles.flatMap((cycle: { id?: unknown; name?: unknown } | null) => {\n const id = normalizeCycleId(cycle?.id);\n const name = typeof cycle?.name === 'string' ? cycle.name.trim() : '';\n return id === null || !name ? [] : [{ id, name }];\n });\n}\n\n/**\n * `queryParams` linku tagu — lista artykułów zawężona do cyklu, w formacie\n * `?filter=` czytanym przez listę (`filter[cycles][]=<id>` w API).\n */\nexport function cycleFilterQueryParams(tag: IArticleCycleTag): {\n filter: string;\n} {\n return {\n filter: JSON.stringify([\n { name: 'cycles', data: [{ id: tag.id, value: tag.name }] },\n ]),\n };\n}\n\n/** Źródło pastylki karty: cykl (reguła projektu) albo słowo kluczowe. */\nexport type ArticleCardTagSource = 'cycles' | 'keywords';\n\n/** Pastylka karty artykułu z polem filtra, do którego prowadzi jej link. */\nexport interface IArticleCardTag extends IArticleCycleTag {\n source: ArticleCardTagSource;\n}\n\n/**\n * Pastylki karty artykułu: wyłącznie `cycles[]` („Opis pól”, MOB-1823 —\n * „cycles: name, kolejne w pastylkach”). Zapas `keywords[]` z MOB-1604\n * zniknął: dokument go nie przewiduje, a reguła „`null`/puste → nie\n * pokazujemy całej kategorii” chowa wiersz tagów, gdy artykuł nie ma cykli.\n */\nexport function articleCardTags(\n item: { cycles?: unknown } | null | undefined,\n): IArticleCardTag[] {\n return articleCycleTags(item).map((tag) => ({ ...tag, source: 'cycles' }));\n}\n\n/**\n * `queryParams` linku pastylki — lista zawężona do cyklu\n * (`filter[cycles][]=<id>`) albo słowa kluczowego (`filter[keywords][]=<id>`).\n */\nexport function cardTagFilterQueryParams(tag: IArticleCardTag): {\n filter: string;\n} {\n return {\n filter: JSON.stringify([\n { name: tag.source, data: [{ id: tag.id, value: tag.name }] },\n ]),\n };\n}\n\n/** Pastylki karty po dopasowaniu do miejsca: widoczne i liczba pominiętych. */\nexport interface IFittedCardTags {\n visible: IArticleCardTag[];\n hidden: number;\n}\n\n/** Odstęp między pastylkami (`gap-2`). */\nconst TAG_GAP = 8;\n/** Padding 12 + 12 i obrys 1 + 1 pastylki (`smart-px-3 smart-border`). */\nconst TAG_CHROME = 26;\n/** Etykieta przycina się na 18rem (`smart-max-w-[18rem]`). */\nconst TAG_MAX_LABEL = 288;\n\n/**\n * Zachowawcza szerokość etykiety Open Sans 14 / tracking 0,5 px. Pomiar\n * w Chromium 2026-10-06: 7,2–8,1 px na znak dla zwykłych słów, 13,4 dla „W”\n * — wolimy przeszacować (pastylka spadnie do „+N”) niż wyjść poza blok.\n */\nexport function estimateTagWidth(label: string): number {\n let width = 0;\n for (const char of label) {\n if (char === ' ') width += 4.5;\n else if ('WMwm'.includes(char)) width += 13.5;\n else if (char !== char.toLowerCase()) width += 11;\n else if ('iljtfr.,:;!|'.includes(char)) width += 5;\n else if (/[\\d+#&%]/.test(char)) width += 9;\n else width += 8.2;\n }\n return TAG_CHROME + Math.min(TAG_MAX_LABEL, Math.ceil(width));\n}\n\n/**\n * Ile pastylek zmieści się w `maxRows` wierszach o szerokości `rowWidth`\n * (MOB-1604, recenzja): liczone PRZED renderem, więc w DOM nie ma linków\n * ukrytych przez `overflow` (fokus nie trafia w niewidoczne elementy).\n * Nadmiar zastępuje pastylka „+N” — jej szerokość jest rezerwowana\n * w ostatnim wierszu.\n */\nexport function fitCardTags(\n tags: IArticleCardTag[],\n rowWidth: number,\n maxRows = 2,\n): IFittedCardTags {\n const place = (widths: number[]): number => {\n let rows = widths.length ? 1 : 0;\n let used = 0;\n for (const width of widths) {\n const next = used === 0 ? width : used + TAG_GAP + width;\n if (next <= rowWidth) {\n used = next;\n } else {\n rows += 1;\n used = width;\n }\n }\n return rows;\n };\n\n const widths = tags.map((tag) => estimateTagWidth(tag.name));\n if (place(widths) <= maxRows) return { visible: tags, hidden: 0 };\n\n for (let count = tags.length - 1; count >= 0; count--) {\n const more = estimateTagWidth(`+${tags.length - count}`);\n if (place([...widths.slice(0, count), more]) <= maxRows) {\n return { visible: tags.slice(0, count), hidden: tags.length - count };\n }\n }\n return { visible: [], hidden: tags.length };\n}\n\n/** A tag of the list's tag bar with the filter field it toggles. */\nexport type IArticleFilterTag = IDictionaryEntry & {\n source?: ArticleCardTagSource;\n};\n\n/**\n * Tag key `${source}:${id}` — cycle and keyword ids are separate domains, so\n * an id alone may repeat. Route ids are strings, dictionary ids numbers:\n * `'7'` and `7` give the same key.\n */\nexport function articleFilterTagKey(tag: {\n id?: unknown;\n source?: ArticleCardTagSource;\n}): string {\n const id =\n typeof tag.id === 'string' && tag.id.trim() !== '' && !isNaN(Number(tag.id))\n ? Number(tag.id)\n : tag.id;\n return `${tag.source ?? 'cycles'}:${String(id)}`;\n}\n\n/**\n * Polish plural form of a minute count for the reading time\n * (`ARTICLES.readingTime.one|few|many`).\n */\nexport function readingTimeForm(minutes: number): 'one' | 'few' | 'many' {\n if (minutes === 1) return 'one';\n const lastDigit = minutes % 10;\n const lastTwo = minutes % 100;\n return lastDigit >= 2 && lastDigit <= 4 && (lastTwo < 12 || lastTwo > 14)\n ? 'few'\n : 'many';\n}\n","import { computed, Directive, inject, input } from '@angular/core';\n\nimport { FileUrlService } from '@smartsoft001-mobilems/angular';\nimport { Article, ArticleKeyword } from '@smartsoft001-mobilems/articles-domain';\n\nimport {\n articleCardTags,\n articleCycleTags,\n cardTagFilterQueryParams,\n IArticleCardTag,\n IArticleCycleTag,\n} from '../tools/article-tags';\n\n/** A list card article: the API list item with its slug, authors and cycles. */\nexport type IArticleCardItem = Article & {\n slug?: string;\n authors?: Array<{ id?: number; name?: string | null }> | null;\n cycles?: unknown;\n};\n\n/**\n * Logic of an article list card (grid or list row): image with the\n * placeholder, description, authors, cycle and keyword tags with their list\n * links. The card keeps its template, e.g. `fitCardTags(tags(), 400)`.\n */\n@Directive()\nexport abstract class ArticleCardBaseComponent {\n protected readonly fileUrlService = inject(FileUrlService);\n\n readonly item = input<IArticleCardItem | undefined>(undefined);\n\n /** Placeholder image when the article has none. */\n protected readonly placeholderImage: string = '/gfx/no-image.png';\n\n readonly imageSrc = computed(() => {\n const item = this.item();\n return item\n ? this.fileUrlService.get(item.image, 'cache', this.placeholderImage)\n : '';\n });\n\n readonly description = computed(() => this.item()?.shortDescription || '');\n\n /** Authors, comma separated; nameless entries are dropped. */\n readonly authorsText = computed(() =>\n (this.item()?.authors ?? [])\n .map((author) => author?.name?.trim())\n .filter((name): name is string => !!name)\n .join(', '),\n );\n\n readonly cycles = computed<IArticleCycleTag[]>(() =>\n articleCycleTags(this.item()),\n );\n\n /** Card tags — cycles only; none = no tag row. */\n readonly tags = computed<IArticleCardTag[]>(() =>\n articleCardTags(this.item()),\n );\n\n readonly keywords = computed<ArticleKeyword[]>(\n () => this.item()?.keywords ?? [],\n );\n\n /** `queryParams` of a tag link — the list narrowed to the cycle/keyword. */\n tagQueryParams(tag: IArticleCardTag): { filter: string } {\n return cardTagFilterQueryParams(tag);\n }\n\n /** `queryParams` of a keyword link; `{}` for a nameless keyword. */\n keywordQueryParams(keyword: ArticleKeyword): { filter?: string } {\n const name = keyword?.name;\n return name\n ? cardTagFilterQueryParams({\n id: keyword.id as unknown as number,\n name,\n source: 'keywords',\n })\n : {};\n }\n}\n","import { computed, inject, Signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { catchError, map, of } from 'rxjs';\n\nimport {\n DataService,\n ICatalog,\n IDictionaryEntry,\n normalizeCycleId,\n} from '@smartsoft001-mobilems/angular';\n\nimport { articleFilterTagKey, IArticleFilterTag } from '../tools/article-tags';\n\n/** Query key of the theme tags — cycles (`filter[cycles][]=<id>`). */\nexport const ARTICLE_CYCLES_FILTER_KEY = 'cycles';\n\n/**\n * Query key of a keyword from the route (`filter[keywords][]=<id>`) — links\n * from older card tags. The tag bar has no keyword dictionary, so an active\n * keyword shows as a selected tag that can be unselected.\n */\nexport const ARTICLE_KEYWORDS_FILTER_KEY = 'keywords';\n\nexport interface IArticleCycleTags {\n /** The whole `Cycle` dictionary, named entries only; `[]` on an API error. */\n readonly dictionary: Signal<IDictionaryEntry[]>;\n /** Active keywords as selected tags. */\n readonly keywordTags: Signal<IArticleFilterTag[]>;\n /** Active cycles the dictionary did not return (deep link, API error). */\n readonly missingCycleTags: Signal<IArticleFilterTag[]>;\n /** Tag bar: active keywords, active cycles outside the dictionary, dictionary. */\n readonly barTags: Signal<IArticleFilterTag[]>;\n readonly selectedCycleIds: Signal<number[]>;\n /** Selection of the bar by `articleFilterTagKey`. */\n readonly selectedKeys: Signal<string[]>;\n /** Toggles the tag in its own field (`cycles` or `keywords`). */\n toggle(tag: IArticleFilterTag): void;\n}\n\n/**\n * Theme tag bar of an articles list (cycles + keywords). Call in an injection\n * context; the dictionary is loaded once per instance.\n */\nexport function createArticleCycleTags(catalog: ICatalog): IArticleCycleTags {\n const dictionary = toSignal(\n inject(DataService)\n .loadCycleTags()\n .pipe(\n map((items) => items.filter((item) => !!item?.name?.trim())),\n catchError(() => of([] as IDictionaryEntry[])),\n ),\n { initialValue: [] as IDictionaryEntry[] },\n );\n\n const keywordTags = computed<IArticleFilterTag[]>(() =>\n catalog\n .queryItems(ARTICLE_KEYWORDS_FILTER_KEY)\n .filter(\n (item) => normalizeCycleId(item?.id) !== null && !!item?.name?.trim(),\n )\n .map((item) => ({ ...item, source: 'keywords' as const })),\n );\n\n const missingCycleTags = computed<IArticleFilterTag[]>(() => {\n const known = new Set(\n dictionary().map((item) => normalizeCycleId(item.id)),\n );\n const seen = new Set<number>();\n return catalog.queryItems(ARTICLE_CYCLES_FILTER_KEY).flatMap((item) => {\n const id = normalizeCycleId(item?.id);\n const name = typeof item?.name === 'string' ? item.name.trim() : '';\n if (id === null || !name || known.has(id) || seen.has(id)) {\n return [];\n }\n seen.add(id);\n return [{ ...item, id, name, source: 'cycles' as const }];\n });\n });\n\n const selectedCycleIds = computed<number[]>(() =>\n catalog\n .queryItems(ARTICLE_CYCLES_FILTER_KEY)\n .map((item) => normalizeCycleId(item.id))\n .filter((id): id is number => id !== null),\n );\n\n return {\n dictionary,\n keywordTags,\n missingCycleTags,\n barTags: computed(() => [\n ...keywordTags(),\n ...missingCycleTags(),\n ...dictionary().map((item) => ({ ...item, source: 'cycles' as const })),\n ]),\n selectedCycleIds,\n selectedKeys: computed(() => [\n ...selectedCycleIds().map((id) =>\n articleFilterTagKey({ id, source: 'cycles' }),\n ),\n ...keywordTags().map((tag) => articleFilterTagKey(tag)),\n ]),\n toggle: (tag) => {\n const key =\n tag.source === ARTICLE_KEYWORDS_FILTER_KEY\n ? ARTICLE_KEYWORDS_FILTER_KEY\n : ARTICLE_CYCLES_FILTER_KEY;\n const { source: _source, ...plain } = tag;\n catalog.toggleQueryItem(key, plain as IDictionaryEntry);\n },\n };\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n computed,\n Directive,\n effect,\n inject,\n PLATFORM_ID,\n Signal,\n} from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { distinctUntilChanged, map, of, switchMap } from 'rxjs';\n\nimport {\n decodeHtmlEntities,\n FileUrlService,\n ISeoMetadata,\n MuseumSeoService,\n PARENT_TITLE_TOKEN,\n stripHtml,\n} from '@smartsoft001-mobilems/angular';\nimport { Article } from '@smartsoft001-mobilems/articles-domain';\nimport { ArticleWidget } from '@smartsoft001-mobilems/models';\n\nimport { ArticlesItemComponent } from '../pages/item/item.component';\nimport {\n ArticlesService,\n IArticleRelated,\n IArticleRelatedCard,\n} from '../services/articles/articles.service';\nimport { articleCycleTags, IArticleCycleTag } from '../tools/article-tags';\n\n/** Article fields of `GET article/:id` the framework model does not declare. */\nexport type IArticleDetails = Article & {\n authors?: Array<{ id?: number; name?: string | null }> | null;\n cycles?: Array<{ id: number; name: string }> | null;\n estimatedReadingTime?: number | null;\n};\n\n/**\n * Base of an article details page: SEO (also during SSR, via\n * `MuseumSeoService.applyForSsr`), the parent title for widget downloads,\n * scroll to top and the visit counter on every loaded article, sorted\n * widgets, plain title, lead, authors and cycle tags. The page provides\n * `PARENT_TITLE_TOKEN` (`useFactory: () => signal('')`) and its template.\n */\n@Directive()\nexport abstract class ArticleDetailsBaseComponent extends ArticlesItemComponent {\n protected readonly fileUrlService = inject(FileUrlService);\n protected readonly museumSeoService = inject(MuseumSeoService);\n protected readonly articlesService = inject(ArticlesService);\n private readonly parentTitle = inject(PARENT_TITLE_TOKEN);\n private readonly platformId = inject(PLATFORM_ID);\n\n /** Translation key of the site name in the SEO title. */\n protected siteNameKey = 'MODEL.mainTitle';\n\n protected readonly article = computed(\n () => this.item() as IArticleDetails | undefined,\n );\n\n /** Bottom widgets by `position` (stable; without a position last). */\n readonly widgets = computed<ArticleWidget[]>(() =>\n sortByPosition(this.item()?.bottomWidgets ?? []),\n );\n\n /** Title without markup — the API returns `<p>…</p>`. */\n readonly altTitle = computed<string>(() =>\n decodeHtmlEntities(stripHtml(this.item()?.title ?? '')).trim(),\n );\n\n /** `shortDescription` when it has text, else `''`. */\n readonly lead = computed<string>(() => {\n const text = this.item()?.shortDescription ?? '';\n return stripHtml(text).trim() ? text : '';\n });\n\n readonly authorsText = computed<string>(() =>\n (this.article()?.authors ?? [])\n .map((author) => author?.name?.trim())\n .filter(Boolean)\n .join(', '),\n );\n\n readonly cycleTags = computed<IArticleCycleTag[]>(() =>\n articleCycleTags(this.article()),\n );\n\n /** Rounded `estimatedReadingTime` in minutes, `0` when unknown. */\n readonly readingMinutes = computed<number>(() =>\n Math.round(Number(this.article()?.estimatedReadingTime) || 0),\n );\n\n protected constructor() {\n super();\n\n this.museumSeoService.applyForSsr(() => this.fetchSsrSeo());\n\n effect(() => {\n const item = this.item();\n if (!item) return;\n\n this.parentTitle.set(this.altTitle());\n this.museumSeoService.apply(this.buildSeoMetadata(item));\n\n if (isPlatformBrowser(this.platformId)) {\n window.scrollTo({ top: 0, behavior: 'instant' });\n void this.articlesService.logVisit(item.id).catch(() => undefined);\n }\n });\n }\n\n /** SEO of the article: `<title> - <site>`, description, image. */\n protected buildSeoMetadata(item: Article): ISeoMetadata {\n const title = decodeHtmlEntities(stripHtml(item.title)).trim();\n return {\n title: `${title} - ${this.translationService.get(this.siteNameKey)}`,\n description: item.shortDescription\n ? decodeHtmlEntities(stripHtml(item.shortDescription)).trim()\n : undefined,\n image: item.image ? this.fileUrlService.get(item.image) : undefined,\n imageAlt: title,\n type: 'article',\n };\n }\n\n private async fetchSsrSeo(): Promise<ISeoMetadata | null> {\n const id = this.route.snapshot.paramMap.get('id');\n if (!id) return null;\n try {\n const item = await this.articlesService.getById(id);\n return item ? this.buildSeoMetadata(item) : null;\n } catch {\n return null;\n }\n }\n}\n\n/**\n * „Related” module of a details page — `GET article/:id/related` for the\n * current article, empty groups before the first answer. Call in an\n * injection context, e.g. a field of an `ArticleDetailsBaseComponent`.\n */\nexport function createArticleRelated<\n O extends IArticleRelatedCard = IArticleRelatedCard,\n C extends IArticleRelatedCard = IArticleRelatedCard,\n A extends IArticleRelatedCard = IArticleRelatedCard,\n>(\n articleId: Signal<string | number | null | undefined>,\n): Signal<IArticleRelated<O, C, A>> {\n const service = inject(ArticlesService);\n const empty: IArticleRelated<O, C, A> = {\n objects: [],\n collections: [],\n articles: [],\n };\n return toSignal(\n toObservable(articleId).pipe(\n distinctUntilChanged(),\n switchMap((id) =>\n id !== undefined && id !== null\n ? service.getRelated<O, C, A>(id)\n : of(empty),\n ),\n map((related) => related ?? empty),\n ),\n { initialValue: empty },\n );\n}\n\n/** Like lodash `sortBy(items, 'position')`: stable, missing positions last. */\nexport function sortByPosition<T extends { position?: number | null }>(\n items: readonly T[],\n): T[] {\n return [...items].sort((a, b) => {\n const left = a?.position;\n const right = b?.position;\n if (left == null && right == null) return 0;\n if (left == null) return 1;\n if (right == null) return -1;\n return left - right;\n });\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n Directive,\n effect,\n ElementRef,\n inject,\n PLATFORM_ID,\n viewChild,\n} from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ListMode } from '@smartsoft001/angular';\nimport { capitalize } from '@smartsoft001/utils';\n\nimport {\n createCatalog,\n ICatalog,\n ICatalogOptions,\n ICatalogSort,\n MuseumSeoService,\n} from '@smartsoft001-mobilems/angular';\n\nimport { ArticlesListComponent } from '../pages/list/list.component';\n\n/** List SEO: `<title> - <site>`, description and canonical url. */\nexport interface IArticlesCatalogSeo {\n /** Translation key of the page title, e.g. `PAGE_TITLES.articles`. */\n titleKey: string;\n /** Translation key of the description, e.g. `ARTICLES.metaDescription`. */\n descriptionKey: string;\n /** Translation key of the site name. Default `MODEL.mainTitle`. */\n siteNameKey?: string;\n /** Canonical url of the list, e.g. `/artykuly`. */\n url: string;\n}\n\nexport interface IArticlesCatalogOptions extends Omit<\n ICatalogOptions,\n 'facade'\n> {\n /** Applied on creation, skipped in a search tab. */\n seo?: IArticlesCatalogSeo;\n}\n\n/**\n * Base of an articles list page on the shared catalog engine\n * (`createCatalog`): first read, persistence, sort/size/page, query helpers\n * and the read guard come from `catalog`; the page keeps its template.\n *\n * ```ts\n * export class ListComponent extends ArticlesCatalogBaseComponent {\n * constructor() {\n * super({ defaults, persistKey: 'ARTICLES', listPath: '/artykuly', searchTab: 'artykuly' });\n * }\n * }\n * ```\n *\n * A `#listContainer` element in the template is scrolled to after a page\n * change from the bottom pagination (`bottomPageChange`).\n */\n@Directive()\nexport abstract class ArticlesCatalogBaseComponent extends ArticlesListComponent {\n readonly ListMode = ListMode;\n protected readonly catalog: ICatalog;\n protected readonly translateService = inject(TranslateService);\n private readonly museumSeoService = inject(MuseumSeoService);\n private readonly platformId = inject(PLATFORM_ID);\n private readonly listContainer =\n viewChild<ElementRef<HTMLElement>>('listContainer');\n private scrollToListAfterLoad = false;\n\n protected constructor(options: IArticlesCatalogOptions) {\n super();\n const { seo, ...catalogOptions } = options;\n this.catalog = createCatalog({ ...catalogOptions, facade: this.facade });\n\n // After a page change from the bottom pagination scroll to the list top\n // once the data has loaded.\n effect(() => {\n const loading = this.catalog.isLoading();\n if (\n !loading &&\n this.scrollToListAfterLoad &&\n isPlatformBrowser(this.platformId)\n ) {\n this.scrollToListAfterLoad = false;\n setTimeout(() =>\n this.listContainer()?.nativeElement.scrollIntoView({\n behavior: 'smooth',\n block: 'start',\n }),\n );\n }\n });\n\n if (seo) this.applyListSeo(seo);\n }\n\n /** The list root element (`#listContainer`), e.g. to move focus. */\n protected get listContainerElement(): HTMLElement | undefined {\n return this.listContainer()?.nativeElement;\n }\n\n onSortChange(sort: ICatalogSort): void {\n this.catalog.setSort(sort);\n }\n\n /** Sort by key (`title-asc`, `random`). */\n sortChange(key: string): void {\n this.catalog.setSortKey(key);\n }\n\n onLimitChange(limit: number | string): void {\n this.catalog.setLimit(limit);\n }\n\n pageChange(page: number): void {\n this.catalog.setPage(page);\n }\n\n bottomPageChange(page: number): void {\n this.scrollToListAfterLoad = true;\n this.pageChange(page);\n }\n\n onListModeChange(mode: ListMode): void {\n this.catalog.setListMode(mode);\n }\n\n onFilterBarSearch(phrase: string): void {\n this.catalog.search(phrase);\n }\n\n retryLoad(): void {\n this.catalog.retry();\n }\n\n clearAllFilters(): void {\n this.catalog.clearAll();\n }\n\n /**\n * Full list meta (title, description, canonical, og), not in a search tab —\n * the canonical url of the list must not point at a phrase url.\n */\n protected applyListSeo(seo: IArticlesCatalogSeo): void {\n if (this.catalog.searchEnabled()) return;\n\n const t = (key: string) => capitalize(this.translateService.instant(key));\n this.museumSeoService.apply({\n title: `${t(seo.titleKey)} - ${t(seo.siteNameKey ?? 'MODEL.mainTitle')}`,\n description: t(seo.descriptionKey),\n type: 'website',\n url: seo.url,\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["smartInitialState","smartGetReducer"],"mappings":";;;;;;;;;;;;;;AAuBA;;;AAGG;AACG,SAAU,eAAe,CAC7B,KAAmB,EAAA;IAEnB,OAAO;AACL,QAAA,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC;AACxC,QAAA,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;KACxC;AACH;AAGM,MAAO,eAAgB,SAAQ,eAAwB,CAAA;IAC3D,oBAAoB,GAAA;AAClB,QAAA,OAAO,SAAS;IAClB;IAEA,iBAAiB,GAAA;AACf,QAAA,OAAO,SAAS;IAClB;;AAGA,IAAA,QAAQ,CAAC,EAAmB,EAAA;QAC1B,OAAO,cAAc,CACnB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAO,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,YAAA,EAAe,EAAE,QAAQ,EAAE,EAAE,CAAC,CACzE;IACH;AAEA;;;;AAIG;AACH,IAAA,UAAU,CAIR,EAAmB,EAAA;QACnB,OAAO,IAAI,CAAC;aACT,GAAG,CAMD,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAA,QAAA,EAAW,EAAE,CAAA,QAAA,CAAU;aAC9C,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,MAAM;YACjB,OAAO,EAAE,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC;YACvD,WAAW,EAAE,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,WAAW,IAAI,EAAE,CAAC;AAC/D,YAAA,QAAQ,EAAE,eAAe,CACvB,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,CACrC,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC,CAChD,CACF;SACF,CAAC,CAAC,EACH,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CACrE;IACL;iIA9CW,eAAe,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;qIAAf,eAAe,EAAA,CAAA,CAAA;;2FAAf,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B;;;AC5BK,MAAO,cAAe,SAAQ,UAAmB,CAAA;AADvD,IAAA,WAAA,GAAA;;AAEY,QAAA,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC;AAK5C,IAAA;IAHC,MAAM,WAAW,CAAC,IAAmC,EAAA;AACnD,QAAA,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;IACrD;iIALW,cAAc,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA;qIAAd,cAAc,EAAA,CAAA,CAAA;;2FAAd,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B;;;ACMM,MAAM,YAAY,GAAG;AAC1B,IAAA,GAAGA,cAAiB;;AAGtB,MAAM,eAAe,GAAG,CAAC,KAAK,GAAG,YAAY,EAAE,MAAW,KAAI;AAC5D,IAAA,QAAQ,MAAM,CAAC,IAAI;;;;;;AAOjB,QAAA;YACE,OAAOC,YAAe,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC;;AAEvD,CAAC;SAEe,UAAU,GAAA;AACxB,IAAA,OAAO,CAAC,KAAU,EAAE,MAAc,KAAI;AACpC,QAAA,OAAO,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC;AACvC,IAAA,CAAC;AACH;;MCjBa,aAAa,CAAA;AAN1B,IAAA,WAAA,GAAA;AAOU,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;AAEvC,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI;AACvB,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;QAE7B,IAAA,CAAA,OAAO,GAAG,YAAY,CAAmB,SAAS;oFAAC;QACnD,IAAA,CAAA,UAAU,GAAG,YAAY,CAAmB,YAAY;uFAAC;AAC1D,IAAA;iIARY,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;qHAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,SAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,SAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,EAAA,EAAA,YAAA,EAAA,YAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,YAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECjB1B,yWAeA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDAY,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;2FAEf,aAAa,EAAA,UAAA,EAAA,CAAA;kBANzB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,8BAA8B,mBAEvB,uBAAuB,CAAC,KAAK,EAAA,OAAA,EACrC,CAAC,gBAAgB,CAAC,EAAA,QAAA,EAAA,yWAAA,EAAA;AAQc,SAAA,CAAA,EAAA,cAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,IAAA,EAAA,CAAA,SAAS,uEACN,YAAY,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;AEZpD,MAAO,gBAAiB,SAAQ,oBAA6B,CAAA;iIAAtD,gBAAgB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;qHAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iCAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECZ7B,0GAGA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDOY,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,KAAA,EAAA,CAAA,CAAA;;2FAEf,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAN5B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,iCAAiC,mBAE1B,uBAAuB,CAAC,KAAK,EAAA,OAAA,EACrC,CAAC,gBAAgB,CAAC,EAAA,QAAA,EAAA,0GAAA,EAAA;;;AEJ7B,MAAM,UAAU,GAAG,CAAC,gBAAgB,EAAE,aAAa,CAAC;MAMvC,gBAAgB,CAAA;iIAAhB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;kIAAhB,gBAAgB,EAAA,OAAA,EAAA,CAHjB,YAAY,EAHJ,gBAAgB,EAAE,aAAa,CAAA,EAAA,OAAA,EAAA,CAA/B,gBAAgB,EAAE,aAAa,CAAA,EAAA,CAAA,CAAA;AAMtC,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,YAHjB,YAAY,CAAA,EAAA,CAAA,CAAA;;2FAGX,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAJ5B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,UAAU,CAAC;AACnC,oBAAA,OAAO,EAAE,CAAC,GAAG,UAAU,CAAC;AACzB,iBAAA;;;ACLM,MAAM,QAAQ,GAAG;IACtB,eAAe;AACf,IAAA;AACE,QAAA,OAAO,EAAE,WAAW;AACpB,QAAA,QAAQ,EAAE,eAAe;AAC1B,KAAA;;;MCaU,cAAc,CAAA;IACzB,OAAO,UAAU,CACf,OAA2C,EAAA;AAE3C,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc;AAChC,YAAA,OAAO,CAAC,MAAM,CAAC,cAAc,GAAG,UAAU;QAC5C,OAAO;AACL,YAAA,QAAQ,EAAE,cAAc;AACxB,YAAA,SAAS,EAAE;AACT,gBAAA;AACE,oBAAA,OAAO,EAAE,YAAY;oBACrB,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAkB;AAC5D,iBAAA;gBACD,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE;gBACjD,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE;AACrD,gBAAA;AACE,oBAAA,OAAO,EAAE,mBAAmB;oBAC5B,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAwB;AAClE,iBAAA;AACF,aAAA;SACF;IACH;iIArBW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAAd,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,YAHf,YAAY,EAAE,gBAAgB,EAAE,cAAc,aAC9C,gBAAgB,CAAA,EAAA,CAAA,CAAA;AAEf,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,EAAA,SAAA,EAJd,CAAC,GAAG,QAAQ,EAAE,cAAc,CAAC,EAAA,OAAA,EAAA,CAC9B,YAAY,EAAE,gBAAgB,EAAE,cAAc,EAC9C,gBAAgB,CAAA,EAAA,CAAA,CAAA;;2FAEf,cAAc,EAAA,UAAA,EAAA,CAAA;kBAN1B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,SAAS,EAAE,CAAC,GAAG,QAAQ,EAAE,cAAc,CAAC;AACxC,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,gBAAgB,EAAE,cAAc,CAAC;oBACzD,OAAO,EAAE,CAAC,gBAAgB,CAAC;AAC5B,iBAAA;;;MCCY,oBAAoB,CAAA;IAC/B,OAAO,UAAU,CACf,OAA2C,EAAA;AAE3C,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,cAAc;AAChC,YAAA,OAAO,CAAC,MAAM,CAAC,cAAc,GAAG,UAAU;QAC5C,OAAO;AACL,YAAA,QAAQ,EAAE,oBAAoB;AAC9B,YAAA,SAAS,EAAE;AACT,gBAAA;AACE,oBAAA,OAAO,EAAE,YAAY;oBACrB,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAkB;AAC5D,iBAAA;gBACD,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE;gBACjD,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE;AACrD,gBAAA;AACE,oBAAA,OAAO,EAAE,mBAAmB;oBAC5B,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAwB;AAClE,iBAAA;AACF,aAAA;SACF;IACH;iIArBW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA,CAAA;AAApB,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,YAHrB,YAAY,EAAE,gBAAgB,EAAE,UAAU,aAC1C,gBAAgB,CAAA,EAAA,CAAA,CAAA;AAEf,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,SAAA,EAJpB,CAAC,GAAG,QAAQ,EAAE,cAAc,CAAC,EAAA,OAAA,EAAA,CAC9B,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAC1C,gBAAgB,CAAA,EAAA,CAAA,CAAA;;2FAEf,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBANhC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,YAAY,EAAE,EAAE;AAChB,oBAAA,SAAS,EAAE,CAAC,GAAG,QAAQ,EAAE,cAAc,CAAC;AACxC,oBAAA,OAAO,EAAE,CAAC,YAAY,EAAE,gBAAgB,EAAE,UAAU,CAAC;oBACrD,OAAO,EAAE,CAAC,gBAAgB,CAAC;AAC5B,iBAAA;;;MChBY,gBAAgB,GAAG,qBAAqB,CAAQ,UAAU;AAEvE;AACA;AACA;AACA;;ACJM,MAAgB,qBAAsB,SAAQ,yBAAkC,CAAA;AADtF,IAAA,WAAA,GAAA;;AAEqB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;AAElD,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAyB;AAC5C,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;AAC7B,QAAA,IAAA,CAAA,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;AAC5B,IAAA;iIANqB,qBAAqB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;qHAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAD1C;;;ACIK,MAAgB,qBAAsB,SAAQ,yBAAkC,CAAA;AAWpF,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AAXU,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;QAC/C,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;AAE9C,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;AAE/B,QAAA,IAAA,CAAA,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO;AAC7B,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ;QAKlC,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE;AAE5B,YAAA,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC;YACvB,IAAI,EAAE,EAAE;AACN,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB;AACF,QAAA,CAAC,CAAC;IACJ;iIAtBoB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;qHAArB,qBAAqB,EAAA,YAAA,EAAA,IAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAArB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAD1C;;;ACkBD;;;;;;;;AAQG;MAEmB,wBAAwB,CAAA;AAkC5C,IAAA,WAAA,GAAA;AAjCmB,QAAA,IAAA,CAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AACzB,QAAA,IAAA,CAAA,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC;AAC9B,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;AACvB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;QAChC,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;;QAG9C,IAAA,CAAA,iBAAiB,GAAW,qBAAqB;QAE3D,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,IAAI;oFAAC;QACtB,IAAA,CAAA,aAAa,GAAG,MAAM,CAAC,KAAK;0FAAC;QAC7B,IAAA,CAAA,OAAO,GAAG,MAAM,CAAC,KAAK;oFAAC;QACvB,IAAA,CAAA,IAAI,GAAG,MAAM,CAAiB,IAAI;iFAAC;QAEnC,IAAA,CAAA,UAAU,GAAG,QAAQ,CAAC,MAC7B,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC;uFACnD;AAEQ,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAkB,MAAK;YAChD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,aAAa;AAC1C,YAAA,IAAI,CAAC,OAAO;AAAE,gBAAA,OAAO,EAAE;YAEvB,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;QAC7D,CAAC;oFAAC;QAEO,IAAA,CAAA,WAAW,GAAG,QAAQ,CAC7B,MACE,IAAI,CAAC,IAAI;AACP,cAAE,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI;aACrC,MAAM,CAAC,OAAO;AACd,aAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;wFACtB;QAGC,MAAM,CAAC,MAAK;YACV,MAAM,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,CAA8B;YAEtE,IAAI,MAAM,CAAC,QAAQ,KAAK,eAAe,IAAI,MAAM,CAAC,OAAO,EAAE;AACzD,gBAAA,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;gBAChC;YACF;AAEA,YAAA,IAAI,MAAM,CAAC,OAAO,EAAE;AAClB,gBAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC;YACnC;iBAAO;AACL,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,gBAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;YACzB;AACF,QAAA,CAAC,CAAC;QAEF,MAAM,CAAC,MAAK;AACV,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AACrD,gBAAA,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;YAClD;AACF,QAAA,CAAC,CAAC;IACJ;AAEQ,IAAA,mBAAmB,CAAC,MAAiC,EAAA;AAC3D,QAAA,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE;AAC3C,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC,EAAE;AACjD,YAAA,WAAW,EAAE;gBACX,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;AAC1B,aAAA;AACF,SAAA,CAAC;IACJ;AAEQ,IAAA,YAAY,CAAC,OAAe,EAAA;AAClC,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAEvB,QAAA,IAAI,CAAC;aACF,GAAG,CAA4B,OAAO,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;aACjE,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,KAAK,QAAQ,EAAE,IAAI,IAAI,IAAI,CAAC,EACzC,UAAU,CAAC,CAAC,KAAK,KAAI;AACnB,YAAA,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC;AACpD,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC;AACjB,QAAA,CAAC,CAAC;AAEH,aAAA,SAAS,CAAC,CAAC,OAAO,KAAI;AACrB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC;AACtB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AACzB,QAAA,CAAC,CAAC;IACN;iIAvFoB,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;qHAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAD7C;;;AC1BD;;;;AAIG;AACG,SAAU,gBAAgB,CAC9B,IAA6C,EAAA;AAE7C,IAAA,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM;AAC3B,IAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,EAAE;AAErC,IAAA,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,KAA8C,KAAI;QACvE,MAAM,EAAE,GAAG,gBAAgB,CAAC,KAAK,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,OAAO,KAAK,EAAE,IAAI,KAAK,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;QACrE,OAAO,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;AACnD,IAAA,CAAC,CAAC;AACJ;AAEA;;;AAGG;AACG,SAAU,sBAAsB,CAAC,GAAqB,EAAA;IAG1D,OAAO;AACL,QAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;YACrB,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE;SAC5D,CAAC;KACH;AACH;AAUA;;;;;AAKG;AACG,SAAU,eAAe,CAC7B,IAA6C,EAAA;IAE7C,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;AAC5E;AAEA;;;AAGG;AACG,SAAU,wBAAwB,CAAC,GAAoB,EAAA;IAG3D,OAAO;AACL,QAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC;YACrB,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE;SAC9D,CAAC;KACH;AACH;AAQA;AACA,MAAM,OAAO,GAAG,CAAC;AACjB;AACA,MAAM,UAAU,GAAG,EAAE;AACrB;AACA,MAAM,aAAa,GAAG,GAAG;AAEzB;;;;AAIG;AACG,SAAU,gBAAgB,CAAC,KAAa,EAAA;IAC5C,IAAI,KAAK,GAAG,CAAC;AACb,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,IAAI,IAAI,KAAK,GAAG;YAAE,KAAK,IAAI,GAAG;AACzB,aAAA,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,KAAK,IAAI,IAAI;AACxC,aAAA,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW,EAAE;YAAE,KAAK,IAAI,EAAE;AAC5C,aAAA,IAAI,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,KAAK,IAAI,CAAC;AAC7C,aAAA,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,KAAK,IAAI,CAAC;;YACrC,KAAK,IAAI,GAAG;IACnB;AACA,IAAA,OAAO,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC/D;AAEA;;;;;;AAMG;AACG,SAAU,WAAW,CACzB,IAAuB,EACvB,QAAgB,EAChB,OAAO,GAAG,CAAC,EAAA;AAEX,IAAA,MAAM,KAAK,GAAG,CAAC,MAAgB,KAAY;AACzC,QAAA,IAAI,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC;QAChC,IAAI,IAAI,GAAG,CAAC;AACZ,QAAA,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;AAC1B,YAAA,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,GAAG,OAAO,GAAG,KAAK;AACxD,YAAA,IAAI,IAAI,IAAI,QAAQ,EAAE;gBACpB,IAAI,GAAG,IAAI;YACb;iBAAO;gBACL,IAAI,IAAI,CAAC;gBACT,IAAI,GAAG,KAAK;YACd;QACF;AACA,QAAA,OAAO,IAAI;AACb,IAAA,CAAC;AAED,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC5D,IAAA,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,OAAO;QAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE;AAEjE,IAAA,KAAK,IAAI,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE;AACrD,QAAA,MAAM,IAAI,GAAG,gBAAgB,CAAC,CAAA,CAAA,EAAI,IAAI,CAAC,MAAM,GAAG,KAAK,CAAA,CAAE,CAAC;AACxD,QAAA,IAAI,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,OAAO,EAAE;YACvD,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE;QACvE;IACF;IACA,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;AAC7C;AAOA;;;;AAIG;AACG,SAAU,mBAAmB,CAAC,GAGnC,EAAA;IACC,MAAM,EAAE,GACN,OAAO,GAAG,CAAC,EAAE,KAAK,QAAQ,IAAI,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACzE,UAAE,MAAM,CAAC,GAAG,CAAC,EAAE;AACf,UAAE,GAAG,CAAC,EAAE;AACZ,IAAA,OAAO,CAAA,EAAG,GAAG,CAAC,MAAM,IAAI,QAAQ,CAAA,CAAA,EAAI,MAAM,CAAC,EAAE,CAAC,CAAA,CAAE;AAClD;AAEA;;;AAGG;AACG,SAAU,eAAe,CAAC,OAAe,EAAA;IAC7C,IAAI,OAAO,KAAK,CAAC;AAAE,QAAA,OAAO,KAAK;AAC/B,IAAA,MAAM,SAAS,GAAG,OAAO,GAAG,EAAE;AAC9B,IAAA,MAAM,OAAO,GAAG,OAAO,GAAG,GAAG;AAC7B,IAAA,OAAO,SAAS,IAAI,CAAC,IAAI,SAAS,IAAI,CAAC,KAAK,OAAO,GAAG,EAAE,IAAI,OAAO,GAAG,EAAE;AACtE,UAAE;UACA,MAAM;AACZ;;AC/JA;;;;AAIG;MAEmB,wBAAwB,CAAA;AAD9C,IAAA,WAAA,GAAA;AAEqB,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;QAEjD,IAAA,CAAA,IAAI,GAAG,KAAK,CAA+B,SAAS;iFAAC;;QAG3C,IAAA,CAAA,gBAAgB,GAAW,mBAAmB;AAExD,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAC,MAAK;AAChC,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,OAAO;AACL,kBAAE,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,gBAAgB;kBAClE,EAAE;QACR,CAAC;qFAAC;AAEO,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,gBAAgB,IAAI,EAAE;wFAAC;;AAGjE,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAC,MAC9B,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO,IAAI,EAAE;AACxB,aAAA,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE;aACpC,MAAM,CAAC,CAAC,IAAI,KAAqB,CAAC,CAAC,IAAI;aACvC,IAAI,CAAC,IAAI,CAAC;wFACd;AAEQ,QAAA,IAAA,CAAA,MAAM,GAAG,QAAQ,CAAqB,MAC7C,gBAAgB,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;mFAC9B;;AAGQ,QAAA,IAAA,CAAA,IAAI,GAAG,QAAQ,CAAoB,MAC1C,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iFAC7B;AAEQ,QAAA,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAC1B,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,IAAI,EAAE;qFAClC;AAkBF,IAAA;;AAfC,IAAA,cAAc,CAAC,GAAoB,EAAA;AACjC,QAAA,OAAO,wBAAwB,CAAC,GAAG,CAAC;IACtC;;AAGA,IAAA,kBAAkB,CAAC,OAAuB,EAAA;AACxC,QAAA,MAAM,IAAI,GAAG,OAAO,EAAE,IAAI;AAC1B,QAAA,OAAO;cACH,wBAAwB,CAAC;gBACvB,EAAE,EAAE,OAAO,CAAC,EAAuB;gBACnC,IAAI;AACJ,gBAAA,MAAM,EAAE,UAAU;aACnB;cACD,EAAE;IACR;iIArDoB,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;qHAAxB,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAD7C;;;ACZD;AACO,MAAM,yBAAyB,GAAG;AAEzC;;;;AAIG;AACI,MAAM,2BAA2B,GAAG;AAkB3C;;;AAGG;AACG,SAAU,sBAAsB,CAAC,OAAiB,EAAA;AACtD,IAAA,MAAM,UAAU,GAAG,QAAQ,CACzB,MAAM,CAAC,WAAW;AACf,SAAA,aAAa;SACb,IAAI,CACH,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAC5D,UAAU,CAAC,MAAM,EAAE,CAAC,EAAwB,CAAC,CAAC,CAC/C,EACH,EAAE,YAAY,EAAE,EAAwB,EAAE,CAC3C;AAED,IAAA,MAAM,WAAW,GAAG,QAAQ,CAAsB,MAChD;SACG,UAAU,CAAC,2BAA2B;SACtC,MAAM,CACL,CAAC,IAAI,KAAK,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE;AAEtE,SAAA,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,UAAmB,EAAE,CAAC,CAAC;oFAC7D;AAED,IAAA,MAAM,gBAAgB,GAAG,QAAQ,CAAsB,MAAK;QAC1D,MAAM,KAAK,GAAG,IAAI,GAAG,CACnB,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CACtD;AACD,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU;AAC9B,QAAA,OAAO,OAAO,CAAC,UAAU,CAAC,yBAAyB,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;YACpE,MAAM,EAAE,GAAG,gBAAgB,CAAC,IAAI,EAAE,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;YACnE,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;AACzD,gBAAA,OAAO,EAAE;YACX;AACA,YAAA,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AACZ,YAAA,OAAO,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAiB,EAAE,CAAC;AAC3D,QAAA,CAAC,CAAC;IACJ,CAAC;yFAAC;AAEF,IAAA,MAAM,gBAAgB,GAAG,QAAQ,CAAW,MAC1C;SACG,UAAU,CAAC,yBAAyB;AACpC,SAAA,GAAG,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;SACvC,MAAM,CAAC,CAAC,EAAE,KAAmB,EAAE,KAAK,IAAI,CAAC;yFAC7C;IAED,OAAO;QACL,UAAU;QACV,WAAW;QACX,gBAAgB;AAChB,QAAA,OAAO,EAAE,QAAQ,CAAC,MAAM;AACtB,YAAA,GAAG,WAAW,EAAE;AAChB,YAAA,GAAG,gBAAgB,EAAE;YACrB,GAAG,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,QAAiB,EAAE,CAAC,CAAC;SACxE,CAAC;QACF,gBAAgB;AAChB,QAAA,YAAY,EAAE,QAAQ,CAAC,MAAM;YAC3B,GAAG,gBAAgB,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,KAC3B,mBAAmB,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAC9C;AACD,YAAA,GAAG,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,mBAAmB,CAAC,GAAG,CAAC,CAAC;SACxD,CAAC;AACF,QAAA,MAAM,EAAE,CAAC,GAAG,KAAI;AACd,YAAA,MAAM,GAAG,GACP,GAAG,CAAC,MAAM,KAAK;AACb,kBAAE;kBACA,yBAAyB;YAC/B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,GAAG,GAAG;AACzC,YAAA,OAAO,CAAC,eAAe,CAAC,GAAG,EAAE,KAAyB,CAAC;QACzD,CAAC;KACF;AACH;;ACzEA;;;;;;AAMG;AAEG,MAAgB,2BAA4B,SAAQ,qBAAqB,CAAA;AA8C7E,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,EAAE;AA9CU,QAAA,IAAA,CAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC3C,QAAA,IAAA,CAAA,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;AAC3C,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACxC,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;;QAGvC,IAAA,CAAA,WAAW,GAAG,iBAAiB;QAEtB,IAAA,CAAA,OAAO,GAAG,QAAQ,CACnC,MAAM,IAAI,CAAC,IAAI,EAAiC;oFACjD;;AAGQ,QAAA,IAAA,CAAA,OAAO,GAAG,QAAQ,CAAkB,MAC3C,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,aAAa,IAAI,EAAE,CAAC;oFACjD;;QAGQ,IAAA,CAAA,QAAQ,GAAG,QAAQ,CAAS,MACnC,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE;qFAC/D;;AAGQ,QAAA,IAAA,CAAA,IAAI,GAAG,QAAQ,CAAS,MAAK;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,gBAAgB,IAAI,EAAE;AAChD,YAAA,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,GAAG,EAAE;QAC3C,CAAC;iFAAC;AAEO,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CAAS,MACtC,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,OAAO,IAAI,EAAE;AAC3B,aAAA,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE;aACpC,MAAM,CAAC,OAAO;aACd,IAAI,CAAC,IAAI,CAAC;wFACd;AAEQ,QAAA,IAAA,CAAA,SAAS,GAAG,QAAQ,CAAqB,MAChD,gBAAgB,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;sFACjC;;QAGQ,IAAA,CAAA,cAAc,GAAG,QAAQ,CAAS,MACzC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,oBAAoB,CAAC,IAAI,CAAC,CAAC;2FAC9D;AAKC,QAAA,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAE3D,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,IAAI,CAAC,IAAI;gBAAE;YAEX,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;AACrC,YAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAExD,YAAA,IAAI,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AACtC,gBAAA,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;AAChD,gBAAA,KAAK,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC;YACpE;AACF,QAAA,CAAC,CAAC;IACJ;;AAGU,IAAA,gBAAgB,CAAC,IAAa,EAAA;AACtC,QAAA,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;QAC9D,OAAO;AACL,YAAA,KAAK,EAAE,CAAA,EAAG,KAAK,CAAA,GAAA,EAAM,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA,CAAE;YACpE,WAAW,EAAE,IAAI,CAAC;AAChB,kBAAE,kBAAkB,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI;AAC3D,kBAAE,SAAS;YACb,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,SAAS;AACnE,YAAA,QAAQ,EAAE,KAAK;AACf,YAAA,IAAI,EAAE,SAAS;SAChB;IACH;AAEQ,IAAA,MAAM,WAAW,GAAA;AACvB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACjD,QAAA,IAAI,CAAC,EAAE;AAAE,YAAA,OAAO,IAAI;AACpB,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;AACnD,YAAA,OAAO,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,IAAI;QAClD;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;iIAxFoB,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;qHAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAA3B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBADhD;;AA4FD;;;;AAIG;AACG,SAAU,oBAAoB,CAKlC,SAAqD,EAAA;AAErD,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,eAAe,CAAC;AACvC,IAAA,MAAM,KAAK,GAA6B;AACtC,QAAA,OAAO,EAAE,EAAE;AACX,QAAA,WAAW,EAAE,EAAE;AACf,QAAA,QAAQ,EAAE,EAAE;KACb;IACD,OAAO,QAAQ,CACb,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CAC1B,oBAAoB,EAAE,EACtB,SAAS,CAAC,CAAC,EAAE,KACX,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK;AACzB,UAAE,OAAO,CAAC,UAAU,CAAU,EAAE;UAC9B,EAAE,CAAC,KAAK,CAAC,CACd,EACD,GAAG,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,KAAK,CAAC,CACnC,EACD,EAAE,YAAY,EAAE,KAAK,EAAE,CACxB;AACH;AAEA;AACM,SAAU,cAAc,CAC5B,KAAmB,EAAA;AAEnB,IAAA,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AAC9B,QAAA,MAAM,IAAI,GAAG,CAAC,EAAE,QAAQ;AACxB,QAAA,MAAM,KAAK,GAAG,CAAC,EAAE,QAAQ;AACzB,QAAA,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI;AAAE,YAAA,OAAO,CAAC;QAC3C,IAAI,IAAI,IAAI,IAAI;AAAE,YAAA,OAAO,CAAC;QAC1B,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,CAAC,CAAC;QAC5B,OAAO,IAAI,GAAG,KAAK;AACrB,IAAA,CAAC,CAAC;AACJ;;AC1IA;;;;;;;;;;;;;;;AAeG;AAEG,MAAgB,4BAA6B,SAAQ,qBAAqB,CAAA;AAU9E,IAAA,WAAA,CAAsB,OAAgC,EAAA;AACpD,QAAA,KAAK,EAAE;QAVA,IAAA,CAAA,QAAQ,GAAG,QAAQ;AAET,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC7C,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC3C,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;QAChC,IAAA,CAAA,aAAa,GAC5B,SAAS,CAA0B,eAAe;0FAAC;QAC7C,IAAA,CAAA,qBAAqB,GAAG,KAAK;QAInC,MAAM,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO;AAC1C,QAAA,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,EAAE,GAAG,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;;;QAIxE,MAAM,CAAC,MAAK;YACV,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;AACxC,YAAA,IACE,CAAC,OAAO;AACR,gBAAA,IAAI,CAAC,qBAAqB;AAC1B,gBAAA,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAClC;AACA,gBAAA,IAAI,CAAC,qBAAqB,GAAG,KAAK;AAClC,gBAAA,UAAU,CAAC,MACT,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa,CAAC,cAAc,CAAC;AACjD,oBAAA,QAAQ,EAAE,QAAQ;AAClB,oBAAA,KAAK,EAAE,OAAO;AACf,iBAAA,CAAC,CACH;YACH;AACF,QAAA,CAAC,CAAC;AAEF,QAAA,IAAI,GAAG;AAAE,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;IACjC;;AAGA,IAAA,IAAc,oBAAoB,GAAA;AAChC,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,EAAE,aAAa;IAC5C;AAEA,IAAA,YAAY,CAAC,IAAkB,EAAA;AAC7B,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;IAC5B;;AAGA,IAAA,UAAU,CAAC,GAAW,EAAA;AACpB,QAAA,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;IAC9B;AAEA,IAAA,aAAa,CAAC,KAAsB,EAAA;AAClC,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;IAC9B;AAEA,IAAA,UAAU,CAAC,IAAY,EAAA;AACrB,QAAA,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;IAC5B;AAEA,IAAA,gBAAgB,CAAC,IAAY,EAAA;AAC3B,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI;AACjC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;IACvB;AAEA,IAAA,gBAAgB,CAAC,IAAc,EAAA;AAC7B,QAAA,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;IAChC;AAEA,IAAA,iBAAiB,CAAC,MAAc,EAAA;AAC9B,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC;IAC7B;IAEA,SAAS,GAAA;AACP,QAAA,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;IACtB;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;IACzB;AAEA;;;AAGG;AACO,IAAA,YAAY,CAAC,GAAwB,EAAA;AAC7C,QAAA,IAAI,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE;YAAE;AAElC,QAAA,MAAM,CAAC,GAAG,CAAC,GAAW,KAAK,UAAU,CAAC,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACzE,QAAA,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;AAC1B,YAAA,KAAK,EAAE,CAAA,EAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA,GAAA,EAAM,CAAC,CAAC,GAAG,CAAC,WAAW,IAAI,iBAAiB,CAAC,CAAA,CAAE;AACxE,YAAA,WAAW,EAAE,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC;AAClC,YAAA,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,GAAG,CAAC,GAAG;AACb,SAAA,CAAC;IACJ;iIA9FoB,4BAA4B,EAAA,IAAA,EAAA,SAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;qHAA5B,4BAA4B,EAAA,YAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,eAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA;;2FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBADjD;wHAQsC,eAAe,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;ACnEtD;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"smartsoft001-mobilems-articles-shell-angular.mjs","sources":["../../../../../../packages/articles/shell/angular/src/lib/services/articles/articles.service.ts","../../../../../../packages/articles/shell/angular/src/lib/+state/articles.facade.ts","../../../../../../packages/articles/shell/angular/src/lib/+state/articles.reducer.ts","../../../../../../packages/articles/shell/angular/src/lib/components/list/list.component.ts","../../../../../../packages/articles/shell/angular/src/lib/components/list/list.component.html","../../../../../../packages/articles/shell/angular/src/lib/components/filters/filters.component.ts","../../../../../../packages/articles/shell/angular/src/lib/components/filters/filters.component.html","../../../../../../packages/articles/shell/angular/src/lib/components/components.module.ts","../../../../../../packages/articles/shell/angular/src/lib/services/index.ts","../../../../../../packages/articles/shell/angular/src/lib/articles.module.ts","../../../../../../packages/articles/shell/angular/src/lib/articles-shared.module.ts","../../../../../../packages/articles/shell/angular/src/lib/+state/articles.selectors.ts","../../../../../../packages/articles/shell/angular/src/lib/pages/list/list.component.ts","../../../../../../packages/articles/shell/angular/src/lib/pages/item/item.component.ts","../../../../../../packages/articles/shell/angular/src/lib/pages/preview/preview.component.ts","../../../../../../packages/articles/shell/angular/src/lib/tools/article-tags.ts","../../../../../../packages/articles/shell/angular/src/lib/catalog/article-card-base.component.ts","../../../../../../packages/articles/shell/angular/src/lib/catalog/article-cycle-tags.ts","../../../../../../packages/articles/shell/angular/src/lib/catalog/article-details-base.component.ts","../../../../../../packages/articles/shell/angular/src/lib/catalog/articles-catalog-base.component.ts","../../../../../../packages/articles/shell/angular/src/smartsoft001-mobilems-articles-shell-angular.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { catchError, firstValueFrom, map, Observable, of } from 'rxjs';\n\nimport { CrudBaseService } from '@smartsoft001-mobilems/angular';\nimport { Article } from '@smartsoft001-mobilems/articles-domain';\n\n/** Cards of `GET article/:id/related`, grouped as the API returns them. */\nexport interface IArticleRelated<\n O extends IArticleRelatedCard = IArticleRelatedCard,\n C extends IArticleRelatedCard = IArticleRelatedCard,\n A extends IArticleRelatedCard = IArticleRelatedCard,\n> {\n objects: O[];\n collections: C[];\n articles: A[];\n}\n\n/** The fields the related module relies on; the API sends full list cards. */\nexport interface IArticleRelatedCard {\n id?: string | number | null;\n image?: unknown;\n}\n\n/**\n * Cards with an image first (order within each group kept), so grey\n * placeholders do not open the module when the API has cards with images.\n */\nexport function withImagesFirst<T extends { image?: unknown }>(\n cards: readonly T[],\n): T[] {\n return [\n ...cards.filter((card) => !!card?.image),\n ...cards.filter((card) => !card?.image),\n ];\n}\n\n@Injectable()\nexport class ArticlesService extends CrudBaseService<Article> {\n getUrlNameForDetails(): string {\n return 'article';\n }\n\n getUrlNameForList(): string {\n return 'Article';\n }\n\n /** `POST api/article/:id/visit` — the visit counter of the details page. */\n logVisit(id: string | number): Promise<void> {\n return firstValueFrom(\n this.http.post<void>(`${this.config.apiUrl}api/article/${id}/visit`, {}),\n );\n }\n\n /**\n * `GET article/:id/related` — objects, collections and other articles with\n * images first, without the article itself. No data or an API error give\n * empty groups, so the details page works without the module.\n */\n getRelated<\n O extends IArticleRelatedCard = IArticleRelatedCard,\n C extends IArticleRelatedCard = IArticleRelatedCard,\n A extends IArticleRelatedCard = IArticleRelatedCard,\n >(id: string | number): Observable<IArticleRelated<O, C, A>> {\n return this.http\n .get<{\n data?: {\n objects?: O[] | null;\n collections?: C[] | null;\n articles?: A[] | null;\n } | null;\n }>(`${this.config.apiUrl}article/${id}/related`)\n .pipe(\n map((response) => ({\n objects: withImagesFirst(response?.data?.objects ?? []),\n collections: withImagesFirst(response?.data?.collections ?? []),\n articles: withImagesFirst(\n (response?.data?.articles ?? []).filter(\n (article) => String(article?.id) !== String(id),\n ),\n ),\n })),\n catchError(() => of({ objects: [], collections: [], articles: [] })),\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { CrudFacade } from '@smartsoft001/crud-shell-angular';\n\nimport { Article } from '@smartsoft001-mobilems/articles-domain';\n\nimport { ArticlesService } from '../services/articles/articles.service';\n\n@Injectable()\nexport class ArticlesFacade extends CrudFacade<Article> {\n protected service = inject(ArticlesService);\n\n async downloadPdf(item: { title: string; id: string }): Promise<void> {\n await this.service.downloadPdf(item.title, item.id);\n }\n}\n","import { Action } from '@ngrx/store';\nimport {\n State as SmartState,\n initialState as smartInitialState,\n getReducer as smartGetReducer,\n} from '@smartsoft001/crud-shell-angular';\n\nimport { Article } from '@smartsoft001-mobilems/articles-domain';\n\n// import {ArticlesFacade} from \"./articles.facade\";\n\nexport type State = SmartState<Article>;\n\nexport const initialState = {\n ...smartInitialState,\n};\n\nconst articlesReducer = (state = initialState, action: any) => {\n switch (action.type) {\n //case ArticlesFacade.name + ' test':\n // return {\n // ...state,\n // loaded: false,\n // }\n\n default:\n return smartGetReducer('articles')(state, action);\n }\n};\n\nexport function getReducer() {\n return (state: any, action: Action) => {\n return articlesReducer(state, action);\n };\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n Component,\n TemplateRef,\n contentChild,\n inject,\n ChangeDetectionStrategy,\n} from '@angular/core';\n\nimport { ArticlesFacade } from '../../+state/articles.facade';\n\n@Component({\n selector: 'smart-mobilems-articles-list',\n templateUrl: './list.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [NgTemplateOutlet],\n})\nexport class ListComponent {\n private facade = inject(ArticlesFacade);\n\n list = this.facade.list;\n loading = this.facade.loading;\n\n itemTpl = contentChild<TemplateRef<any>>('itemTpl');\n loadingTpl = contentChild<TemplateRef<any>>('loadingTpl');\n}\n","@if (list(); as listData) {\n @if (listData && itemTpl()) {\n @for (item of listData; track item) {\n <ng-container\n *ngTemplateOutlet=\"itemTpl(); context: { $implicit: item }\"\n ></ng-container>\n }\n }\n}\n\n@if (loading()) {\n @if (loadingTpl()) {\n <ng-container *ngTemplateOutlet=\"loadingTpl()\"></ng-container>\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, ChangeDetectionStrategy } from '@angular/core';\n\nimport { FiltersBaseComponent } from '@smartsoft001-mobilems/angular';\nimport { Article } from '@smartsoft001-mobilems/articles-domain';\n\n@Component({\n selector: 'smart-mobilems-articles-filters',\n templateUrl: './filters.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [NgTemplateOutlet],\n})\nexport class FiltersComponent extends FiltersBaseComponent<Article> {}\n","<ng-container\n *ngTemplateOutlet=\"contentTpl(); context: { $implicit: context }\"\n></ng-container>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { FiltersComponent } from './filters/filters.component';\nimport { ListComponent } from './list/list.component';\n\nconst COMPONENTS = [FiltersComponent, ListComponent];\n\n@NgModule({\n imports: [CommonModule, COMPONENTS],\n exports: [...COMPONENTS],\n})\nexport class ComponentsModule {}\n","import { CrudService } from '@smartsoft001/crud-shell-angular';\n\nimport { ArticlesService } from './articles/articles.service';\n\nexport * from './articles/articles.service';\n\nexport const SERVICES = [\n ArticlesService,\n {\n provide: CrudService,\n useClass: ArticlesService,\n },\n];\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { FILE_SERVICE_CONFIG, IFileServiceConfig } from '@smartsoft001/angular';\nimport {\n CrudConfig,\n CrudFullConfig,\n CrudFullModule,\n ICrudModuleOptionsWithoutRoutng,\n} from '@smartsoft001/crud-shell-angular';\nimport { IEntity } from '@smartsoft001/domain-core';\n\nimport { SharedConfig } from '@smartsoft001-mobilems/angular';\nimport { SharedModule } from '@smartsoft001-mobilems/angular';\n\nimport { ArticlesFacade } from './+state/articles.facade';\nimport { getReducer } from './+state/articles.reducer';\nimport { ComponentsModule } from './components';\nimport { SERVICES } from './services';\n\n@NgModule({\n declarations: [],\n providers: [...SERVICES, ArticlesFacade],\n imports: [SharedModule, ComponentsModule, CrudFullModule],\n exports: [ComponentsModule],\n})\nexport class ArticlesModule {\n static forFeature<T extends IEntity<string>>(\n options: ICrudModuleOptionsWithoutRoutng<T>,\n ): ModuleWithProviders<ArticlesModule> {\n if (!options.config.reducerFactory)\n options.config.reducerFactory = getReducer;\n return {\n ngModule: ArticlesModule,\n providers: [\n {\n provide: SharedConfig,\n useValue: { apiUrl: options.config.apiUrl } as SharedConfig,\n },\n { provide: CrudConfig, useValue: options.config },\n { provide: CrudFullConfig, useValue: options.config },\n {\n provide: FILE_SERVICE_CONFIG,\n useValue: { apiUrl: options.config.apiUrl } as IFileServiceConfig,\n },\n ],\n };\n }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { FILE_SERVICE_CONFIG, IFileServiceConfig } from '@smartsoft001/angular';\nimport {\n CrudConfig,\n CrudFullConfig,\n CrudModule,\n ICrudModuleOptionsWithoutRoutng,\n} from '@smartsoft001/crud-shell-angular';\nimport { IEntity } from '@smartsoft001/domain-core';\n\nimport { SharedConfig } from '@smartsoft001-mobilems/angular';\nimport { SharedModule } from '@smartsoft001-mobilems/angular';\n\nimport { ArticlesFacade } from './+state/articles.facade';\nimport { getReducer } from './+state/articles.reducer';\nimport { ComponentsModule } from './components';\nimport { SERVICES } from './services';\n\n@NgModule({\n declarations: [],\n providers: [...SERVICES, ArticlesFacade],\n imports: [SharedModule, ComponentsModule, CrudModule],\n exports: [ComponentsModule],\n})\nexport class ArticlesSharedModule {\n static forFeature<T extends IEntity<string>>(\n options: ICrudModuleOptionsWithoutRoutng<T>,\n ): ModuleWithProviders<ArticlesSharedModule> {\n if (!options.config.reducerFactory)\n options.config.reducerFactory = getReducer;\n return {\n ngModule: ArticlesSharedModule,\n providers: [\n {\n provide: SharedConfig,\n useValue: { apiUrl: options.config.apiUrl } as SharedConfig,\n },\n { provide: CrudConfig, useValue: options.config },\n { provide: CrudFullConfig, useValue: options.config },\n {\n provide: FILE_SERVICE_CONFIG,\n useValue: { apiUrl: options.config.apiUrl } as IFileServiceConfig,\n },\n ],\n };\n }\n}\n","import {\n createFeatureSelector,\n //createSelector\n} from '@ngrx/store';\n\nimport { State } from './articles.reducer';\n\nexport const getArticlesState = createFeatureSelector<State>('articles');\n\n//export const getArticlesTest = createSelector(\n// getArticlesState,\n// (state) => state.test\n//);\n","import { inject, Directive, Signal } from '@angular/core';\nimport { CrudListPageBaseComponent } from '@smartsoft001/crud-shell-angular';\n\nimport { Article } from '@smartsoft001-mobilems/articles-domain';\n\nimport { ArticlesFacade } from '../../+state';\n\n@Directive()\nexport abstract class ArticlesListComponent extends CrudListPageBaseComponent<Article> {\n protected readonly facade = inject(ArticlesFacade);\n\n list = this.facade.list as Signal<Article[]>;\n loading = this.facade.loading;\n filter = this.facade.filter;\n}\n","import { Directive, effect, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute } from '@angular/router';\nimport { CrudItemPageBaseComponent } from '@smartsoft001/crud-shell-angular';\n\nimport { SeoService, TranslationService } from '@smartsoft001-mobilems/angular';\nimport { Article } from '@smartsoft001-mobilems/articles-domain';\n\nimport { ArticlesFacade } from '../../+state';\n\n@Directive()\nexport abstract class ArticlesItemComponent extends CrudItemPageBaseComponent<Article> {\n protected readonly route = inject(ActivatedRoute);\n protected readonly seoService = inject(SeoService);\n protected readonly translationService = inject(TranslationService);\n protected readonly params = toSignal(this.route.params);\n\n override facade = inject(ArticlesFacade);\n\n readonly loading = this.facade.loading;\n readonly item = this.facade.selected;\n\n protected constructor() {\n super();\n\n effect(() => {\n const params = this.params();\n\n const id = params['id'];\n if (id) {\n this.facade.select(id);\n }\n });\n }\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { HttpClient } from '@angular/common/http';\nimport {\n computed,\n Directive,\n effect,\n inject,\n PLATFORM_ID,\n signal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { catchError, map, of } from 'rxjs';\n\nimport { Article } from '@smartsoft001-mobilems/articles-domain';\nimport { ArticleWidget } from '@smartsoft001-mobilems/models';\n\n/** Query params the CMS appends when it opens `/article-preview`. */\nexport interface ArticlePreviewQueryParams {\n apiHost?: string;\n dataUrl?: string;\n pathUrl?: string;\n pageUrl?: string;\n mediaUrl?: string;\n templateName?: string;\n viewType?: string;\n}\n\n/**\n * CMS preview of an unpublished article.\n *\n * The CMS opens `/article-preview?dataUrl=...` in the editor's browser and the\n * page fetches `dataUrl` with the CMS session cookie, so the route must be\n * rendered on the client (`RenderMode.Client`). A `viewType=thematic-path`\n * preview is forwarded to `thematicPathRoute`. Subclass with the app's own\n * template; the subclass owns only the view.\n */\n@Directive()\nexport abstract class ArticlesPreviewComponent {\n protected readonly http = inject(HttpClient);\n protected readonly route = inject(ActivatedRoute);\n protected readonly router = inject(Router);\n protected readonly platformId = inject(PLATFORM_ID);\n protected readonly queryParams = toSignal(this.route.queryParams);\n\n /** Route a `thematic-path` preview is forwarded to; override per app. */\n protected readonly thematicPathRoute: string = '/sciezki-tematyczne';\n\n readonly loading = signal(true);\n readonly noQueryParams = signal(false);\n readonly noLogin = signal(false);\n readonly item = signal<Article | null>(null);\n\n readonly plainTitle = computed(() =>\n (this.item()?.title ?? '').replace(/<[^>]*>/g, ''),\n );\n\n readonly widgets = computed<ArticleWidget[]>(() => {\n const widgets = this.item()?.bottomWidgets;\n if (!widgets) return [];\n\n return [...widgets].sort((a, b) => a.position - b.position);\n });\n\n readonly authorsText = computed(\n () =>\n this.item()\n ?.authors?.map((author) => author.name)\n .filter(Boolean)\n .join(', ') ?? '',\n );\n\n protected constructor() {\n effect(() => {\n const params = (this.queryParams() ?? {}) as ArticlePreviewQueryParams;\n\n if (params.viewType === 'thematic-path' && params.pathUrl) {\n this.forwardThematicPath(params);\n return;\n }\n\n if (params.dataUrl) {\n this.fetchArticle(params.dataUrl);\n } else {\n this.noQueryParams.set(true);\n this.loading.set(false);\n }\n });\n\n effect(() => {\n if (this.item() && isPlatformBrowser(this.platformId)) {\n window.scrollTo({ top: 0, behavior: 'instant' });\n }\n });\n }\n\n private forwardThematicPath(params: ArticlePreviewQueryParams): void {\n const id = params.pathUrl?.split('/').pop();\n this.router.navigate([this.thematicPathRoute, id], {\n queryParams: {\n pathUrl: params.pathUrl,\n pageUrl: params.pageUrl,\n mediaUrl: params.mediaUrl,\n },\n });\n }\n\n private fetchArticle(dataUrl: string): void {\n this.loading.set(true);\n this.noLogin.set(false);\n\n this.http\n .get<{ data?: Article | null }>(dataUrl, { withCredentials: true })\n .pipe(\n map((response) => response?.data ?? null),\n catchError((error) => {\n console.error('Error fetching preview data:', error);\n this.noLogin.set(true);\n return of(null);\n }),\n )\n .subscribe((article) => {\n this.item.set(article);\n this.loading.set(false);\n });\n }\n}\n","import {\n IDictionaryEntry,\n normalizeCycleId,\n} from '@smartsoft001-mobilems/angular';\n\n/** Cykl artykułu (`cycles[]` z API) — tag tematyczny listy „Niezwykłe Historie”. */\nexport interface IArticleCycleTag {\n id: number;\n name: string;\n}\n\n/**\n * Cykle artykułu z pominięciem pustych wpisów, z id znormalizowanym do\n * liczby. `cycles: null` (albo brak pola) daje pustą tablicę, więc szablon\n * nie renderuje wtedy wiersza tagów (MOB-1605).\n */\nexport function articleCycleTags(\n item: { cycles?: unknown } | null | undefined,\n): IArticleCycleTag[] {\n const cycles = item?.cycles;\n if (!Array.isArray(cycles)) return [];\n\n return cycles.flatMap((cycle: { id?: unknown; name?: unknown } | null) => {\n const id = normalizeCycleId(cycle?.id);\n const name = typeof cycle?.name === 'string' ? cycle.name.trim() : '';\n return id === null || !name ? [] : [{ id, name }];\n });\n}\n\n/**\n * `queryParams` linku tagu — lista artykułów zawężona do cyklu, w formacie\n * `?filter=` czytanym przez listę (`filter[cycles][]=<id>` w API).\n */\nexport function cycleFilterQueryParams(tag: IArticleCycleTag): {\n filter: string;\n} {\n return {\n filter: JSON.stringify([\n { name: 'cycles', data: [{ id: tag.id, value: tag.name }] },\n ]),\n };\n}\n\n/** Źródło pastylki karty: cykl (reguła projektu) albo słowo kluczowe. */\nexport type ArticleCardTagSource = 'cycles' | 'keywords';\n\n/** Pastylka karty artykułu z polem filtra, do którego prowadzi jej link. */\nexport interface IArticleCardTag extends IArticleCycleTag {\n source: ArticleCardTagSource;\n}\n\n/**\n * Pastylki karty artykułu: wyłącznie `cycles[]` („Opis pól”, MOB-1823 —\n * „cycles: name, kolejne w pastylkach”). Zapas `keywords[]` z MOB-1604\n * zniknął: dokument go nie przewiduje, a reguła „`null`/puste → nie\n * pokazujemy całej kategorii” chowa wiersz tagów, gdy artykuł nie ma cykli.\n */\nexport function articleCardTags(\n item: { cycles?: unknown } | null | undefined,\n): IArticleCardTag[] {\n return articleCycleTags(item).map((tag) => ({ ...tag, source: 'cycles' }));\n}\n\n/**\n * `queryParams` linku pastylki — lista zawężona do cyklu\n * (`filter[cycles][]=<id>`) albo słowa kluczowego (`filter[keywords][]=<id>`).\n */\nexport function cardTagFilterQueryParams(tag: IArticleCardTag): {\n filter: string;\n} {\n return {\n filter: JSON.stringify([\n { name: tag.source, data: [{ id: tag.id, value: tag.name }] },\n ]),\n };\n}\n\n/** Pastylki karty po dopasowaniu do miejsca: widoczne i liczba pominiętych. */\nexport interface IFittedCardTags {\n visible: IArticleCardTag[];\n hidden: number;\n}\n\n/** Odstęp między pastylkami (`gap-2`). */\nconst TAG_GAP = 8;\n/** Padding 12 + 12 i obrys 1 + 1 pastylki (`smart-px-3 smart-border`). */\nconst TAG_CHROME = 26;\n/** Etykieta przycina się na 18rem (`smart-max-w-[18rem]`). */\nconst TAG_MAX_LABEL = 288;\n\n/**\n * Zachowawcza szerokość etykiety Open Sans 14 / tracking 0,5 px. Pomiar\n * w Chromium 2026-10-06: 7,2–8,1 px na znak dla zwykłych słów, 13,4 dla „W”\n * — wolimy przeszacować (pastylka spadnie do „+N”) niż wyjść poza blok.\n */\nexport function estimateTagWidth(label: string): number {\n let width = 0;\n for (const char of label) {\n if (char === ' ') width += 4.5;\n else if ('WMwm'.includes(char)) width += 13.5;\n else if (char !== char.toLowerCase()) width += 11;\n else if ('iljtfr.,:;!|'.includes(char)) width += 5;\n else if (/[\\d+#&%]/.test(char)) width += 9;\n else width += 8.2;\n }\n return TAG_CHROME + Math.min(TAG_MAX_LABEL, Math.ceil(width));\n}\n\n/**\n * Ile pastylek zmieści się w `maxRows` wierszach o szerokości `rowWidth`\n * (MOB-1604, recenzja): liczone PRZED renderem, więc w DOM nie ma linków\n * ukrytych przez `overflow` (fokus nie trafia w niewidoczne elementy).\n * Nadmiar zastępuje pastylka „+N” — jej szerokość jest rezerwowana\n * w ostatnim wierszu.\n */\nexport function fitCardTags(\n tags: IArticleCardTag[],\n rowWidth: number,\n maxRows = 2,\n): IFittedCardTags {\n const place = (widths: number[]): number => {\n let rows = widths.length ? 1 : 0;\n let used = 0;\n for (const width of widths) {\n const next = used === 0 ? width : used + TAG_GAP + width;\n if (next <= rowWidth) {\n used = next;\n } else {\n rows += 1;\n used = width;\n }\n }\n return rows;\n };\n\n const widths = tags.map((tag) => estimateTagWidth(tag.name));\n if (place(widths) <= maxRows) return { visible: tags, hidden: 0 };\n\n for (let count = tags.length - 1; count >= 0; count--) {\n const more = estimateTagWidth(`+${tags.length - count}`);\n if (place([...widths.slice(0, count), more]) <= maxRows) {\n return { visible: tags.slice(0, count), hidden: tags.length - count };\n }\n }\n return { visible: [], hidden: tags.length };\n}\n\n/** A tag of the list's tag bar with the filter field it toggles. */\nexport type IArticleFilterTag = IDictionaryEntry & {\n source?: ArticleCardTagSource;\n};\n\n/**\n * Tag key `${source}:${id}` — cycle and keyword ids are separate domains, so\n * an id alone may repeat. Route ids are strings, dictionary ids numbers:\n * `'7'` and `7` give the same key.\n */\nexport function articleFilterTagKey(tag: {\n id?: unknown;\n source?: ArticleCardTagSource;\n}): string {\n const id =\n typeof tag.id === 'string' && tag.id.trim() !== '' && !isNaN(Number(tag.id))\n ? Number(tag.id)\n : tag.id;\n return `${tag.source ?? 'cycles'}:${String(id)}`;\n}\n\n/**\n * Polish plural form of a minute count for the reading time\n * (`ARTICLES.readingTime.one|few|many`).\n */\nexport function readingTimeForm(minutes: number): 'one' | 'few' | 'many' {\n if (minutes === 1) return 'one';\n const lastDigit = minutes % 10;\n const lastTwo = minutes % 100;\n return lastDigit >= 2 && lastDigit <= 4 && (lastTwo < 12 || lastTwo > 14)\n ? 'few'\n : 'many';\n}\n","import { computed, Directive, inject, input } from '@angular/core';\n\nimport { FileUrlService } from '@smartsoft001-mobilems/angular';\nimport { Article, ArticleKeyword } from '@smartsoft001-mobilems/articles-domain';\n\nimport {\n articleCardTags,\n articleCycleTags,\n cardTagFilterQueryParams,\n IArticleCardTag,\n IArticleCycleTag,\n} from '../tools/article-tags';\n\n/** A list card article: the API list item with its slug, authors and cycles. */\nexport type IArticleCardItem = Article & {\n slug?: string;\n authors?: Array<{ id?: number; name?: string | null }> | null;\n cycles?: unknown;\n};\n\n/**\n * Logic of an article list card (grid or list row): image with the\n * placeholder, description, authors, cycle and keyword tags with their list\n * links. The card keeps its template, e.g. `fitCardTags(tags(), 400)`.\n */\n@Directive()\nexport abstract class ArticleCardBaseComponent {\n protected readonly fileUrlService = inject(FileUrlService);\n\n readonly item = input<IArticleCardItem | undefined>(undefined);\n\n /** Placeholder image when the article has none. */\n protected readonly placeholderImage: string = '/gfx/no-image.png';\n\n readonly imageSrc = computed(() => {\n const item = this.item();\n return item\n ? this.fileUrlService.get(item.image, 'cache', this.placeholderImage)\n : '';\n });\n\n readonly description = computed(() => this.item()?.shortDescription || '');\n\n /** Authors, comma separated; nameless entries are dropped. */\n readonly authorsText = computed(() =>\n (this.item()?.authors ?? [])\n .map((author) => author?.name?.trim())\n .filter((name): name is string => !!name)\n .join(', '),\n );\n\n readonly cycles = computed<IArticleCycleTag[]>(() =>\n articleCycleTags(this.item()),\n );\n\n /** Card tags — cycles only; none = no tag row. */\n readonly tags = computed<IArticleCardTag[]>(() =>\n articleCardTags(this.item()),\n );\n\n readonly keywords = computed<ArticleKeyword[]>(\n () => this.item()?.keywords ?? [],\n );\n\n /** `queryParams` of a tag link — the list narrowed to the cycle/keyword. */\n tagQueryParams(tag: IArticleCardTag): { filter: string } {\n return cardTagFilterQueryParams(tag);\n }\n\n /** `queryParams` of a keyword link; `{}` for a nameless keyword. */\n keywordQueryParams(keyword: ArticleKeyword): { filter?: string } {\n const name = keyword?.name;\n return name\n ? cardTagFilterQueryParams({\n id: keyword.id as unknown as number,\n name,\n source: 'keywords',\n })\n : {};\n }\n}\n","import { computed, inject, Signal } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { catchError, map, of } from 'rxjs';\n\nimport {\n DataService,\n ICatalog,\n IDictionaryEntry,\n normalizeCycleId,\n} from '@smartsoft001-mobilems/angular';\n\nimport { articleFilterTagKey, IArticleFilterTag } from '../tools/article-tags';\n\n/** Query key of the theme tags — cycles (`filter[cycles][]=<id>`). */\nexport const ARTICLE_CYCLES_FILTER_KEY = 'cycles';\n\n/**\n * Query key of a keyword from the route (`filter[keywords][]=<id>`) — links\n * from older card tags. The tag bar has no keyword dictionary, so an active\n * keyword shows as a selected tag that can be unselected.\n */\nexport const ARTICLE_KEYWORDS_FILTER_KEY = 'keywords';\n\nexport interface IArticleCycleTags {\n /** The whole `Cycle` dictionary, named entries only; `[]` on an API error. */\n readonly dictionary: Signal<IDictionaryEntry[]>;\n /** Active keywords as selected tags. */\n readonly keywordTags: Signal<IArticleFilterTag[]>;\n /** Active cycles the dictionary did not return (deep link, API error). */\n readonly missingCycleTags: Signal<IArticleFilterTag[]>;\n /** Tag bar: active keywords, active cycles outside the dictionary, dictionary. */\n readonly barTags: Signal<IArticleFilterTag[]>;\n readonly selectedCycleIds: Signal<number[]>;\n /** Selection of the bar by `articleFilterTagKey`. */\n readonly selectedKeys: Signal<string[]>;\n /** Toggles the tag in its own field (`cycles` or `keywords`). */\n toggle(tag: IArticleFilterTag): void;\n}\n\n/**\n * Theme tag bar of an articles list (cycles + keywords). Call in an injection\n * context; the dictionary is loaded once per instance.\n */\nexport function createArticleCycleTags(catalog: ICatalog): IArticleCycleTags {\n const dictionary = toSignal(\n inject(DataService)\n .loadCycleTags()\n .pipe(\n map((items) => items.filter((item) => !!item?.name?.trim())),\n catchError(() => of([] as IDictionaryEntry[])),\n ),\n { initialValue: [] as IDictionaryEntry[] },\n );\n\n const keywordTags = computed<IArticleFilterTag[]>(() =>\n catalog\n .queryItems(ARTICLE_KEYWORDS_FILTER_KEY)\n .filter(\n (item) => normalizeCycleId(item?.id) !== null && !!item?.name?.trim(),\n )\n .map((item) => ({ ...item, source: 'keywords' as const })),\n );\n\n const missingCycleTags = computed<IArticleFilterTag[]>(() => {\n const known = new Set(\n dictionary().map((item) => normalizeCycleId(item.id)),\n );\n const seen = new Set<number>();\n return catalog.queryItems(ARTICLE_CYCLES_FILTER_KEY).flatMap((item) => {\n const id = normalizeCycleId(item?.id);\n const name = typeof item?.name === 'string' ? item.name.trim() : '';\n if (id === null || !name || known.has(id) || seen.has(id)) {\n return [];\n }\n seen.add(id);\n return [{ ...item, id, name, source: 'cycles' as const }];\n });\n });\n\n const selectedCycleIds = computed<number[]>(() =>\n catalog\n .queryItems(ARTICLE_CYCLES_FILTER_KEY)\n .map((item) => normalizeCycleId(item.id))\n .filter((id): id is number => id !== null),\n );\n\n return {\n dictionary,\n keywordTags,\n missingCycleTags,\n barTags: computed(() => [\n ...keywordTags(),\n ...missingCycleTags(),\n ...dictionary().map((item) => ({ ...item, source: 'cycles' as const })),\n ]),\n selectedCycleIds,\n selectedKeys: computed(() => [\n ...selectedCycleIds().map((id) =>\n articleFilterTagKey({ id, source: 'cycles' }),\n ),\n ...keywordTags().map((tag) => articleFilterTagKey(tag)),\n ]),\n toggle: (tag) => {\n const key =\n tag.source === ARTICLE_KEYWORDS_FILTER_KEY\n ? ARTICLE_KEYWORDS_FILTER_KEY\n : ARTICLE_CYCLES_FILTER_KEY;\n const { source: _source, ...plain } = tag;\n catalog.toggleQueryItem(key, plain as IDictionaryEntry);\n },\n };\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n computed,\n Directive,\n effect,\n inject,\n PLATFORM_ID,\n Signal,\n} from '@angular/core';\nimport { toObservable, toSignal } from '@angular/core/rxjs-interop';\nimport { distinctUntilChanged, map, of, switchMap } from 'rxjs';\n\nimport {\n decodeHtmlEntities,\n FileUrlService,\n ISeoMetadata,\n MuseumSeoService,\n PARENT_TITLE_TOKEN,\n stripHtml,\n} from '@smartsoft001-mobilems/angular';\nimport { Article } from '@smartsoft001-mobilems/articles-domain';\nimport { ArticleWidget } from '@smartsoft001-mobilems/models';\n\nimport { ArticlesItemComponent } from '../pages/item/item.component';\nimport {\n ArticlesService,\n IArticleRelated,\n IArticleRelatedCard,\n} from '../services/articles/articles.service';\nimport { articleCycleTags, IArticleCycleTag } from '../tools/article-tags';\n\n/** Article fields of `GET article/:id` the framework model does not declare. */\nexport type IArticleDetails = Article & {\n authors?: Array<{ id?: number; name?: string | null }> | null;\n cycles?: Array<{ id: number; name: string }> | null;\n estimatedReadingTime?: number | null;\n};\n\n/**\n * Base of an article details page: SEO (also during SSR, via\n * `MuseumSeoService.applyForSsr`), the parent title for widget downloads,\n * scroll to top and the visit counter on every loaded article, sorted\n * widgets, plain title, lead, authors and cycle tags. The page provides\n * `PARENT_TITLE_TOKEN` (`useFactory: () => signal('')`) and its template.\n */\n@Directive()\nexport abstract class ArticleDetailsBaseComponent extends ArticlesItemComponent {\n protected readonly fileUrlService = inject(FileUrlService);\n protected readonly museumSeoService = inject(MuseumSeoService);\n protected readonly articlesService = inject(ArticlesService);\n private readonly detailsParentTitle = inject(PARENT_TITLE_TOKEN);\n private readonly detailsPlatformId = inject(PLATFORM_ID);\n\n /** Translation key of the site name in the SEO title. */\n protected siteNameKey = 'MODEL.mainTitle';\n\n protected readonly article = computed(\n () => this.item() as IArticleDetails | undefined,\n );\n\n /** Bottom widgets by `position` (stable; without a position last). */\n readonly widgets = computed<ArticleWidget[]>(() =>\n sortByPosition(this.item()?.bottomWidgets ?? []),\n );\n\n /** Title without markup — the API returns `<p>…</p>`. */\n readonly altTitle = computed<string>(() =>\n decodeHtmlEntities(stripHtml(this.item()?.title ?? '')).trim(),\n );\n\n /** `shortDescription` when it has text, else `''`. */\n readonly lead = computed<string>(() => {\n const text = this.item()?.shortDescription ?? '';\n return stripHtml(text).trim() ? text : '';\n });\n\n readonly authorsText = computed<string>(() =>\n (this.article()?.authors ?? [])\n .map((author) => author?.name?.trim())\n .filter(Boolean)\n .join(', '),\n );\n\n readonly cycleTags = computed<IArticleCycleTag[]>(() =>\n articleCycleTags(this.article()),\n );\n\n /** Rounded `estimatedReadingTime` in minutes, `0` when unknown. */\n readonly readingMinutes = computed<number>(() =>\n Math.round(Number(this.article()?.estimatedReadingTime) || 0),\n );\n\n protected constructor() {\n super();\n\n this.museumSeoService.applyForSsr(() => this.detailsFetchSsrSeo());\n\n effect(() => {\n const item = this.item();\n if (!item) return;\n\n this.detailsParentTitle.set(this.altTitle());\n this.museumSeoService.apply(this.buildSeoMetadata(item));\n\n if (isPlatformBrowser(this.detailsPlatformId)) {\n window.scrollTo({ top: 0, behavior: 'instant' });\n void this.articlesService.logVisit(item.id).catch(() => undefined);\n }\n });\n }\n\n /** SEO of the article: `<title> - <site>`, description, image. */\n protected buildSeoMetadata(item: Article): ISeoMetadata {\n const title = decodeHtmlEntities(stripHtml(item.title)).trim();\n return {\n title: `${title} - ${this.translationService.get(this.siteNameKey)}`,\n description: item.shortDescription\n ? decodeHtmlEntities(stripHtml(item.shortDescription)).trim()\n : undefined,\n image: item.image ? this.fileUrlService.get(item.image) : undefined,\n imageAlt: title,\n type: 'article',\n };\n }\n\n private async detailsFetchSsrSeo(): Promise<ISeoMetadata | null> {\n const id = this.route.snapshot.paramMap.get('id');\n if (!id) return null;\n try {\n const item = await this.articlesService.getById(id);\n return item ? this.buildSeoMetadata(item) : null;\n } catch {\n return null;\n }\n }\n}\n\n/**\n * „Related” module of a details page — `GET article/:id/related` for the\n * current article, empty groups before the first answer. Call in an\n * injection context, e.g. a field of an `ArticleDetailsBaseComponent`.\n */\nexport function createArticleRelated<\n O extends IArticleRelatedCard = IArticleRelatedCard,\n C extends IArticleRelatedCard = IArticleRelatedCard,\n A extends IArticleRelatedCard = IArticleRelatedCard,\n>(\n articleId: Signal<string | number | null | undefined>,\n): Signal<IArticleRelated<O, C, A>> {\n const service = inject(ArticlesService);\n const empty: IArticleRelated<O, C, A> = {\n objects: [],\n collections: [],\n articles: [],\n };\n return toSignal(\n toObservable(articleId).pipe(\n distinctUntilChanged(),\n switchMap((id) =>\n id !== undefined && id !== null\n ? service.getRelated<O, C, A>(id)\n : of(empty),\n ),\n map((related) => related ?? empty),\n ),\n { initialValue: empty },\n );\n}\n\n/** Like lodash `sortBy(items, 'position')`: stable, missing positions last. */\nexport function sortByPosition<T extends { position?: number | null }>(\n items: readonly T[],\n): T[] {\n return [...items].sort((a, b) => {\n const left = a?.position;\n const right = b?.position;\n if (left == null && right == null) return 0;\n if (left == null) return 1;\n if (right == null) return -1;\n return left - right;\n });\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n Directive,\n effect,\n ElementRef,\n inject,\n PLATFORM_ID,\n viewChild,\n} from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ListMode } from '@smartsoft001/angular';\nimport { capitalize } from '@smartsoft001/utils';\n\nimport {\n createCatalog,\n ICatalog,\n ICatalogOptions,\n ICatalogSort,\n MuseumSeoService,\n} from '@smartsoft001-mobilems/angular';\n\nimport { ArticlesListComponent } from '../pages/list/list.component';\n\n/** List SEO: `<title> - <site>`, description and canonical url. */\nexport interface IArticlesCatalogSeo {\n /** Translation key of the page title, e.g. `PAGE_TITLES.articles`. */\n titleKey: string;\n /** Translation key of the description, e.g. `ARTICLES.metaDescription`. */\n descriptionKey: string;\n /** Translation key of the site name. Default `MODEL.mainTitle`. */\n siteNameKey?: string;\n /** Canonical url of the list, e.g. `/artykuly`. */\n url: string;\n}\n\nexport interface IArticlesCatalogOptions extends Omit<\n ICatalogOptions,\n 'facade'\n> {\n /** Applied on creation, skipped in a search tab. */\n seo?: IArticlesCatalogSeo;\n}\n\n/**\n * Base of an articles list page on the shared catalog engine\n * (`createCatalog`): first read, persistence, sort/size/page, query helpers\n * and the read guard come from `catalog`; the page keeps its template.\n *\n * ```ts\n * export class ListComponent extends ArticlesCatalogBaseComponent {\n * constructor() {\n * super({ defaults, persistKey: 'ARTICLES', listPath: '/artykuly', searchTab: 'artykuly' });\n * }\n * }\n * ```\n *\n * A `#listContainer` element in the template is scrolled to after a page\n * change from the bottom pagination (`bottomPageChange`).\n */\n@Directive()\nexport abstract class ArticlesCatalogBaseComponent extends ArticlesListComponent {\n readonly ListMode = ListMode;\n protected readonly catalog: ICatalog;\n protected readonly translateService = inject(TranslateService);\n private readonly catalogSeoService = inject(MuseumSeoService);\n private readonly catalogPlatformId = inject(PLATFORM_ID);\n private readonly catalogListContainer =\n viewChild<ElementRef<HTMLElement>>('listContainer');\n private catalogScrollAfterLoad = false;\n\n protected constructor(options: IArticlesCatalogOptions) {\n super();\n const { seo, ...catalogOptions } = options;\n this.catalog = createCatalog({ ...catalogOptions, facade: this.facade });\n\n // After a page change from the bottom pagination scroll to the list top\n // once the data has loaded.\n effect(() => {\n const loading = this.catalog.isLoading();\n if (\n !loading &&\n this.catalogScrollAfterLoad &&\n isPlatformBrowser(this.catalogPlatformId)\n ) {\n this.catalogScrollAfterLoad = false;\n setTimeout(() =>\n this.catalogListContainer()?.nativeElement.scrollIntoView({\n behavior: 'smooth',\n block: 'start',\n }),\n );\n }\n });\n\n if (seo) this.applyListSeo(seo);\n }\n\n /** The list root element (`#listContainer`), e.g. to move focus. */\n protected get listContainerElement(): HTMLElement | undefined {\n return this.catalogListContainer()?.nativeElement;\n }\n\n onSortChange(sort: ICatalogSort): void {\n this.catalog.setSort(sort);\n }\n\n /** Sort by key (`title-asc`, `random`). */\n sortChange(key: string): void {\n this.catalog.setSortKey(key);\n }\n\n onLimitChange(limit: number | string): void {\n this.catalog.setLimit(limit);\n }\n\n pageChange(page: number): void {\n this.catalog.setPage(page);\n }\n\n bottomPageChange(page: number): void {\n this.catalogScrollAfterLoad = true;\n this.pageChange(page);\n }\n\n onListModeChange(mode: ListMode): void {\n this.catalog.setListMode(mode);\n }\n\n onFilterBarSearch(phrase: string): void {\n this.catalog.search(phrase);\n }\n\n retryLoad(): void {\n this.catalog.retry();\n }\n\n clearAllFilters(): void {\n this.catalog.clearAll();\n }\n\n /**\n * Full list meta (title, description, canonical, og), not in a search tab —\n * the canonical url of the list must not point at a phrase url.\n */\n protected applyListSeo(seo: IArticlesCatalogSeo): void {\n if (this.catalog.searchEnabled()) return;\n\n const t = (key: string) => capitalize(this.translateService.instant(key));\n this.catalogSeoService.apply({\n title: `${t(seo.titleKey)} - ${t(seo.siteNameKey ?? 'MODEL.mainTitle')}`,\n description: t(seo.descriptionKey),\n type: 'website',\n url: seo.url,\n });\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["smartInitialState","smartGetReducer"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -377,8 +377,8 @@ declare abstract class ArticleDetailsBaseComponent extends ArticlesItemComponent
|
|
|
377
377
|
protected readonly fileUrlService: FileUrlService;
|
|
378
378
|
protected readonly museumSeoService: MuseumSeoService;
|
|
379
379
|
protected readonly articlesService: ArticlesService;
|
|
380
|
-
private readonly
|
|
381
|
-
private readonly
|
|
380
|
+
private readonly detailsParentTitle;
|
|
381
|
+
private readonly detailsPlatformId;
|
|
382
382
|
/** Translation key of the site name in the SEO title. */
|
|
383
383
|
protected siteNameKey: string;
|
|
384
384
|
protected readonly article: Signal<IArticleDetails>;
|
|
@@ -395,7 +395,7 @@ declare abstract class ArticleDetailsBaseComponent extends ArticlesItemComponent
|
|
|
395
395
|
protected constructor();
|
|
396
396
|
/** SEO of the article: `<title> - <site>`, description, image. */
|
|
397
397
|
protected buildSeoMetadata(item: Article): ISeoMetadata;
|
|
398
|
-
private
|
|
398
|
+
private detailsFetchSsrSeo;
|
|
399
399
|
static ɵfac: i0.ɵɵFactoryDeclaration<ArticleDetailsBaseComponent, never>;
|
|
400
400
|
static ɵdir: i0.ɵɵDirectiveDeclaration<ArticleDetailsBaseComponent, never, never, {}, {}, never, never, true, never>;
|
|
401
401
|
}
|
|
@@ -445,10 +445,10 @@ declare abstract class ArticlesCatalogBaseComponent extends ArticlesListComponen
|
|
|
445
445
|
readonly ListMode: typeof ListMode;
|
|
446
446
|
protected readonly catalog: ICatalog;
|
|
447
447
|
protected readonly translateService: TranslateService;
|
|
448
|
-
private readonly
|
|
449
|
-
private readonly
|
|
450
|
-
private readonly
|
|
451
|
-
private
|
|
448
|
+
private readonly catalogSeoService;
|
|
449
|
+
private readonly catalogPlatformId;
|
|
450
|
+
private readonly catalogListContainer;
|
|
451
|
+
private catalogScrollAfterLoad;
|
|
452
452
|
protected constructor(options: IArticlesCatalogOptions);
|
|
453
453
|
/** The list root element (`#listContainer`), e.g. to move focus. */
|
|
454
454
|
protected get listContainerElement(): HTMLElement | undefined;
|