@smartsoft001-mobilems/articles-shell-angular 2.109.0 → 2.110.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.parentTitle = inject(PARENT_TITLE_TOKEN);
616
- this.platformId = inject(PLATFORM_ID);
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.fetchSsrSeo());
643
+ this.museumSeoService.applyForSsr(() => this.detailsFetchSsrSeo());
644
644
  effect(() => {
645
645
  const item = this.item();
646
646
  if (!item)
647
647
  return;
648
- this.parentTitle.set(this.altTitle());
648
+ this.detailsParentTitle.set(this.altTitle());
649
649
  this.museumSeoService.apply(this.buildSeoMetadata(item));
650
- if (isPlatformBrowser(this.platformId)) {
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 fetchSsrSeo() {
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.museumSeoService = inject(MuseumSeoService);
740
- this.platformId = inject(PLATFORM_ID);
741
- this.listContainer = viewChild('listContainer', /* @ts-ignore */
742
- ...(ngDevMode ? [{ debugName: "listContainer" }] : /* istanbul ignore next */ []));
743
- this.scrollToListAfterLoad = false;
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.scrollToListAfterLoad &&
752
- isPlatformBrowser(this.platformId)) {
753
- this.scrollToListAfterLoad = false;
754
- setTimeout(() => this.listContainer()?.nativeElement.scrollIntoView({
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.listContainer()?.nativeElement;
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.scrollToListAfterLoad = true;
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.museumSeoService.apply({
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: "listContainer", first: true, predicate: ["listContainer"], descendants: true, isSignal: true }], usesInheritance: true, ngImport: i0 }); }
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: { listContainer: [{ type: i0.ViewChild, args: ['listContainer', { isSignal: true }] }] } });
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":"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"}
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smartsoft001-mobilems/articles-shell-angular",
3
- "version": "2.109.0",
3
+ "version": "2.110.0",
4
4
  "description": "This library was generated with [Nx](https://nx.dev).",
5
5
  "repository": {
6
6
  "type": "git",
@@ -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 parentTitle;
381
- private readonly platformId;
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 fetchSsrSeo;
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 museumSeoService;
449
- private readonly platformId;
450
- private readonly listContainer;
451
- private scrollToListAfterLoad;
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;