@smartsoft001-mobilems/objects-shell-angular 2.129.0 → 2.130.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.
@@ -1 +1 @@
1
- {"version":3,"file":"smartsoft001-mobilems-objects-shell-angular.mjs","sources":["../../../../../../packages/objects/shell/angular/src/lib/services/objects/objects.service.ts","../../../../../../packages/objects/shell/angular/src/lib/+state/objects.facade.ts","../../../../../../packages/objects/shell/angular/src/lib/+state/objects.reducer.ts","../../../../../../packages/objects/shell/angular/src/lib/components/list/list.component.ts","../../../../../../packages/objects/shell/angular/src/lib/components/list/list.component.html","../../../../../../packages/objects/shell/angular/src/lib/components/filters/filters.component.ts","../../../../../../packages/objects/shell/angular/src/lib/components/filters/filters.component.html","../../../../../../packages/objects/shell/angular/src/lib/components/components.module.ts","../../../../../../packages/objects/shell/angular/src/lib/services/objects-data/objects-data.service.ts","../../../../../../packages/objects/shell/angular/src/lib/services/object-media/object-media.service.ts","../../../../../../packages/objects/shell/angular/src/lib/services/index.ts","../../../../../../packages/objects/shell/angular/src/lib/objects.module.ts","../../../../../../packages/objects/shell/angular/src/lib/objects-shared.module.ts","../../../../../../packages/objects/shell/angular/src/lib/+state/objects.selectors.ts","../../../../../../packages/objects/shell/angular/src/lib/pages/list/list.component.ts","../../../../../../packages/objects/shell/angular/src/lib/pages/item/item.component.ts","../../../../../../packages/objects/shell/angular/src/lib/models/objects-filters.model.ts","../../../../../../packages/objects/shell/angular/src/lib/catalog/objects-catalog-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/catalog/object-details-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/tools/object-detail.ts","../../../../../../packages/objects/shell/angular/src/lib/tools/ask-about-object.ts","../../../../../../packages/objects/shell/angular/src/lib/filters/objects-advanced-filters-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/filters/objects-filter-tools.ts","../../../../../../packages/objects/shell/angular/src/lib/filters/objects-filters-bar-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/filters/objects-search-panel-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/filters/objects-share-results-base.component.ts","../../../../../../packages/objects/shell/angular/src/smartsoft001-mobilems-objects-shell-angular.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { CrudBaseService } from '@smartsoft001-mobilems/angular';\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\n@Injectable()\nexport class ObjectsService extends CrudBaseService<MsObject> {\n getUrlNameForDetails(): string {\n return 'object';\n }\n\n getUrlNameForList(): string {\n return 'Object';\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { CrudFacade } from '@smartsoft001/crud-shell-angular';\n\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nimport { ObjectsService } from '../services/objects/objects.service';\n\n@Injectable()\nexport class ObjectsFacade extends CrudFacade<MsObject> {\n protected service = inject(ObjectsService);\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 { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\n// import {objectsFacade} from \"./objects.facade\";\n\nexport type State = SmartState<MsObject>;\n\nexport const initialState = {\n ...smartInitialState,\n};\n\nconst objectsReducer = (state = initialState, action: any) => {\n switch (action.type) {\n //case objectsFacade.name + ' test':\n // return {\n // ...state,\n // loaded: false,\n // }\n\n default:\n return smartGetReducer('objects')(state, action);\n }\n};\n\nexport function getReducer() {\n return (state: any, action: Action) => {\n return objectsReducer(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 { ObjectsFacade } from '../../+state/objects.facade';\n\n@Component({\n selector: 'smart-mobilems-objects-list',\n templateUrl: './list.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [NgTemplateOutlet],\n})\nexport class ListComponent {\n private facade = inject(ObjectsFacade);\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 { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\n@Component({\n selector: 'smart-mobilems-objects-filters',\n templateUrl: './filters.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [NgTemplateOutlet],\n})\nexport class FiltersComponent extends FiltersBaseComponent<MsObject> {}\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 { isPlatformServer } from '@angular/common';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { inject, Injectable, isDevMode, PLATFORM_ID } from '@angular/core';\nimport {\n catchError,\n expand,\n firstValueFrom,\n from,\n map,\n mergeMap,\n Observable,\n of,\n reduce,\n retry,\n switchMap,\n tap,\n throwError,\n timer,\n toArray,\n} from 'rxjs';\n\nimport {\n DICTIONARY_PAGE_SIZE,\n type IDictionaryEntry,\n type IDictionaryPage,\n} from '@smartsoft001-mobilems/angular';\n\nimport { ObjectsService } from '../objects/objects.service';\n\n/** Pause before the only retry of `related` after a network error (ms). */\nconst RELATED_RETRY_DELAY = 500;\n\n/** Response of `GET object/:id/related`. */\nexport interface IObjectRelated {\n objects: Array<{ id: number | string }>;\n collections: Array<{ id: number | string }>;\n articles: Array<{ id: number | string }>;\n}\n\n/**\n * A public (thematic) collection from the `GET public-collections/page/{n}`\n * list — as much as the object card (\"Related collections\") and the filters\n * panel need.\n */\nexport interface IObjectCollectionSummary {\n id: number | string;\n title: string;\n publicationDate: string | null;\n /** Number of objects in the collection — the page size of the membership check. */\n itemCount: number | null;\n}\n\ninterface IPublicCollectionsPageResponse {\n data?: {\n items?: Array<{\n id: number | string;\n title?: string | null;\n publicationDate?: string | null;\n itemCount?: number | null;\n }> | null;\n paginatorDetails?: { totalPagesCount?: number | null } | null;\n } | null;\n}\n\ninterface IObjectIdsPageResponse {\n data?: {\n items?: Array<{ id: number | string }> | null;\n paginatorDetails?: { totalPagesCount?: number | null } | null;\n } | null;\n}\n\n/** Page size of the public collections list (the API accepts up to 500). */\nconst PUBLIC_COLLECTIONS_PAGE_SIZE = 100;\n\n/**\n * Segregations of the `ArchaeologicalData` dictionary — per the MobileMS task\n * (Kanbanize 50040, MOB-1844): site towns, periods (epochs) and cultures.\n */\nexport type ArchaeologicalSegregation =\n 'ArcheoTown' | 'ArcheoPeriod' | 'ArcheoCulture';\n\ninterface IDictionaryPageResponse {\n data?: {\n items?: IDictionaryEntry[];\n paginatorDetails?: { totalPagesCount?: number };\n } | null;\n}\n\n/** Page size of `search/Object` when checking an object's membership. */\nconst COLLECTION_OBJECTS_PAGE_SIZE = 500;\n/** How many collections are checked at once (API 429 limit). */\nconst COLLECTION_LOOKUP_CONCURRENCY = 4;\n\n/**\n * The API answers 404 `NO_RESULTS_FOR_GIVEN_QUERY` instead of an empty list —\n * only that 404 means \"no results\"; any other 404 (wrong address, proxy) is an error.\n */\nconst isNoResults = (error: HttpErrorResponse): boolean =>\n error?.status === 404 &&\n (error.error as { message?: string } | null)?.message ===\n 'NO_RESULTS_FOR_GIVEN_QUERY';\n\n/**\n * `ObjectsService` plus the reads of the object details page and the filter\n * dictionaries. A subclass, so `ObjectsService` (the `CrudService` of the\n * objects module) stays unchanged. Request URLs, parameter order included,\n * are transfer cache keys: keep them as they are.\n */\n@Injectable()\nexport class ObjectsDataService extends ObjectsService {\n private readonly objectsDataIsServer = isPlatformServer(inject(PLATFORM_ID));\n\n /**\n * Counts a visit of the object card: `POST api/object/:id/visit`. Browser\n * only — the caller runs it under `isPlatformBrowser` and catches its errors.\n */\n logVisit(id: number | string): Promise<void> {\n const cardUrl: string = this.config.apiUrl + 'api/object/' + id + '/visit';\n return firstValueFrom(this.http.post<void>(cardUrl, {}));\n }\n\n /**\n * \"You may also be interested in\" — `GET object/:id/related` (objects,\n * collections, articles). A network error (status 0) is retried once; any\n * other error, or a second failed request, goes on to the `rxResource`\n * (error state — the section stays hidden, `reload()` retries). In dev mode\n * the error is logged, except a 404 on the server: there `related` starts\n * next to the card (MOB-1850), so a missing object gives two 404s and the\n * card view shows the error. In the browser `related` follows the card — a\n * 404 is unexpected there and stays in the console.\n */\n getRelated(id: number | string): Observable<IObjectRelated> {\n return this.http\n .get<{\n data?: Partial<IObjectRelated> | null;\n }>(`${this.config.apiUrl}object/${id}/related`)\n .pipe(\n retry({\n count: 1,\n delay: (error: HttpErrorResponse) =>\n error?.status === 0\n ? timer(RELATED_RETRY_DELAY)\n : throwError(() => error),\n }),\n map((response) => ({\n objects: response?.data?.objects ?? [],\n collections: response?.data?.collections ?? [],\n articles: response?.data?.articles ?? [],\n })),\n tap({\n error: (error: HttpErrorResponse) => {\n if (\n isDevMode() &&\n !(this.objectsDataIsServer && error?.status === 404)\n ) {\n console.error(`object/${id}/related`, error);\n }\n },\n }),\n );\n }\n\n /**\n * One page of the public collections list, newest publication first\n * (`sort=publicationDate-desc`), with the phrase in `filter[phrase]` (the\n * \"Field description\" document: \"Search in collections: filter:phrase\").\n * 404 `NO_RESULTS_FOR_GIVEN_QUERY` is an empty page, any other error propagates.\n */\n loadPublicCollectionsPage(\n page = 1,\n query?: string,\n ): Observable<{\n items: IObjectCollectionSummary[];\n totalPagesCount: number;\n }> {\n const phrase = query?.trim();\n const url =\n `${this.config.apiUrl}public-collections/page/${page}` +\n `?maxPerPage=${PUBLIC_COLLECTIONS_PAGE_SIZE}&sort=publicationDate-desc` +\n (phrase ? `&filter[phrase]=${encodeURIComponent(phrase)}` : '');\n return this.http.get<IPublicCollectionsPageResponse>(url).pipe(\n map((response) => ({\n items: (response?.data?.items ?? [])\n .filter((item) => item && item.id !== null && item.id !== undefined)\n .map((item) => ({\n id: item.id,\n title: item.title?.trim() ?? '',\n publicationDate: item.publicationDate ?? null,\n itemCount:\n typeof item.itemCount === 'number' ? item.itemCount : null,\n })),\n totalPagesCount: Math.max(\n 1,\n response?.data?.paginatorDetails?.totalPagesCount ?? 1,\n ),\n })),\n catchError((error: HttpErrorResponse) =>\n isNoResults(error)\n ? of({ items: [] as IObjectCollectionSummary[], totalPagesCount: 1 })\n : throwError(() => error),\n ),\n );\n }\n\n /**\n * Public collections as the dictionary of the \"Thematic collection\" field in\n * the advanced filters (MOB-1844): `filter[entryCollections]` in\n * `search/Object` takes ids from `public-collections`, not from the\n * `ECollection` dictionary.\n */\n loadCollectionsDictionary(\n page = 1,\n query?: string,\n ): Observable<IDictionaryPage> {\n return this.loadPublicCollectionsPage(page, query).pipe(\n map((result) => ({\n items: result.items.map((item) => ({\n id: Number(item.id),\n name: item.title,\n })),\n totalPagesCount: result.totalPagesCount,\n })),\n );\n }\n\n /**\n * Dictionary of the \"Archaeological filters\" fields (MOB-1844). In Muza it is\n * `ArchaeologicalData` segregated into `ArcheoTown|ArcheoPeriod|ArcheoCulture`\n * (Kanbanize 50040), but MobileMS exposed each segregation as its own\n * dictionary type: `dictionary/ArcheoTown/search/page/{n}` (develop\n * 2026-10-21 — the type is recognised, `ArchaeologicalData` still 409). Same\n * path and shape as the framework's `DataService.loadFilterDictionary`. Until\n * production has these types the API answers 409 and the field shows a load error.\n */\n loadArchaeologicalDictionary(\n segregation: ArchaeologicalSegregation,\n page = 1,\n query?: string,\n ): Observable<IDictionaryPage> {\n const phrase = query?.trim();\n // No phrase, no `q` — the API treats an empty `q=` as a query with no results.\n const url =\n `${this.config.apiUrl}api/dictionary/${segregation}/search/page/${page}` +\n `?maxPerPage=${DICTIONARY_PAGE_SIZE}&_type=query` +\n (phrase ? `&q=${encodeURIComponent(phrase)}` : '');\n return this.http.get<IDictionaryPageResponse>(url).pipe(\n map((response) => ({\n items: response?.data?.items ?? [],\n totalPagesCount: response?.data?.paginatorDetails?.totalPagesCount ?? 1,\n })),\n );\n }\n\n /** All public collections (consecutive pages of the list). */\n loadAllPublicCollections(): Observable<IObjectCollectionSummary[]> {\n return this.loadPublicCollectionsPage(1).pipe(\n expand((result, index) =>\n index + 2 <= result.totalPagesCount\n ? this.loadPublicCollectionsPage(index + 2)\n : [],\n ),\n reduce(\n (all, result) => [...all, ...result.items],\n [] as IObjectCollectionSummary[],\n ),\n );\n }\n\n /**\n * \"Related collections\" of the object card per the \"Field description\"\n * document: `search/Object` with `filter[entryCollections]`, sorted by\n * publication date. The API gives no reverse direction (`portalCollections`\n * and `related.collections` are empty also for objects in a collection), so\n * for each public collection we check whether its objects contain this\n * object — a few collections at a time, in list order. A collection that\n * could not be checked is skipped; a failed list means no section (an empty\n * list), not a page error.\n */\n loadRelatedCollections(\n objectId: number | string,\n ): Observable<IObjectCollectionSummary[]> {\n return this.loadAllPublicCollections().pipe(\n switchMap((collections) =>\n from(collections).pipe(\n mergeMap(\n (collection) =>\n this.objectsDataCollectionContains(collection, objectId).pipe(\n map((contains) => (contains ? collection : null)),\n ),\n COLLECTION_LOOKUP_CONCURRENCY,\n ),\n toArray(),\n map((matches) =>\n collections.filter((collection) => matches.includes(collection)),\n ),\n ),\n ),\n catchError(() => of([] as IObjectCollectionSummary[])),\n );\n }\n\n /** Whether `search/Object` with the collection's `filter[entryCollections]` contains the object; an error → unknown → `false`. */\n private objectsDataCollectionContains(\n collection: IObjectCollectionSummary,\n objectId: number | string,\n ): Observable<boolean> {\n const wanted = String(objectId);\n const pageSize = Math.min(\n COLLECTION_OBJECTS_PAGE_SIZE,\n Math.max(1, collection.itemCount ?? COLLECTION_OBJECTS_PAGE_SIZE),\n );\n const load = (page: number) =>\n this.http\n .get<IObjectIdsPageResponse>(\n `${this.config.apiUrl}search/Object/page/${page}` +\n `?maxPerPage=${pageSize}` +\n `&filter[entryCollections][]=${encodeURIComponent(String(collection.id))}`,\n )\n .pipe(\n map((response) => ({\n found: (response?.data?.items ?? []).some(\n (item) => String(item?.id) === wanted,\n ),\n totalPagesCount: Math.max(\n 1,\n response?.data?.paginatorDetails?.totalPagesCount ?? 1,\n ),\n })),\n // A collection without objects → 404 `NO_RESULTS_FOR_GIVEN_QUERY`.\n catchError((error: HttpErrorResponse) =>\n isNoResults(error)\n ? of({ found: false, totalPagesCount: 1 })\n : throwError(() => error),\n ),\n );\n return load(1).pipe(\n expand((result, index) =>\n !result.found && index + 2 <= result.totalPagesCount\n ? load(index + 2)\n : [],\n ),\n reduce((found, result) => found || result.found, false),\n catchError(() => of(false)),\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport { FileUrlService } from '@smartsoft001-mobilems/angular';\nimport { MsFile } from '@smartsoft001-mobilems/models';\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nimport { FileType, FormFeatureType } from '../../models';\n\n/** A gallery item (full size, for fullscreen). */\nexport interface IObjectGalleryItem {\n title?: string;\n image?: MsFile;\n file?: MsFile;\n}\n\n/**\n * Shared listing of an object's media (the main image + `additionalImages`\n * filtered by `formFeature`) — used by the details page image viewer\n * (MOB-1801), the hero gallery, the thumbnails and the HD images section.\n */\n@Injectable({ providedIn: 'root' })\nexport class ObjectMediaService {\n private readonly objectMediaFileUrl = inject(FileUrlService);\n\n /** Gallery items (full size, for fullscreen). */\n galleryItems(\n obj: MsObject | undefined,\n types: FormFeatureType[],\n includeMainImage = true,\n ): IObjectGalleryItem[] {\n if (!obj) return [];\n\n const out: IObjectGalleryItem[] = [];\n\n if (obj.image && includeMainImage) {\n const url = this.objectMediaFileUrl.get(obj.image);\n if (!url?.includes('assets/no-image.svg')) {\n out.push({ title: obj.title, image: obj.image });\n }\n }\n\n for (const img of this.objectMediaAdditional(obj, types)) {\n const url = this.objectMediaFileUrl.get(img as unknown as MsFile);\n if (!url?.includes('assets/no-image.svg')) {\n out.push({ title: obj.title, image: img as unknown as MsFile });\n }\n }\n\n return out;\n }\n\n /** Thumbnail URLs (`cache` mode + a forced `.jpg` for the CDN). */\n thumbnailUrls(\n obj: MsObject | undefined,\n types: FormFeatureType[],\n includeMainImage = true,\n ): string[] {\n if (!obj) return [];\n\n const urls: string[] = [];\n\n if (obj.image && includeMainImage) {\n const url = this.objectMediaJpg(\n this.objectMediaFileUrl.get(obj.image, 'cache'),\n );\n if (url && !url.includes('assets/no-image.svg')) {\n urls.push(url);\n }\n }\n\n for (const img of this.objectMediaAdditional(obj, types)) {\n const url = this.objectMediaJpg(\n this.objectMediaFileUrl.get(img as unknown as MsFile, 'cache'),\n );\n if (url && !url.includes('assets/no-image.svg')) {\n urls.push(url);\n }\n }\n\n return urls;\n }\n\n /**\n * Whether the object has files of the types (video, 3D model) — by\n * `filePath`, because `FileUrlService` returns a placeholder for\n * non-image extensions.\n */\n hasFiles(obj: MsObject | undefined, types: FormFeatureType[]): boolean {\n if (!obj) return false;\n return this.objectMediaAdditional(obj, types).some(\n (file) => !!file?.filePath,\n );\n }\n\n private objectMediaAdditional(\n obj: MsObject,\n types: FormFeatureType[],\n ): FileType[] {\n const additional = (obj as MsObject & { additionalImages?: FileType[] })\n .additionalImages;\n if (!Array.isArray(additional)) return [];\n\n return (additional as unknown as FileType[])\n .filter((img) => types.includes(img?.formFeature))\n .sort((a, b) => (a?.position ?? 0) - (b?.position ?? 0));\n }\n\n /** Replaces the extension with `.jpg` — CDN cache compatibility. */\n private objectMediaJpg(path: string): string {\n const lastDotIndex = path.lastIndexOf('.');\n if (lastDotIndex > -1) {\n return path.substring(0, lastDotIndex) + '.jpg';\n }\n return path + '.jpg';\n }\n}\n","import { CrudService } from '@smartsoft001/crud-shell-angular';\n\nimport { ObjectsService } from './objects/objects.service';\nimport { ObjectsDataService } from './objects-data/objects-data.service';\n\nexport * from './objects/objects.service';\nexport * from './objects-data/objects-data.service';\nexport * from './object-media/object-media.service';\n\nexport const SERVICES = [\n ObjectsService,\n ObjectsDataService,\n {\n provide: CrudService,\n useClass: ObjectsService,\n },\n];\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { FILE_SERVICE_CONFIG, IFileServiceConfig } from '@smartsoft001/angular';\nimport {\n CrudConfig,\n CrudCoreModule,\n CrudFullConfig,\n ICrudModuleOptionsWithoutRoutng,\n} from '@smartsoft001/crud-shell-angular';\nimport { IEntity } from '@smartsoft001/domain-core';\n\nimport {\n provideInheritedSharedConfig,\n SharedModule,\n} from '@smartsoft001-mobilems/angular';\n\nimport { ObjectsFacade } from './+state/objects.facade';\nimport { getReducer } from './+state/objects.reducer';\nimport { ComponentsModule } from './components';\nimport { SERVICES } from './services';\n\n@NgModule({\n declarations: [],\n providers: [...SERVICES, ObjectsFacade],\n imports: [SharedModule, ComponentsModule, CrudCoreModule],\n exports: [ComponentsModule],\n})\nexport class ObjectsModule {\n static forFeature<T extends IEntity<string>>(\n options: ICrudModuleOptionsWithoutRoutng<T>,\n ): ModuleWithProviders<ObjectsModule> {\n if (!options.config.reducerFactory)\n options.config.reducerFactory = getReducer;\n return {\n ngModule: ObjectsModule,\n providers: [\n provideInheritedSharedConfig(options.config.apiUrl),\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 {\n provideInheritedSharedConfig,\n SharedModule,\n} from '@smartsoft001-mobilems/angular';\n\nimport { ObjectsFacade } from './+state/objects.facade';\nimport { getReducer } from './+state/objects.reducer';\nimport { ComponentsModule } from './components';\nimport { SERVICES } from './services';\n\n@NgModule({\n declarations: [],\n providers: [...SERVICES, ObjectsFacade],\n imports: [SharedModule, ComponentsModule, CrudModule],\n exports: [ComponentsModule, CrudModule],\n})\nexport class ObjectsSharedModule {\n static forFeature<T extends IEntity<string>>(\n options: ICrudModuleOptionsWithoutRoutng<T>,\n ): ModuleWithProviders<ObjectsSharedModule> {\n if (!options.config.reducerFactory)\n options.config.reducerFactory = getReducer;\n return {\n ngModule: ObjectsSharedModule,\n providers: [\n provideInheritedSharedConfig(options.config.apiUrl),\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 './objects.reducer';\n\nexport const getObjectsState = createFeatureSelector<State>('objects');\n\n//export const getobjectsTest = createSelector(\n// getobjectsState,\n// (state) => state.test\n//);\n","import { Directive, inject, Signal } from '@angular/core';\nimport { CrudListPageBaseComponent } from '@smartsoft001/crud-shell-angular';\n\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nimport { ObjectsFacade } from '../../+state';\n\n@Directive()\nexport abstract class ObjectsListComponent extends CrudListPageBaseComponent<MsObject> {\n protected readonly facade = inject(ObjectsFacade);\n\n list = this.facade.list as Signal<MsObject[]>;\n loading = this.facade.loading;\n filter = this.facade.filter;\n}\n","import { Directive, effect, inject, signal } 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 { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nimport { ObjectsFacade } from '../../+state';\n\n@Directive()\nexport abstract class ObjectsItemComponent extends CrudItemPageBaseComponent<MsObject> {\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(ObjectsFacade);\n\n readonly loading = this.facade.loading;\n readonly item = this.facade.selected;\n /** @deprecated No museum uses it; download the card through the app's own download service. */\n readonly isPdfDownloading = signal(false);\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 /** @deprecated No museum uses it; download the card through the app's own download service. */\n async onDownload(): Promise<void> {\n this.isPdfDownloading.set(true);\n try {\n await this.facade.downloadPdf({\n id: this.item()?.id.toString() || '',\n title: this.item()?.title as string,\n });\n } catch (error) {\n console.error('PDF download failed:', error);\n } finally {\n this.isPdfDownloading.set(false);\n }\n }\n}\n","import { MsFile } from '@smartsoft001-mobilems/models';\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nexport type SortType =\n 'random' | 'date-asc' | 'date-desc' | 'name-asc' | 'name-desc';\n\nexport type IKeyValue = {\n key: string;\n value?: string;\n};\n\nexport enum AdvancedFilterType {\n CREATORS = 'creators',\n AUTHORS = 'authors',\n MATERIALS = 'materials',\n TECHNIQUES = 'techniques',\n CREATE_PLACES = 'createPlaces',\n KEYWORDS = 'keywords',\n}\n\nexport enum FormFeatureType {\n MODEL_3D = 1,\n PHOTO_360 = 2,\n IMAGES = 3,\n AUDIO = 7,\n AUDIO_DESKRYPCJA = 8,\n VIDEO = 9,\n ORTHOGRAPHY = 11,\n OTHER = 13,\n IMAGES_HD = 14,\n VIRTUAL_WALK = 15,\n ANIMATION = 20,\n}\n\nexport interface IMultimediaDictionaryItem {\n id: FormFeatureType;\n translationKey: string;\n}\n\n/**\n * Dictionary of multimedia types with their translation keys.\n * Use with TranslateService to get localized names.\n */\nexport const MULTIMEDIA_DICTIONARY: IMultimediaDictionaryItem[] = [\n {\n id: FormFeatureType.IMAGES,\n translationKey: 'OBJECTS.filters.multimedia.images',\n },\n {\n id: FormFeatureType.IMAGES_HD,\n translationKey: 'OBJECTS.filters.multimedia.galleryHD',\n },\n {\n id: FormFeatureType.MODEL_3D,\n translationKey: 'OBJECTS.filters.multimedia.model3D',\n },\n {\n id: FormFeatureType.AUDIO,\n translationKey: 'OBJECTS.filters.multimedia.audio',\n },\n {\n id: FormFeatureType.AUDIO_DESKRYPCJA,\n translationKey: 'OBJECTS.filters.multimedia.audioDescription',\n },\n {\n id: FormFeatureType.VIDEO,\n translationKey: 'OBJECTS.filters.multimedia.video',\n },\n {\n id: FormFeatureType.ANIMATION,\n translationKey: 'OBJECTS.filters.multimedia.animation',\n },\n {\n id: FormFeatureType.VIRTUAL_WALK,\n translationKey: 'OBJECTS.filters.multimedia.virtualWalk',\n },\n {\n id: FormFeatureType.OTHER,\n translationKey: 'OBJECTS.filters.multimedia.other',\n },\n];\n\nexport type FileType = Omit<MsFile, 'formFeature'> & {\n formFeature: FormFeatureType;\n};\n\ninterface Model3DFile {\n id: number;\n filePath: string;\n extension: string;\n altText: string | null;\n fileName: string;\n}\n\nexport interface IModel3DObject {\n formFeature: FormFeatureType;\n files: Model3DFile[];\n description: string | null;\n iframeSource: string | null;\n iframeHtml: string | null;\n isRemote: boolean;\n originalDimensions: string | null;\n id: number;\n position: number;\n filePath: string;\n extension: string;\n altText: string | null;\n altTextEn: string | null;\n vimeoUrl: string | null;\n}\n\nexport interface IAnimationObject {\n formFeature: FormFeatureType;\n files: MsFile[];\n description: string | null;\n iframeSource: string | null;\n iframeHtml: string | null;\n isRemote: boolean;\n originalDimensions: string | null;\n id: number;\n position: number;\n filePath: string;\n extension: string;\n altText: string | null;\n altTextEn: string | null;\n vimeoUrl: string | null;\n}\n\n// Leci z API, nie jest udokumentowane\nexport interface ISpecificObject extends MsObject {\n dimensionTextWithDuration?: string;\n specificDimensionDescription?: string;\n publicationDate?: string;\n authors?: Array<{\n id: number;\n name: string;\n role?: string;\n additionalRoles?: string[];\n comment?: string;\n }>;\n createPlaces?: Array<{\n id: number;\n name: string;\n comment?: string;\n }>;\n materials?: Array<{\n id: number;\n name: string;\n comment?: string;\n }>;\n techniques?: Array<{\n id: number;\n name: string;\n comment?: string;\n }>;\n createdAt?: string | Date;\n createDates?: Array<{\n id: number;\n name: string;\n comment?: string;\n }>;\n visited?: number;\n objectCardDownloadCount?: number;\n shareMuseumObjectMultimediaEnabled?: boolean;\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n AfterViewInit,\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n PLATFORM_ID,\n Signal,\n signal,\n untracked,\n viewChild,\n WritableSignal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ListMode, PaginationMode } from '@smartsoft001/angular';\nimport { ICrudFilter } from '@smartsoft001/crud-shell-angular';\nimport { capitalize } from '@smartsoft001/utils';\n\nimport {\n createCatalog,\n createCatalogLoadMore,\n createSafeTimeouts,\n ICatalog,\n ICatalogLoadMore,\n ICatalogOptions,\n MasonryGridComponent,\n MuseumSeoService,\n WcagChangesService,\n} from '@smartsoft001-mobilems/angular';\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nimport { ObjectsListComponent } from '../pages/list/list.component';\n\n/**\n * Filter defaults of the objects list (Muzeum Podlasia): 20 objects per page,\n * newest first. **The key order is part of the contract** — the first read\n * spreads this object first, so it shapes the facade filter, the persisted\n * `MUSEUM_OBJECTS_FILTER` value and the `#base64` hash.\n */\nexport const OBJECTS_CATALOG_DEFAULTS: ICrudFilter = {\n paginationMode: PaginationMode.singlePage,\n sortBy: 'publication-date',\n sortDesc: true,\n offset: 0,\n limit: 20,\n};\n\n/** List SEO: `<title> - <site>`, a raw description and the canonical url. */\nexport interface IObjectsCatalogSeo {\n /** Translation key of the page title, e.g. `PAGE_TITLES.objects`. */\n titleKey: string;\n /** Translation key of the description — not capitalised. */\n descriptionKey: string;\n /** Translation key of the site name. Default `MODEL.mainTitle`. */\n siteNameKey?: string;\n /** Canonical url of the list, e.g. `/obiekty`. */\n url: string;\n}\n\nexport const OBJECTS_CATALOG_SEO: IObjectsCatalogSeo = {\n titleKey: 'PAGE_TITLES.objects',\n descriptionKey: 'HOME.collectionsDescription',\n siteNameKey: 'MODEL.mainTitle',\n url: '/obiekty',\n};\n\n/** Focus target and live-region message of „więcej ↓” (load more). */\nexport interface IObjectsCatalogLoadMore {\n /** Cards inside `#listContainer`; the first appended one gets the focus. */\n itemSelector?: string;\n /** Translation key announced after a page is appended (`{ count }`). */\n loadedMoreKey?: string;\n}\n\nconst OBJECTS_CATALOG_ITEM_SELECTOR =\n '[data-testid=\"objects-grid-item-link\"], [data-testid=\"objects-list-item\"]';\nconst OBJECTS_CATALOG_LOADED_MORE_KEY = 'OBJECTS.loadedMore';\n\nexport interface IObjectsCatalogOptions extends Partial<\n Omit<ICatalogOptions, 'facade'>\n> {\n /** Applied on creation, skipped in a search tab; `null` — no SEO. */\n seo?: IObjectsCatalogSeo | null;\n loadMore?: IObjectsCatalogLoadMore;\n}\n\n/**\n * Base of an objects list page on the shared catalog engine\n * (`createCatalog`): first read (also in SSR when the route carries the\n * filter), persistence, page, search, the read guard, the mobile list mode,\n * „więcej ↓”, the masonry lifecycle and the list SEO. The page keeps its\n * template.\n *\n * ```ts\n * export class ListComponent extends ObjectsCatalogBaseComponent {\n * constructor() {\n * super();\n * }\n * }\n * ```\n *\n * The template holds a `#listContainer` element (scrolled to after a page\n * change from the bottom pagination; it holds the cards focused by load\n * more) and a `smart-mobilems-masonry-grid` in the grid mode.\n */\n@Directive()\nexport abstract class ObjectsCatalogBaseComponent\n extends ObjectsListComponent\n implements AfterViewInit\n{\n readonly ListMode = ListMode;\n protected readonly catalog: ICatalog;\n\n readonly isBrowser: Signal<boolean>;\n /** The route set the filter, so the list is read and rendered in SSR too. */\n readonly routeList: Signal<boolean>;\n readonly listMode: Signal<ListMode>;\n readonly searchEnabled: Signal<boolean | undefined>;\n readonly barPhrase: Signal<string>;\n readonly isLoading: Signal<boolean>;\n readonly hasError: Signal<unknown>;\n readonly totalCount: Signal<number>;\n /** `publication-date-desc` style key for the toolbar. */\n readonly sortKey: Signal<string | undefined>;\n readonly selectedPage: Signal<number>;\n /** `?type=new` — the page offers the newest-first sort options. */\n readonly isNewType: Signal<boolean>;\n\n /** Cards on the list — with „więcej ↓” previous pages + the current one. */\n readonly items: Signal<MsObject[]>;\n /** There are results after the current page. */\n readonly hasMore: Signal<boolean>;\n /** The next page is loading — the list stays, only the button shows it. */\n readonly isAppending: Signal<boolean>;\n /** Screen reader message after cards were appended. */\n readonly loadMoreStatus: WritableSignal<string> = signal('');\n\n private readonly objectsCatalogTranslate = inject(TranslateService);\n private readonly objectsCatalogSeoService = inject(MuseumSeoService);\n private readonly objectsCatalogWcag = inject(WcagChangesService);\n private readonly objectsCatalogBrowser = isPlatformBrowser(\n inject(PLATFORM_ID),\n );\n private readonly objectsCatalogTimeouts = createSafeTimeouts();\n private readonly objectsCatalogMasonry = viewChild(MasonryGridComponent);\n private readonly objectsCatalogListContainer =\n viewChild<ElementRef<HTMLElement>>('listContainer');\n private readonly objectsCatalogLoadMore: ICatalogLoadMore<MsObject>;\n private objectsCatalogViewReady = false;\n private objectsCatalogScrollAfterLoad = false;\n private readonly objectsCatalogQueryParams = toSignal(\n inject(ActivatedRoute).queryParams,\n );\n\n protected constructor(options: IObjectsCatalogOptions = {}) {\n super();\n const {\n seo = OBJECTS_CATALOG_SEO,\n loadMore = {},\n ...catalogOptions\n } = options;\n const defaults = catalogOptions.defaults ?? OBJECTS_CATALOG_DEFAULTS;\n\n this.catalog = createCatalog({\n persistKey: 'MUSEUM_OBJECTS_FILTER',\n listPath: '/obiekty',\n searchTab: 'obiekty',\n listModeKey: 'MUSEUM_OBJECTS_LIST_MODE',\n ssrRead: 'route',\n // Mobile mockup (2300:51189) has the grid only — the view toggle is\n // hidden below md, so a stored list view does not apply there.\n mobileListModeBelow: 768,\n ...catalogOptions,\n defaults,\n facade: this.facade,\n });\n\n this.isBrowser = this.catalog.isBrowser;\n this.routeList = this.catalog.routeList;\n this.listMode = this.catalog.listMode;\n this.searchEnabled = this.catalog.searchEnabled;\n this.barPhrase = this.catalog.barPhrase;\n this.isLoading = this.catalog.isLoading;\n this.hasError = this.catalog.hasError;\n this.totalCount = this.catalog.totalCount;\n this.sortKey = this.catalog.sortKey;\n this.selectedPage = this.catalog.selectedPage;\n this.isNewType = computed(\n () => this.objectsCatalogQueryParams()?.['type'] === 'new',\n );\n\n // „więcej ↓” (mobile mockup 2300:51213); the focus moves to the first\n // appended card, without scrolling — the new cards sit right below.\n this.objectsCatalogLoadMore = createCatalogLoadMore<MsObject>({\n list: this.list,\n filter: this.facade.filter,\n totalCount: this.totalCount,\n loading: this.isLoading,\n read: (filter) => this.facade.read(filter),\n defaultLimit: defaults.limit || 20,\n onAppended: (added, firstIndex) => {\n this.loadMoreStatus.set(\n this.objectsCatalogTranslate.instant(\n loadMore.loadedMoreKey ?? OBJECTS_CATALOG_LOADED_MORE_KEY,\n { count: added },\n ),\n );\n if (!added || !this.objectsCatalogBrowser) return;\n this.objectsCatalogTimeouts.later(\n () =>\n this.listContainerElement\n ?.querySelectorAll<HTMLElement>(\n loadMore.itemSelector ?? OBJECTS_CATALOG_ITEM_SELECTOR,\n )\n [firstIndex]?.focus({ preventScroll: true }),\n 0,\n );\n },\n });\n this.items = this.objectsCatalogLoadMore.items;\n this.hasMore = this.objectsCatalogLoadMore.hasMore;\n this.isAppending = this.objectsCatalogLoadMore.isAppending;\n\n // Every loaded card (appended pages included) goes to the page, e.g. for\n // „select all” (MOB-1661). Untracked: the hook's own reads do not re-run it.\n effect(() => {\n const items = this.items();\n untracked(() => this.onCatalogItems(items));\n });\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.isLoading();\n if (\n !loading &&\n this.objectsCatalogScrollAfterLoad &&\n this.objectsCatalogBrowser\n ) {\n this.objectsCatalogScrollAfterLoad = false;\n this.objectsCatalogTimeouts.later(\n () =>\n this.listContainerElement?.scrollIntoView({\n behavior: 'smooth',\n block: 'start',\n }),\n 0,\n );\n }\n });\n\n // Re-layout masonry on WCAG/contrast changes.\n effect(() => {\n this.objectsCatalogWcag.wcagSettingsChanged();\n\n if (!this.objectsCatalogViewReady) {\n return;\n }\n\n this.objectsCatalogDestroyMasonry();\n this.objectsCatalogInitMasonry();\n });\n\n // Re-layout masonry when the list changes.\n effect(() => {\n const items = this.items();\n const mode = this.listMode();\n\n if (items && mode === ListMode.masonryGrid) {\n this.objectsCatalogDestroyMasonry();\n this.objectsCatalogTimeouts.later(\n () => this.objectsCatalogInitMasonry(),\n 150,\n );\n }\n });\n\n // Initialise masonry once the grid component is present.\n effect(() => {\n const masonry = this.objectsCatalogMasonry();\n const mode = this.listMode();\n const items = this.items();\n\n if (masonry && mode === ListMode.masonryGrid && items?.length) {\n this.objectsCatalogTimeouts.later(\n () => this.objectsCatalogInitMasonry(),\n 250,\n );\n }\n });\n\n if (seo) this.applyListSeo(seo);\n }\n\n /** The list root element (`#listContainer`). */\n protected get listContainerElement(): HTMLElement | undefined {\n return this.objectsCatalogListContainer()?.nativeElement;\n }\n\n /**\n * „więcej ↓” — reads the next page and appends it under the current cards\n * (no scrolling, no loader in place of the list).\n */\n loadMore(): void {\n if (this.isLoading() || !this.hasMore()) {\n return;\n }\n // Cleared first, so the live region changes — and is announced — even\n // when the next page brings the same number of cards.\n this.loadMoreStatus.set('');\n this.objectsCatalogLoadMore.loadMore();\n }\n\n retryLoad(): void {\n this.catalog.retry();\n }\n\n pageChange(page: number): void {\n this.catalog.setPage(page);\n }\n\n /** Page change from the bottom pagination — scrolls to the list once loaded. */\n bottomPageChange(page: number): void {\n this.objectsCatalogScrollAfterLoad = true;\n this.pageChange(page);\n }\n\n /**\n * In the catalog it reads with the phrase from the first page. In a search\n * tab the address is the only source of the phrase (MOB-1818): a new one\n * opens `/wyszukaj/:text/obiekty`, a blank one `/obiekty` with the other\n * filters.\n */\n search(phrase: string): void {\n this.catalog.search(phrase);\n }\n\n /**\n * A filter change in a search tab (MOB-1818) opens `/obiekty` with the whole\n * filter, the phrase (`filter[phrase]`), the sort and the page size instead\n * of narrowing the results in place.\n */\n openInCatalog(filter: ICrudFilter): void {\n this.catalog.openInList(filter);\n }\n\n onListMode(value: ListMode): void {\n const newMode =\n value === ListMode.masonryGrid ? ListMode.masonryGrid : ListMode.desktop;\n\n this.catalog.setListMode(newMode);\n // Below the mobile breakpoint the mode is forced and the toggle ignored.\n if (this.listMode() !== newMode) return;\n\n if (newMode !== ListMode.masonryGrid) {\n this.objectsCatalogDestroyMasonry();\n } else {\n this.objectsCatalogTimeouts.later(\n () => this.objectsCatalogInitMasonry(),\n 100,\n );\n }\n }\n\n ngAfterViewInit(): void {\n this.objectsCatalogInitMasonry();\n this.objectsCatalogViewReady = true;\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n this.objectsCatalogDestroyMasonry();\n }\n\n /**\n * Called with every loaded card (appended „więcej ↓” pages included) each\n * time they change, untracked. No-op; e.g. Podlasie feeds its\n * `SelectionStore` here.\n */\n protected onCatalogItems(items: MsObject[]): void {\n void items;\n }\n\n /**\n * Full list meta (title, description, canonical, og), not in a search tab —\n * there the search page sets them, and the canonical of the list must not\n * point at a phrase url (MOB-1064). The description goes out as translated.\n */\n protected applyListSeo(seo: IObjectsCatalogSeo): void {\n if (this.catalog.searchEnabled()) return;\n\n const t = (key: string): string =>\n this.objectsCatalogTranslate.instant(key);\n this.objectsCatalogSeoService.apply({\n title: `${capitalize(t(seo.titleKey))} - ${capitalize(t(seo.siteNameKey ?? 'MODEL.mainTitle'))}`,\n description: t(seo.descriptionKey),\n type: 'website',\n url: seo.url,\n });\n }\n\n private objectsCatalogInitMasonry(): void {\n if (\n this.listMode() !== ListMode.masonryGrid ||\n !this.objectsCatalogBrowser\n ) {\n return;\n }\n // The MasonryGridComponent owns the masonry library and the image-load\n // handling; it packs the projected `.masonry-item` cards.\n this.objectsCatalogMasonry()?.initMasonry();\n }\n\n private objectsCatalogDestroyMasonry(): void {\n this.objectsCatalogMasonry()?.destroyMasonry();\n }\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n computed,\n Directive,\n effect,\n inject,\n OnInit,\n PLATFORM_ID,\n ResourceRef,\n Signal,\n untracked,\n} from '@angular/core';\nimport { rxResource, toObservable } from '@angular/core/rxjs-interop';\nimport { filter, takeUntil } from 'rxjs';\n\nimport {\n FileUrlService,\n ISeoMetadata,\n MuseumSeoService,\n} from '@smartsoft001-mobilems/angular';\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nimport { ObjectsItemComponent } from '../pages/item/item.component';\nimport {\n IObjectCollectionSummary,\n IObjectRelated,\n ObjectsDataService,\n} from '../services/objects-data/objects-data.service';\n\n/** Options of an object details page, passed to `super(options)`. */\nexport interface IObjectDetailsOptions {\n /** Translation key of the site name in the title. Default `MODEL.mainTitle`. */\n siteNameKey?: string;\n /** Opt-in „You may also be interested in” (`GET object/:id/related`). Default `false`. */\n related?: boolean;\n /** Opt-in „Related collections” (reverse `search/Object` lookup, browser only). Default `false`. */\n relatedCollections?: boolean;\n}\n\nconst OBJECT_DETAILS_SITE_NAME_KEY = 'MODEL.mainTitle';\n\n/** Muzeum Podlasia's tag strip — an unclosed trailing tag (`<br`) goes too. */\nfunction objectDetailsStripHtml(html: string | undefined): string {\n if (!html) return '';\n return html.replace(/<\\/?[^>]+(>|$)/g, '');\n}\n\n/**\n * Base of an object details page (`/obiekty/:id`, MOB-1801), from Muzeum\n * Podlasia's item page: the SEO (also in SSR), the item effect with the\n * `onObjectShown` hook (default: scroll to the top in the browser), the\n * browser-only visit counter, `hasError`, `retryLoad`, `altTitle` and two\n * opt-in resources — `related` and `relatedCollections`. The page keeps its\n * template.\n *\n * ```ts\n * // Muzeum Podlasia\n * export class ItemComponent extends ObjectDetailsBaseComponent {\n * constructor() {\n * super({ related: true, relatedCollections: true });\n * }\n * }\n * ```\n */\n@Directive()\nexport abstract class ObjectDetailsBaseComponent\n extends ObjectsItemComponent\n implements OnInit\n{\n protected readonly objectDetailsService = inject(ObjectsDataService);\n private readonly objectDetailsSeoService = inject(MuseumSeoService);\n private readonly objectDetailsFileUrl = inject(FileUrlService);\n private readonly objectDetailsDocument = inject(DOCUMENT);\n private readonly objectDetailsBrowser = isPlatformBrowser(\n inject(PLATFORM_ID),\n );\n private readonly objectDetailsServer = !this.objectDetailsBrowser;\n private readonly objectDetailsOptions: IObjectDetailsOptions;\n\n /** Object id from the route (`/obiekty/:id` and `/obiekty/:id/:slug`). */\n private readonly objectDetailsRouteId = computed(\n () => this.params()?.['id'] as string | undefined,\n );\n\n /**\n * Id for „related” (MOB-1850). On the server from the route:\n * `GET object/:id/related` starts together with `GET object/:id`, so SSR\n * waits for the longer of the two requests, not their sum (card 5233:\n * ~400 → ~290 ms locally). In the browser unchanged — after the card (no\n * extra 404 for a missing object, „Try again” works as before). A\n * non-numeric id waits for the card. `computed`, because `rxResource`\n * does not compare the `params` result — every change of a read signal\n * would repeat the request.\n */\n private readonly objectDetailsRelatedId = computed(() => {\n const id = this.objectDetailsRouteId();\n return this.objectDetailsServer && id && /^\\d+$/.test(id)\n ? id\n : this.item()?.id;\n });\n\n /** The card failed — „related” started on the server has nothing to wait for. */\n private readonly objectDetailsCardFailed$ = toObservable(\n this.facade.error,\n ).pipe(filter(Boolean));\n\n readonly hasError = this.facade.error;\n\n /** The object title without markup — image `alt`s. `''` without an object. */\n readonly altTitle: Signal<string> = computed(() =>\n objectDetailsStripHtml(this.item()?.title ?? ''),\n );\n\n /**\n * „You may also be interested in” — `GET object/:id/related`, only with\n * the `related` option. A card error stops the request (the error page\n * waits neither for „related” nor for its retry after a network error);\n * the resource then ends in an error state, the section is gone anyway.\n */\n readonly related: ResourceRef<IObjectRelated | undefined>;\n\n /**\n * „Related collections” per the „Field description” document: thematic\n * collections whose `search/Object` with `filter[entryCollections]`\n * contains the object (the service gives an empty list also after an\n * error — the section then disappears). Only with the\n * `relatedCollections` option and only in the browser: the reverse lookup\n * is one `search/Object` request per collection, and its responses (full\n * object cards) must not reach SSR nor the transfer cache HTML — the\n * server renders without this section, the client adds it after\n * hydration.\n */\n readonly relatedCollections: ResourceRef<IObjectCollectionSummary[]>;\n\n protected constructor(options: IObjectDetailsOptions = {}) {\n super();\n this.objectDetailsOptions = options;\n\n this.related = rxResource({\n params: () =>\n this.objectDetailsOptions.related\n ? this.objectDetailsRelatedId()\n : undefined,\n stream: ({ params }) =>\n this.objectDetailsService\n .getRelated(params)\n .pipe(takeUntil(this.objectDetailsCardFailed$)),\n });\n\n this.relatedCollections = rxResource({\n params: () =>\n this.objectDetailsOptions.relatedCollections &&\n this.objectDetailsBrowser\n ? this.item()?.id\n : undefined,\n stream: ({ params }) =>\n this.objectDetailsService.loadRelatedCollections(params),\n defaultValue: [],\n });\n\n this.objectDetailsSeoService.applyForSsr(() =>\n this.objectDetailsFetchSsrSeo(),\n );\n\n effect(() => {\n const item = this.item();\n if (item) {\n untracked(() => {\n this.objectDetailsSeoService.apply(this.objectDetailsSeo(item));\n this.onObjectShown(item);\n });\n }\n });\n }\n\n /**\n * Visit counter — browser only (SSR would count the visit a second time),\n * and its error (e.g. a 429 of the API limit) must neither reach the\n * console as an unhandled `HttpErrorResponse` nor break the view. Once per\n * page instance: in-page navigation to another object sends no new visit.\n */\n ngOnInit(): void {\n if (!this.objectDetailsBrowser) return;\n this.objectDetailsService\n .logVisit(Number(this.route.snapshot.paramMap.get('id')))\n .catch(() => undefined);\n }\n\n retryLoad(): void {\n const id = this.route.snapshot.paramMap.get('id');\n if (id) this.facade.select(id);\n }\n\n /** SEO of the object: `<title> - <site>`, description, image and its alt. */\n protected objectDetailsSeo(item: MsObject): ISeoMetadata {\n const strippedTitle = objectDetailsStripHtml(item.title);\n const siteName = this.translationService.get(\n this.objectDetailsOptions.siteNameKey ?? OBJECT_DETAILS_SITE_NAME_KEY,\n );\n return {\n title: `${strippedTitle} - ${siteName}`,\n description: item.description\n ? objectDetailsStripHtml(item.description)\n : undefined,\n image: item.image ? this.objectDetailsFileUrl.get(item.image) : undefined,\n imageAlt: strippedTitle,\n type: 'article',\n };\n }\n\n /**\n * Called (untracked) after the SEO for every object the facade selects.\n * Default: scroll to the top in the browser. Override to keep the scroll\n * on a re-read of the same card (MOB-1961) or to reset a gallery.\n */\n protected onObjectShown(item: MsObject): void {\n void item;\n if (this.objectDetailsBrowser) {\n this.objectDetailsDocument.defaultView?.scrollTo({\n top: 0,\n behavior: 'instant',\n });\n }\n }\n\n private async objectDetailsFetchSsrSeo(): Promise<ISeoMetadata | null> {\n const id = this.route.snapshot.paramMap.get('id');\n if (!id) return null;\n try {\n const item = await this.objectDetailsService.getById(id);\n return item ? this.objectDetailsSeo(item) : null;\n } catch {\n return null;\n }\n }\n}\n","import {\n INamedEntryParts,\n INamedEntrySource,\n namedEntryParts,\n toPlainText,\n} from '@smartsoft001-mobilems/angular';\n\n/**\n * Generic readers of an object card from `GET object/:id` for a details page\n * (MOB-1801), per the MobileMS „Opis pól” document (2026-10-05). A field\n * without data gives an empty list — the template then hides the whole row\n * with its label, nothing is made up. The layout groupings (header facts,\n * metrics columns, hero crops) stay in each museum.\n */\n\n/** A field value: `name [role] (comment)`; `nameKey` — a translation instead of the name. */\nexport type ObjectDetailValue = INamedEntryParts & { nameKey?: string };\n\n/** A related link (article, collection) of the details page. */\nexport interface IObjectDetailLink {\n id: number | string;\n title: string;\n route: string;\n}\n\n/** One bibliography item; `permalink` makes it a link. */\nexport interface IObjectBibliographyEntry {\n text: string;\n permalink: string | null;\n}\n\n/**\n * The card fields these tools read. Both `MsObject` and a museum's wider card\n * type (e.g. Podlasie's `ObjectCard`) are assignable to it.\n */\nexport interface IObjectDetailSource {\n title?: string | null;\n name?: string | null;\n noEvidence?: string | null;\n seriesTitles?: ReadonlyArray<INamedEntrySource | null | undefined> | null;\n bibliographyMNK?:\n | string\n | null\n | ReadonlyArray<\n string | { text?: string | null; permalink?: string | null }\n >;\n publicDescriptions?: ReadonlyArray<{ text?: string | null } | null> | null;\n description?: string | null;\n articles?: ReadonlyArray<{\n id: number | string;\n title?: string | null;\n }> | null;\n}\n\nconst objectDetailHasText = (\n value: string | null | undefined,\n): value is string => !!value?.trim();\n\nconst objectDetailBare = (entries: INamedEntryParts[]): INamedEntryParts[] =>\n entries.map((entry) => ({ ...entry, role: null, comment: null }));\n\nconst objectDetailTextValue = (\n value: string | null | undefined,\n): ObjectDetailValue[] =>\n objectDetailHasText(value)\n ? [{ name: value.trim(), role: null, comment: null }]\n : [];\n\n/**\n * A link title without HTML (the articles API sends `<p>…</p>` with entities,\n * MOB-1845) — the framework's `toPlainText` strips tags also after decoding\n * entities (`&lt;p&gt;`), like `PlainTextPipe` on the article cards.\n */\nconst objectDetailPlainTitle = (title: string | null | undefined): string =>\n toPlainText(title);\n\n/** The object title — the document says `name`, the details API returns `title`. */\nexport function objectTitle(obj: IObjectDetailSource): string {\n return (obj.title ?? obj.name ?? '').trim();\n}\n\n/** Header tags: `seriesTitles` (the `Cycle` dictionary) → a list with the `cycles` filter. */\nexport function tagValues(obj: IObjectDetailSource): ObjectDetailValue[] {\n return objectDetailBare(namedEntryParts(obj.seriesTitles));\n}\n\n/** Inventory number: `noEvidence`. */\nexport function inventoryValues(obj: IObjectDetailSource): ObjectDetailValue[] {\n return objectDetailTextValue(obj.noEvidence);\n}\n\n/**\n * Bibliography as in OSSO (`museum-objects` item/main-tab): every\n * `bibliographyMNK[]` entry is a separate item, and its `text` (HTML from the\n * API) goes whole — OSSO does not split the text on full stops. An entry\n * without text is dropped; `permalink` makes the item a link.\n */\nexport function bibliography(\n obj: IObjectDetailSource,\n): IObjectBibliographyEntry[] {\n const source = obj.bibliographyMNK;\n const entries = typeof source === 'string' ? [source] : (source ?? []);\n // A loop instead of `flatMap` — the library's TS `lib` predates ES2019.\n const out: IObjectBibliographyEntry[] = [];\n for (const entry of entries) {\n const text = typeof entry === 'string' ? entry : (entry?.text ?? '');\n if (!objectDetailHasText(text)) continue;\n const permalink =\n typeof entry === 'string' || !objectDetailHasText(entry?.permalink)\n ? null\n : entry.permalink.trim();\n out.push({ text: text.trim(), permalink });\n }\n return out;\n}\n\n/**\n * Description (HTML from the API): `publicDescriptions[].text` (the\n * popular-science description), and without it `description` (the physical\n * description) — the „Opis pól” rule of MOB-1563 („popular-science\n * description, and if there is none — the physical one”); object 5233 has\n * only `description` (MOB-1801). The description does not depend on media.\n */\nexport function descriptionHtml(obj: IObjectDetailSource): string[] {\n // An empty editor paragraph (`<p></p>`, `<p>&nbsp;</p>`) is not a description.\n const visible = (text: string) => toPlainText(text).length > 0;\n const popular = (obj.publicDescriptions ?? [])\n .map((entry) => entry?.text ?? '')\n .filter(visible);\n if (popular.length) return popular;\n const physical = obj.description ?? '';\n return visible(physical) ? [physical.trim()] : [];\n}\n\n/**\n * „Powiązane artykuły” — the card's `articles` field; the title without HTML\n * (MOB-1845). `routePrefix` is the articles list route of the museum.\n */\nexport function relatedArticles(\n obj: IObjectDetailSource,\n routePrefix = '/artykuly',\n): IObjectDetailLink[] {\n return (obj.articles ?? [])\n .map((article) => ({\n id: article.id,\n title: objectDetailPlainTitle(article?.title),\n route: `${routePrefix}/${article.id}`,\n }))\n .filter((article) => article.title.length > 0);\n}\n","/**\n * „Zapytaj o obiekt” keys (MOB-1869) — the mail address and text live in the\n * CMS translations, so a museum changes them without a deployment.\n */\nexport const ASK_ABOUT_OBJECT_KEYS = {\n email: 'DETAILS_PAGE.detail.askEmail',\n subject: 'DETAILS_PAGE.detail.askSubject',\n body: 'DETAILS_PAGE.detail.askBody',\n objectWithInventory: 'DETAILS_PAGE.detail.askObjectWithInventory',\n portal: 'MODEL.mainTitle',\n} as const;\n\n/** `TranslateService.instant` — a key without a translation comes back as itself. */\nexport type AskTranslate = (\n key: string,\n params?: Record<string, string>,\n) => string;\n\nexport interface IAskAboutObject {\n /** The title without HTML. */\n title: string;\n inventory?: string | null;\n /** The full address of the object card on the portal. */\n url?: string | null;\n}\n\nconst ASK_ABOUT_OBJECT_EMAIL = /^[^\\s@?&#]+@[^\\s@?&#]+\\.[^\\s@?&#]+$/;\n\nfunction askAboutObjectTranslated(\n translate: AskTranslate,\n key: string,\n params?: Record<string, string>,\n): string | null {\n const value = translate(key, params);\n return value && value !== key ? value : null;\n}\n\n/**\n * The `mailto:` of the „Zapytaj o obiekt” button: the address from\n * `askEmail`, the subject with the title (and the inventory number), the body\n * with a greeting, the object, a link and room for the question. Without a\n * valid address — `null` (no button); a missing subject or body is simply\n * skipped. Body lines break as CRLF, as RFC 6068 requires.\n */\nexport function askAboutObjectHref(\n translate: AskTranslate,\n object: IAskAboutObject,\n): string | null {\n const email = askAboutObjectTranslated(\n translate,\n ASK_ABOUT_OBJECT_KEYS.email,\n )?.trim();\n if (!email || !ASK_ABOUT_OBJECT_EMAIL.test(email)) return null;\n\n const title = object.title.trim();\n const inventory = object.inventory?.trim();\n const label =\n (inventory &&\n askAboutObjectTranslated(\n translate,\n ASK_ABOUT_OBJECT_KEYS.objectWithInventory,\n {\n title,\n inventory,\n },\n )) ||\n title;\n\n const subject = askAboutObjectTranslated(\n translate,\n ASK_ABOUT_OBJECT_KEYS.subject,\n {\n object: label,\n },\n );\n const body = askAboutObjectTranslated(translate, ASK_ABOUT_OBJECT_KEYS.body, {\n object: label,\n url: object.url ?? '',\n portal:\n askAboutObjectTranslated(translate, ASK_ABOUT_OBJECT_KEYS.portal) ?? '',\n });\n\n const query = [\n subject ? `subject=${encodeURIComponent(subject)}` : null,\n body ? `body=${encodeURIComponent(body.replace(/\\r?\\n/g, '\\r\\n'))}` : null,\n ].filter(Boolean);\n\n return `mailto:${email}${query.length ? `?${query.join('&')}` : ''}`;\n}\n","import {\n computed,\n Directive,\n inject,\n input,\n linkedSignal,\n output,\n signal,\n} from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport {\n ICrudFilter,\n ICrudFilterQueryItem,\n} from '@smartsoft001/crud-shell-angular';\n\nimport { FilterType, IDictionaryEntry } from '@smartsoft001-mobilems/angular';\n\nimport { FormFeatureType } from '../models/objects-filters.model';\nimport {\n ArchaeologicalSegregation,\n ObjectsDataService,\n} from '../services/objects-data/objects-data.service';\n\n/** How a field of the advanced filters panel is rendered. */\nexport type ObjectsAdvancedFilterMode =\n 'dictionary' | 'tree' | 'text' | 'boolean';\n\n/** The yes/no checkboxes of the panel (\"Na ekspozycji\", \"Pokaż tylko\"). */\nexport type ObjectsAdvancedFilterBoolean =\n 'onExhibition' | 'hasImage' | 'hasVideo';\n\n/**\n * One field of the advanced filters panel. `dictionaryKey` is the API\n * dictionary name (`DataService.loadFilterDictionary`); `key` is the query\n * filter key written through `FiltersContext.filters`. Picking a value in a\n * field with `dependsOn` checks the referenced boolean field (MOB-1802: the\n * field stays enabled); unchecking that boolean clears the field.\n */\nexport interface IObjectsAdvancedFilterField {\n key: string;\n labelKey: string;\n mode: ObjectsAdvancedFilterMode;\n dictionaryKey?: string;\n /**\n * The field's own source (`FilterDictionarySource`) instead of the default\n * `DataService.loadFilterDictionary`:\n * - `publicCollections` — `GET public-collections/page/{n}` through\n * `ObjectsDataService.loadCollectionsDictionary`;\n * - `archaeologicalData` — `GET dictionary/{segregation}/search/page/{n}`\n * (one type per segregation) through `ObjectsDataService.loadArchaeologicalDictionary`.\n */\n source?: 'publicCollections' | 'archaeologicalData';\n /** Segregation of the `ArchaeologicalData` dictionary (only with `source: 'archaeologicalData'`). */\n segregation?: ArchaeologicalSegregation;\n dependsOn?: string;\n}\n\n/** One write of the panel's batch — handed to `FiltersContext.filters` by the bar. */\nexport interface IObjectsAdvancedFilterWrite {\n key: string;\n type: '=';\n val: FilterType;\n}\n\n/** Options of {@link ObjectsAdvancedFiltersBaseComponent}, passed to `super(…)`. */\nexport interface IObjectsAdvancedFiltersOptions {\n /** The panel's fields — the app's config (Podlasie: `OBJECTS_ADVANCED_FILTER_FIELDS`). */\n fields: readonly IObjectsAdvancedFilterField[];\n /** Query keys the panel writes in its single batch, in this order. */\n managedKeys: readonly string[];\n /**\n * Keys the panel no longer has (MOB-1844). `FiltersContext.filters` changes\n * only the keys it is given, so an old deep link or saved filter would stay\n * active with no field to remove it — \"Zastosuj\" and \"Resetuj\" always send\n * them with `val: undefined`. Default `[]`.\n */\n retiredKeys?: readonly string[];\n /** `locationType` value of \"Na ekspozycji: Tak\". Default `'Ekspozycja'`. */\n onExhibitionValue?: string;\n}\n\n/** Translation keys of the \"Pokaż tylko\" multimedia entries, by `FormFeatureType`. */\nconst OBJECTS_ADVANCED_FILTERS_MULTIMEDIA_LABELS: Partial<\n Record<FormFeatureType, string>\n> = {\n [FormFeatureType.IMAGES]: 'OBJECTS.filters.multimedia.images',\n [FormFeatureType.VIDEO]: 'OBJECTS.filters.multimedia.video',\n};\n\n/**\n * Logic of the \"Filtry zaawansowane\" panel (Muzeum Podlasia's\n * `objects-advanced-filters`, MOB-1596, layout per the MOB-1802 mockup).\n * Presentational: reads `filter()`, keeps every edit in a local draft and only\n * writes through `apply` — the parent (the filters bar) performs the single\n * `context.filters` assignment. The template and the field config stay in the app.\n */\n@Directive()\nexport abstract class ObjectsAdvancedFiltersBaseComponent {\n private readonly objectsAdvancedFiltersTranslate = inject(TranslateService);\n\n private readonly objectsAdvancedFiltersService = inject(ObjectsDataService);\n\n private readonly objectsAdvancedFiltersOptions: Required<IObjectsAdvancedFiltersOptions>;\n\n /**\n * \"Kolekcja tematyczna\" (MOB-1844): pages of the `public-collections` list\n * (with the phrase in `filter[phrase]`) instead of a `dictionary/*` dictionary.\n */\n protected readonly collectionsSource = (page: number, query?: string) =>\n this.objectsAdvancedFiltersService.loadCollectionsDictionary(page, query);\n\n /**\n * \"Filtry archeologiczne\" (MOB-1844): the `ArchaeologicalData` dictionary\n * with a segregation — names planned by MobileMS (Kanbanize 50040).\n */\n protected readonly archeoTownsSource = (page: number, query?: string) =>\n this.objectsAdvancedFiltersService.loadArchaeologicalDictionary(\n 'ArcheoTown',\n page,\n query,\n );\n\n protected readonly archeoPeriodsSource = (page: number, query?: string) =>\n this.objectsAdvancedFiltersService.loadArchaeologicalDictionary(\n 'ArcheoPeriod',\n page,\n query,\n );\n\n protected readonly archeoCulturesSource = (page: number, query?: string) =>\n this.objectsAdvancedFiltersService.loadArchaeologicalDictionary(\n 'ArcheoCulture',\n page,\n query,\n );\n\n readonly filter = input.required<ICrudFilter>();\n\n /** Toggled by the parent — reopening re-derives the draft, discarding it. */\n readonly isOpen = input<boolean>(false);\n\n /** The `/obiekty` list — a full-width band with the content in the page container. */\n readonly fullBleed = input<boolean>(false);\n\n readonly apply = output<IObjectsAdvancedFilterWrite[]>();\n\n protected readonly fields: readonly IObjectsAdvancedFilterField[];\n\n /** Mobile: the \"Filtry archeologiczne\" section collapses with a chevron (2276:7709). */\n protected readonly archaeologicalOpen = signal(true);\n\n protected readonly draftQuery = linkedSignal<ICrudFilterQueryItem[]>(() => {\n this.isOpen();\n return this.filter().query ? [...(this.filter().query ?? [])] : [];\n });\n\n /** Synthetic filter fed to the reused `app-filter-*` inputs so they read the draft. */\n protected readonly draftFilter = computed<ICrudFilter>(() => ({\n ...this.filter(),\n query: this.draftQuery(),\n }));\n\n protected constructor(options: IObjectsAdvancedFiltersOptions) {\n this.objectsAdvancedFiltersOptions = {\n fields: options.fields,\n managedKeys: options.managedKeys,\n retiredKeys: options.retiredKeys ?? [],\n onExhibitionValue: options.onExhibitionValue ?? 'Ekspozycja',\n };\n this.fields = options.fields;\n }\n\n readDictionaryValue(key: string): IDictionaryEntry[] {\n const value = this.draftQuery().find((q) => q.key === key)?.value;\n return Array.isArray(value) ? (value as IDictionaryEntry[]) : [];\n }\n\n onDictionaryToggle(key: string, item: IDictionaryEntry): void {\n const current = this.readDictionaryValue(key);\n const isPresent = current.some((i) => i.id === item.id);\n const next = isPresent\n ? current.filter((i) => i.id !== item.id)\n : [...current, item];\n this.objectsAdvancedFiltersWriteDictionary(key, next);\n\n // Picking a department means \"Na ekspozycji: Tak\" (MOB-1802) — the field\n // is enabled from the start and the checkbox follows the choice.\n const field = this.fields.find((f) => f.key === key);\n if (field?.dependsOn === 'onExhibition' && next.length) {\n this.objectsAdvancedFiltersSetDraftEntry(\n 'locationType',\n this.objectsAdvancedFiltersOptions.onExhibitionValue,\n );\n }\n }\n\n onDictionaryClearAll(key: string): void {\n this.objectsAdvancedFiltersWriteDictionary(key, []);\n }\n\n toggleArchaeological(): void {\n this.archaeologicalOpen.update((open) => !open);\n }\n\n onInventoryNumberChange(value: string): void {\n this.objectsAdvancedFiltersSetDraftEntry(\n 'inventoryNumber',\n value.length ? value : undefined,\n );\n }\n\n onBooleanToggle(key: ObjectsAdvancedFilterBoolean, checked: boolean): void {\n if (key === 'onExhibition') {\n this.objectsAdvancedFiltersSetDraftEntry(\n 'locationType',\n checked\n ? this.objectsAdvancedFiltersOptions.onExhibitionValue\n : undefined,\n );\n if (!checked) {\n this.onDictionaryClearAll('department');\n }\n return;\n }\n\n const featureId =\n key === 'hasImage' ? FormFeatureType.IMAGES : FormFeatureType.VIDEO;\n this.objectsAdvancedFiltersToggleFormFeature(featureId);\n }\n\n isBooleanChecked(key: ObjectsAdvancedFilterBoolean): boolean {\n if (key === 'onExhibition') {\n return this.draftQuery().some(\n (q) =>\n q.key === 'locationType' &&\n q.value === this.objectsAdvancedFiltersOptions.onExhibitionValue,\n );\n }\n\n const featureId =\n key === 'hasImage' ? FormFeatureType.IMAGES : FormFeatureType.VIDEO;\n return this.readDictionaryValue('formFeature').some(\n (item) => item.id === featureId,\n );\n }\n\n applyDraft(): void {\n this.apply.emit(this.objectsAdvancedFiltersBuildPayload());\n }\n\n reset(): void {\n this.draftQuery.set([]);\n this.apply.emit(this.objectsAdvancedFiltersBuildPayload());\n }\n\n private objectsAdvancedFiltersToggleFormFeature(\n featureId: FormFeatureType,\n ): void {\n const current = this.readDictionaryValue('formFeature');\n const isPresent = current.some((item) => item.id === featureId);\n\n if (isPresent) {\n this.objectsAdvancedFiltersWriteDictionary(\n 'formFeature',\n current.filter((item) => item.id !== featureId),\n );\n return;\n }\n\n const labelKey = OBJECTS_ADVANCED_FILTERS_MULTIMEDIA_LABELS[featureId];\n const name = labelKey\n ? this.objectsAdvancedFiltersTranslate.instant(labelKey)\n : '';\n this.objectsAdvancedFiltersWriteDictionary('formFeature', [\n ...current,\n { id: featureId, name },\n ]);\n }\n\n private objectsAdvancedFiltersWriteDictionary(\n key: string,\n items: IDictionaryEntry[],\n ): void {\n this.objectsAdvancedFiltersSetDraftEntry(\n key,\n (items.length ? items : undefined) as FilterType,\n );\n }\n\n private objectsAdvancedFiltersSetDraftEntry(\n key: string,\n value: FilterType,\n ): void {\n this.draftQuery.update((current) => {\n const filtered = current.filter((q) => q.key !== key);\n return value === undefined\n ? filtered\n : [...filtered, { key, type: '=', value } as ICrudFilterQueryItem];\n });\n }\n\n private objectsAdvancedFiltersBuildPayload(): IObjectsAdvancedFilterWrite[] {\n const { managedKeys, retiredKeys } = this.objectsAdvancedFiltersOptions;\n\n return [\n ...managedKeys.map((key) => ({\n key,\n type: '=' as const,\n val: this.draftQuery().find((q) => q.key === key)?.value as FilterType,\n })),\n ...retiredKeys\n .filter((key) => !managedKeys.includes(key))\n .map((key) => ({ key, type: '=' as const, val: undefined })),\n ];\n }\n}\n","import { ICrudFilter } from '@smartsoft001/crud-shell-angular';\n\nimport {\n FilterType,\n serializeCatalogFilter,\n} from '@smartsoft001-mobilems/angular';\n\nimport { IKeyValue } from '../models';\n\n/** Sort options of the objects list (the default order). */\nexport const OBJECTS_SORT_OPTIONS: IKeyValue[] = Object.freeze([\n { key: 'random', value: 'OBJECTS.filters.random' },\n { key: 'publication-date-desc', value: 'OBJECTS.filters.date-desc' },\n { key: 'publication-date-asc', value: 'OBJECTS.filters.date-asc' },\n { key: 'name-asc', value: 'OBJECTS.filters.name-asc' },\n { key: 'name-desc', value: 'OBJECTS.filters.name-desc' },\n { key: 'visited-desc', value: 'OBJECTS.filters.most-popular' },\n]) as IKeyValue[];\n\n/** Sort order shown for `?type=new` — newest first. */\nexport const OBJECTS_NEW_TYPE_SORT_OPTIONS: IKeyValue[] = Object.freeze([\n { key: 'publication-date-desc', value: 'OBJECTS.filters.date-desc' },\n { key: 'publication-date-asc', value: 'OBJECTS.filters.date-asc' },\n { key: 'random', value: 'OBJECTS.filters.random' },\n { key: 'name-asc', value: 'OBJECTS.filters.name-asc' },\n { key: 'name-desc', value: 'OBJECTS.filters.name-desc' },\n { key: 'visited-desc', value: 'OBJECTS.filters.most-popular' },\n]) as IKeyValue[];\n\n/** Page sizes of the objects list. */\nexport const OBJECTS_LIMIT_OPTIONS: IKeyValue[] = Object.freeze([\n { key: '20' },\n { key: '40' },\n { key: '60' },\n { key: '80' },\n { key: '100' },\n]) as IKeyValue[];\n\n/** API query key of the theme tags (cycles) filter. */\nexport const OBJECTS_THEME_TAGS_FILTER_KEY = 'cycles';\n\n/** Chip labels of the yes/no filters from the advanced filters panel. */\nexport const OBJECTS_FILTER_SINGLE_VALUE_LABELS: Readonly<\n Record<string, string>\n> = {\n onExhibition: 'SEARCH.advancedFiltersPanel.onExhibition',\n hasImage: 'SEARCH.advancedFiltersPanel.hasImage',\n hasVideo: 'SEARCH.advancedFiltersPanel.hasVideo',\n};\n\n/** A filter write in the shape `FiltersContext.filters` accepts. */\nexport interface IObjectsFilterWrite {\n key: string;\n type: string;\n val: FilterType;\n}\n\n/** A date range of the date filters (`null` — an open end). */\nexport interface IObjectsDateRange {\n from: string | null;\n to: string | null;\n}\n\n/** The sort dropdown key (e.g. `publication-date-desc`) of a sort; no `by` → `random`. */\nexport function objectsSortKey(sort?: { by?: string; desc?: boolean }): string {\n return !sort?.by ? 'random' : `${sort.by}-${sort.desc ? 'desc' : 'asc'}`;\n}\n\n/** The sort of a sort dropdown key; `random` → an empty `by`. */\nexport function objectsSortFromKey(key: string): {\n by: string;\n desc: boolean;\n} {\n const desc = key.endsWith('-desc');\n let by = key.replace(/-asc$/, '').replace(/-desc$/, '');\n\n if (by === 'random') {\n by = '';\n }\n\n return { by, desc };\n}\n\n/** The list URL (`/obiekty` by default) restoring the current filter (phrase + query items). */\nexport function buildObjectsResultsUrl(\n origin: string,\n filter: ICrudFilter | null | undefined,\n listPath = '/obiekty',\n): string {\n const serialized = serializeCatalogFilter(filter);\n return `${origin}${listPath}${serialized ? `?filter=${encodeURIComponent(serialized)}` : ''}`;\n}\n","import {\n computed,\n Directive,\n inject,\n input,\n output,\n Signal,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ListMode } from '@smartsoft001/angular';\nimport {\n ICrudFilter,\n ICrudFilterQueryItem,\n} from '@smartsoft001/crud-shell-angular';\n\nimport {\n createCycleTagSearch,\n dictionaryEntries,\n dictionaryEntryKey,\n dictionaryFilterItems,\n FiltersContext,\n FilterType,\n ICycleTagSearch,\n IDictionaryEntry,\n mergeSelectedTags,\n} from '@smartsoft001-mobilems/angular';\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nimport {\n IObjectsDateRange,\n IObjectsFilterWrite,\n OBJECTS_FILTER_SINGLE_VALUE_LABELS,\n OBJECTS_LIMIT_OPTIONS,\n OBJECTS_SORT_OPTIONS,\n OBJECTS_THEME_TAGS_FILTER_KEY,\n objectsSortFromKey,\n objectsSortKey,\n} from './objects-filter-tools';\nimport { IKeyValue } from '../models';\n\n/** Options of {@link ObjectsFiltersBarBaseComponent}, passed to `super(…)`. */\nexport interface IObjectsFiltersBarOptions {\n /**\n * Load the `Cycle` dictionary for the theme tags (`themeTags`, `tagsQuery`).\n * Default `false`: no `dictionary/Cycle` request; `themeTags` holds only the\n * cycles selected in the filter.\n */\n cycleTags?: boolean;\n /**\n * Chip labels (translation keys) of the yes/no filters, by query key.\n * Default `OBJECTS_FILTER_SINGLE_VALUE_LABELS`.\n */\n singleValueLabels?: Readonly<Record<string, string>>;\n /**\n * Single-value filters — their chip clears the whole query item.\n * Default `['categories', 'inventoryNumber', 'locationType']`.\n */\n singleValueKeys?: readonly string[];\n}\n\n/** API query key of the \"Nr inwentarzowy\" filter — `filter[inventoryNumber]`. */\nconst OBJECTS_FILTERS_BAR_INVENTORY_NUMBER_KEY = 'inventoryNumber';\n\nconst OBJECTS_FILTERS_BAR_SINGLE_VALUE_KEYS: readonly string[] = [\n 'categories',\n OBJECTS_FILTERS_BAR_INVENTORY_NUMBER_KEY,\n 'locationType',\n];\n\n/** The write target of the bar: the framework context or the redirect one. */\ntype ObjectsFiltersBarWriteTarget = Pick<\n FiltersContext<MsObject>,\n 'filters' | 'sort' | 'limit'\n>;\n\n/** A batch of filter writes in the type `FiltersContext.filters` declares. */\ntype ObjectsFiltersBarFilterWrites = ObjectsFiltersBarWriteTarget['filters'];\n\n/** `val[0]` upper-cased; `''` for an empty value. */\nfunction objectsFiltersBarCapitalize(val: string): string {\n if (!val?.length) return '';\n\n return val[0].toUpperCase() + val.substring(1);\n}\n\n/**\n * Stand-in `FiltersContext` of the search results tab (MOB-1818): the same\n * setters as the framework context (`filters`, `sort`, `limit`), but instead of\n * a read through the facade it hands over the complete filter — the list moves\n * to `/obiekty` with it. Query items are composed like\n * `FiltersContext.multipleFilterSet`: a write replaces the item with the same\n * key and type, `undefined` removes it.\n */\nclass ObjectsRedirectFiltersContext {\n constructor(\n private readonly current: () => ICrudFilter,\n private readonly redirect: (filter: ICrudFilter) => void,\n ) {}\n\n get query(): ICrudFilterQueryItem[] | undefined {\n return this.current().query;\n }\n\n set filters(writes: IObjectsFilterWrite[]) {\n let query = [...(this.current().query ?? [])];\n\n for (const { key, type, val } of writes) {\n query = query.filter((item) => !(item.key === key && item.type === type));\n if (val) {\n query.push({\n key,\n type,\n value: val,\n hidden: true,\n } as ICrudFilterQueryItem);\n }\n }\n\n this.emit({ query, offset: 0 });\n }\n\n set sort(value: { by: string; desc: boolean }) {\n this.emit({ sortBy: value.by, sortDesc: value.desc, offset: 0 });\n }\n\n set limit(value: number) {\n this.emit({ limit: value, offset: 0 });\n }\n\n private emit(patch: Partial<ICrudFilter>): void {\n this.redirect({ ...this.current(), ...patch });\n }\n}\n\n/**\n * Logic of the objects list top filter bar (Muzeum Podlasia's `filters-top`):\n * theme tags, applied-filter chips, sort/limit dropdowns, pagination and the\n * grid/list view toggle. The template stays in the app.\n *\n * Every mutation goes through the framework `FiltersContext` provided by\n * `<smart-mobilems-objects-filters>` (passed to each method by the template),\n * which dispatches to the objects facade. With `redirectChanges` on (the search\n * results tab, MOB-1818) filter, sort and page size changes are emitted as one\n * complete filter through `filterRedirect` instead.\n */\n@Directive()\nexport abstract class ObjectsFiltersBarBaseComponent {\n private readonly objectsFiltersBarTranslate = inject(TranslateService);\n\n private readonly objectsFiltersBarSingleValueLabels: Readonly<\n Record<string, string>\n >;\n\n private readonly objectsFiltersBarSingleValueKeys: readonly string[];\n\n private readonly objectsFiltersBarCycleTags: ICycleTagSearch;\n\n /** Query key of the panel's theme tags — `filter[cycles][]`. */\n protected readonly themeTagsFilterKey = OBJECTS_THEME_TAGS_FILTER_KEY;\n\n /**\n * The page's current filter, bound straight through to the filter fields.\n * Reads come from here; writes go through the FiltersContext — both sides are\n * the same facade state.\n */\n readonly filter = input.required<ICrudFilter>();\n\n readonly listMode = input<ListMode>(ListMode.masonryGrid);\n\n /**\n * The result count from the list page — only for the response to the\n * current filter (the shared slice guard). Without it the count comes from\n * the framework context.\n */\n readonly totalCount = input<number | null>(null);\n\n readonly sortOptions = input<IKeyValue[]>(OBJECTS_SORT_OPTIONS);\n\n /**\n * The search results tab (MOB-1818): filter, sort and page size changes do\n * not narrow the list in place, they go to `filterRedirect` with the\n * complete filter. Paging stays in the tab.\n */\n readonly redirectChanges = input(false);\n\n /** The complete filter after a change in the results tab — the list moves to `/obiekty` with it. */\n readonly filterRedirect = output<ICrudFilter>();\n\n readonly listModeChange = output<ListMode>();\n\n /** Free-text search — the list page owns the read so it can persist it. */\n readonly searchEvent = output<string>();\n\n readonly isAdvancedFiltersOn = signal<boolean>(false);\n\n limitOptions: IKeyValue[] = OBJECTS_LIMIT_OPTIONS;\n\n /** The \"Wyszukaj więcej tagów\" phrase — empty = the panel's default tags. */\n readonly tagsQuery: WritableSignal<string>;\n\n /**\n * Panel chips: the selected cycles (from the filter) first, then the\n * dictionary or the phrase result — a selected cycle missing from the `q`\n * result stays and can be unselected (MOB-1826 review). Without the\n * `cycleTags` option only the selected cycles.\n */\n readonly themeTags: Signal<IDictionaryEntry[]>;\n\n protected constructor(options: IObjectsFiltersBarOptions = {}) {\n this.objectsFiltersBarSingleValueLabels =\n options.singleValueLabels ?? OBJECTS_FILTER_SINGLE_VALUE_LABELS;\n this.objectsFiltersBarSingleValueKeys =\n options.singleValueKeys ?? OBJECTS_FILTERS_BAR_SINGLE_VALUE_KEYS;\n\n // The whole `Cycle` dictionary (every page), with the hit phrase `q`\n // (MOB-1826, like the collections and articles lists). How many show at\n // once is the panel's call (6 + \"Pokaż wszystkie\").\n this.objectsFiltersBarCycleTags = options.cycleTags\n ? createCycleTagSearch()\n : { query: signal(''), tags: signal<IDictionaryEntry[]>([]) };\n\n this.tagsQuery = this.objectsFiltersBarCycleTags.query;\n\n const cycleTags = this.objectsFiltersBarCycleTags.tags;\n this.themeTags = computed(() =>\n mergeSelectedTags(\n dictionaryFilterItems(\n this.filter()?.query?.find(\n (q) => q.key === OBJECTS_THEME_TAGS_FILTER_KEY && q.type === '=',\n )?.value,\n ),\n cycleTags(),\n ),\n );\n }\n\n toggleAdvancedFilters(force?: boolean): void {\n this.isAdvancedFiltersOn.update((val) => force ?? !val);\n }\n\n onListMode(value: ListMode): void {\n this.listModeChange.emit(value);\n }\n\n /** Map a sort dropdown key (e.g. `publication-date-desc`) to the matching option. */\n selectedSort(sort?: { by?: string; desc?: boolean }): IKeyValue {\n const options = this.sortOptions();\n const key = objectsSortKey(sort);\n return options.find((option) => option.key === key) ?? options[0];\n }\n\n selectedLimit(limit?: number): IKeyValue {\n return (\n this.limitOptions.find((option) => option.key === String(limit ?? 20)) ??\n this.limitOptions[0]\n );\n }\n\n sortChange(context: FiltersContext<MsObject>, value: string): void {\n this.objectsFiltersBarWriteTarget(context).sort = objectsSortFromKey(value);\n }\n\n limitChange(context: FiltersContext<MsObject>, value: string): void {\n this.objectsFiltersBarWriteTarget(context).limit = Number(value);\n }\n\n pageChange(context: FiltersContext<MsObject>, value: number): void {\n context.page = value;\n }\n\n /** Toggle a single dictionary entry on/off for `key`. */\n advancedFilterChange(\n context: FiltersContext<MsObject>,\n entry: IDictionaryEntry,\n key: string,\n ): void {\n // `\"3\"` from a deep link and `3` from the dictionary are the same entry —\n // a click removes it instead of adding a duplicate; an event without an id\n // changes nothing (MOB-1826 review).\n const eventKey = dictionaryEntryKey(entry?.id);\n if (eventKey === null) {\n return;\n }\n\n const current = this.objectsFiltersBarDictionaryValue(context, key);\n const isToggled = (item: IDictionaryEntry) =>\n dictionaryEntryKey(item.id) === eventKey;\n const newValue = current.some(isToggled)\n ? current.filter((item) => !isToggled(item))\n : [...current, entry];\n\n this.objectsFiltersBarSetDictionary(context, key, newValue);\n }\n\n /** The year field already debounces typing (500 ms, MOB-1866). */\n onCreateDatesFilterChange(\n context: FiltersContext<MsObject>,\n range: IObjectsDateRange,\n ): void {\n // Set both bounds in one go so the list is re-read once, not twice.\n this.objectsFiltersBarWriteTarget(context).filters = [\n {\n val: (range.from?.length ? range.from : undefined) as FilterType,\n key: 'createDates',\n type: '>=',\n },\n {\n val: (range.to?.length ? range.to : undefined) as FilterType,\n key: 'createDates',\n type: '<=',\n },\n ];\n }\n\n /**\n * Batched write from the \"Filtry zaawansowane\" panel (MOB-1596) — the panel\n * keeps its own draft and hands over the full snapshot on Zastosuj/Resetuj,\n * so this is the single `context.filters` assignment for that whole edit.\n */\n onAdvancedFiltersApply(\n context: FiltersContext<MsObject>,\n payload: IObjectsFilterWrite[],\n ): void {\n this.objectsFiltersBarWriteTarget(context).filters =\n payload as ObjectsFiltersBarFilterWrites;\n }\n\n /** A yes/no filter — unchecking sends `undefined`, which removes the query item. */\n onBooleanFilterChange(\n context: FiltersContext<MsObject>,\n event: { key: string; checked: boolean },\n ): void {\n this.objectsFiltersBarWriteTarget(context).filters = [\n {\n // `FilterType` has no boolean; a yes/no filter writes `true`.\n val: (event.checked ? true : undefined) as unknown as FilterType,\n key: event.key,\n type: '=',\n },\n ];\n }\n\n clearFilter(\n context: FiltersContext<MsObject>,\n item: ICrudFilterQueryItem,\n value?: IDictionaryEntry,\n ): void {\n if (!item) {\n return;\n }\n\n // The date range and single-value filters (also the panel's yes/no ones,\n // e.g. \"Z opisem\") have no list of values — the chip clears the whole item.\n if (\n (item.key === 'createDates' &&\n (item.type === '>=' || item.type === '<=')) ||\n this.objectsFiltersBarSingleValueKeys.includes(item.key) ||\n !Array.isArray(item.value)\n ) {\n this.objectsFiltersBarWriteTarget(context).filters = [\n { val: undefined, key: item.key, type: item.type },\n ];\n return;\n }\n\n // Removing the last entry of a dictionary filter drops the whole query item.\n if (value) {\n this.advancedFilterChange(context, value, item.key);\n }\n }\n\n isListValue(value: unknown): boolean {\n return Array.isArray(value);\n }\n\n /** List entries for the chips — no `null` and no entries without an id (MOB-1826 review). */\n listEntries(value: unknown): Array<IDictionaryEntry & { text?: string }> {\n return dictionaryEntries(value) as Array<\n IDictionaryEntry & { text?: string }\n >;\n }\n\n /** Chip label of a filter without a list of values — a yes/no one has no value after the colon. */\n singleValueLabel(item: ICrudFilterQueryItem): string {\n const label = objectsFiltersBarCapitalize(\n this.objectsFiltersBarTranslate.instant(\n this.objectsFiltersBarSingleValueLabels[item.key] ??\n `OBJECTS.filters.applied.${item.key}`,\n ),\n );\n\n return item.value === true ? label : `${label}: ${item.value}`;\n }\n\n $context(context: unknown): FiltersContext<MsObject> {\n return context as FiltersContext<MsObject>;\n }\n\n /**\n * Write a dictionary filter through the generic `filters` setter. An empty\n * selection must be sent as `undefined` — that is what removes the query item.\n */\n protected objectsFiltersBarSetDictionary(\n context: FiltersContext<MsObject>,\n key: string,\n value: IDictionaryEntry[],\n ): void {\n this.objectsFiltersBarWriteTarget(context).filters = [\n { val: (value.length ? value : undefined) as FilterType, key, type: '=' },\n ];\n }\n\n /**\n * Where a filter write goes: the framework context (read through the facade)\n * or — in the results tab — the redirect context to `/obiekty` (MOB-1818).\n */\n private objectsFiltersBarWriteTarget(\n context: FiltersContext<MsObject>,\n ): ObjectsFiltersBarWriteTarget {\n if (!this.redirectChanges()) {\n return context;\n }\n\n return new ObjectsRedirectFiltersContext(\n () => this.filter(),\n (filter) => this.filterRedirect.emit(filter),\n ) as unknown as ObjectsFiltersBarWriteTarget;\n }\n\n private objectsFiltersBarDictionaryValue(\n context: FiltersContext<MsObject>,\n key: string,\n ): IDictionaryEntry[] {\n const value = (context.query ?? []).find(\n (q) => q.key === key && q.type === '=',\n )?.value;\n return dictionaryEntries(value);\n }\n}\n","import {\n computed,\n Directive,\n ElementRef,\n input,\n linkedSignal,\n output,\n signal,\n TemplateRef,\n viewChild,\n} from '@angular/core';\nimport { ICrudFilter } from '@smartsoft001/crud-shell-angular';\n\nimport {\n dictionaryFilterItems,\n ThemeTag,\n} from '@smartsoft001-mobilems/angular';\n\nimport {\n IObjectsDateRange,\n IObjectsFilterWrite,\n OBJECTS_THEME_TAGS_FILTER_KEY,\n} from './objects-filter-tools';\n\n/**\n * Logic of the grey objects search panel (Muzeum Podlasia's\n * `objects-search-panel`, mockup \"search tagi filtry\" 458:7898, desktop\n * \"Frame 502\" 2300:51176, mobile \"Panel wyszukiwarki\" 2300:51195): phrase →\n * theme tags + \"Wyszukaj więcej tagów\" → date range, \"Pokaż\" and \"Szukaj\" →\n * advanced filters. On mobile a \"Filtry ↓\" button under the phrase field\n * expands the rest of the panel.\n *\n * Presentational — it reads its state from `filter()` and emits events; the\n * parent (the filters bar) writes to `FiltersContext`. No template: each\n * museum extends it and keeps its own HTML, with the phrase input marked\n * `#phraseField`.\n */\n@Directive()\nexport abstract class ObjectsSearchPanelBaseComponent {\n readonly phrase = input<string>('');\n readonly filter = input.required<ICrudFilter>();\n\n /**\n * Theme tags — the whole `Cycle` dictionary or the \"Wyszukaj więcej tagów\"\n * result; the template decides how many show at once (MOB-1826).\n */\n readonly tags = input<ThemeTag[]>([]);\n\n /** The parent controls the advanced filters panel state. */\n readonly isAdvancedFiltersOn = input<boolean>(false);\n\n /**\n * The `/obiekty` list also searches by filters alone — \"Szukaj\" with an\n * empty phrase is allowed there. In the search results the phrase is part\n * of the address, so an empty phrase has nowhere to go.\n */\n readonly allowEmptyPhrase = input<boolean>(false);\n\n /** A full-bleed band (the `/obiekty` list) instead of a grey box (search results). */\n readonly fullBleed = input<boolean>(false);\n\n /**\n * Selected filter chips (state \"Selected\" 2193:3301 / mobile 2276:7726) —\n * rendered by the parent and inserted once by the panel; only CSS places\n * them, so the DOM is the same after SSR and in the browser.\n */\n readonly selectedFiltersTpl = input<TemplateRef<unknown> | null>(null);\n\n readonly searchPhrase = output<string>();\n readonly tagToggle = output<ThemeTag>();\n\n /**\n * Passed through unchanged — the date field debounces the year typing\n * (MOB-1866), the panel delays nothing here.\n */\n readonly dateRangeChange = output<IObjectsDateRange>();\n\n readonly booleanFilterChange = output<{ key: string; checked: boolean }>();\n\n /** \"Wyszukaj więcej tagów\" — an empty phrase goes back to the default tags. */\n readonly tagsSearch = output<string>();\n readonly advancedFiltersToggle = output<void>();\n\n /** One batched payload from the \"Filtry zaawansowane\" panel's Zastosuj/Resetuj. */\n readonly advancedFiltersApply = output<IObjectsFilterWrite[]>();\n\n /** The selected theme tags read from the current filter. */\n protected readonly selectedTagIds = computed<(number | null)[]>(() => {\n const value = (this.filter()?.query ?? []).find(\n (q) => q.key === OBJECTS_THEME_TAGS_FILTER_KEY,\n )?.value;\n\n // `null`, `[null]` and entries without an id (a restored filter) are\n // skipped, `\"3\"` from the address = `3` from the dictionary (MOB-1826 review).\n return dictionaryFilterItems(value).map((item) => item.id);\n });\n\n /** The field text — starts from `phrase()` and follows a change from the URL. */\n protected readonly searchText = linkedSignal(() => this.phrase());\n\n /** The \"Wyszukaj więcej tagów\" phrase and the last query sent. */\n protected readonly tagQuery = signal('');\n protected readonly submittedTagQuery = signal('');\n\n /** \"Pokaż wszystkie tagi (N)\" expanded — a new search collapses it. */\n protected readonly tagsExpanded = signal(false);\n\n /** Mobile: \"Filtry ↓\" expands the tags, dates and buttons (always visible from lg). */\n protected readonly filtersOpen = signal(false);\n\n /** Mobile: \"Więcej tagów\" reveals the tag search field (2276:7913). */\n protected readonly moreTagsOpen = signal(false);\n\n private readonly objectsSearchPanelPhraseField =\n viewChild<ElementRef<HTMLInputElement>>('phraseField');\n\n /** The \"Pokaż\" boxes' state read from the filter — e.g. after a link with filters. */\n protected isBooleanFilterOn(key: string): boolean {\n return (this.filter()?.query ?? []).some(\n (q) => q.key === key && q.value === true,\n );\n }\n\n protected toggleMoreTags(): void {\n this.moreTagsOpen.update((open) => !open);\n }\n\n protected toggleFilters(): void {\n this.filtersOpen.update((open) => !open);\n }\n\n /**\n * \"×\" in the phrase field. On the list it also clears the search; in the\n * search results it only empties the field (a new phrase is a new address).\n */\n protected clearPhrase(): void {\n this.searchText.set('');\n this.objectsSearchPanelPhraseField()?.nativeElement.focus();\n\n if (this.allowEmptyPhrase()) {\n this.searchPhrase.emit('');\n }\n }\n\n protected searchTags(): void {\n const query = this.tagQuery().trim();\n this.submittedTagQuery.set(query);\n this.tagsExpanded.set(false);\n this.tagsSearch.emit(query);\n }\n\n protected onBooleanFilterChange(key: string, checked: boolean): void {\n this.booleanFilterChange.emit({ key, checked });\n }\n\n /**\n * Only an explicit action (button / Enter) searches — the panel has no\n * live search, so there is no debounce here either.\n */\n protected search(): void {\n const phrase = this.searchText().trim();\n\n if (!phrase && !this.allowEmptyPhrase()) {\n return;\n }\n\n this.searchPhrase.emit(phrase);\n }\n}\n","import { Directive, input } from '@angular/core';\nimport { ICrudFilter } from '@smartsoft001/crud-shell-angular';\n\nimport {\n SHARE_LINK_COPIED_TIMEOUT,\n ShareLinkBaseComponent,\n} from '@smartsoft001-mobilems/angular';\n\nimport { buildObjectsResultsUrl } from './objects-filter-tools';\n\n/** How long (ms) the \"link copied\" message stays after a click. */\nexport const OBJECTS_SHARE_COPIED_TIMEOUT = SHARE_LINK_COPIED_TIMEOUT;\n\n/**\n * Logic of \"Share search results\" (mock-up \"Action panel\" 2300:51184): a link\n * to the objects list with the current filters, shared through\n * `ShareLinkBaseComponent` — the native share sheet, or a clipboard copy with a\n * \"link copied\" flag when the browser has no share sheet. The template stays in\n * the app.\n */\n@Directive()\nexport abstract class ObjectsShareResultsBaseComponent extends ShareLinkBaseComponent {\n readonly filter = input<ICrudFilter | null | undefined>(undefined);\n\n /** The list path the link opens; overridable, read inside `share`. */\n protected readonly objectsShareResultsListPath: string = '/obiekty';\n\n /** How long (ms) \"copied\" stays on; overridable, read inside `share`. */\n protected readonly objectsShareResultsCopiedTimeout: number =\n OBJECTS_SHARE_COPIED_TIMEOUT;\n\n protected override get shareLinkCopiedTimeout(): number {\n return this.objectsShareResultsCopiedTimeout;\n }\n\n protected override shareLinkUrl(): string {\n return buildObjectsResultsUrl(\n this.shareLinkDocument.defaultView?.location.origin ?? '',\n this.filter(),\n this.objectsShareResultsListPath,\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-objects-shell-angular.mjs","sources":["../../../../../../packages/objects/shell/angular/src/lib/services/objects/objects.service.ts","../../../../../../packages/objects/shell/angular/src/lib/+state/objects.facade.ts","../../../../../../packages/objects/shell/angular/src/lib/+state/objects.reducer.ts","../../../../../../packages/objects/shell/angular/src/lib/components/list/list.component.ts","../../../../../../packages/objects/shell/angular/src/lib/components/list/list.component.html","../../../../../../packages/objects/shell/angular/src/lib/components/filters/filters.component.ts","../../../../../../packages/objects/shell/angular/src/lib/components/filters/filters.component.html","../../../../../../packages/objects/shell/angular/src/lib/components/components.module.ts","../../../../../../packages/objects/shell/angular/src/lib/services/objects-data/objects-data.service.ts","../../../../../../packages/objects/shell/angular/src/lib/services/object-media/object-media.service.ts","../../../../../../packages/objects/shell/angular/src/lib/services/index.ts","../../../../../../packages/objects/shell/angular/src/lib/objects.module.ts","../../../../../../packages/objects/shell/angular/src/lib/objects-shared.module.ts","../../../../../../packages/objects/shell/angular/src/lib/+state/objects.selectors.ts","../../../../../../packages/objects/shell/angular/src/lib/pages/list/list.component.ts","../../../../../../packages/objects/shell/angular/src/lib/pages/item/item.component.ts","../../../../../../packages/objects/shell/angular/src/lib/models/objects-filters.model.ts","../../../../../../packages/objects/shell/angular/src/lib/catalog/objects-catalog-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/catalog/object-details-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/tools/object-detail.ts","../../../../../../packages/objects/shell/angular/src/lib/tools/ask-about-object.ts","../../../../../../packages/objects/shell/angular/src/lib/filters/objects-advanced-filters-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/filters/objects-filter-tools.ts","../../../../../../packages/objects/shell/angular/src/lib/filters/objects-filters-bar-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/filters/objects-search-panel-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/filters/objects-share-results-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/media-tabs/object-media-tab-base.ts","../../../../../../packages/objects/shell/angular/src/lib/media-tabs/object-download-button-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/media-tabs/object-map-tab-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/media-tabs/object-audio-media-tab-base.ts","../../../../../../packages/objects/shell/angular/src/lib/media-tabs/object-audio-tab-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/media-tabs/object-audio-description-tab-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/media-tabs/object-documents-tab-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/media-tabs/media-tab-picker.ts","../../../../../../packages/objects/shell/angular/src/lib/media-tabs/object-video-media-tab-base.ts","../../../../../../packages/objects/shell/angular/src/lib/media-tabs/object-animation-tab-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/media-tabs/object-video-tab-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/media-tabs/object-virtual-walk-tab-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/media-tabs/object-model-3d-tab-base.component.ts","../../../../../../packages/objects/shell/angular/src/lib/media-tabs/object-media-sections-base.component.ts","../../../../../../packages/objects/shell/angular/src/smartsoft001-mobilems-objects-shell-angular.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { CrudBaseService } from '@smartsoft001-mobilems/angular';\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\n@Injectable()\nexport class ObjectsService extends CrudBaseService<MsObject> {\n getUrlNameForDetails(): string {\n return 'object';\n }\n\n getUrlNameForList(): string {\n return 'Object';\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { CrudFacade } from '@smartsoft001/crud-shell-angular';\n\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nimport { ObjectsService } from '../services/objects/objects.service';\n\n@Injectable()\nexport class ObjectsFacade extends CrudFacade<MsObject> {\n protected service = inject(ObjectsService);\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 { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\n// import {objectsFacade} from \"./objects.facade\";\n\nexport type State = SmartState<MsObject>;\n\nexport const initialState = {\n ...smartInitialState,\n};\n\nconst objectsReducer = (state = initialState, action: any) => {\n switch (action.type) {\n //case objectsFacade.name + ' test':\n // return {\n // ...state,\n // loaded: false,\n // }\n\n default:\n return smartGetReducer('objects')(state, action);\n }\n};\n\nexport function getReducer() {\n return (state: any, action: Action) => {\n return objectsReducer(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 { ObjectsFacade } from '../../+state/objects.facade';\n\n@Component({\n selector: 'smart-mobilems-objects-list',\n templateUrl: './list.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [NgTemplateOutlet],\n})\nexport class ListComponent {\n private facade = inject(ObjectsFacade);\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 { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\n@Component({\n selector: 'smart-mobilems-objects-filters',\n templateUrl: './filters.component.html',\n changeDetection: ChangeDetectionStrategy.Eager,\n imports: [NgTemplateOutlet],\n})\nexport class FiltersComponent extends FiltersBaseComponent<MsObject> {}\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 { isPlatformServer } from '@angular/common';\nimport { HttpErrorResponse } from '@angular/common/http';\nimport { inject, Injectable, isDevMode, PLATFORM_ID } from '@angular/core';\nimport {\n catchError,\n expand,\n firstValueFrom,\n from,\n map,\n mergeMap,\n Observable,\n of,\n reduce,\n retry,\n switchMap,\n tap,\n throwError,\n timer,\n toArray,\n} from 'rxjs';\n\nimport {\n DICTIONARY_PAGE_SIZE,\n type IDictionaryEntry,\n type IDictionaryPage,\n} from '@smartsoft001-mobilems/angular';\n\nimport { ObjectsService } from '../objects/objects.service';\n\n/** Pause before the only retry of `related` after a network error (ms). */\nconst RELATED_RETRY_DELAY = 500;\n\n/** Response of `GET object/:id/related`. */\nexport interface IObjectRelated {\n objects: Array<{ id: number | string }>;\n collections: Array<{ id: number | string }>;\n articles: Array<{ id: number | string }>;\n}\n\n/**\n * A public (thematic) collection from the `GET public-collections/page/{n}`\n * list — as much as the object card (\"Related collections\") and the filters\n * panel need.\n */\nexport interface IObjectCollectionSummary {\n id: number | string;\n title: string;\n publicationDate: string | null;\n /** Number of objects in the collection — the page size of the membership check. */\n itemCount: number | null;\n}\n\ninterface IPublicCollectionsPageResponse {\n data?: {\n items?: Array<{\n id: number | string;\n title?: string | null;\n publicationDate?: string | null;\n itemCount?: number | null;\n }> | null;\n paginatorDetails?: { totalPagesCount?: number | null } | null;\n } | null;\n}\n\ninterface IObjectIdsPageResponse {\n data?: {\n items?: Array<{ id: number | string }> | null;\n paginatorDetails?: { totalPagesCount?: number | null } | null;\n } | null;\n}\n\n/** Page size of the public collections list (the API accepts up to 500). */\nconst PUBLIC_COLLECTIONS_PAGE_SIZE = 100;\n\n/**\n * Segregations of the `ArchaeologicalData` dictionary — per the MobileMS task\n * (Kanbanize 50040, MOB-1844): site towns, periods (epochs) and cultures.\n */\nexport type ArchaeologicalSegregation =\n 'ArcheoTown' | 'ArcheoPeriod' | 'ArcheoCulture';\n\ninterface IDictionaryPageResponse {\n data?: {\n items?: IDictionaryEntry[];\n paginatorDetails?: { totalPagesCount?: number };\n } | null;\n}\n\n/** Page size of `search/Object` when checking an object's membership. */\nconst COLLECTION_OBJECTS_PAGE_SIZE = 500;\n/** How many collections are checked at once (API 429 limit). */\nconst COLLECTION_LOOKUP_CONCURRENCY = 4;\n\n/**\n * The API answers 404 `NO_RESULTS_FOR_GIVEN_QUERY` instead of an empty list —\n * only that 404 means \"no results\"; any other 404 (wrong address, proxy) is an error.\n */\nconst isNoResults = (error: HttpErrorResponse): boolean =>\n error?.status === 404 &&\n (error.error as { message?: string } | null)?.message ===\n 'NO_RESULTS_FOR_GIVEN_QUERY';\n\n/**\n * `ObjectsService` plus the reads of the object details page and the filter\n * dictionaries. A subclass, so `ObjectsService` (the `CrudService` of the\n * objects module) stays unchanged. Request URLs, parameter order included,\n * are transfer cache keys: keep them as they are.\n */\n@Injectable()\nexport class ObjectsDataService extends ObjectsService {\n private readonly objectsDataIsServer = isPlatformServer(inject(PLATFORM_ID));\n\n /**\n * Counts a visit of the object card: `POST api/object/:id/visit`. Browser\n * only — the caller runs it under `isPlatformBrowser` and catches its errors.\n */\n logVisit(id: number | string): Promise<void> {\n const cardUrl: string = this.config.apiUrl + 'api/object/' + id + '/visit';\n return firstValueFrom(this.http.post<void>(cardUrl, {}));\n }\n\n /**\n * \"You may also be interested in\" — `GET object/:id/related` (objects,\n * collections, articles). A network error (status 0) is retried once; any\n * other error, or a second failed request, goes on to the `rxResource`\n * (error state — the section stays hidden, `reload()` retries). In dev mode\n * the error is logged, except a 404 on the server: there `related` starts\n * next to the card (MOB-1850), so a missing object gives two 404s and the\n * card view shows the error. In the browser `related` follows the card — a\n * 404 is unexpected there and stays in the console.\n */\n getRelated(id: number | string): Observable<IObjectRelated> {\n return this.http\n .get<{\n data?: Partial<IObjectRelated> | null;\n }>(`${this.config.apiUrl}object/${id}/related`)\n .pipe(\n retry({\n count: 1,\n delay: (error: HttpErrorResponse) =>\n error?.status === 0\n ? timer(RELATED_RETRY_DELAY)\n : throwError(() => error),\n }),\n map((response) => ({\n objects: response?.data?.objects ?? [],\n collections: response?.data?.collections ?? [],\n articles: response?.data?.articles ?? [],\n })),\n tap({\n error: (error: HttpErrorResponse) => {\n if (\n isDevMode() &&\n !(this.objectsDataIsServer && error?.status === 404)\n ) {\n console.error(`object/${id}/related`, error);\n }\n },\n }),\n );\n }\n\n /**\n * One page of the public collections list, newest publication first\n * (`sort=publicationDate-desc`), with the phrase in `filter[phrase]` (the\n * \"Field description\" document: \"Search in collections: filter:phrase\").\n * 404 `NO_RESULTS_FOR_GIVEN_QUERY` is an empty page, any other error propagates.\n */\n loadPublicCollectionsPage(\n page = 1,\n query?: string,\n ): Observable<{\n items: IObjectCollectionSummary[];\n totalPagesCount: number;\n }> {\n const phrase = query?.trim();\n const url =\n `${this.config.apiUrl}public-collections/page/${page}` +\n `?maxPerPage=${PUBLIC_COLLECTIONS_PAGE_SIZE}&sort=publicationDate-desc` +\n (phrase ? `&filter[phrase]=${encodeURIComponent(phrase)}` : '');\n return this.http.get<IPublicCollectionsPageResponse>(url).pipe(\n map((response) => ({\n items: (response?.data?.items ?? [])\n .filter((item) => item && item.id !== null && item.id !== undefined)\n .map((item) => ({\n id: item.id,\n title: item.title?.trim() ?? '',\n publicationDate: item.publicationDate ?? null,\n itemCount:\n typeof item.itemCount === 'number' ? item.itemCount : null,\n })),\n totalPagesCount: Math.max(\n 1,\n response?.data?.paginatorDetails?.totalPagesCount ?? 1,\n ),\n })),\n catchError((error: HttpErrorResponse) =>\n isNoResults(error)\n ? of({ items: [] as IObjectCollectionSummary[], totalPagesCount: 1 })\n : throwError(() => error),\n ),\n );\n }\n\n /**\n * Public collections as the dictionary of the \"Thematic collection\" field in\n * the advanced filters (MOB-1844): `filter[entryCollections]` in\n * `search/Object` takes ids from `public-collections`, not from the\n * `ECollection` dictionary.\n */\n loadCollectionsDictionary(\n page = 1,\n query?: string,\n ): Observable<IDictionaryPage> {\n return this.loadPublicCollectionsPage(page, query).pipe(\n map((result) => ({\n items: result.items.map((item) => ({\n id: Number(item.id),\n name: item.title,\n })),\n totalPagesCount: result.totalPagesCount,\n })),\n );\n }\n\n /**\n * Dictionary of the \"Archaeological filters\" fields (MOB-1844). In Muza it is\n * `ArchaeologicalData` segregated into `ArcheoTown|ArcheoPeriod|ArcheoCulture`\n * (Kanbanize 50040), but MobileMS exposed each segregation as its own\n * dictionary type: `dictionary/ArcheoTown/search/page/{n}` (develop\n * 2026-10-21 — the type is recognised, `ArchaeologicalData` still 409). Same\n * path and shape as the framework's `DataService.loadFilterDictionary`. Until\n * production has these types the API answers 409 and the field shows a load error.\n */\n loadArchaeologicalDictionary(\n segregation: ArchaeologicalSegregation,\n page = 1,\n query?: string,\n ): Observable<IDictionaryPage> {\n const phrase = query?.trim();\n // No phrase, no `q` — the API treats an empty `q=` as a query with no results.\n const url =\n `${this.config.apiUrl}api/dictionary/${segregation}/search/page/${page}` +\n `?maxPerPage=${DICTIONARY_PAGE_SIZE}&_type=query` +\n (phrase ? `&q=${encodeURIComponent(phrase)}` : '');\n return this.http.get<IDictionaryPageResponse>(url).pipe(\n map((response) => ({\n items: response?.data?.items ?? [],\n totalPagesCount: response?.data?.paginatorDetails?.totalPagesCount ?? 1,\n })),\n );\n }\n\n /** All public collections (consecutive pages of the list). */\n loadAllPublicCollections(): Observable<IObjectCollectionSummary[]> {\n return this.loadPublicCollectionsPage(1).pipe(\n expand((result, index) =>\n index + 2 <= result.totalPagesCount\n ? this.loadPublicCollectionsPage(index + 2)\n : [],\n ),\n reduce(\n (all, result) => [...all, ...result.items],\n [] as IObjectCollectionSummary[],\n ),\n );\n }\n\n /**\n * \"Related collections\" of the object card per the \"Field description\"\n * document: `search/Object` with `filter[entryCollections]`, sorted by\n * publication date. The API gives no reverse direction (`portalCollections`\n * and `related.collections` are empty also for objects in a collection), so\n * for each public collection we check whether its objects contain this\n * object — a few collections at a time, in list order. A collection that\n * could not be checked is skipped; a failed list means no section (an empty\n * list), not a page error.\n */\n loadRelatedCollections(\n objectId: number | string,\n ): Observable<IObjectCollectionSummary[]> {\n return this.loadAllPublicCollections().pipe(\n switchMap((collections) =>\n from(collections).pipe(\n mergeMap(\n (collection) =>\n this.objectsDataCollectionContains(collection, objectId).pipe(\n map((contains) => (contains ? collection : null)),\n ),\n COLLECTION_LOOKUP_CONCURRENCY,\n ),\n toArray(),\n map((matches) =>\n collections.filter((collection) => matches.includes(collection)),\n ),\n ),\n ),\n catchError(() => of([] as IObjectCollectionSummary[])),\n );\n }\n\n /** Whether `search/Object` with the collection's `filter[entryCollections]` contains the object; an error → unknown → `false`. */\n private objectsDataCollectionContains(\n collection: IObjectCollectionSummary,\n objectId: number | string,\n ): Observable<boolean> {\n const wanted = String(objectId);\n const pageSize = Math.min(\n COLLECTION_OBJECTS_PAGE_SIZE,\n Math.max(1, collection.itemCount ?? COLLECTION_OBJECTS_PAGE_SIZE),\n );\n const load = (page: number) =>\n this.http\n .get<IObjectIdsPageResponse>(\n `${this.config.apiUrl}search/Object/page/${page}` +\n `?maxPerPage=${pageSize}` +\n `&filter[entryCollections][]=${encodeURIComponent(String(collection.id))}`,\n )\n .pipe(\n map((response) => ({\n found: (response?.data?.items ?? []).some(\n (item) => String(item?.id) === wanted,\n ),\n totalPagesCount: Math.max(\n 1,\n response?.data?.paginatorDetails?.totalPagesCount ?? 1,\n ),\n })),\n // A collection without objects → 404 `NO_RESULTS_FOR_GIVEN_QUERY`.\n catchError((error: HttpErrorResponse) =>\n isNoResults(error)\n ? of({ found: false, totalPagesCount: 1 })\n : throwError(() => error),\n ),\n );\n return load(1).pipe(\n expand((result, index) =>\n !result.found && index + 2 <= result.totalPagesCount\n ? load(index + 2)\n : [],\n ),\n reduce((found, result) => found || result.found, false),\n catchError(() => of(false)),\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\n\nimport { FileUrlService } from '@smartsoft001-mobilems/angular';\nimport { MsFile } from '@smartsoft001-mobilems/models';\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nimport { FileType, FormFeatureType } from '../../models';\n\n/** A gallery item (full size, for fullscreen). */\nexport interface IObjectGalleryItem {\n title?: string;\n image?: MsFile;\n file?: MsFile;\n}\n\n/**\n * Shared listing of an object's media (the main image + `additionalImages`\n * filtered by `formFeature`) — used by the details page image viewer\n * (MOB-1801), the hero gallery, the thumbnails and the HD images section.\n */\n@Injectable({ providedIn: 'root' })\nexport class ObjectMediaService {\n private readonly objectMediaFileUrl = inject(FileUrlService);\n\n /** Gallery items (full size, for fullscreen). */\n galleryItems(\n obj: MsObject | undefined,\n types: FormFeatureType[],\n includeMainImage = true,\n ): IObjectGalleryItem[] {\n if (!obj) return [];\n\n const out: IObjectGalleryItem[] = [];\n\n if (obj.image && includeMainImage) {\n const url = this.objectMediaFileUrl.get(obj.image);\n if (!url?.includes('assets/no-image.svg')) {\n out.push({ title: obj.title, image: obj.image });\n }\n }\n\n for (const img of this.objectMediaAdditional(obj, types)) {\n const url = this.objectMediaFileUrl.get(img as unknown as MsFile);\n if (!url?.includes('assets/no-image.svg')) {\n out.push({ title: obj.title, image: img as unknown as MsFile });\n }\n }\n\n return out;\n }\n\n /** Thumbnail URLs (`cache` mode + a forced `.jpg` for the CDN). */\n thumbnailUrls(\n obj: MsObject | undefined,\n types: FormFeatureType[],\n includeMainImage = true,\n ): string[] {\n if (!obj) return [];\n\n const urls: string[] = [];\n\n if (obj.image && includeMainImage) {\n const url = this.objectMediaJpg(\n this.objectMediaFileUrl.get(obj.image, 'cache'),\n );\n if (url && !url.includes('assets/no-image.svg')) {\n urls.push(url);\n }\n }\n\n for (const img of this.objectMediaAdditional(obj, types)) {\n const url = this.objectMediaJpg(\n this.objectMediaFileUrl.get(img as unknown as MsFile, 'cache'),\n );\n if (url && !url.includes('assets/no-image.svg')) {\n urls.push(url);\n }\n }\n\n return urls;\n }\n\n /**\n * Whether the object has files of the types (video, 3D model) — by\n * `filePath`, because `FileUrlService` returns a placeholder for\n * non-image extensions.\n */\n hasFiles(obj: MsObject | undefined, types: FormFeatureType[]): boolean {\n if (!obj) return false;\n return this.objectMediaAdditional(obj, types).some(\n (file) => !!file?.filePath,\n );\n }\n\n private objectMediaAdditional(\n obj: MsObject,\n types: FormFeatureType[],\n ): FileType[] {\n const additional = (obj as MsObject & { additionalImages?: FileType[] })\n .additionalImages;\n if (!Array.isArray(additional)) return [];\n\n return (additional as unknown as FileType[])\n .filter((img) => types.includes(img?.formFeature))\n .sort((a, b) => (a?.position ?? 0) - (b?.position ?? 0));\n }\n\n /** Replaces the extension with `.jpg` — CDN cache compatibility. */\n private objectMediaJpg(path: string): string {\n const lastDotIndex = path.lastIndexOf('.');\n if (lastDotIndex > -1) {\n return path.substring(0, lastDotIndex) + '.jpg';\n }\n return path + '.jpg';\n }\n}\n","import { CrudService } from '@smartsoft001/crud-shell-angular';\n\nimport { ObjectsService } from './objects/objects.service';\nimport { ObjectsDataService } from './objects-data/objects-data.service';\n\nexport * from './objects/objects.service';\nexport * from './objects-data/objects-data.service';\nexport * from './object-media/object-media.service';\n\nexport const SERVICES = [\n ObjectsService,\n ObjectsDataService,\n {\n provide: CrudService,\n useClass: ObjectsService,\n },\n];\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { FILE_SERVICE_CONFIG, IFileServiceConfig } from '@smartsoft001/angular';\nimport {\n CrudConfig,\n CrudCoreModule,\n CrudFullConfig,\n ICrudModuleOptionsWithoutRoutng,\n} from '@smartsoft001/crud-shell-angular';\nimport { IEntity } from '@smartsoft001/domain-core';\n\nimport {\n provideInheritedSharedConfig,\n SharedModule,\n} from '@smartsoft001-mobilems/angular';\n\nimport { ObjectsFacade } from './+state/objects.facade';\nimport { getReducer } from './+state/objects.reducer';\nimport { ComponentsModule } from './components';\nimport { SERVICES } from './services';\n\n@NgModule({\n declarations: [],\n providers: [...SERVICES, ObjectsFacade],\n imports: [SharedModule, ComponentsModule, CrudCoreModule],\n exports: [ComponentsModule],\n})\nexport class ObjectsModule {\n static forFeature<T extends IEntity<string>>(\n options: ICrudModuleOptionsWithoutRoutng<T>,\n ): ModuleWithProviders<ObjectsModule> {\n if (!options.config.reducerFactory)\n options.config.reducerFactory = getReducer;\n return {\n ngModule: ObjectsModule,\n providers: [\n provideInheritedSharedConfig(options.config.apiUrl),\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 {\n provideInheritedSharedConfig,\n SharedModule,\n} from '@smartsoft001-mobilems/angular';\n\nimport { ObjectsFacade } from './+state/objects.facade';\nimport { getReducer } from './+state/objects.reducer';\nimport { ComponentsModule } from './components';\nimport { SERVICES } from './services';\n\n@NgModule({\n declarations: [],\n providers: [...SERVICES, ObjectsFacade],\n imports: [SharedModule, ComponentsModule, CrudModule],\n exports: [ComponentsModule, CrudModule],\n})\nexport class ObjectsSharedModule {\n static forFeature<T extends IEntity<string>>(\n options: ICrudModuleOptionsWithoutRoutng<T>,\n ): ModuleWithProviders<ObjectsSharedModule> {\n if (!options.config.reducerFactory)\n options.config.reducerFactory = getReducer;\n return {\n ngModule: ObjectsSharedModule,\n providers: [\n provideInheritedSharedConfig(options.config.apiUrl),\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 './objects.reducer';\n\nexport const getObjectsState = createFeatureSelector<State>('objects');\n\n//export const getobjectsTest = createSelector(\n// getobjectsState,\n// (state) => state.test\n//);\n","import { Directive, inject, Signal } from '@angular/core';\nimport { CrudListPageBaseComponent } from '@smartsoft001/crud-shell-angular';\n\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nimport { ObjectsFacade } from '../../+state';\n\n@Directive()\nexport abstract class ObjectsListComponent extends CrudListPageBaseComponent<MsObject> {\n protected readonly facade = inject(ObjectsFacade);\n\n list = this.facade.list as Signal<MsObject[]>;\n loading = this.facade.loading;\n filter = this.facade.filter;\n}\n","import { Directive, effect, inject, signal } 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 { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nimport { ObjectsFacade } from '../../+state';\n\n@Directive()\nexport abstract class ObjectsItemComponent extends CrudItemPageBaseComponent<MsObject> {\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(ObjectsFacade);\n\n readonly loading = this.facade.loading;\n readonly item = this.facade.selected;\n /** @deprecated No museum uses it; download the card through the app's own download service. */\n readonly isPdfDownloading = signal(false);\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 /** @deprecated No museum uses it; download the card through the app's own download service. */\n async onDownload(): Promise<void> {\n this.isPdfDownloading.set(true);\n try {\n await this.facade.downloadPdf({\n id: this.item()?.id.toString() || '',\n title: this.item()?.title as string,\n });\n } catch (error) {\n console.error('PDF download failed:', error);\n } finally {\n this.isPdfDownloading.set(false);\n }\n }\n}\n","import { MsFile } from '@smartsoft001-mobilems/models';\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nexport type SortType =\n 'random' | 'date-asc' | 'date-desc' | 'name-asc' | 'name-desc';\n\nexport type IKeyValue = {\n key: string;\n value?: string;\n};\n\nexport enum AdvancedFilterType {\n CREATORS = 'creators',\n AUTHORS = 'authors',\n MATERIALS = 'materials',\n TECHNIQUES = 'techniques',\n CREATE_PLACES = 'createPlaces',\n KEYWORDS = 'keywords',\n}\n\nexport enum FormFeatureType {\n MODEL_3D = 1,\n PHOTO_360 = 2,\n IMAGES = 3,\n AUDIO = 7,\n AUDIO_DESKRYPCJA = 8,\n VIDEO = 9,\n ORTHOGRAPHY = 11,\n OTHER = 13,\n IMAGES_HD = 14,\n VIRTUAL_WALK = 15,\n ANIMATION = 20,\n}\n\nexport interface IMultimediaDictionaryItem {\n id: FormFeatureType;\n translationKey: string;\n}\n\n/**\n * Dictionary of multimedia types with their translation keys.\n * Use with TranslateService to get localized names.\n */\nexport const MULTIMEDIA_DICTIONARY: IMultimediaDictionaryItem[] = [\n {\n id: FormFeatureType.IMAGES,\n translationKey: 'OBJECTS.filters.multimedia.images',\n },\n {\n id: FormFeatureType.IMAGES_HD,\n translationKey: 'OBJECTS.filters.multimedia.galleryHD',\n },\n {\n id: FormFeatureType.MODEL_3D,\n translationKey: 'OBJECTS.filters.multimedia.model3D',\n },\n {\n id: FormFeatureType.AUDIO,\n translationKey: 'OBJECTS.filters.multimedia.audio',\n },\n {\n id: FormFeatureType.AUDIO_DESKRYPCJA,\n translationKey: 'OBJECTS.filters.multimedia.audioDescription',\n },\n {\n id: FormFeatureType.VIDEO,\n translationKey: 'OBJECTS.filters.multimedia.video',\n },\n {\n id: FormFeatureType.ANIMATION,\n translationKey: 'OBJECTS.filters.multimedia.animation',\n },\n {\n id: FormFeatureType.VIRTUAL_WALK,\n translationKey: 'OBJECTS.filters.multimedia.virtualWalk',\n },\n {\n id: FormFeatureType.OTHER,\n translationKey: 'OBJECTS.filters.multimedia.other',\n },\n];\n\nexport type FileType = Omit<MsFile, 'formFeature'> & {\n formFeature: FormFeatureType;\n};\n\ninterface Model3DFile {\n id: number;\n filePath: string;\n extension: string;\n altText: string | null;\n fileName: string;\n}\n\nexport interface IModel3DObject {\n formFeature: FormFeatureType;\n files: Model3DFile[];\n description: string | null;\n iframeSource: string | null;\n iframeHtml: string | null;\n isRemote: boolean;\n originalDimensions: string | null;\n id: number;\n position: number;\n filePath: string;\n extension: string;\n altText: string | null;\n altTextEn: string | null;\n vimeoUrl: string | null;\n}\n\nexport interface IAnimationObject {\n formFeature: FormFeatureType;\n files: MsFile[];\n description: string | null;\n iframeSource: string | null;\n iframeHtml: string | null;\n isRemote: boolean;\n originalDimensions: string | null;\n id: number;\n position: number;\n filePath: string;\n extension: string;\n altText: string | null;\n altTextEn: string | null;\n vimeoUrl: string | null;\n}\n\n// Leci z API, nie jest udokumentowane\nexport interface ISpecificObject extends MsObject {\n dimensionTextWithDuration?: string;\n specificDimensionDescription?: string;\n publicationDate?: string;\n authors?: Array<{\n id: number;\n name: string;\n role?: string;\n additionalRoles?: string[];\n comment?: string;\n }>;\n createPlaces?: Array<{\n id: number;\n name: string;\n comment?: string;\n }>;\n materials?: Array<{\n id: number;\n name: string;\n comment?: string;\n }>;\n techniques?: Array<{\n id: number;\n name: string;\n comment?: string;\n }>;\n createdAt?: string | Date;\n createDates?: Array<{\n id: number;\n name: string;\n comment?: string;\n }>;\n visited?: number;\n objectCardDownloadCount?: number;\n shareMuseumObjectMultimediaEnabled?: boolean;\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport {\n AfterViewInit,\n computed,\n Directive,\n effect,\n ElementRef,\n inject,\n PLATFORM_ID,\n Signal,\n signal,\n untracked,\n viewChild,\n WritableSignal,\n} from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute } from '@angular/router';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ListMode, PaginationMode } from '@smartsoft001/angular';\nimport { ICrudFilter } from '@smartsoft001/crud-shell-angular';\nimport { capitalize } from '@smartsoft001/utils';\n\nimport {\n createCatalog,\n createCatalogLoadMore,\n createSafeTimeouts,\n ICatalog,\n ICatalogLoadMore,\n ICatalogOptions,\n MasonryGridComponent,\n MuseumSeoService,\n WcagChangesService,\n} from '@smartsoft001-mobilems/angular';\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nimport { ObjectsListComponent } from '../pages/list/list.component';\n\n/**\n * Filter defaults of the objects list (Muzeum Podlasia): 20 objects per page,\n * newest first. **The key order is part of the contract** — the first read\n * spreads this object first, so it shapes the facade filter, the persisted\n * `MUSEUM_OBJECTS_FILTER` value and the `#base64` hash.\n */\nexport const OBJECTS_CATALOG_DEFAULTS: ICrudFilter = {\n paginationMode: PaginationMode.singlePage,\n sortBy: 'publication-date',\n sortDesc: true,\n offset: 0,\n limit: 20,\n};\n\n/** List SEO: `<title> - <site>`, a raw description and the canonical url. */\nexport interface IObjectsCatalogSeo {\n /** Translation key of the page title, e.g. `PAGE_TITLES.objects`. */\n titleKey: string;\n /** Translation key of the description — not capitalised. */\n descriptionKey: string;\n /** Translation key of the site name. Default `MODEL.mainTitle`. */\n siteNameKey?: string;\n /** Canonical url of the list, e.g. `/obiekty`. */\n url: string;\n}\n\nexport const OBJECTS_CATALOG_SEO: IObjectsCatalogSeo = {\n titleKey: 'PAGE_TITLES.objects',\n descriptionKey: 'HOME.collectionsDescription',\n siteNameKey: 'MODEL.mainTitle',\n url: '/obiekty',\n};\n\n/** Focus target and live-region message of „więcej ↓” (load more). */\nexport interface IObjectsCatalogLoadMore {\n /** Cards inside `#listContainer`; the first appended one gets the focus. */\n itemSelector?: string;\n /** Translation key announced after a page is appended (`{ count }`). */\n loadedMoreKey?: string;\n}\n\nconst OBJECTS_CATALOG_ITEM_SELECTOR =\n '[data-testid=\"objects-grid-item-link\"], [data-testid=\"objects-list-item\"]';\nconst OBJECTS_CATALOG_LOADED_MORE_KEY = 'OBJECTS.loadedMore';\n\nexport interface IObjectsCatalogOptions extends Partial<\n Omit<ICatalogOptions, 'facade'>\n> {\n /** Applied on creation, skipped in a search tab; `null` — no SEO. */\n seo?: IObjectsCatalogSeo | null;\n loadMore?: IObjectsCatalogLoadMore;\n}\n\n/**\n * Base of an objects list page on the shared catalog engine\n * (`createCatalog`): first read (also in SSR when the route carries the\n * filter), persistence, page, search, the read guard, the mobile list mode,\n * „więcej ↓”, the masonry lifecycle and the list SEO. The page keeps its\n * template.\n *\n * ```ts\n * export class ListComponent extends ObjectsCatalogBaseComponent {\n * constructor() {\n * super();\n * }\n * }\n * ```\n *\n * The template holds a `#listContainer` element (scrolled to after a page\n * change from the bottom pagination; it holds the cards focused by load\n * more) and a `smart-mobilems-masonry-grid` in the grid mode.\n */\n@Directive()\nexport abstract class ObjectsCatalogBaseComponent\n extends ObjectsListComponent\n implements AfterViewInit\n{\n readonly ListMode = ListMode;\n protected readonly catalog: ICatalog;\n\n readonly isBrowser: Signal<boolean>;\n /** The route set the filter, so the list is read and rendered in SSR too. */\n readonly routeList: Signal<boolean>;\n readonly listMode: Signal<ListMode>;\n readonly searchEnabled: Signal<boolean | undefined>;\n readonly barPhrase: Signal<string>;\n readonly isLoading: Signal<boolean>;\n readonly hasError: Signal<unknown>;\n readonly totalCount: Signal<number>;\n /** `publication-date-desc` style key for the toolbar. */\n readonly sortKey: Signal<string | undefined>;\n readonly selectedPage: Signal<number>;\n /** `?type=new` — the page offers the newest-first sort options. */\n readonly isNewType: Signal<boolean>;\n\n /** Cards on the list — with „więcej ↓” previous pages + the current one. */\n readonly items: Signal<MsObject[]>;\n /** There are results after the current page. */\n readonly hasMore: Signal<boolean>;\n /** The next page is loading — the list stays, only the button shows it. */\n readonly isAppending: Signal<boolean>;\n /** Screen reader message after cards were appended. */\n readonly loadMoreStatus: WritableSignal<string> = signal('');\n\n private readonly objectsCatalogTranslate = inject(TranslateService);\n private readonly objectsCatalogSeoService = inject(MuseumSeoService);\n private readonly objectsCatalogWcag = inject(WcagChangesService);\n private readonly objectsCatalogBrowser = isPlatformBrowser(\n inject(PLATFORM_ID),\n );\n private readonly objectsCatalogTimeouts = createSafeTimeouts();\n private readonly objectsCatalogMasonry = viewChild(MasonryGridComponent);\n private readonly objectsCatalogListContainer =\n viewChild<ElementRef<HTMLElement>>('listContainer');\n private readonly objectsCatalogLoadMore: ICatalogLoadMore<MsObject>;\n private objectsCatalogViewReady = false;\n private objectsCatalogScrollAfterLoad = false;\n private readonly objectsCatalogQueryParams = toSignal(\n inject(ActivatedRoute).queryParams,\n );\n\n protected constructor(options: IObjectsCatalogOptions = {}) {\n super();\n const {\n seo = OBJECTS_CATALOG_SEO,\n loadMore = {},\n ...catalogOptions\n } = options;\n const defaults = catalogOptions.defaults ?? OBJECTS_CATALOG_DEFAULTS;\n\n this.catalog = createCatalog({\n persistKey: 'MUSEUM_OBJECTS_FILTER',\n listPath: '/obiekty',\n searchTab: 'obiekty',\n listModeKey: 'MUSEUM_OBJECTS_LIST_MODE',\n ssrRead: 'route',\n // Mobile mockup (2300:51189) has the grid only — the view toggle is\n // hidden below md, so a stored list view does not apply there.\n mobileListModeBelow: 768,\n ...catalogOptions,\n defaults,\n facade: this.facade,\n });\n\n this.isBrowser = this.catalog.isBrowser;\n this.routeList = this.catalog.routeList;\n this.listMode = this.catalog.listMode;\n this.searchEnabled = this.catalog.searchEnabled;\n this.barPhrase = this.catalog.barPhrase;\n this.isLoading = this.catalog.isLoading;\n this.hasError = this.catalog.hasError;\n this.totalCount = this.catalog.totalCount;\n this.sortKey = this.catalog.sortKey;\n this.selectedPage = this.catalog.selectedPage;\n this.isNewType = computed(\n () => this.objectsCatalogQueryParams()?.['type'] === 'new',\n );\n\n // „więcej ↓” (mobile mockup 2300:51213); the focus moves to the first\n // appended card, without scrolling — the new cards sit right below.\n this.objectsCatalogLoadMore = createCatalogLoadMore<MsObject>({\n list: this.list,\n filter: this.facade.filter,\n totalCount: this.totalCount,\n loading: this.isLoading,\n read: (filter) => this.facade.read(filter),\n defaultLimit: defaults.limit || 20,\n onAppended: (added, firstIndex) => {\n this.loadMoreStatus.set(\n this.objectsCatalogTranslate.instant(\n loadMore.loadedMoreKey ?? OBJECTS_CATALOG_LOADED_MORE_KEY,\n { count: added },\n ),\n );\n if (!added || !this.objectsCatalogBrowser) return;\n this.objectsCatalogTimeouts.later(\n () =>\n this.listContainerElement\n ?.querySelectorAll<HTMLElement>(\n loadMore.itemSelector ?? OBJECTS_CATALOG_ITEM_SELECTOR,\n )\n [firstIndex]?.focus({ preventScroll: true }),\n 0,\n );\n },\n });\n this.items = this.objectsCatalogLoadMore.items;\n this.hasMore = this.objectsCatalogLoadMore.hasMore;\n this.isAppending = this.objectsCatalogLoadMore.isAppending;\n\n // Every loaded card (appended pages included) goes to the page, e.g. for\n // „select all” (MOB-1661). Untracked: the hook's own reads do not re-run it.\n effect(() => {\n const items = this.items();\n untracked(() => this.onCatalogItems(items));\n });\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.isLoading();\n if (\n !loading &&\n this.objectsCatalogScrollAfterLoad &&\n this.objectsCatalogBrowser\n ) {\n this.objectsCatalogScrollAfterLoad = false;\n this.objectsCatalogTimeouts.later(\n () =>\n this.listContainerElement?.scrollIntoView({\n behavior: 'smooth',\n block: 'start',\n }),\n 0,\n );\n }\n });\n\n // Re-layout masonry on WCAG/contrast changes.\n effect(() => {\n this.objectsCatalogWcag.wcagSettingsChanged();\n\n if (!this.objectsCatalogViewReady) {\n return;\n }\n\n this.objectsCatalogDestroyMasonry();\n this.objectsCatalogInitMasonry();\n });\n\n // Re-layout masonry when the list changes.\n effect(() => {\n const items = this.items();\n const mode = this.listMode();\n\n if (items && mode === ListMode.masonryGrid) {\n this.objectsCatalogDestroyMasonry();\n this.objectsCatalogTimeouts.later(\n () => this.objectsCatalogInitMasonry(),\n 150,\n );\n }\n });\n\n // Initialise masonry once the grid component is present.\n effect(() => {\n const masonry = this.objectsCatalogMasonry();\n const mode = this.listMode();\n const items = this.items();\n\n if (masonry && mode === ListMode.masonryGrid && items?.length) {\n this.objectsCatalogTimeouts.later(\n () => this.objectsCatalogInitMasonry(),\n 250,\n );\n }\n });\n\n if (seo) this.applyListSeo(seo);\n }\n\n /** The list root element (`#listContainer`). */\n protected get listContainerElement(): HTMLElement | undefined {\n return this.objectsCatalogListContainer()?.nativeElement;\n }\n\n /**\n * „więcej ↓” — reads the next page and appends it under the current cards\n * (no scrolling, no loader in place of the list).\n */\n loadMore(): void {\n if (this.isLoading() || !this.hasMore()) {\n return;\n }\n // Cleared first, so the live region changes — and is announced — even\n // when the next page brings the same number of cards.\n this.loadMoreStatus.set('');\n this.objectsCatalogLoadMore.loadMore();\n }\n\n retryLoad(): void {\n this.catalog.retry();\n }\n\n pageChange(page: number): void {\n this.catalog.setPage(page);\n }\n\n /** Page change from the bottom pagination — scrolls to the list once loaded. */\n bottomPageChange(page: number): void {\n this.objectsCatalogScrollAfterLoad = true;\n this.pageChange(page);\n }\n\n /**\n * In the catalog it reads with the phrase from the first page. In a search\n * tab the address is the only source of the phrase (MOB-1818): a new one\n * opens `/wyszukaj/:text/obiekty`, a blank one `/obiekty` with the other\n * filters.\n */\n search(phrase: string): void {\n this.catalog.search(phrase);\n }\n\n /**\n * A filter change in a search tab (MOB-1818) opens `/obiekty` with the whole\n * filter, the phrase (`filter[phrase]`), the sort and the page size instead\n * of narrowing the results in place.\n */\n openInCatalog(filter: ICrudFilter): void {\n this.catalog.openInList(filter);\n }\n\n onListMode(value: ListMode): void {\n const newMode =\n value === ListMode.masonryGrid ? ListMode.masonryGrid : ListMode.desktop;\n\n this.catalog.setListMode(newMode);\n // Below the mobile breakpoint the mode is forced and the toggle ignored.\n if (this.listMode() !== newMode) return;\n\n if (newMode !== ListMode.masonryGrid) {\n this.objectsCatalogDestroyMasonry();\n } else {\n this.objectsCatalogTimeouts.later(\n () => this.objectsCatalogInitMasonry(),\n 100,\n );\n }\n }\n\n ngAfterViewInit(): void {\n this.objectsCatalogInitMasonry();\n this.objectsCatalogViewReady = true;\n }\n\n override ngOnDestroy(): void {\n super.ngOnDestroy();\n this.objectsCatalogDestroyMasonry();\n }\n\n /**\n * Called with every loaded card (appended „więcej ↓” pages included) each\n * time they change, untracked. No-op; e.g. Podlasie feeds its\n * `SelectionStore` here.\n */\n protected onCatalogItems(items: MsObject[]): void {\n void items;\n }\n\n /**\n * Full list meta (title, description, canonical, og), not in a search tab —\n * there the search page sets them, and the canonical of the list must not\n * point at a phrase url (MOB-1064). The description goes out as translated.\n */\n protected applyListSeo(seo: IObjectsCatalogSeo): void {\n if (this.catalog.searchEnabled()) return;\n\n const t = (key: string): string =>\n this.objectsCatalogTranslate.instant(key);\n this.objectsCatalogSeoService.apply({\n title: `${capitalize(t(seo.titleKey))} - ${capitalize(t(seo.siteNameKey ?? 'MODEL.mainTitle'))}`,\n description: t(seo.descriptionKey),\n type: 'website',\n url: seo.url,\n });\n }\n\n private objectsCatalogInitMasonry(): void {\n if (\n this.listMode() !== ListMode.masonryGrid ||\n !this.objectsCatalogBrowser\n ) {\n return;\n }\n // The MasonryGridComponent owns the masonry library and the image-load\n // handling; it packs the projected `.masonry-item` cards.\n this.objectsCatalogMasonry()?.initMasonry();\n }\n\n private objectsCatalogDestroyMasonry(): void {\n this.objectsCatalogMasonry()?.destroyMasonry();\n }\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n computed,\n Directive,\n effect,\n inject,\n OnInit,\n PLATFORM_ID,\n ResourceRef,\n Signal,\n untracked,\n} from '@angular/core';\nimport { rxResource, toObservable } from '@angular/core/rxjs-interop';\nimport { filter, takeUntil } from 'rxjs';\n\nimport {\n FileUrlService,\n ISeoMetadata,\n MuseumSeoService,\n} from '@smartsoft001-mobilems/angular';\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nimport { ObjectsItemComponent } from '../pages/item/item.component';\nimport {\n IObjectCollectionSummary,\n IObjectRelated,\n ObjectsDataService,\n} from '../services/objects-data/objects-data.service';\n\n/** Options of an object details page, passed to `super(options)`. */\nexport interface IObjectDetailsOptions {\n /** Translation key of the site name in the title. Default `MODEL.mainTitle`. */\n siteNameKey?: string;\n /** Opt-in „You may also be interested in” (`GET object/:id/related`). Default `false`. */\n related?: boolean;\n /** Opt-in „Related collections” (reverse `search/Object` lookup, browser only). Default `false`. */\n relatedCollections?: boolean;\n}\n\nconst OBJECT_DETAILS_SITE_NAME_KEY = 'MODEL.mainTitle';\n\n/** Muzeum Podlasia's tag strip — an unclosed trailing tag (`<br`) goes too. */\nfunction objectDetailsStripHtml(html: string | undefined): string {\n if (!html) return '';\n return html.replace(/<\\/?[^>]+(>|$)/g, '');\n}\n\n/**\n * Base of an object details page (`/obiekty/:id`, MOB-1801), from Muzeum\n * Podlasia's item page: the SEO (also in SSR), the item effect with the\n * `onObjectShown` hook (default: scroll to the top in the browser), the\n * browser-only visit counter, `hasError`, `retryLoad`, `altTitle` and two\n * opt-in resources — `related` and `relatedCollections`. The page keeps its\n * template.\n *\n * ```ts\n * // Muzeum Podlasia\n * export class ItemComponent extends ObjectDetailsBaseComponent {\n * constructor() {\n * super({ related: true, relatedCollections: true });\n * }\n * }\n * ```\n */\n@Directive()\nexport abstract class ObjectDetailsBaseComponent\n extends ObjectsItemComponent\n implements OnInit\n{\n protected readonly objectDetailsService = inject(ObjectsDataService);\n private readonly objectDetailsSeoService = inject(MuseumSeoService);\n private readonly objectDetailsFileUrl = inject(FileUrlService);\n private readonly objectDetailsDocument = inject(DOCUMENT);\n private readonly objectDetailsBrowser = isPlatformBrowser(\n inject(PLATFORM_ID),\n );\n private readonly objectDetailsServer = !this.objectDetailsBrowser;\n private readonly objectDetailsOptions: IObjectDetailsOptions;\n\n /** Object id from the route (`/obiekty/:id` and `/obiekty/:id/:slug`). */\n private readonly objectDetailsRouteId = computed(\n () => this.params()?.['id'] as string | undefined,\n );\n\n /**\n * Id for „related” (MOB-1850). On the server from the route:\n * `GET object/:id/related` starts together with `GET object/:id`, so SSR\n * waits for the longer of the two requests, not their sum (card 5233:\n * ~400 → ~290 ms locally). In the browser unchanged — after the card (no\n * extra 404 for a missing object, „Try again” works as before). A\n * non-numeric id waits for the card. `computed`, because `rxResource`\n * does not compare the `params` result — every change of a read signal\n * would repeat the request.\n */\n private readonly objectDetailsRelatedId = computed(() => {\n const id = this.objectDetailsRouteId();\n return this.objectDetailsServer && id && /^\\d+$/.test(id)\n ? id\n : this.item()?.id;\n });\n\n /** The card failed — „related” started on the server has nothing to wait for. */\n private readonly objectDetailsCardFailed$ = toObservable(\n this.facade.error,\n ).pipe(filter(Boolean));\n\n readonly hasError = this.facade.error;\n\n /** The object title without markup — image `alt`s. `''` without an object. */\n readonly altTitle: Signal<string> = computed(() =>\n objectDetailsStripHtml(this.item()?.title ?? ''),\n );\n\n /**\n * „You may also be interested in” — `GET object/:id/related`, only with\n * the `related` option. A card error stops the request (the error page\n * waits neither for „related” nor for its retry after a network error);\n * the resource then ends in an error state, the section is gone anyway.\n */\n readonly related: ResourceRef<IObjectRelated | undefined>;\n\n /**\n * „Related collections” per the „Field description” document: thematic\n * collections whose `search/Object` with `filter[entryCollections]`\n * contains the object (the service gives an empty list also after an\n * error — the section then disappears). Only with the\n * `relatedCollections` option and only in the browser: the reverse lookup\n * is one `search/Object` request per collection, and its responses (full\n * object cards) must not reach SSR nor the transfer cache HTML — the\n * server renders without this section, the client adds it after\n * hydration.\n */\n readonly relatedCollections: ResourceRef<IObjectCollectionSummary[]>;\n\n protected constructor(options: IObjectDetailsOptions = {}) {\n super();\n this.objectDetailsOptions = options;\n\n this.related = rxResource({\n params: () =>\n this.objectDetailsOptions.related\n ? this.objectDetailsRelatedId()\n : undefined,\n stream: ({ params }) =>\n this.objectDetailsService\n .getRelated(params)\n .pipe(takeUntil(this.objectDetailsCardFailed$)),\n });\n\n this.relatedCollections = rxResource({\n params: () =>\n this.objectDetailsOptions.relatedCollections &&\n this.objectDetailsBrowser\n ? this.item()?.id\n : undefined,\n stream: ({ params }) =>\n this.objectDetailsService.loadRelatedCollections(params),\n defaultValue: [],\n });\n\n this.objectDetailsSeoService.applyForSsr(() =>\n this.objectDetailsFetchSsrSeo(),\n );\n\n effect(() => {\n const item = this.item();\n if (item) {\n untracked(() => {\n this.objectDetailsSeoService.apply(this.objectDetailsSeo(item));\n this.onObjectShown(item);\n });\n }\n });\n }\n\n /**\n * Visit counter — browser only (SSR would count the visit a second time),\n * and its error (e.g. a 429 of the API limit) must neither reach the\n * console as an unhandled `HttpErrorResponse` nor break the view. Once per\n * page instance: in-page navigation to another object sends no new visit.\n */\n ngOnInit(): void {\n if (!this.objectDetailsBrowser) return;\n this.objectDetailsService\n .logVisit(Number(this.route.snapshot.paramMap.get('id')))\n .catch(() => undefined);\n }\n\n retryLoad(): void {\n const id = this.route.snapshot.paramMap.get('id');\n if (id) this.facade.select(id);\n }\n\n /** SEO of the object: `<title> - <site>`, description, image and its alt. */\n protected objectDetailsSeo(item: MsObject): ISeoMetadata {\n const strippedTitle = objectDetailsStripHtml(item.title);\n const siteName = this.translationService.get(\n this.objectDetailsOptions.siteNameKey ?? OBJECT_DETAILS_SITE_NAME_KEY,\n );\n return {\n title: `${strippedTitle} - ${siteName}`,\n description: item.description\n ? objectDetailsStripHtml(item.description)\n : undefined,\n image: item.image ? this.objectDetailsFileUrl.get(item.image) : undefined,\n imageAlt: strippedTitle,\n type: 'article',\n };\n }\n\n /**\n * Called (untracked) after the SEO for every object the facade selects.\n * Default: scroll to the top in the browser. Override to keep the scroll\n * on a re-read of the same card (MOB-1961) or to reset a gallery.\n */\n protected onObjectShown(item: MsObject): void {\n void item;\n if (this.objectDetailsBrowser) {\n this.objectDetailsDocument.defaultView?.scrollTo({\n top: 0,\n behavior: 'instant',\n });\n }\n }\n\n private async objectDetailsFetchSsrSeo(): Promise<ISeoMetadata | null> {\n const id = this.route.snapshot.paramMap.get('id');\n if (!id) return null;\n try {\n const item = await this.objectDetailsService.getById(id);\n return item ? this.objectDetailsSeo(item) : null;\n } catch {\n return null;\n }\n }\n}\n","import {\n INamedEntryParts,\n INamedEntrySource,\n namedEntryParts,\n toPlainText,\n} from '@smartsoft001-mobilems/angular';\n\n/**\n * Generic readers of an object card from `GET object/:id` for a details page\n * (MOB-1801), per the MobileMS „Opis pól” document (2026-10-05). A field\n * without data gives an empty list — the template then hides the whole row\n * with its label, nothing is made up. The layout groupings (header facts,\n * metrics columns, hero crops) stay in each museum.\n */\n\n/** A field value: `name [role] (comment)`; `nameKey` — a translation instead of the name. */\nexport type ObjectDetailValue = INamedEntryParts & { nameKey?: string };\n\n/** A related link (article, collection) of the details page. */\nexport interface IObjectDetailLink {\n id: number | string;\n title: string;\n route: string;\n}\n\n/** One bibliography item; `permalink` makes it a link. */\nexport interface IObjectBibliographyEntry {\n text: string;\n permalink: string | null;\n}\n\n/**\n * The card fields these tools read. Both `MsObject` and a museum's wider card\n * type (e.g. Podlasie's `ObjectCard`) are assignable to it.\n */\nexport interface IObjectDetailSource {\n title?: string | null;\n name?: string | null;\n noEvidence?: string | null;\n seriesTitles?: ReadonlyArray<INamedEntrySource | null | undefined> | null;\n bibliographyMNK?:\n | string\n | null\n | ReadonlyArray<\n string | { text?: string | null; permalink?: string | null }\n >;\n publicDescriptions?: ReadonlyArray<{ text?: string | null } | null> | null;\n description?: string | null;\n articles?: ReadonlyArray<{\n id: number | string;\n title?: string | null;\n }> | null;\n}\n\nconst objectDetailHasText = (\n value: string | null | undefined,\n): value is string => !!value?.trim();\n\nconst objectDetailBare = (entries: INamedEntryParts[]): INamedEntryParts[] =>\n entries.map((entry) => ({ ...entry, role: null, comment: null }));\n\nconst objectDetailTextValue = (\n value: string | null | undefined,\n): ObjectDetailValue[] =>\n objectDetailHasText(value)\n ? [{ name: value.trim(), role: null, comment: null }]\n : [];\n\n/**\n * A link title without HTML (the articles API sends `<p>…</p>` with entities,\n * MOB-1845) — the framework's `toPlainText` strips tags also after decoding\n * entities (`&lt;p&gt;`), like `PlainTextPipe` on the article cards.\n */\nconst objectDetailPlainTitle = (title: string | null | undefined): string =>\n toPlainText(title);\n\n/** The object title — the document says `name`, the details API returns `title`. */\nexport function objectTitle(obj: IObjectDetailSource): string {\n return (obj.title ?? obj.name ?? '').trim();\n}\n\n/** Header tags: `seriesTitles` (the `Cycle` dictionary) → a list with the `cycles` filter. */\nexport function tagValues(obj: IObjectDetailSource): ObjectDetailValue[] {\n return objectDetailBare(namedEntryParts(obj.seriesTitles));\n}\n\n/** Inventory number: `noEvidence`. */\nexport function inventoryValues(obj: IObjectDetailSource): ObjectDetailValue[] {\n return objectDetailTextValue(obj.noEvidence);\n}\n\n/**\n * Bibliography as in OSSO (`museum-objects` item/main-tab): every\n * `bibliographyMNK[]` entry is a separate item, and its `text` (HTML from the\n * API) goes whole — OSSO does not split the text on full stops. An entry\n * without text is dropped; `permalink` makes the item a link.\n */\nexport function bibliography(\n obj: IObjectDetailSource,\n): IObjectBibliographyEntry[] {\n const source = obj.bibliographyMNK;\n const entries = typeof source === 'string' ? [source] : (source ?? []);\n // A loop instead of `flatMap` — the library's TS `lib` predates ES2019.\n const out: IObjectBibliographyEntry[] = [];\n for (const entry of entries) {\n const text = typeof entry === 'string' ? entry : (entry?.text ?? '');\n if (!objectDetailHasText(text)) continue;\n const permalink =\n typeof entry === 'string' || !objectDetailHasText(entry?.permalink)\n ? null\n : entry.permalink.trim();\n out.push({ text: text.trim(), permalink });\n }\n return out;\n}\n\n/**\n * Description (HTML from the API): `publicDescriptions[].text` (the\n * popular-science description), and without it `description` (the physical\n * description) — the „Opis pól” rule of MOB-1563 („popular-science\n * description, and if there is none — the physical one”); object 5233 has\n * only `description` (MOB-1801). The description does not depend on media.\n */\nexport function descriptionHtml(obj: IObjectDetailSource): string[] {\n // An empty editor paragraph (`<p></p>`, `<p>&nbsp;</p>`) is not a description.\n const visible = (text: string) => toPlainText(text).length > 0;\n const popular = (obj.publicDescriptions ?? [])\n .map((entry) => entry?.text ?? '')\n .filter(visible);\n if (popular.length) return popular;\n const physical = obj.description ?? '';\n return visible(physical) ? [physical.trim()] : [];\n}\n\n/**\n * „Powiązane artykuły” — the card's `articles` field; the title without HTML\n * (MOB-1845). `routePrefix` is the articles list route of the museum.\n */\nexport function relatedArticles(\n obj: IObjectDetailSource,\n routePrefix = '/artykuly',\n): IObjectDetailLink[] {\n return (obj.articles ?? [])\n .map((article) => ({\n id: article.id,\n title: objectDetailPlainTitle(article?.title),\n route: `${routePrefix}/${article.id}`,\n }))\n .filter((article) => article.title.length > 0);\n}\n","/**\n * „Zapytaj o obiekt” keys (MOB-1869) — the mail address and text live in the\n * CMS translations, so a museum changes them without a deployment.\n */\nexport const ASK_ABOUT_OBJECT_KEYS = {\n email: 'DETAILS_PAGE.detail.askEmail',\n subject: 'DETAILS_PAGE.detail.askSubject',\n body: 'DETAILS_PAGE.detail.askBody',\n objectWithInventory: 'DETAILS_PAGE.detail.askObjectWithInventory',\n portal: 'MODEL.mainTitle',\n} as const;\n\n/** `TranslateService.instant` — a key without a translation comes back as itself. */\nexport type AskTranslate = (\n key: string,\n params?: Record<string, string>,\n) => string;\n\nexport interface IAskAboutObject {\n /** The title without HTML. */\n title: string;\n inventory?: string | null;\n /** The full address of the object card on the portal. */\n url?: string | null;\n}\n\nconst ASK_ABOUT_OBJECT_EMAIL = /^[^\\s@?&#]+@[^\\s@?&#]+\\.[^\\s@?&#]+$/;\n\nfunction askAboutObjectTranslated(\n translate: AskTranslate,\n key: string,\n params?: Record<string, string>,\n): string | null {\n const value = translate(key, params);\n return value && value !== key ? value : null;\n}\n\n/**\n * The `mailto:` of the „Zapytaj o obiekt” button: the address from\n * `askEmail`, the subject with the title (and the inventory number), the body\n * with a greeting, the object, a link and room for the question. Without a\n * valid address — `null` (no button); a missing subject or body is simply\n * skipped. Body lines break as CRLF, as RFC 6068 requires.\n */\nexport function askAboutObjectHref(\n translate: AskTranslate,\n object: IAskAboutObject,\n): string | null {\n const email = askAboutObjectTranslated(\n translate,\n ASK_ABOUT_OBJECT_KEYS.email,\n )?.trim();\n if (!email || !ASK_ABOUT_OBJECT_EMAIL.test(email)) return null;\n\n const title = object.title.trim();\n const inventory = object.inventory?.trim();\n const label =\n (inventory &&\n askAboutObjectTranslated(\n translate,\n ASK_ABOUT_OBJECT_KEYS.objectWithInventory,\n {\n title,\n inventory,\n },\n )) ||\n title;\n\n const subject = askAboutObjectTranslated(\n translate,\n ASK_ABOUT_OBJECT_KEYS.subject,\n {\n object: label,\n },\n );\n const body = askAboutObjectTranslated(translate, ASK_ABOUT_OBJECT_KEYS.body, {\n object: label,\n url: object.url ?? '',\n portal:\n askAboutObjectTranslated(translate, ASK_ABOUT_OBJECT_KEYS.portal) ?? '',\n });\n\n const query = [\n subject ? `subject=${encodeURIComponent(subject)}` : null,\n body ? `body=${encodeURIComponent(body.replace(/\\r?\\n/g, '\\r\\n'))}` : null,\n ].filter(Boolean);\n\n return `mailto:${email}${query.length ? `?${query.join('&')}` : ''}`;\n}\n","import {\n computed,\n Directive,\n inject,\n input,\n linkedSignal,\n output,\n signal,\n} from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport {\n ICrudFilter,\n ICrudFilterQueryItem,\n} from '@smartsoft001/crud-shell-angular';\n\nimport { FilterType, IDictionaryEntry } from '@smartsoft001-mobilems/angular';\n\nimport { FormFeatureType } from '../models/objects-filters.model';\nimport {\n ArchaeologicalSegregation,\n ObjectsDataService,\n} from '../services/objects-data/objects-data.service';\n\n/** How a field of the advanced filters panel is rendered. */\nexport type ObjectsAdvancedFilterMode =\n 'dictionary' | 'tree' | 'text' | 'boolean';\n\n/** The yes/no checkboxes of the panel (\"Na ekspozycji\", \"Pokaż tylko\"). */\nexport type ObjectsAdvancedFilterBoolean =\n 'onExhibition' | 'hasImage' | 'hasVideo';\n\n/**\n * One field of the advanced filters panel. `dictionaryKey` is the API\n * dictionary name (`DataService.loadFilterDictionary`); `key` is the query\n * filter key written through `FiltersContext.filters`. Picking a value in a\n * field with `dependsOn` checks the referenced boolean field (MOB-1802: the\n * field stays enabled); unchecking that boolean clears the field.\n */\nexport interface IObjectsAdvancedFilterField {\n key: string;\n labelKey: string;\n mode: ObjectsAdvancedFilterMode;\n dictionaryKey?: string;\n /**\n * The field's own source (`FilterDictionarySource`) instead of the default\n * `DataService.loadFilterDictionary`:\n * - `publicCollections` — `GET public-collections/page/{n}` through\n * `ObjectsDataService.loadCollectionsDictionary`;\n * - `archaeologicalData` — `GET dictionary/{segregation}/search/page/{n}`\n * (one type per segregation) through `ObjectsDataService.loadArchaeologicalDictionary`.\n */\n source?: 'publicCollections' | 'archaeologicalData';\n /** Segregation of the `ArchaeologicalData` dictionary (only with `source: 'archaeologicalData'`). */\n segregation?: ArchaeologicalSegregation;\n dependsOn?: string;\n}\n\n/** One write of the panel's batch — handed to `FiltersContext.filters` by the bar. */\nexport interface IObjectsAdvancedFilterWrite {\n key: string;\n type: '=';\n val: FilterType;\n}\n\n/** Options of {@link ObjectsAdvancedFiltersBaseComponent}, passed to `super(…)`. */\nexport interface IObjectsAdvancedFiltersOptions {\n /** The panel's fields — the app's config (Podlasie: `OBJECTS_ADVANCED_FILTER_FIELDS`). */\n fields: readonly IObjectsAdvancedFilterField[];\n /** Query keys the panel writes in its single batch, in this order. */\n managedKeys: readonly string[];\n /**\n * Keys the panel no longer has (MOB-1844). `FiltersContext.filters` changes\n * only the keys it is given, so an old deep link or saved filter would stay\n * active with no field to remove it — \"Zastosuj\" and \"Resetuj\" always send\n * them with `val: undefined`. Default `[]`.\n */\n retiredKeys?: readonly string[];\n /** `locationType` value of \"Na ekspozycji: Tak\". Default `'Ekspozycja'`. */\n onExhibitionValue?: string;\n}\n\n/** Translation keys of the \"Pokaż tylko\" multimedia entries, by `FormFeatureType`. */\nconst OBJECTS_ADVANCED_FILTERS_MULTIMEDIA_LABELS: Partial<\n Record<FormFeatureType, string>\n> = {\n [FormFeatureType.IMAGES]: 'OBJECTS.filters.multimedia.images',\n [FormFeatureType.VIDEO]: 'OBJECTS.filters.multimedia.video',\n};\n\n/**\n * Logic of the \"Filtry zaawansowane\" panel (Muzeum Podlasia's\n * `objects-advanced-filters`, MOB-1596, layout per the MOB-1802 mockup).\n * Presentational: reads `filter()`, keeps every edit in a local draft and only\n * writes through `apply` — the parent (the filters bar) performs the single\n * `context.filters` assignment. The template and the field config stay in the app.\n */\n@Directive()\nexport abstract class ObjectsAdvancedFiltersBaseComponent {\n private readonly objectsAdvancedFiltersTranslate = inject(TranslateService);\n\n private readonly objectsAdvancedFiltersService = inject(ObjectsDataService);\n\n private readonly objectsAdvancedFiltersOptions: Required<IObjectsAdvancedFiltersOptions>;\n\n /**\n * \"Kolekcja tematyczna\" (MOB-1844): pages of the `public-collections` list\n * (with the phrase in `filter[phrase]`) instead of a `dictionary/*` dictionary.\n */\n protected readonly collectionsSource = (page: number, query?: string) =>\n this.objectsAdvancedFiltersService.loadCollectionsDictionary(page, query);\n\n /**\n * \"Filtry archeologiczne\" (MOB-1844): the `ArchaeologicalData` dictionary\n * with a segregation — names planned by MobileMS (Kanbanize 50040).\n */\n protected readonly archeoTownsSource = (page: number, query?: string) =>\n this.objectsAdvancedFiltersService.loadArchaeologicalDictionary(\n 'ArcheoTown',\n page,\n query,\n );\n\n protected readonly archeoPeriodsSource = (page: number, query?: string) =>\n this.objectsAdvancedFiltersService.loadArchaeologicalDictionary(\n 'ArcheoPeriod',\n page,\n query,\n );\n\n protected readonly archeoCulturesSource = (page: number, query?: string) =>\n this.objectsAdvancedFiltersService.loadArchaeologicalDictionary(\n 'ArcheoCulture',\n page,\n query,\n );\n\n readonly filter = input.required<ICrudFilter>();\n\n /** Toggled by the parent — reopening re-derives the draft, discarding it. */\n readonly isOpen = input<boolean>(false);\n\n /** The `/obiekty` list — a full-width band with the content in the page container. */\n readonly fullBleed = input<boolean>(false);\n\n readonly apply = output<IObjectsAdvancedFilterWrite[]>();\n\n protected readonly fields: readonly IObjectsAdvancedFilterField[];\n\n /** Mobile: the \"Filtry archeologiczne\" section collapses with a chevron (2276:7709). */\n protected readonly archaeologicalOpen = signal(true);\n\n protected readonly draftQuery = linkedSignal<ICrudFilterQueryItem[]>(() => {\n this.isOpen();\n return this.filter().query ? [...(this.filter().query ?? [])] : [];\n });\n\n /** Synthetic filter fed to the reused `app-filter-*` inputs so they read the draft. */\n protected readonly draftFilter = computed<ICrudFilter>(() => ({\n ...this.filter(),\n query: this.draftQuery(),\n }));\n\n protected constructor(options: IObjectsAdvancedFiltersOptions) {\n this.objectsAdvancedFiltersOptions = {\n fields: options.fields,\n managedKeys: options.managedKeys,\n retiredKeys: options.retiredKeys ?? [],\n onExhibitionValue: options.onExhibitionValue ?? 'Ekspozycja',\n };\n this.fields = options.fields;\n }\n\n readDictionaryValue(key: string): IDictionaryEntry[] {\n const value = this.draftQuery().find((q) => q.key === key)?.value;\n return Array.isArray(value) ? (value as IDictionaryEntry[]) : [];\n }\n\n onDictionaryToggle(key: string, item: IDictionaryEntry): void {\n const current = this.readDictionaryValue(key);\n const isPresent = current.some((i) => i.id === item.id);\n const next = isPresent\n ? current.filter((i) => i.id !== item.id)\n : [...current, item];\n this.objectsAdvancedFiltersWriteDictionary(key, next);\n\n // Picking a department means \"Na ekspozycji: Tak\" (MOB-1802) — the field\n // is enabled from the start and the checkbox follows the choice.\n const field = this.fields.find((f) => f.key === key);\n if (field?.dependsOn === 'onExhibition' && next.length) {\n this.objectsAdvancedFiltersSetDraftEntry(\n 'locationType',\n this.objectsAdvancedFiltersOptions.onExhibitionValue,\n );\n }\n }\n\n onDictionaryClearAll(key: string): void {\n this.objectsAdvancedFiltersWriteDictionary(key, []);\n }\n\n toggleArchaeological(): void {\n this.archaeologicalOpen.update((open) => !open);\n }\n\n onInventoryNumberChange(value: string): void {\n this.objectsAdvancedFiltersSetDraftEntry(\n 'inventoryNumber',\n value.length ? value : undefined,\n );\n }\n\n onBooleanToggle(key: ObjectsAdvancedFilterBoolean, checked: boolean): void {\n if (key === 'onExhibition') {\n this.objectsAdvancedFiltersSetDraftEntry(\n 'locationType',\n checked\n ? this.objectsAdvancedFiltersOptions.onExhibitionValue\n : undefined,\n );\n if (!checked) {\n this.onDictionaryClearAll('department');\n }\n return;\n }\n\n const featureId =\n key === 'hasImage' ? FormFeatureType.IMAGES : FormFeatureType.VIDEO;\n this.objectsAdvancedFiltersToggleFormFeature(featureId);\n }\n\n isBooleanChecked(key: ObjectsAdvancedFilterBoolean): boolean {\n if (key === 'onExhibition') {\n return this.draftQuery().some(\n (q) =>\n q.key === 'locationType' &&\n q.value === this.objectsAdvancedFiltersOptions.onExhibitionValue,\n );\n }\n\n const featureId =\n key === 'hasImage' ? FormFeatureType.IMAGES : FormFeatureType.VIDEO;\n return this.readDictionaryValue('formFeature').some(\n (item) => item.id === featureId,\n );\n }\n\n applyDraft(): void {\n this.apply.emit(this.objectsAdvancedFiltersBuildPayload());\n }\n\n reset(): void {\n this.draftQuery.set([]);\n this.apply.emit(this.objectsAdvancedFiltersBuildPayload());\n }\n\n private objectsAdvancedFiltersToggleFormFeature(\n featureId: FormFeatureType,\n ): void {\n const current = this.readDictionaryValue('formFeature');\n const isPresent = current.some((item) => item.id === featureId);\n\n if (isPresent) {\n this.objectsAdvancedFiltersWriteDictionary(\n 'formFeature',\n current.filter((item) => item.id !== featureId),\n );\n return;\n }\n\n const labelKey = OBJECTS_ADVANCED_FILTERS_MULTIMEDIA_LABELS[featureId];\n const name = labelKey\n ? this.objectsAdvancedFiltersTranslate.instant(labelKey)\n : '';\n this.objectsAdvancedFiltersWriteDictionary('formFeature', [\n ...current,\n { id: featureId, name },\n ]);\n }\n\n private objectsAdvancedFiltersWriteDictionary(\n key: string,\n items: IDictionaryEntry[],\n ): void {\n this.objectsAdvancedFiltersSetDraftEntry(\n key,\n (items.length ? items : undefined) as FilterType,\n );\n }\n\n private objectsAdvancedFiltersSetDraftEntry(\n key: string,\n value: FilterType,\n ): void {\n this.draftQuery.update((current) => {\n const filtered = current.filter((q) => q.key !== key);\n return value === undefined\n ? filtered\n : [...filtered, { key, type: '=', value } as ICrudFilterQueryItem];\n });\n }\n\n private objectsAdvancedFiltersBuildPayload(): IObjectsAdvancedFilterWrite[] {\n const { managedKeys, retiredKeys } = this.objectsAdvancedFiltersOptions;\n\n return [\n ...managedKeys.map((key) => ({\n key,\n type: '=' as const,\n val: this.draftQuery().find((q) => q.key === key)?.value as FilterType,\n })),\n ...retiredKeys\n .filter((key) => !managedKeys.includes(key))\n .map((key) => ({ key, type: '=' as const, val: undefined })),\n ];\n }\n}\n","import { ICrudFilter } from '@smartsoft001/crud-shell-angular';\n\nimport {\n FilterType,\n serializeCatalogFilter,\n} from '@smartsoft001-mobilems/angular';\n\nimport { IKeyValue } from '../models';\n\n/** Sort options of the objects list (the default order). */\nexport const OBJECTS_SORT_OPTIONS: IKeyValue[] = Object.freeze([\n { key: 'random', value: 'OBJECTS.filters.random' },\n { key: 'publication-date-desc', value: 'OBJECTS.filters.date-desc' },\n { key: 'publication-date-asc', value: 'OBJECTS.filters.date-asc' },\n { key: 'name-asc', value: 'OBJECTS.filters.name-asc' },\n { key: 'name-desc', value: 'OBJECTS.filters.name-desc' },\n { key: 'visited-desc', value: 'OBJECTS.filters.most-popular' },\n]) as IKeyValue[];\n\n/** Sort order shown for `?type=new` — newest first. */\nexport const OBJECTS_NEW_TYPE_SORT_OPTIONS: IKeyValue[] = Object.freeze([\n { key: 'publication-date-desc', value: 'OBJECTS.filters.date-desc' },\n { key: 'publication-date-asc', value: 'OBJECTS.filters.date-asc' },\n { key: 'random', value: 'OBJECTS.filters.random' },\n { key: 'name-asc', value: 'OBJECTS.filters.name-asc' },\n { key: 'name-desc', value: 'OBJECTS.filters.name-desc' },\n { key: 'visited-desc', value: 'OBJECTS.filters.most-popular' },\n]) as IKeyValue[];\n\n/** Page sizes of the objects list. */\nexport const OBJECTS_LIMIT_OPTIONS: IKeyValue[] = Object.freeze([\n { key: '20' },\n { key: '40' },\n { key: '60' },\n { key: '80' },\n { key: '100' },\n]) as IKeyValue[];\n\n/** API query key of the theme tags (cycles) filter. */\nexport const OBJECTS_THEME_TAGS_FILTER_KEY = 'cycles';\n\n/** Chip labels of the yes/no filters from the advanced filters panel. */\nexport const OBJECTS_FILTER_SINGLE_VALUE_LABELS: Readonly<\n Record<string, string>\n> = {\n onExhibition: 'SEARCH.advancedFiltersPanel.onExhibition',\n hasImage: 'SEARCH.advancedFiltersPanel.hasImage',\n hasVideo: 'SEARCH.advancedFiltersPanel.hasVideo',\n};\n\n/** A filter write in the shape `FiltersContext.filters` accepts. */\nexport interface IObjectsFilterWrite {\n key: string;\n type: string;\n val: FilterType;\n}\n\n/** A date range of the date filters (`null` — an open end). */\nexport interface IObjectsDateRange {\n from: string | null;\n to: string | null;\n}\n\n/** The sort dropdown key (e.g. `publication-date-desc`) of a sort; no `by` → `random`. */\nexport function objectsSortKey(sort?: { by?: string; desc?: boolean }): string {\n return !sort?.by ? 'random' : `${sort.by}-${sort.desc ? 'desc' : 'asc'}`;\n}\n\n/** The sort of a sort dropdown key; `random` → an empty `by`. */\nexport function objectsSortFromKey(key: string): {\n by: string;\n desc: boolean;\n} {\n const desc = key.endsWith('-desc');\n let by = key.replace(/-asc$/, '').replace(/-desc$/, '');\n\n if (by === 'random') {\n by = '';\n }\n\n return { by, desc };\n}\n\n/** The list URL (`/obiekty` by default) restoring the current filter (phrase + query items). */\nexport function buildObjectsResultsUrl(\n origin: string,\n filter: ICrudFilter | null | undefined,\n listPath = '/obiekty',\n): string {\n const serialized = serializeCatalogFilter(filter);\n return `${origin}${listPath}${serialized ? `?filter=${encodeURIComponent(serialized)}` : ''}`;\n}\n","import {\n computed,\n Directive,\n inject,\n input,\n output,\n Signal,\n signal,\n WritableSignal,\n} from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\nimport { ListMode } from '@smartsoft001/angular';\nimport {\n ICrudFilter,\n ICrudFilterQueryItem,\n} from '@smartsoft001/crud-shell-angular';\n\nimport {\n createCycleTagSearch,\n dictionaryEntries,\n dictionaryEntryKey,\n dictionaryFilterItems,\n FiltersContext,\n FilterType,\n ICycleTagSearch,\n IDictionaryEntry,\n mergeSelectedTags,\n} from '@smartsoft001-mobilems/angular';\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nimport {\n IObjectsDateRange,\n IObjectsFilterWrite,\n OBJECTS_FILTER_SINGLE_VALUE_LABELS,\n OBJECTS_LIMIT_OPTIONS,\n OBJECTS_SORT_OPTIONS,\n OBJECTS_THEME_TAGS_FILTER_KEY,\n objectsSortFromKey,\n objectsSortKey,\n} from './objects-filter-tools';\nimport { IKeyValue } from '../models';\n\n/** Options of {@link ObjectsFiltersBarBaseComponent}, passed to `super(…)`. */\nexport interface IObjectsFiltersBarOptions {\n /**\n * Load the `Cycle` dictionary for the theme tags (`themeTags`, `tagsQuery`).\n * Default `false`: no `dictionary/Cycle` request; `themeTags` holds only the\n * cycles selected in the filter.\n */\n cycleTags?: boolean;\n /**\n * Chip labels (translation keys) of the yes/no filters, by query key.\n * Default `OBJECTS_FILTER_SINGLE_VALUE_LABELS`.\n */\n singleValueLabels?: Readonly<Record<string, string>>;\n /**\n * Single-value filters — their chip clears the whole query item.\n * Default `['categories', 'inventoryNumber', 'locationType']`.\n */\n singleValueKeys?: readonly string[];\n}\n\n/** API query key of the \"Nr inwentarzowy\" filter — `filter[inventoryNumber]`. */\nconst OBJECTS_FILTERS_BAR_INVENTORY_NUMBER_KEY = 'inventoryNumber';\n\nconst OBJECTS_FILTERS_BAR_SINGLE_VALUE_KEYS: readonly string[] = [\n 'categories',\n OBJECTS_FILTERS_BAR_INVENTORY_NUMBER_KEY,\n 'locationType',\n];\n\n/** The write target of the bar: the framework context or the redirect one. */\ntype ObjectsFiltersBarWriteTarget = Pick<\n FiltersContext<MsObject>,\n 'filters' | 'sort' | 'limit'\n>;\n\n/** A batch of filter writes in the type `FiltersContext.filters` declares. */\ntype ObjectsFiltersBarFilterWrites = ObjectsFiltersBarWriteTarget['filters'];\n\n/** `val[0]` upper-cased; `''` for an empty value. */\nfunction objectsFiltersBarCapitalize(val: string): string {\n if (!val?.length) return '';\n\n return val[0].toUpperCase() + val.substring(1);\n}\n\n/**\n * Stand-in `FiltersContext` of the search results tab (MOB-1818): the same\n * setters as the framework context (`filters`, `sort`, `limit`), but instead of\n * a read through the facade it hands over the complete filter — the list moves\n * to `/obiekty` with it. Query items are composed like\n * `FiltersContext.multipleFilterSet`: a write replaces the item with the same\n * key and type, `undefined` removes it.\n */\nclass ObjectsRedirectFiltersContext {\n constructor(\n private readonly current: () => ICrudFilter,\n private readonly redirect: (filter: ICrudFilter) => void,\n ) {}\n\n get query(): ICrudFilterQueryItem[] | undefined {\n return this.current().query;\n }\n\n set filters(writes: IObjectsFilterWrite[]) {\n let query = [...(this.current().query ?? [])];\n\n for (const { key, type, val } of writes) {\n query = query.filter((item) => !(item.key === key && item.type === type));\n if (val) {\n query.push({\n key,\n type,\n value: val,\n hidden: true,\n } as ICrudFilterQueryItem);\n }\n }\n\n this.emit({ query, offset: 0 });\n }\n\n set sort(value: { by: string; desc: boolean }) {\n this.emit({ sortBy: value.by, sortDesc: value.desc, offset: 0 });\n }\n\n set limit(value: number) {\n this.emit({ limit: value, offset: 0 });\n }\n\n private emit(patch: Partial<ICrudFilter>): void {\n this.redirect({ ...this.current(), ...patch });\n }\n}\n\n/**\n * Logic of the objects list top filter bar (Muzeum Podlasia's `filters-top`):\n * theme tags, applied-filter chips, sort/limit dropdowns, pagination and the\n * grid/list view toggle. The template stays in the app.\n *\n * Every mutation goes through the framework `FiltersContext` provided by\n * `<smart-mobilems-objects-filters>` (passed to each method by the template),\n * which dispatches to the objects facade. With `redirectChanges` on (the search\n * results tab, MOB-1818) filter, sort and page size changes are emitted as one\n * complete filter through `filterRedirect` instead.\n */\n@Directive()\nexport abstract class ObjectsFiltersBarBaseComponent {\n private readonly objectsFiltersBarTranslate = inject(TranslateService);\n\n private readonly objectsFiltersBarSingleValueLabels: Readonly<\n Record<string, string>\n >;\n\n private readonly objectsFiltersBarSingleValueKeys: readonly string[];\n\n private readonly objectsFiltersBarCycleTags: ICycleTagSearch;\n\n /** Query key of the panel's theme tags — `filter[cycles][]`. */\n protected readonly themeTagsFilterKey = OBJECTS_THEME_TAGS_FILTER_KEY;\n\n /**\n * The page's current filter, bound straight through to the filter fields.\n * Reads come from here; writes go through the FiltersContext — both sides are\n * the same facade state.\n */\n readonly filter = input.required<ICrudFilter>();\n\n readonly listMode = input<ListMode>(ListMode.masonryGrid);\n\n /**\n * The result count from the list page — only for the response to the\n * current filter (the shared slice guard). Without it the count comes from\n * the framework context.\n */\n readonly totalCount = input<number | null>(null);\n\n readonly sortOptions = input<IKeyValue[]>(OBJECTS_SORT_OPTIONS);\n\n /**\n * The search results tab (MOB-1818): filter, sort and page size changes do\n * not narrow the list in place, they go to `filterRedirect` with the\n * complete filter. Paging stays in the tab.\n */\n readonly redirectChanges = input(false);\n\n /** The complete filter after a change in the results tab — the list moves to `/obiekty` with it. */\n readonly filterRedirect = output<ICrudFilter>();\n\n readonly listModeChange = output<ListMode>();\n\n /** Free-text search — the list page owns the read so it can persist it. */\n readonly searchEvent = output<string>();\n\n readonly isAdvancedFiltersOn = signal<boolean>(false);\n\n limitOptions: IKeyValue[] = OBJECTS_LIMIT_OPTIONS;\n\n /** The \"Wyszukaj więcej tagów\" phrase — empty = the panel's default tags. */\n readonly tagsQuery: WritableSignal<string>;\n\n /**\n * Panel chips: the selected cycles (from the filter) first, then the\n * dictionary or the phrase result — a selected cycle missing from the `q`\n * result stays and can be unselected (MOB-1826 review). Without the\n * `cycleTags` option only the selected cycles.\n */\n readonly themeTags: Signal<IDictionaryEntry[]>;\n\n protected constructor(options: IObjectsFiltersBarOptions = {}) {\n this.objectsFiltersBarSingleValueLabels =\n options.singleValueLabels ?? OBJECTS_FILTER_SINGLE_VALUE_LABELS;\n this.objectsFiltersBarSingleValueKeys =\n options.singleValueKeys ?? OBJECTS_FILTERS_BAR_SINGLE_VALUE_KEYS;\n\n // The whole `Cycle` dictionary (every page), with the hit phrase `q`\n // (MOB-1826, like the collections and articles lists). How many show at\n // once is the panel's call (6 + \"Pokaż wszystkie\").\n this.objectsFiltersBarCycleTags = options.cycleTags\n ? createCycleTagSearch()\n : { query: signal(''), tags: signal<IDictionaryEntry[]>([]) };\n\n this.tagsQuery = this.objectsFiltersBarCycleTags.query;\n\n const cycleTags = this.objectsFiltersBarCycleTags.tags;\n this.themeTags = computed(() =>\n mergeSelectedTags(\n dictionaryFilterItems(\n this.filter()?.query?.find(\n (q) => q.key === OBJECTS_THEME_TAGS_FILTER_KEY && q.type === '=',\n )?.value,\n ),\n cycleTags(),\n ),\n );\n }\n\n toggleAdvancedFilters(force?: boolean): void {\n this.isAdvancedFiltersOn.update((val) => force ?? !val);\n }\n\n onListMode(value: ListMode): void {\n this.listModeChange.emit(value);\n }\n\n /** Map a sort dropdown key (e.g. `publication-date-desc`) to the matching option. */\n selectedSort(sort?: { by?: string; desc?: boolean }): IKeyValue {\n const options = this.sortOptions();\n const key = objectsSortKey(sort);\n return options.find((option) => option.key === key) ?? options[0];\n }\n\n selectedLimit(limit?: number): IKeyValue {\n return (\n this.limitOptions.find((option) => option.key === String(limit ?? 20)) ??\n this.limitOptions[0]\n );\n }\n\n sortChange(context: FiltersContext<MsObject>, value: string): void {\n this.objectsFiltersBarWriteTarget(context).sort = objectsSortFromKey(value);\n }\n\n limitChange(context: FiltersContext<MsObject>, value: string): void {\n this.objectsFiltersBarWriteTarget(context).limit = Number(value);\n }\n\n pageChange(context: FiltersContext<MsObject>, value: number): void {\n context.page = value;\n }\n\n /** Toggle a single dictionary entry on/off for `key`. */\n advancedFilterChange(\n context: FiltersContext<MsObject>,\n entry: IDictionaryEntry,\n key: string,\n ): void {\n // `\"3\"` from a deep link and `3` from the dictionary are the same entry —\n // a click removes it instead of adding a duplicate; an event without an id\n // changes nothing (MOB-1826 review).\n const eventKey = dictionaryEntryKey(entry?.id);\n if (eventKey === null) {\n return;\n }\n\n const current = this.objectsFiltersBarDictionaryValue(context, key);\n const isToggled = (item: IDictionaryEntry) =>\n dictionaryEntryKey(item.id) === eventKey;\n const newValue = current.some(isToggled)\n ? current.filter((item) => !isToggled(item))\n : [...current, entry];\n\n this.objectsFiltersBarSetDictionary(context, key, newValue);\n }\n\n /** The year field already debounces typing (500 ms, MOB-1866). */\n onCreateDatesFilterChange(\n context: FiltersContext<MsObject>,\n range: IObjectsDateRange,\n ): void {\n // Set both bounds in one go so the list is re-read once, not twice.\n this.objectsFiltersBarWriteTarget(context).filters = [\n {\n val: (range.from?.length ? range.from : undefined) as FilterType,\n key: 'createDates',\n type: '>=',\n },\n {\n val: (range.to?.length ? range.to : undefined) as FilterType,\n key: 'createDates',\n type: '<=',\n },\n ];\n }\n\n /**\n * Batched write from the \"Filtry zaawansowane\" panel (MOB-1596) — the panel\n * keeps its own draft and hands over the full snapshot on Zastosuj/Resetuj,\n * so this is the single `context.filters` assignment for that whole edit.\n */\n onAdvancedFiltersApply(\n context: FiltersContext<MsObject>,\n payload: IObjectsFilterWrite[],\n ): void {\n this.objectsFiltersBarWriteTarget(context).filters =\n payload as ObjectsFiltersBarFilterWrites;\n }\n\n /** A yes/no filter — unchecking sends `undefined`, which removes the query item. */\n onBooleanFilterChange(\n context: FiltersContext<MsObject>,\n event: { key: string; checked: boolean },\n ): void {\n this.objectsFiltersBarWriteTarget(context).filters = [\n {\n // `FilterType` has no boolean; a yes/no filter writes `true`.\n val: (event.checked ? true : undefined) as unknown as FilterType,\n key: event.key,\n type: '=',\n },\n ];\n }\n\n clearFilter(\n context: FiltersContext<MsObject>,\n item: ICrudFilterQueryItem,\n value?: IDictionaryEntry,\n ): void {\n if (!item) {\n return;\n }\n\n // The date range and single-value filters (also the panel's yes/no ones,\n // e.g. \"Z opisem\") have no list of values — the chip clears the whole item.\n if (\n (item.key === 'createDates' &&\n (item.type === '>=' || item.type === '<=')) ||\n this.objectsFiltersBarSingleValueKeys.includes(item.key) ||\n !Array.isArray(item.value)\n ) {\n this.objectsFiltersBarWriteTarget(context).filters = [\n { val: undefined, key: item.key, type: item.type },\n ];\n return;\n }\n\n // Removing the last entry of a dictionary filter drops the whole query item.\n if (value) {\n this.advancedFilterChange(context, value, item.key);\n }\n }\n\n isListValue(value: unknown): boolean {\n return Array.isArray(value);\n }\n\n /** List entries for the chips — no `null` and no entries without an id (MOB-1826 review). */\n listEntries(value: unknown): Array<IDictionaryEntry & { text?: string }> {\n return dictionaryEntries(value) as Array<\n IDictionaryEntry & { text?: string }\n >;\n }\n\n /** Chip label of a filter without a list of values — a yes/no one has no value after the colon. */\n singleValueLabel(item: ICrudFilterQueryItem): string {\n const label = objectsFiltersBarCapitalize(\n this.objectsFiltersBarTranslate.instant(\n this.objectsFiltersBarSingleValueLabels[item.key] ??\n `OBJECTS.filters.applied.${item.key}`,\n ),\n );\n\n return item.value === true ? label : `${label}: ${item.value}`;\n }\n\n $context(context: unknown): FiltersContext<MsObject> {\n return context as FiltersContext<MsObject>;\n }\n\n /**\n * Write a dictionary filter through the generic `filters` setter. An empty\n * selection must be sent as `undefined` — that is what removes the query item.\n */\n protected objectsFiltersBarSetDictionary(\n context: FiltersContext<MsObject>,\n key: string,\n value: IDictionaryEntry[],\n ): void {\n this.objectsFiltersBarWriteTarget(context).filters = [\n { val: (value.length ? value : undefined) as FilterType, key, type: '=' },\n ];\n }\n\n /**\n * Where a filter write goes: the framework context (read through the facade)\n * or — in the results tab — the redirect context to `/obiekty` (MOB-1818).\n */\n private objectsFiltersBarWriteTarget(\n context: FiltersContext<MsObject>,\n ): ObjectsFiltersBarWriteTarget {\n if (!this.redirectChanges()) {\n return context;\n }\n\n return new ObjectsRedirectFiltersContext(\n () => this.filter(),\n (filter) => this.filterRedirect.emit(filter),\n ) as unknown as ObjectsFiltersBarWriteTarget;\n }\n\n private objectsFiltersBarDictionaryValue(\n context: FiltersContext<MsObject>,\n key: string,\n ): IDictionaryEntry[] {\n const value = (context.query ?? []).find(\n (q) => q.key === key && q.type === '=',\n )?.value;\n return dictionaryEntries(value);\n }\n}\n","import {\n computed,\n Directive,\n ElementRef,\n input,\n linkedSignal,\n output,\n signal,\n TemplateRef,\n viewChild,\n} from '@angular/core';\nimport { ICrudFilter } from '@smartsoft001/crud-shell-angular';\n\nimport {\n dictionaryFilterItems,\n ThemeTag,\n} from '@smartsoft001-mobilems/angular';\n\nimport {\n IObjectsDateRange,\n IObjectsFilterWrite,\n OBJECTS_THEME_TAGS_FILTER_KEY,\n} from './objects-filter-tools';\n\n/**\n * Logic of the grey objects search panel (Muzeum Podlasia's\n * `objects-search-panel`, mockup \"search tagi filtry\" 458:7898, desktop\n * \"Frame 502\" 2300:51176, mobile \"Panel wyszukiwarki\" 2300:51195): phrase →\n * theme tags + \"Wyszukaj więcej tagów\" → date range, \"Pokaż\" and \"Szukaj\" →\n * advanced filters. On mobile a \"Filtry ↓\" button under the phrase field\n * expands the rest of the panel.\n *\n * Presentational — it reads its state from `filter()` and emits events; the\n * parent (the filters bar) writes to `FiltersContext`. No template: each\n * museum extends it and keeps its own HTML, with the phrase input marked\n * `#phraseField`.\n */\n@Directive()\nexport abstract class ObjectsSearchPanelBaseComponent {\n readonly phrase = input<string>('');\n readonly filter = input.required<ICrudFilter>();\n\n /**\n * Theme tags — the whole `Cycle` dictionary or the \"Wyszukaj więcej tagów\"\n * result; the template decides how many show at once (MOB-1826).\n */\n readonly tags = input<ThemeTag[]>([]);\n\n /** The parent controls the advanced filters panel state. */\n readonly isAdvancedFiltersOn = input<boolean>(false);\n\n /**\n * The `/obiekty` list also searches by filters alone — \"Szukaj\" with an\n * empty phrase is allowed there. In the search results the phrase is part\n * of the address, so an empty phrase has nowhere to go.\n */\n readonly allowEmptyPhrase = input<boolean>(false);\n\n /** A full-bleed band (the `/obiekty` list) instead of a grey box (search results). */\n readonly fullBleed = input<boolean>(false);\n\n /**\n * Selected filter chips (state \"Selected\" 2193:3301 / mobile 2276:7726) —\n * rendered by the parent and inserted once by the panel; only CSS places\n * them, so the DOM is the same after SSR and in the browser.\n */\n readonly selectedFiltersTpl = input<TemplateRef<unknown> | null>(null);\n\n readonly searchPhrase = output<string>();\n readonly tagToggle = output<ThemeTag>();\n\n /**\n * Passed through unchanged — the date field debounces the year typing\n * (MOB-1866), the panel delays nothing here.\n */\n readonly dateRangeChange = output<IObjectsDateRange>();\n\n readonly booleanFilterChange = output<{ key: string; checked: boolean }>();\n\n /** \"Wyszukaj więcej tagów\" — an empty phrase goes back to the default tags. */\n readonly tagsSearch = output<string>();\n readonly advancedFiltersToggle = output<void>();\n\n /** One batched payload from the \"Filtry zaawansowane\" panel's Zastosuj/Resetuj. */\n readonly advancedFiltersApply = output<IObjectsFilterWrite[]>();\n\n /** The selected theme tags read from the current filter. */\n protected readonly selectedTagIds = computed<(number | null)[]>(() => {\n const value = (this.filter()?.query ?? []).find(\n (q) => q.key === OBJECTS_THEME_TAGS_FILTER_KEY,\n )?.value;\n\n // `null`, `[null]` and entries without an id (a restored filter) are\n // skipped, `\"3\"` from the address = `3` from the dictionary (MOB-1826 review).\n return dictionaryFilterItems(value).map((item) => item.id);\n });\n\n /** The field text — starts from `phrase()` and follows a change from the URL. */\n protected readonly searchText = linkedSignal(() => this.phrase());\n\n /** The \"Wyszukaj więcej tagów\" phrase and the last query sent. */\n protected readonly tagQuery = signal('');\n protected readonly submittedTagQuery = signal('');\n\n /** \"Pokaż wszystkie tagi (N)\" expanded — a new search collapses it. */\n protected readonly tagsExpanded = signal(false);\n\n /** Mobile: \"Filtry ↓\" expands the tags, dates and buttons (always visible from lg). */\n protected readonly filtersOpen = signal(false);\n\n /** Mobile: \"Więcej tagów\" reveals the tag search field (2276:7913). */\n protected readonly moreTagsOpen = signal(false);\n\n private readonly objectsSearchPanelPhraseField =\n viewChild<ElementRef<HTMLInputElement>>('phraseField');\n\n /** The \"Pokaż\" boxes' state read from the filter — e.g. after a link with filters. */\n protected isBooleanFilterOn(key: string): boolean {\n return (this.filter()?.query ?? []).some(\n (q) => q.key === key && q.value === true,\n );\n }\n\n protected toggleMoreTags(): void {\n this.moreTagsOpen.update((open) => !open);\n }\n\n protected toggleFilters(): void {\n this.filtersOpen.update((open) => !open);\n }\n\n /**\n * \"×\" in the phrase field. On the list it also clears the search; in the\n * search results it only empties the field (a new phrase is a new address).\n */\n protected clearPhrase(): void {\n this.searchText.set('');\n this.objectsSearchPanelPhraseField()?.nativeElement.focus();\n\n if (this.allowEmptyPhrase()) {\n this.searchPhrase.emit('');\n }\n }\n\n protected searchTags(): void {\n const query = this.tagQuery().trim();\n this.submittedTagQuery.set(query);\n this.tagsExpanded.set(false);\n this.tagsSearch.emit(query);\n }\n\n protected onBooleanFilterChange(key: string, checked: boolean): void {\n this.booleanFilterChange.emit({ key, checked });\n }\n\n /**\n * Only an explicit action (button / Enter) searches — the panel has no\n * live search, so there is no debounce here either.\n */\n protected search(): void {\n const phrase = this.searchText().trim();\n\n if (!phrase && !this.allowEmptyPhrase()) {\n return;\n }\n\n this.searchPhrase.emit(phrase);\n }\n}\n","import { Directive, input } from '@angular/core';\nimport { ICrudFilter } from '@smartsoft001/crud-shell-angular';\n\nimport {\n SHARE_LINK_COPIED_TIMEOUT,\n ShareLinkBaseComponent,\n} from '@smartsoft001-mobilems/angular';\n\nimport { buildObjectsResultsUrl } from './objects-filter-tools';\n\n/** How long (ms) the \"link copied\" message stays after a click. */\nexport const OBJECTS_SHARE_COPIED_TIMEOUT = SHARE_LINK_COPIED_TIMEOUT;\n\n/**\n * Logic of \"Share search results\" (mock-up \"Action panel\" 2300:51184): a link\n * to the objects list with the current filters, shared through\n * `ShareLinkBaseComponent` — the native share sheet, or a clipboard copy with a\n * \"link copied\" flag when the browser has no share sheet. The template stays in\n * the app.\n */\n@Directive()\nexport abstract class ObjectsShareResultsBaseComponent extends ShareLinkBaseComponent {\n readonly filter = input<ICrudFilter | null | undefined>(undefined);\n\n /** The list path the link opens; overridable, read inside `share`. */\n protected readonly objectsShareResultsListPath: string = '/obiekty';\n\n /** How long (ms) \"copied\" stays on; overridable, read inside `share`. */\n protected readonly objectsShareResultsCopiedTimeout: number =\n OBJECTS_SHARE_COPIED_TIMEOUT;\n\n protected override get shareLinkCopiedTimeout(): number {\n return this.objectsShareResultsCopiedTimeout;\n }\n\n protected override shareLinkUrl(): string {\n return buildObjectsResultsUrl(\n this.shareLinkDocument.defaultView?.location.origin ?? '',\n this.filter(),\n this.objectsShareResultsListPath,\n );\n }\n}\n","import { computed, Directive, inject, input, Signal } from '@angular/core';\nimport { TranslateService } from '@ngx-translate/core';\n\nimport { FileUrlService } from '@smartsoft001-mobilems/angular';\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nimport { FileType, FormFeatureType } from '../models/objects-filters.model';\n\n/**\n * Logic-only base of an object media tab (MOB-1801), from Muzeum Podlasia's\n * `components/tabs`: the `item` and `formFeatureTypes` inputs and `models` —\n * the object's `additionalImages` of the given form feature types, sorted by\n * `position`. The tab keeps its template, styles and `host`.\n *\n * `mediaTabFilterModels(models)` is a hook (identity by default) that a tab\n * overrides to narrow the list further.\n *\n * ```ts\n * export class OtherFilesTabComponent extends ObjectMediaTabBaseComponent<IAnimationObject> {}\n * ```\n */\n@Directive()\nexport abstract class ObjectMediaTabBaseComponent<\n TMedia extends { id: number | string },\n> {\n protected readonly mediaTabFileUrl = inject(FileUrlService);\n protected readonly mediaTabTranslate = inject(TranslateService);\n\n /** The object whose media the tab shows. */\n readonly item = input.required<MsObject>();\n /** The form feature types (`FormFeatureType`) the tab shows. */\n readonly formFeatureTypes = input.required<FormFeatureType[]>();\n\n /** The object's media of `formFeatureTypes`, sorted by `position`, then through `mediaTabFilterModels`. */\n readonly models: Signal<TMedia[]> = computed<TMedia[]>(() => {\n const obj = this.item();\n let filtered: TMedia[] = [];\n\n if (obj.additionalImages && Array.isArray(obj.additionalImages)) {\n filtered = (obj.additionalImages as unknown as FileType[])\n .filter((img) => this.formFeatureTypes().includes(img?.formFeature))\n .sort(\n (a, b) => (a?.position ?? 0) - (b?.position ?? 0),\n ) as unknown as TMedia[];\n }\n\n return this.mediaTabFilterModels(filtered);\n });\n\n /** Narrows the sorted list. Identity by default. */\n protected mediaTabFilterModels(models: TMedia[]): TMedia[] {\n return models;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Directive, inject, input, signal } from '@angular/core';\n\n/**\n * Logic-only base of the media tabs' download button, from Muzeum Podlasia's\n * `download-button`: `download()` fetches `url`, saves the blob as `filename`\n * through a temporary `<a download>` and revokes the object URL. It runs only\n * from a click, so never on the server. The button keeps its template.\n *\n * ```ts\n * export class DownloadButtonComponent extends ObjectDownloadButtonBaseComponent {}\n * ```\n */\n@Directive()\nexport abstract class ObjectDownloadButtonBaseComponent {\n private readonly downloadButtonDocument = inject(DOCUMENT);\n\n /** The file URL. An empty URL does nothing. */\n readonly url = input.required<string>();\n /** The name the file is saved under. */\n readonly filename = input.required<string>();\n\n /** `true` while the file is being fetched. */\n readonly isDownloading = signal(false);\n\n async download(): Promise<void> {\n const url = this.url();\n const filename = this.filename();\n if (!url) return;\n\n this.isDownloading.set(true);\n\n try {\n const response = await fetch(url);\n const blob = await response.blob();\n const blobUrl = URL.createObjectURL(blob);\n\n const link = this.downloadButtonDocument.createElement('a');\n link.href = blobUrl;\n link.download = filename;\n link.click();\n\n URL.revokeObjectURL(blobUrl);\n } catch (error) {\n console.error('Failed to download file:', error);\n } finally {\n this.isDownloading.set(false);\n }\n }\n}\n","import { computed, Directive, input } from '@angular/core';\n\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\n/** The `archeoMap` field of an object card (coordinates as strings). */\nexport interface IObjectArcheoMap {\n latitude: string;\n longitude: string;\n}\n\n/**\n * Logic-only base of the object map tab, from Muzeum Podlasia's `map-tab`:\n * the object's `archeoMap` coordinates. The tab keeps its template (the map\n * component and its zoom).\n *\n * ```ts\n * export class MapTabComponent extends ObjectMapTabBaseComponent {}\n * ```\n */\n@Directive()\nexport abstract class ObjectMapTabBaseComponent {\n /** The object whose `archeoMap` the tab shows. */\n readonly item = input.required<MsObject>();\n\n private readonly mapTabArcheoMap = computed(() => {\n const obj = this.item() as MsObject & { archeoMap?: IObjectArcheoMap };\n return obj?.archeoMap;\n });\n\n /** Truthy (the longitude string) when both coordinates are set. */\n readonly hasCoordinates = computed(() => {\n const map = this.mapTabArcheoMap();\n return map?.latitude && map?.longitude;\n });\n\n /** `parseFloat(latitude)`, `0` when missing. */\n readonly latitude = computed(() => {\n const map = this.mapTabArcheoMap();\n return map?.latitude ? parseFloat(map.latitude) : 0;\n });\n\n /** `parseFloat(longitude)`, `0` when missing. */\n readonly longitude = computed(() => {\n const map = this.mapTabArcheoMap();\n return map?.longitude ? parseFloat(map.longitude) : 0;\n });\n}\n","import { Directive } from '@angular/core';\n\nimport { MsFile } from '@smartsoft001-mobilems/models';\n\nimport { ObjectMediaTabBaseComponent } from './object-media-tab-base';\nimport { IAnimationObject } from '../models/objects-filters.model';\n\n/**\n * Logic-only base of an object tab with native `<audio>` players (MOB-1801):\n * the file URL, title, aria label and download file name of each recording,\n * shared by `ObjectAudioTabBaseComponent` and\n * `ObjectAudioDescriptionTabBaseComponent`. The fallback label comes from\n * `audioMediaTabLabelKey`, read lazily, so a subclass overrides it with a\n * field.\n *\n * ```ts\n * protected override readonly audioMediaTabLabelKey = 'DETAILS_PAGE.tabs.audio';\n * ```\n */\n@Directive()\nexport abstract class ObjectAudioMediaTabBaseComponent<\n TMedia extends IAnimationObject = IAnimationObject,\n> extends ObjectMediaTabBaseComponent<TMedia> {\n /** Translation key of the player label; read lazily, so a subclass can override it. */\n protected readonly audioMediaTabLabelKey: string =\n 'OBJECTS.filters.multimedia.audio';\n\n /** The recording's file URL (`noCache`). */\n getAudioUrl(audio: TMedia): string {\n return this.mediaTabFileUrl.get(audio as unknown as MsFile, 'noCache');\n }\n\n /** Alt text in the current language, then the description, then the label key. */\n getAudioTitle(audio: TMedia): string {\n const currentLang = this.mediaTabTranslate.currentLang;\n const altText = currentLang === 'en' ? audio.altTextEn : audio.altText;\n return (\n altText ||\n audio.description ||\n this.mediaTabTranslate.instant(this.audioMediaTabLabelKey)\n );\n }\n\n /** `<label>: <title>`. */\n getAudioAriaLabel(audio: TMedia): string {\n const title = this.getAudioTitle(audio);\n const audioLabel = this.mediaTabTranslate.instant(\n this.audioMediaTabLabelKey,\n );\n return `${audioLabel}: ${title}`;\n }\n\n /** The object title, alt text, description or `audio`, plus the extension (`mp3` by default). */\n getDownloadFilename(audio: TMedia): string {\n const name =\n this.item()?.title || audio.altText || audio.description || 'audio';\n const ext = audio.extension || 'mp3';\n return `${name}.${ext}`;\n }\n}\n","import { Directive } from '@angular/core';\n\nimport { WidgetAudioItem } from '@smartsoft001-mobilems/angular';\nimport { MsFile } from '@smartsoft001-mobilems/models';\n\nimport { ObjectAudioMediaTabBaseComponent } from './object-audio-media-tab-base';\nimport { IAnimationObject } from '../models/objects-filters.model';\n\n/** Options of `ObjectAudioTabBaseComponent`, passed to `super(options)`. */\nexport interface IObjectAudioTabOptions {\n /**\n * Keep only recordings with a file (`filePath`), so the \"Audio 1, 2…\"\n * numbering counts what is shown (MOB-1872 review). Default `true`\n * (Muzeum Podlasia); `false` keeps the unfiltered list (sztuki-2, template).\n */\n playableOnly?: boolean;\n}\n\n/**\n * Logic-only base of the object audio tab (MOB-1801). Muzeum Podlasia renders\n * the article player (`app-widget-audio` on `WidgetAudioBaseComponent`,\n * MOB-1805 / MOB-1872) through `widgetItem` and `trackName`; sztuki-2 and the\n * template render a native `<audio>` with a download button through\n * `getAudioUrl`, `getAudioTitle`, `getAudioAriaLabel` and\n * `getDownloadFilename` (`ObjectAudioMediaTabBaseComponent`, label\n * `DETAILS_PAGE.tabs.audio`), with `playableOnly: false`. The tab keeps its\n * template, styles and `host`.\n *\n * ```ts\n * export class AudioTabComponent extends ObjectAudioTabBaseComponent {\n * constructor() {\n * super(); // sztuki-2 / template: super({ playableOnly: false })\n * }\n * }\n * ```\n */\n@Directive()\nexport abstract class ObjectAudioTabBaseComponent extends ObjectAudioMediaTabBaseComponent {\n protected override readonly audioMediaTabLabelKey: string =\n 'DETAILS_PAGE.tabs.audio';\n\n private readonly audioTabOptions: IObjectAudioTabOptions;\n\n protected constructor(options: IObjectAudioTabOptions = {}) {\n super();\n this.audioTabOptions = options;\n }\n\n /** With `playableOnly` (default) only recordings with a file. */\n protected override mediaTabFilterModels(\n models: IAnimationObject[],\n ): IAnimationObject[] {\n if (this.audioTabOptions.playableOnly === false) return models;\n // Only recordings with a file — the \"Audio 1, 2…\" numbering counts what\n // is shown (MOB-1872 review).\n return models.filter((audio) => !!audio.filePath);\n }\n\n /**\n * The recording in the audio widget's shape: the file in `file`, the\n * heading from the description (without one — a player without a heading,\n * as in the mock-up).\n */\n widgetItem(audio: IAnimationObject): WidgetAudioItem {\n return {\n file: audio as unknown as MsFile,\n title: audio.description ?? '',\n } as WidgetAudioItem;\n }\n\n /**\n * The recording's name for screen readers (the player's button and\n * slider): the alt text in the current language or the description;\n * several recordings without names — \"Audio 1\", \"Audio 2\"… (MOB-1872\n * review); a single one — `null`.\n */\n trackName(audio: IAnimationObject, index: number): string | null {\n const altText =\n this.mediaTabTranslate.currentLang === 'en'\n ? audio.altTextEn\n : audio.altText;\n const name = (altText || audio.description || '').trim();\n if (name) return name;\n return this.models().length > 1\n ? `${this.mediaTabTranslate.instant(this.audioMediaTabLabelKey)} ${index + 1}`\n : null;\n }\n}\n","import { computed, Directive, Signal } from '@angular/core';\n\nimport { ObjectAudioMediaTabBaseComponent } from './object-audio-media-tab-base';\n\n/**\n * Logic-only base of the object audio description tab (MOB-1801), from Muzeum\n * Podlasia's `audio-description-tab.component.ts` (sztuki-2 and the template\n * differ by one template class only): the main image above the players and\n * the names of each recording (`ObjectAudioMediaTabBaseComponent`, label\n * `OBJECTS.filters.multimedia.audio`). The tab keeps its template, styles and `host`.\n *\n * ```ts\n * export class AudioDescriptionTabComponent extends ObjectAudioDescriptionTabBaseComponent {}\n * ```\n */\n@Directive()\nexport abstract class ObjectAudioDescriptionTabBaseComponent extends ObjectAudioMediaTabBaseComponent {\n /** The object's main image (`big` = full resolution without cache); `null` without one or for the no-image placeholder. */\n readonly mainImageUrl: Signal<string | null> = computed<string | null>(() => {\n const obj = this.item();\n if (obj?.image) {\n const url = this.mediaTabFileUrl.get(obj.image, 'big');\n if (url && !url.includes('assets/no-image.svg')) {\n return url;\n }\n }\n return null;\n });\n}\n","import { Directive } from '@angular/core';\n\nimport { MsFile } from '@smartsoft001-mobilems/models';\n\nimport { ObjectMediaTabBaseComponent } from './object-media-tab-base';\nimport { IAnimationObject } from '../models/objects-filters.model';\n\n/**\n * Logic-only base of the object documents tab (MOB-1801), from Muzeum\n * Podlasia's `documents-tab.component.ts` (sztuki-2 and the template differ by\n * one template class only): each document's URL, display name and download\n * file name. The tab keeps its template, styles and `host`.\n *\n * ```ts\n * export class DocumentsTabComponent extends ObjectDocumentsTabBaseComponent {}\n * ```\n */\n@Directive()\nexport abstract class ObjectDocumentsTabBaseComponent extends ObjectMediaTabBaseComponent<IAnimationObject> {\n /** The document's file URL (`noCache`). */\n getDocumentUrl(doc: IAnimationObject): string {\n return this.mediaTabFileUrl.get(doc as unknown as MsFile, 'noCache');\n }\n\n /** Alt text in the current language, then the description, then the upper-case extension (`PDF` by default). */\n getDocumentDisplayName(doc: IAnimationObject): string {\n const currentLang = this.mediaTabTranslate.currentLang;\n const altText = currentLang === 'en' ? doc.altTextEn : doc.altText;\n\n if (altText) return altText;\n if (doc.description) return doc.description;\n\n // Show the extension name when there is no description\n const extension = doc.extension || 'pdf';\n return extension.toUpperCase();\n }\n\n /** Alt text in the current language, description or `document`, plus the extension (`pdf` by default). */\n getDocumentFileName(doc: IAnimationObject): string {\n const currentLang = this.mediaTabTranslate.currentLang;\n const altText = currentLang === 'en' ? doc.altTextEn : doc.altText;\n const name = altText || doc.description || 'document';\n const extension = doc.extension || 'pdf';\n return `${name}.${extension}`;\n }\n}\n","import {\n computed,\n effect,\n Signal,\n signal,\n WritableSignal,\n} from '@angular/core';\n\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nimport { IKeyValue } from '../models/objects-filters.model';\n\n/**\n * Selector state of a media tab with a dropdown (animation, video, virtual\n * walk). Internal to the media tab bases — not exported from the package.\n */\nexport interface IMediaTabPicker<T> {\n /** The chosen option key (`String(model.id)`), `null` without models. */\n selectedKey: WritableSignal<string | null>;\n /** Dropdown options: `altText ?? description ?? fallbackLabel(index)`. */\n options: Signal<IKeyValue[]>;\n /** The model of `selectedKey`, falling back to the first model. */\n selected: Signal<T | null>;\n /** The option of `selected`, falling back to the first option or `{ key: '', value: '' }`. */\n selectedOption: Signal<IKeyValue>;\n}\n\n/**\n * Creates the selector state of a media tab, 1:1 from Muzeum Podlasia's\n * animation tab. `fallbackLabel` gets the 0-based index of a model without\n * `altText` and `description`. When `item()` becomes a different object (a new\n * `id`), the first model is selected; an object that only re-emits keeps the\n * user's choice. `item` and `models` are functions (`() => this.item()`), read\n * lazily, so a tab that redeclares `item` still works. Call it in an injection context (a field initializer),\n * because it registers an `effect`.\n */\nexport function createMediaTabPicker<\n T extends {\n id: number | string;\n altText?: string | null;\n description?: string | null;\n },\n>(\n item: () => MsObject,\n models: () => T[],\n fallbackLabel: (index: number) => string,\n): IMediaTabPicker<T> {\n const selectedKey = signal<string | null>(null);\n\n const options = computed<IKeyValue[]>(() => {\n return models().map((model, index) => ({\n key: String(model.id),\n value: model?.altText ?? model?.description ?? fallbackLabel(index),\n }));\n });\n\n const selected = computed<T | null>(() => {\n const list = models();\n if (list.length === 0) return null;\n\n const key = selectedKey();\n if (key) {\n const found = list.find((model) => String(model.id) === key);\n if (found) return found;\n }\n\n return list[0];\n });\n\n const selectedOption = computed<IKeyValue>(() => {\n const model = selected();\n const list = options();\n\n if (model) {\n const found = list.find((option) => option.key === String(model.id));\n if (found) return found;\n }\n\n return list[0] || { key: '', value: '' };\n });\n\n let lastItemId: string | null = null;\n\n effect(() => {\n const currentItem = item();\n const list = models();\n\n // Only reset the selected key when the item changes (a different object)\n if (currentItem?.id !== lastItemId) {\n lastItemId = currentItem?.id ?? null;\n if (list.length > 0) {\n selectedKey.set(String(list[0].id));\n } else {\n selectedKey.set(null);\n }\n }\n });\n\n return { selectedKey, options, selected, selectedOption };\n}\n","import {\n Directive,\n ElementRef,\n Signal,\n viewChild,\n WritableSignal,\n} from '@angular/core';\n\nimport { MsFile } from '@smartsoft001-mobilems/models';\n\nimport { createMediaTabPicker } from './media-tab-picker';\nimport { ObjectMediaTabBaseComponent } from './object-media-tab-base';\nimport { IAnimationObject, IKeyValue } from '../models/objects-filters.model';\n\n/**\n * Logic-only base of an object tab with one video at a time and a dropdown\n * (MOB-1801), shared by `ObjectAnimationTabBaseComponent` and\n * `ObjectVideoTabBaseComponent`, 1:1 from Muzeum Podlasia's animation and\n * video tabs: the selector state, the player reset on a change and the\n * player helpers. The translation keys and the download fallback name are\n * abstract fields, read lazily.\n */\n@Directive()\nexport abstract class ObjectVideoMediaTabBaseComponent<\n TMedia extends IAnimationObject = IAnimationObject,\n> extends ObjectMediaTabBaseComponent<TMedia> {\n /** Translation key of a dropdown option without a name (`<label> <n>`). */\n protected abstract readonly videoMediaTabOptionLabelKey: string;\n /** Translation key of the player title and aria label. */\n protected abstract readonly videoMediaTabTitleKey: string;\n /** Download file name without the object title, alt text and description. */\n protected abstract readonly videoMediaTabDownloadName: string;\n\n /** The template's native `<video #videoPlayer>`, if it has one. */\n readonly videoPlayer = viewChild<ElementRef<HTMLVideoElement>>('videoPlayer');\n\n private readonly videoMediaTabPicker = createMediaTabPicker<TMedia>(\n () => this.item(),\n () => this.models(),\n (index) =>\n `${this.mediaTabTranslate.instant(this.videoMediaTabOptionLabelKey)} ${index + 1}`,\n );\n\n /** The chosen video's key; the first video of each new object. */\n readonly selectedVideoKey: WritableSignal<string | null> =\n this.videoMediaTabPicker.selectedKey;\n /** Dropdown options: alt text, description or `<label> <n>`. */\n readonly videoOptions: Signal<IKeyValue[]> = this.videoMediaTabPicker.options;\n /** The chosen video, the first one by default. */\n readonly selectedVideo: Signal<TMedia | null> =\n this.videoMediaTabPicker.selected;\n /** The dropdown option of `selectedVideo`. */\n readonly selectedVideoOption: Signal<IKeyValue> =\n this.videoMediaTabPicker.selectedOption;\n\n /** Selects a video; a native `#videoPlayer` is paused and rewound. */\n videoChange(key: string): void {\n this.selectedVideoKey.set(key);\n // Reset video playback\n const player = this.videoPlayer()?.nativeElement;\n if (player) {\n player.pause();\n player.currentTime = 0;\n }\n }\n\n /** The video's file URL (`noCache`). */\n getVideoUrl(video: TMedia): string {\n return this.mediaTabFileUrl.get(video as unknown as MsFile, 'noCache');\n }\n\n /** Alt text in the current language, then the description, then the title key. */\n getVideoTitle(video: TMedia): string {\n const currentLang = this.mediaTabTranslate.currentLang;\n const altText = currentLang === 'en' ? video.altTextEn : video.altText;\n return (\n altText ||\n video.description ||\n this.mediaTabTranslate.instant(this.videoMediaTabTitleKey)\n );\n }\n\n /** `<title key>: <title>`. */\n getVideoAriaLabel(video: TMedia): string {\n const title = this.getVideoTitle(video);\n const videoLabel = this.mediaTabTranslate.instant(\n this.videoMediaTabTitleKey,\n );\n return `${videoLabel}: ${title}`;\n }\n\n /** The object title, alt text, description or the fallback name, plus the extension (`mp4` by default). */\n getDownloadFilename(video: TMedia): string {\n const name =\n this.item()?.title ||\n video.altText ||\n video.description ||\n this.videoMediaTabDownloadName;\n const ext = video.extension || 'mp4';\n return `${name}.${ext}`;\n }\n}\n","import { Directive } from '@angular/core';\n\nimport { ObjectVideoMediaTabBaseComponent } from './object-video-media-tab-base';\n\n/**\n * Logic-only base of the object animation tab (MOB-1801), 1:1 from Muzeum\n * Podlasia (sztuki-2 and the template are identical): options without a name\n * are `OBJECTS.filters.multimedia.animation <n>`, the player is titled with\n * `OBJECTS.filters.multimedia.video`, the download falls back to\n * `animation.mp4`, and `videoChange` pauses and rewinds `#videoPlayer`. The\n * tab keeps its template, styles and `host`.\n *\n * ```ts\n * export class AnimationTabComponent extends ObjectAnimationTabBaseComponent {}\n * ```\n */\n@Directive()\nexport abstract class ObjectAnimationTabBaseComponent extends ObjectVideoMediaTabBaseComponent {\n protected override readonly videoMediaTabOptionLabelKey: string =\n 'OBJECTS.filters.multimedia.animation';\n protected override readonly videoMediaTabTitleKey: string =\n 'OBJECTS.filters.multimedia.video';\n protected override readonly videoMediaTabDownloadName: string = 'animation';\n}\n","import { Directive } from '@angular/core';\n\nimport { ObjectVideoMediaTabBaseComponent } from './object-video-media-tab-base';\n\n/**\n * Logic-only base of the object video tab (MOB-1801). Options, title and\n * aria label use `DETAILS_PAGE.tabs.video`. Muzeum Podlasia renders the app's\n * video player (a new source resets it — a still frame with a play button,\n * no playback), so its template has no `#videoPlayer` and `videoChange` only\n * selects the video. Sztuki-2 and the template render a native\n * `<video #videoPlayer>`, which `videoChange` pauses and rewinds, and a\n * download button named by `getDownloadFilename` (fallback `video.mp4`). The\n * tab keeps its template, styles and `host`.\n *\n * ```ts\n * export class VideoTabComponent extends ObjectVideoTabBaseComponent {}\n * ```\n */\n@Directive()\nexport abstract class ObjectVideoTabBaseComponent extends ObjectVideoMediaTabBaseComponent {\n protected override readonly videoMediaTabOptionLabelKey: string =\n 'DETAILS_PAGE.tabs.video';\n protected override readonly videoMediaTabTitleKey: string =\n 'DETAILS_PAGE.tabs.video';\n protected override readonly videoMediaTabDownloadName: string = 'video';\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n computed,\n DestroyRef,\n Directive,\n ElementRef,\n inject,\n PLATFORM_ID,\n Signal,\n signal,\n viewChild,\n WritableSignal,\n} from '@angular/core';\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';\n\nimport { createMediaTabPicker } from './media-tab-picker';\nimport { ObjectMediaTabBaseComponent } from './object-media-tab-base';\nimport { IKeyValue, IModel3DObject } from '../models/objects-filters.model';\n\n/**\n * Logic-only base of the object virtual walk tab (MOB-1801), 1:1 from Muzeum\n * Podlasia (sztuki-2 and the template are identical): the walk dropdown, the\n * trusted iframe source and the fullscreen toggle of `#walkContainer`. The\n * `fullscreenchange` listener is registered in the browser only, through the\n * injected `DOCUMENT`, and removed on destroy. The tab keeps its template,\n * styles and `host`.\n *\n * ```ts\n * export class VirtualWalkTabComponent extends ObjectVirtualWalkTabBaseComponent {\n * constructor() {\n * super();\n * }\n * }\n * ```\n */\n@Directive()\nexport abstract class ObjectVirtualWalkTabBaseComponent extends ObjectMediaTabBaseComponent<IModel3DObject> {\n private readonly virtualWalkTabSanitizer = inject(DomSanitizer);\n private readonly virtualWalkTabDocument = inject(DOCUMENT);\n\n /** The template's `#iframeContainer`. */\n readonly iframeContainer = viewChild<ElementRef>('iframeContainer');\n /** The template's `#walkContainer`, the element shown fullscreen. */\n readonly walkContainer = viewChild<ElementRef>('walkContainer');\n\n private readonly virtualWalkTabPicker = createMediaTabPicker(\n () => this.item(),\n () => this.models(),\n (index) =>\n `${this.mediaTabTranslate.instant('OBJECTS.filters.multimedia.virtualWalk')} ${index + 1}`,\n );\n\n /** The chosen walk's key; the first walk of each new object. */\n readonly selectedWalkKey: WritableSignal<string | null> =\n this.virtualWalkTabPicker.selectedKey;\n /** Dropdown options: alt text, description or `OBJECTS.filters.multimedia.virtualWalk <n>`. */\n readonly walkOptions: Signal<IKeyValue[]> = this.virtualWalkTabPicker.options;\n /** The chosen walk, the first one by default. */\n readonly selectedWalk: Signal<IModel3DObject | null> =\n this.virtualWalkTabPicker.selected;\n /** The dropdown option of `selectedWalk`. */\n readonly selectedWalkOption: Signal<IKeyValue> =\n this.virtualWalkTabPicker.selectedOption;\n\n /** The selected walk's `iframeSource`, trusted; `null` without one. */\n readonly safeIframeUrl: Signal<SafeResourceUrl | null> =\n computed<SafeResourceUrl | null>(() => {\n const walk = this.selectedWalk();\n if (!walk?.iframeSource) return null;\n return this.virtualWalkTabSanitizer.bypassSecurityTrustResourceUrl(\n walk.iframeSource,\n );\n });\n\n /** Whether the document is in fullscreen (follows `fullscreenchange`, e.g. Escape). */\n readonly isFullscreen = signal(false);\n\n protected constructor() {\n super();\n\n if (isPlatformBrowser(inject(PLATFORM_ID))) {\n // Listen for fullscreen changes (e.g. when the user presses Escape)\n const doc = this.virtualWalkTabDocument;\n const onFullscreenChange = () => {\n this.isFullscreen.set(!!doc.fullscreenElement);\n };\n\n doc.addEventListener('fullscreenchange', onFullscreenChange);\n\n inject(DestroyRef).onDestroy(() => {\n doc.removeEventListener('fullscreenchange', onFullscreenChange);\n });\n }\n }\n\n /** Selects a walk. */\n walkChange(key: string): void {\n this.selectedWalkKey.set(key);\n }\n\n /** Alt text in the current language, then the description, then `OBJECTS.filters.multimedia.virtualWalk`. */\n getWalkTitle(walk: IModel3DObject): string {\n const currentLang = this.mediaTabTranslate.currentLang;\n const altText = currentLang === 'en' ? walk.altTextEn : walk.altText;\n return (\n altText ||\n walk.description ||\n this.mediaTabTranslate.instant('OBJECTS.filters.multimedia.virtualWalk')\n );\n }\n\n /** Shows `#walkContainer` fullscreen, or leaves fullscreen. */\n toggleFullscreen(): void {\n const container = this.walkContainer();\n if (!container) return;\n\n const element = container.nativeElement as HTMLElement;\n const doc = this.virtualWalkTabDocument;\n\n if (!doc.fullscreenElement) {\n element.requestFullscreen().catch((err) => {\n console.error('Error attempting to enable fullscreen:', err);\n });\n } else {\n doc.exitFullscreen();\n }\n }\n}\n","import { DOCUMENT, isPlatformBrowser } from '@angular/common';\nimport {\n DestroyRef,\n Directive,\n effect,\n ElementRef,\n inject,\n PLATFORM_ID,\n signal,\n viewChild,\n WritableSignal,\n} from '@angular/core';\n\nimport {\n createLazyLoader,\n createSafeTimeouts,\n ILazyLoader,\n} from '@smartsoft001-mobilems/angular';\n\nimport { ObjectMediaTabBaseComponent } from './object-media-tab-base';\nimport { IModel3DObject } from '../models/objects-filters.model';\n\n/** The `online-3d-viewer` `Viewer` calls the 3D tab makes. */\nexport interface IObjectModel3dViewer {\n SetUpVector(direction: unknown, animate: boolean): void;\n GetBoundingSphere(filter: (meshUserData: unknown) => boolean): unknown;\n AdjustClippingPlanesToSphere(sphere: unknown): void;\n FitSphereToWindow(sphere: unknown, animate: boolean): void;\n SetEdgeSettings(settings: unknown): void;\n}\n\n/** The `online-3d-viewer` `EmbeddedViewer` calls the 3D tab makes. */\nexport interface IObjectModel3dEmbeddedViewer {\n LoadModelFromUrlList(urls: string[]): void;\n Destroy(): void;\n GetViewer(): IObjectModel3dViewer;\n}\n\n/**\n * The part of the `online-3d-viewer` module the 3D tab uses. The framework\n * does not depend on the library: the museum returns its own\n * `import('online-3d-viewer')` from `loadModel3dLibrary()`, which is\n * assignable without a cast.\n *\n * The colour and edge slots of the `EmbeddedViewer` parameters and the\n * `EdgeSettings` colour are `any`: constructor parameters are checked\n * contravariantly (`strictFunctionTypes`), so anything narrower would have to\n * restate the library's `RGBAColor`, `RGBColor` and `EdgeSettings` classes\n * member by member. The values come from the same module's constructors.\n */\nexport interface IObjectModel3dViewerLibrary {\n EmbeddedViewer: new (\n parentElement: HTMLElement,\n parameters: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n backgroundColor: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n defaultColor: any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n edgeSettings: any;\n onModelLoaded: () => void;\n },\n ) => IObjectModel3dEmbeddedViewer;\n RGBAColor: new (r: number, g: number, b: number, a: number) => unknown;\n RGBColor: new (r: number, g: number, b: number) => unknown;\n EdgeSettings: new (\n showEdges: boolean,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n edgeColor: any,\n edgeThreshold: number,\n ) => unknown;\n Direction: { Y: unknown };\n}\n\n/** Options of `ObjectModel3dTabBaseComponent`, passed to `super(options)`. */\nexport interface IObjectModel3dTabOptions {\n /**\n * Keep only models with at least one file to load (`files[].filePath`) —\n * the same condition as the tab counter, so the default model does not end\n * in \"No files found\" (MOB-1872 review). Default `true` (Muzeum Podlasia);\n * `false` keeps the unfiltered list (sztuki-2, template).\n */\n loadableOnly?: boolean;\n}\n\n/**\n * Logic-only base of the object 3D model tab (MOB-1801), 1:1 from Muzeum\n * Podlasia: the model list, the lazily loaded `online-3d-viewer`, the model\n * switch, the camera reset, the wireframe and the fullscreen toggle. The tab\n * keeps its template, styles and `host`, and returns its own\n * `import('online-3d-viewer')` from `loadModel3dLibrary()` — the framework does\n * not depend on the library, and the viewer is never loaded on the server.\n * Podlasie's model file URI panel (MOB-981) stays in Podlasie and follows\n * `selectedModel`.\n *\n * ```ts\n * export class Model3dTabComponent extends ObjectModel3dTabBaseComponent {\n * constructor() {\n * super(); // sztuki-2 / template: super({ loadableOnly: false })\n * }\n *\n * protected loadModel3dLibrary() {\n * return import('online-3d-viewer');\n * }\n * }\n * ```\n */\n@Directive()\nexport abstract class ObjectModel3dTabBaseComponent extends ObjectMediaTabBaseComponent<IModel3DObject> {\n /** The template's `#viewer3d`, the viewer's canvas container. */\n readonly viewer3d = viewChild<ElementRef>('viewer3d');\n\n /** The chosen model's index, bound with `ngModel` (may arrive as a string). */\n selectedModelIndex = 0;\n /** The chosen model's index as a signal, next to `selectedModelIndex` (`onModelChange`). */\n readonly selectedModel = signal(0);\n /** A model is loading. */\n readonly isLoading = signal(false);\n /** The load error, `null` without one. */\n readonly error: WritableSignal<string | null> = signal<string | null>(null);\n /** The edges are shown. */\n readonly isWireframe = signal(false);\n /** Whether the document is in fullscreen (follows `fullscreenchange`, e.g. Escape). */\n readonly isFullscreen = signal(false);\n\n private readonly model3dTabOptions: IObjectModel3dTabOptions;\n private readonly model3dTabDocument = inject(DOCUMENT);\n private readonly model3dTabPlatformId = inject(PLATFORM_ID);\n private readonly model3dTabTimeouts = createSafeTimeouts();\n /**\n * `online-3d-viewer` (+ `three`, ~1.1 MB) is loaded only on the first\n * init — a static import put the library in the chunk of the whole objects\n * module, loaded on the `/obiekty` list and every card, also without a 3D\n * model (Lighthouse, MOB-1850, MOB-1895). One load is shared between\n * concurrent calls. Created on first use.\n */\n private model3dTabLibraryLoader: ILazyLoader<IObjectModel3dViewerLibrary> | null =\n null;\n /** The number of the latest init — an older call after `await` does not overwrite a newer one. */\n private model3dTabInitToken = 0;\n private model3dTabViewer: IObjectModel3dEmbeddedViewer | null = null;\n\n protected constructor(options: IObjectModel3dTabOptions = {}) {\n super();\n this.model3dTabOptions = options;\n\n effect(() => {\n const viewerElement = this.viewer3d();\n const models = this.models();\n\n if (viewerElement && models.length > 0) {\n this.model3dTabTimeouts.later(\n () => void this.model3dTabInitViewer(),\n 100,\n );\n }\n });\n\n if (isPlatformBrowser(this.model3dTabPlatformId)) {\n // Listen for fullscreen changes (e.g. when the user presses Escape)\n const doc = this.model3dTabDocument;\n const onFullscreenChange = () => {\n const wasFullscreen = this.isFullscreen();\n this.isFullscreen.set(!!doc.fullscreenElement);\n\n // Reinitialize the viewer when leaving fullscreen to fix sizing issues\n if (wasFullscreen && !doc.fullscreenElement) {\n this.model3dTabTimeouts.later(\n () => void this.model3dTabInitViewer(),\n 100,\n );\n }\n };\n\n doc.addEventListener('fullscreenchange', onFullscreenChange);\n\n inject(DestroyRef).onDestroy(() => {\n doc.removeEventListener('fullscreenchange', onFullscreenChange);\n });\n }\n }\n\n /** The museum's `import('online-3d-viewer')`. Called once, in the browser, on the first init. */\n protected abstract loadModel3dLibrary(): Promise<IObjectModel3dViewerLibrary>;\n\n /** With `loadableOnly` (default) only models with a file to load. */\n protected override mediaTabFilterModels(\n models: IModel3DObject[],\n ): IModel3DObject[] {\n if (this.model3dTabOptions.loadableOnly === false) return models;\n // Only models with a file to load — the same condition as the tab\n // counter, so the default model does not end in \"No files found\"\n // (MOB-1872 review).\n return models.filter((model) =>\n (model.files ?? []).some((file) => !!file?.filePath),\n );\n }\n\n /** Follows the `selectedModelIndex` dropdown: sets `selectedModel` and loads that model. */\n onModelChange(): void {\n this.selectedModel.set(Number(this.selectedModelIndex) || 0);\n this.model3dTabLoadModel(this.selectedModelIndex);\n }\n\n /** Fits the model to the window with the Y axis up. A no-op before the library is loaded. */\n resetCamera(): void {\n const library = this.model3dTabLibraryLoader?.loaded;\n if (this.model3dTabViewer && library) {\n // Reset the camera to fit the model and reset rotation\n const viewerInstance = this.model3dTabViewer.GetViewer();\n\n // Reset the up vector to default (Y-up)\n viewerInstance.SetUpVector(library.Direction.Y, false);\n\n // Get bounding sphere and fit to window\n const boundingSphere = viewerInstance.GetBoundingSphere(\n () => true, // Include all meshes\n );\n viewerInstance.AdjustClippingPlanesToSphere(boundingSphere);\n viewerInstance.FitSphereToWindow(boundingSphere, true); // Use animation for smooth transition\n }\n }\n\n /** Shows or hides the edges. A no-op before the library is loaded. */\n toggleWireframe(): void {\n const library = this.model3dTabLibraryLoader?.loaded;\n if (!this.model3dTabViewer || !library) return;\n\n const newWireframeState = !this.isWireframe();\n this.isWireframe.set(newWireframeState);\n\n const edgeSettings = new library.EdgeSettings(\n newWireframeState,\n new library.RGBColor(0, 0, 0),\n 1,\n );\n\n const viewerInstance = this.model3dTabViewer.GetViewer();\n viewerInstance.SetEdgeSettings(edgeSettings);\n }\n\n /** Shows the parent of `#viewer3d` fullscreen, or leaves fullscreen. */\n toggleFullscreen(): void {\n const viewerElement = this.viewer3d();\n if (!viewerElement) return;\n\n const container = viewerElement.nativeElement.parentElement as HTMLElement;\n const doc = this.model3dTabDocument;\n\n if (!doc.fullscreenElement) {\n container.requestFullscreen().catch((err) => {\n console.error('Error attempting to enable fullscreen:', err);\n });\n } else {\n doc.exitFullscreen();\n }\n }\n\n private model3dTabLibrary(): ILazyLoader<IObjectModel3dViewerLibrary> {\n this.model3dTabLibraryLoader ??= createLazyLoader(() =>\n this.loadModel3dLibrary(),\n );\n return this.model3dTabLibraryLoader;\n }\n\n private async model3dTabInitViewer(): Promise<void> {\n if (!isPlatformBrowser(this.model3dTabPlatformId)) return;\n const viewerElement = this.viewer3d();\n if (!viewerElement) return;\n\n const models = this.models();\n if (models.length === 0) return;\n\n const token = ++this.model3dTabInitToken;\n this.isLoading.set(true);\n this.error.set(null);\n let library: IObjectModel3dViewerLibrary;\n try {\n library = await this.model3dTabLibrary().load();\n } catch (loadError) {\n // The library chunk did not arrive (network, old deploy) — a message\n // instead of an endless loader; the next entry to the tab retries.\n if (token === this.model3dTabInitToken) {\n this.isLoading.set(false);\n this.error.set('3D viewer failed to load');\n }\n console.error('online-3d-viewer', loadError);\n return;\n }\n // A newer call came in meanwhile, or the component is gone.\n if (token !== this.model3dTabInitToken || !this.viewer3d()) return;\n\n // Clean up existing viewer\n if (this.model3dTabViewer) {\n this.model3dTabViewer.Destroy();\n this.model3dTabViewer = null;\n }\n\n const parentDiv = viewerElement.nativeElement as HTMLElement;\n parentDiv.innerHTML = ''; // Clear previous content\n\n // Initialize the viewer with callback for proper loading state\n this.model3dTabViewer = new library.EmbeddedViewer(parentDiv, {\n backgroundColor: new library.RGBAColor(245, 245, 245, 255),\n defaultColor: new library.RGBColor(200, 200, 200),\n edgeSettings: new library.EdgeSettings(\n false,\n new library.RGBColor(0, 0, 0),\n 1,\n ),\n onModelLoaded: () => {\n this.isLoading.set(false);\n },\n });\n\n this.model3dTabLoadModel(this.selectedModelIndex);\n }\n\n private model3dTabLoadModel(index: number): void {\n if (!this.model3dTabViewer) return;\n\n const models = this.models();\n if (index < 0 || index >= models.length) return;\n\n const model = models[index];\n\n this.isLoading.set(true);\n this.error.set(null);\n\n // Only files with a URL — an empty entry in `files[]` broke the 3D viewer\n // and blocked the model's valid files (MOB-1872 review).\n const fileUrls = (model.files ?? [])\n .map((file) => file?.filePath)\n .filter((url): url is string => !!url);\n\n if (fileUrls.length === 0) {\n this.error.set('No files found for this model');\n this.isLoading.set(false);\n return;\n }\n\n // Load the model - callbacks onModelLoaded/onModelLoadFailed handle loading state\n this.model3dTabViewer.LoadModelFromUrlList(fileUrls);\n }\n}\n","import { computed, Directive, inject, input, signal } from '@angular/core';\n\nimport { FileUrlService } from '@smartsoft001-mobilems/angular';\nimport { MsFile } from '@smartsoft001-mobilems/models';\nimport { MsObject } from '@smartsoft001-mobilems/objects-domain';\n\nimport { FileType, FormFeatureType } from '../models/objects-filters.model';\nimport { ObjectMediaService } from '../services/object-media/object-media.service';\n\n/**\n * Logic-only base of the sztuki-2 / template `media-sections`: an object's\n * multimedia as landing-page sections (Figma), each with a heading like\n * „Galeria zdjęć”; a section without data is not rendered. Order: HD photos →\n * 3D model → animation → video → audio → virtual walk → audio description →\n * map → other files. The component keeps its template, heading class and\n * tab imports.\n *\n * ```ts\n * export class MediaSectionsComponent extends ObjectMediaSectionsBaseComponent {\n * readonly sectionHeadingClass = '…';\n * }\n * ```\n */\n@Directive()\nexport abstract class ObjectMediaSectionsBaseComponent {\n private readonly mediaSectionsFileUrl = inject(FileUrlService);\n private readonly mediaSectionsMedia = inject(ObjectMediaService);\n\n /** The object whose multimedia the sections show. */\n readonly item = input.required<MsObject>();\n\n /**\n * Multimedia already shown in the object card's gallery frame (the video /\n * 3D tabs, MOB-1961) — not repeated in the sections. Default `[]`.\n */\n readonly exclude = input<ReadonlyArray<'model3d' | 'video'>>([]);\n\n /** `[IMAGES_HD]` */\n readonly imagesHDTypes = [FormFeatureType.IMAGES_HD];\n\n /** `[MODEL_3D]` */\n readonly model3DTypes = [FormFeatureType.MODEL_3D];\n\n /** `[ANIMATION]` */\n readonly animationTypes = [FormFeatureType.ANIMATION];\n\n /** `[AUDIO_DESKRYPCJA]` */\n readonly adTypes = [FormFeatureType.AUDIO_DESKRYPCJA];\n\n /** `[VIRTUAL_WALK]` */\n readonly virtualWalkTypes = [FormFeatureType.VIRTUAL_WALK];\n\n /** `[VIDEO]` */\n readonly videoTypes = [FormFeatureType.VIDEO];\n\n /** `[AUDIO]` */\n readonly audioTypes = [FormFeatureType.AUDIO];\n\n /** `[OTHER]` */\n readonly otherTypes = [FormFeatureType.OTHER];\n\n /** HD photo thumbnails (without the main image) — fullscreen on click. */\n readonly hdThumbnailUrls = computed(() =>\n this.mediaSectionsMedia.thumbnailUrls(\n this.item(),\n this.imagesHDTypes,\n false,\n ),\n );\n\n /** HD photo gallery items (without the main image) for the fullscreen. */\n readonly hdGalleryItems = computed(() =>\n this.mediaSectionsMedia.galleryItems(\n this.item(),\n this.imagesHDTypes,\n false,\n ),\n );\n\n /** Whether the HD fullscreen gallery is open. */\n readonly hdFullscreenOpen = signal(false);\n\n /** The photo the HD fullscreen gallery shows. */\n readonly hdFullscreenIndex = signal(0);\n\n /** Opens the HD fullscreen gallery at the clicked thumbnail. */\n openHdFullscreen(index: number): void {\n this.hdFullscreenIndex.set(index);\n this.hdFullscreenOpen.set(true);\n }\n\n /** The object title without HTML tags (alt text). */\n readonly altTitle = computed<string>(() =>\n (this.item()?.title ?? '').replace(/<\\/?[^>]+(>|$)/g, ''),\n );\n\n /** HD photos section: any HD thumbnail. */\n readonly showPhotosHD = computed(() => this.hdThumbnailUrls().length > 0);\n\n /** 3D model section: a real file URL, unless excluded. */\n readonly showModel3D = computed(\n () =>\n !this.exclude().includes('model3d') &&\n this.mediaSectionsHasContent(this.model3DTypes),\n );\n\n /** Animation section: a real file URL. */\n readonly showAnimation = computed(() =>\n this.mediaSectionsHasContent(this.animationTypes),\n );\n\n /**\n * Video section: a file with a `filePath` (`FileUrlService` gives a\n * placeholder for non-image extensions), unless excluded.\n */\n readonly showVideo = computed(\n () =>\n !this.exclude().includes('video') &&\n this.mediaSectionsMedia.hasFiles(this.item(), this.videoTypes),\n );\n\n /** Audio section: a file with a `filePath`. */\n readonly showAudio = computed(() =>\n this.mediaSectionsMedia.hasFiles(this.item(), this.audioTypes),\n );\n\n /** Virtual walk section: a walk with an `iframeSource` (not a file URL). */\n readonly showVirtualWalk = computed(() => {\n const obj = this.item() as\n (MsObject & { additionalImages?: FileType[] }) | undefined;\n if (!obj?.additionalImages) return false;\n\n const virtualWalkItems = (\n obj.additionalImages as unknown as FileType[]\n ).filter((img) => this.virtualWalkTypes.includes(img?.formFeature));\n\n // Any virtual walk item with an iframeSource\n return virtualWalkItems.some(\n (item) => (item as unknown as { iframeSource?: string }).iframeSource,\n );\n });\n\n /** The number of audio description files with a real URL. */\n readonly audioDescriptionCount = computed(() => {\n const obj = this.item() as\n (MsObject & { additionalImages?: FileType[] }) | undefined;\n if (!obj?.additionalImages) return 0;\n\n const audioItems = (obj.additionalImages as unknown as FileType[]).filter(\n (img) => {\n if (!this.adTypes.includes(img?.formFeature)) return false;\n const url = this.mediaSectionsFileUrl.get(img as unknown as MsFile);\n return url && !url.includes('assets/no-image.svg');\n },\n );\n return audioItems.length;\n });\n\n /** Audio description section: any audio description. */\n readonly showAudioDescription = computed(\n () => this.audioDescriptionCount() > 0,\n );\n\n /** Map section: both `archeoMap` coordinates set. */\n readonly showMap = computed(() => {\n const obj = this.item() as\n | (MsObject & { archeoMap?: { latitude: string; longitude: string } })\n | undefined;\n return !!(obj?.archeoMap?.latitude && obj?.archeoMap?.longitude);\n });\n\n /** Other files section (PDF, etc.): a real file URL. */\n readonly showOther = computed(() =>\n this.mediaSectionsHasContent(this.otherTypes),\n );\n\n /** Whether any section is visible. */\n readonly hasVisibleSections = computed(\n () =>\n this.showPhotosHD() ||\n this.showModel3D() ||\n this.showAnimation() ||\n this.showVideo() ||\n this.showAudio() ||\n this.showVirtualWalk() ||\n this.showAudioDescription() ||\n this.showMap() ||\n this.showOther(),\n );\n\n /**\n * Whether an additional file of the types has a URL from `FileUrlService`\n * that is not the no-image placeholder. Reads `item()`, so the calling\n * `computed` tracks it.\n */\n private mediaSectionsHasContent(types: FormFeatureType[]): boolean {\n const obj = this.item() as\n (MsObject & { additionalImages?: FileType[] }) | undefined;\n if (!obj) return false;\n\n // Check additional images\n if (obj.additionalImages && Array.isArray(obj.additionalImages)) {\n const filtered = (obj.additionalImages as unknown as FileType[]).filter(\n (img) => types.includes(img?.formFeature),\n );\n\n for (const img of filtered) {\n const url = this.mediaSectionsFileUrl.get(img as unknown as MsFile);\n if (url && !url.includes('assets/no-image.svg')) {\n return true;\n }\n }\n }\n\n return false;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["smartInitialState","smartGetReducer"],"mappings":"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"}