@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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smartsoft001-mobilems/objects-shell-angular",
3
- "version": "2.129.0",
3
+ "version": "2.130.0",
4
4
  "description": "This library was generated with [Nx](https://nx.dev).",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,10 +1,10 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { TemplateRef, ModuleWithProviders, Signal, AfterViewInit, WritableSignal, OnInit, ResourceRef } from '@angular/core';
2
+ import { TemplateRef, ModuleWithProviders, Signal, AfterViewInit, WritableSignal, OnInit, ResourceRef, ElementRef } from '@angular/core';
3
3
  import * as _smartsoft001_crud_shell_angular from '@smartsoft001/crud-shell-angular';
4
4
  import { ICrudModuleOptionsWithoutRoutng, CrudFacade, State as State$1, CrudListPageBaseComponent, CrudItemPageBaseComponent, CrudService, ICrudFilter, ICrudFilterQueryItem } from '@smartsoft001/crud-shell-angular';
5
5
  import { IEntity } from '@smartsoft001/domain-core';
6
6
  import * as _smartsoft001_mobilems_angular from '@smartsoft001-mobilems/angular';
7
- import { FiltersBaseComponent, CrudBaseService, SeoService, TranslationService, IDictionaryPage, ICatalogOptions, ICatalog, ISeoMetadata, INamedEntrySource, INamedEntryParts, FilterType, IDictionaryEntry, FiltersContext, ThemeTag, ShareLinkBaseComponent } from '@smartsoft001-mobilems/angular';
7
+ import { FiltersBaseComponent, CrudBaseService, SeoService, TranslationService, IDictionaryPage, ICatalogOptions, ICatalog, ISeoMetadata, INamedEntrySource, INamedEntryParts, FilterType, IDictionaryEntry, FiltersContext, ThemeTag, ShareLinkBaseComponent, FileUrlService, WidgetAudioItem } from '@smartsoft001-mobilems/angular';
8
8
  import * as i1 from '@angular/common';
9
9
  import { MsObject } from '@smartsoft001-mobilems/objects-domain';
10
10
  import * as dist_packages_objects_domain_src from 'dist/packages/objects/domain/src';
@@ -16,6 +16,9 @@ import { MsFile } from '@smartsoft001-mobilems/models';
16
16
  import { ListMode } from '@smartsoft001/angular';
17
17
  import * as rxjs from 'rxjs';
18
18
  import { Observable } from 'rxjs';
19
+ import { TranslateService } from '@ngx-translate/core';
20
+ import { SafeResourceUrl } from '@angular/platform-browser';
21
+ import * as _smartsoft001_mobilems_objects_shell_angular from '@smartsoft001-mobilems/objects-shell-angular';
19
22
 
20
23
  declare class FiltersComponent extends FiltersBaseComponent<MsObject> {
21
24
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FiltersComponent, never>;
@@ -1080,5 +1083,540 @@ declare abstract class ObjectsShareResultsBaseComponent extends ShareLinkBaseCom
1080
1083
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectsShareResultsBaseComponent, never, never, { "filter": { "alias": "filter"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1081
1084
  }
1082
1085
 
1083
- export { ASK_ABOUT_OBJECT_KEYS, AdvancedFilterType, ComponentsModule, FiltersComponent, FormFeatureType, ListComponent, MULTIMEDIA_DICTIONARY, OBJECTS_CATALOG_DEFAULTS, OBJECTS_CATALOG_SEO, OBJECTS_FILTER_SINGLE_VALUE_LABELS, OBJECTS_LIMIT_OPTIONS, OBJECTS_NEW_TYPE_SORT_OPTIONS, OBJECTS_SHARE_COPIED_TIMEOUT, OBJECTS_SORT_OPTIONS, OBJECTS_THEME_TAGS_FILTER_KEY, ObjectDetailsBaseComponent, ObjectMediaService, ObjectsAdvancedFiltersBaseComponent, ObjectsCatalogBaseComponent, ObjectsDataService, ObjectsFacade, ObjectsFiltersBarBaseComponent, ObjectsItemComponent, ObjectsListComponent, ObjectsModule, ObjectsSearchPanelBaseComponent, ObjectsService, ObjectsShareResultsBaseComponent, ObjectsSharedModule, SERVICES, askAboutObjectHref, bibliography, buildObjectsResultsUrl, descriptionHtml, getObjectsState, getReducer, initialState, inventoryValues, objectTitle, objectsSortFromKey, objectsSortKey, relatedArticles, tagValues };
1084
- export type { ArchaeologicalSegregation, AskTranslate, FileType, IAnimationObject, IAskAboutObject, IKeyValue, IModel3DObject, IMultimediaDictionaryItem, IObjectBibliographyEntry, IObjectCollectionSummary, IObjectDetailLink, IObjectDetailSource, IObjectDetailsOptions, IObjectGalleryItem, IObjectRelated, IObjectsAdvancedFilterField, IObjectsAdvancedFilterWrite, IObjectsAdvancedFiltersOptions, IObjectsCatalogLoadMore, IObjectsCatalogOptions, IObjectsCatalogSeo, IObjectsDateRange, IObjectsFilterWrite, IObjectsFiltersBarOptions, ISpecificObject, ObjectDetailValue, ObjectsAdvancedFilterBoolean, ObjectsAdvancedFilterMode, SortType, State };
1086
+ /**
1087
+ * Logic-only base of an object media tab (MOB-1801), from Muzeum Podlasia's
1088
+ * `components/tabs`: the `item` and `formFeatureTypes` inputs and `models` —
1089
+ * the object's `additionalImages` of the given form feature types, sorted by
1090
+ * `position`. The tab keeps its template, styles and `host`.
1091
+ *
1092
+ * `mediaTabFilterModels(models)` is a hook (identity by default) that a tab
1093
+ * overrides to narrow the list further.
1094
+ *
1095
+ * ```ts
1096
+ * export class OtherFilesTabComponent extends ObjectMediaTabBaseComponent<IAnimationObject> {}
1097
+ * ```
1098
+ */
1099
+ declare abstract class ObjectMediaTabBaseComponent<TMedia extends {
1100
+ id: number | string;
1101
+ }> {
1102
+ protected readonly mediaTabFileUrl: FileUrlService;
1103
+ protected readonly mediaTabTranslate: TranslateService;
1104
+ /** The object whose media the tab shows. */
1105
+ readonly item: _angular_core.InputSignal<MsObject>;
1106
+ /** The form feature types (`FormFeatureType`) the tab shows. */
1107
+ readonly formFeatureTypes: _angular_core.InputSignal<FormFeatureType[]>;
1108
+ /** The object's media of `formFeatureTypes`, sorted by `position`, then through `mediaTabFilterModels`. */
1109
+ readonly models: Signal<TMedia[]>;
1110
+ /** Narrows the sorted list. Identity by default. */
1111
+ protected mediaTabFilterModels(models: TMedia[]): TMedia[];
1112
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectMediaTabBaseComponent<any>, never>;
1113
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectMediaTabBaseComponent<any>, never, never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; "formFeatureTypes": { "alias": "formFeatureTypes"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1114
+ }
1115
+
1116
+ /**
1117
+ * Logic-only base of the media tabs' download button, from Muzeum Podlasia's
1118
+ * `download-button`: `download()` fetches `url`, saves the blob as `filename`
1119
+ * through a temporary `<a download>` and revokes the object URL. It runs only
1120
+ * from a click, so never on the server. The button keeps its template.
1121
+ *
1122
+ * ```ts
1123
+ * export class DownloadButtonComponent extends ObjectDownloadButtonBaseComponent {}
1124
+ * ```
1125
+ */
1126
+ declare abstract class ObjectDownloadButtonBaseComponent {
1127
+ private readonly downloadButtonDocument;
1128
+ /** The file URL. An empty URL does nothing. */
1129
+ readonly url: _angular_core.InputSignal<string>;
1130
+ /** The name the file is saved under. */
1131
+ readonly filename: _angular_core.InputSignal<string>;
1132
+ /** `true` while the file is being fetched. */
1133
+ readonly isDownloading: _angular_core.WritableSignal<boolean>;
1134
+ download(): Promise<void>;
1135
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectDownloadButtonBaseComponent, never>;
1136
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectDownloadButtonBaseComponent, never, never, { "url": { "alias": "url"; "required": true; "isSignal": true; }; "filename": { "alias": "filename"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1137
+ }
1138
+
1139
+ /** The `archeoMap` field of an object card (coordinates as strings). */
1140
+ interface IObjectArcheoMap {
1141
+ latitude: string;
1142
+ longitude: string;
1143
+ }
1144
+ /**
1145
+ * Logic-only base of the object map tab, from Muzeum Podlasia's `map-tab`:
1146
+ * the object's `archeoMap` coordinates. The tab keeps its template (the map
1147
+ * component and its zoom).
1148
+ *
1149
+ * ```ts
1150
+ * export class MapTabComponent extends ObjectMapTabBaseComponent {}
1151
+ * ```
1152
+ */
1153
+ declare abstract class ObjectMapTabBaseComponent {
1154
+ /** The object whose `archeoMap` the tab shows. */
1155
+ readonly item: _angular_core.InputSignal<MsObject>;
1156
+ private readonly mapTabArcheoMap;
1157
+ /** Truthy (the longitude string) when both coordinates are set. */
1158
+ readonly hasCoordinates: _angular_core.Signal<string>;
1159
+ /** `parseFloat(latitude)`, `0` when missing. */
1160
+ readonly latitude: _angular_core.Signal<number>;
1161
+ /** `parseFloat(longitude)`, `0` when missing. */
1162
+ readonly longitude: _angular_core.Signal<number>;
1163
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectMapTabBaseComponent, never>;
1164
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectMapTabBaseComponent, never, never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
1165
+ }
1166
+
1167
+ /**
1168
+ * Logic-only base of an object tab with native `<audio>` players (MOB-1801):
1169
+ * the file URL, title, aria label and download file name of each recording,
1170
+ * shared by `ObjectAudioTabBaseComponent` and
1171
+ * `ObjectAudioDescriptionTabBaseComponent`. The fallback label comes from
1172
+ * `audioMediaTabLabelKey`, read lazily, so a subclass overrides it with a
1173
+ * field.
1174
+ *
1175
+ * ```ts
1176
+ * protected override readonly audioMediaTabLabelKey = 'DETAILS_PAGE.tabs.audio';
1177
+ * ```
1178
+ */
1179
+ declare abstract class ObjectAudioMediaTabBaseComponent<TMedia extends IAnimationObject = IAnimationObject> extends ObjectMediaTabBaseComponent<TMedia> {
1180
+ /** Translation key of the player label; read lazily, so a subclass can override it. */
1181
+ protected readonly audioMediaTabLabelKey: string;
1182
+ /** The recording's file URL (`noCache`). */
1183
+ getAudioUrl(audio: TMedia): string;
1184
+ /** Alt text in the current language, then the description, then the label key. */
1185
+ getAudioTitle(audio: TMedia): string;
1186
+ /** `<label>: <title>`. */
1187
+ getAudioAriaLabel(audio: TMedia): string;
1188
+ /** The object title, alt text, description or `audio`, plus the extension (`mp3` by default). */
1189
+ getDownloadFilename(audio: TMedia): string;
1190
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectAudioMediaTabBaseComponent<any>, never>;
1191
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectAudioMediaTabBaseComponent<any>, never, never, {}, {}, never, never, true, never>;
1192
+ }
1193
+
1194
+ /** Options of `ObjectAudioTabBaseComponent`, passed to `super(options)`. */
1195
+ interface IObjectAudioTabOptions {
1196
+ /**
1197
+ * Keep only recordings with a file (`filePath`), so the "Audio 1, 2…"
1198
+ * numbering counts what is shown (MOB-1872 review). Default `true`
1199
+ * (Muzeum Podlasia); `false` keeps the unfiltered list (sztuki-2, template).
1200
+ */
1201
+ playableOnly?: boolean;
1202
+ }
1203
+ /**
1204
+ * Logic-only base of the object audio tab (MOB-1801). Muzeum Podlasia renders
1205
+ * the article player (`app-widget-audio` on `WidgetAudioBaseComponent`,
1206
+ * MOB-1805 / MOB-1872) through `widgetItem` and `trackName`; sztuki-2 and the
1207
+ * template render a native `<audio>` with a download button through
1208
+ * `getAudioUrl`, `getAudioTitle`, `getAudioAriaLabel` and
1209
+ * `getDownloadFilename` (`ObjectAudioMediaTabBaseComponent`, label
1210
+ * `DETAILS_PAGE.tabs.audio`), with `playableOnly: false`. The tab keeps its
1211
+ * template, styles and `host`.
1212
+ *
1213
+ * ```ts
1214
+ * export class AudioTabComponent extends ObjectAudioTabBaseComponent {
1215
+ * constructor() {
1216
+ * super(); // sztuki-2 / template: super({ playableOnly: false })
1217
+ * }
1218
+ * }
1219
+ * ```
1220
+ */
1221
+ declare abstract class ObjectAudioTabBaseComponent extends ObjectAudioMediaTabBaseComponent {
1222
+ protected readonly audioMediaTabLabelKey: string;
1223
+ private readonly audioTabOptions;
1224
+ protected constructor(options?: IObjectAudioTabOptions);
1225
+ /** With `playableOnly` (default) only recordings with a file. */
1226
+ protected mediaTabFilterModels(models: IAnimationObject[]): IAnimationObject[];
1227
+ /**
1228
+ * The recording in the audio widget's shape: the file in `file`, the
1229
+ * heading from the description (without one — a player without a heading,
1230
+ * as in the mock-up).
1231
+ */
1232
+ widgetItem(audio: IAnimationObject): WidgetAudioItem;
1233
+ /**
1234
+ * The recording's name for screen readers (the player's button and
1235
+ * slider): the alt text in the current language or the description;
1236
+ * several recordings without names — "Audio 1", "Audio 2"… (MOB-1872
1237
+ * review); a single one — `null`.
1238
+ */
1239
+ trackName(audio: IAnimationObject, index: number): string | null;
1240
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectAudioTabBaseComponent, never>;
1241
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectAudioTabBaseComponent, never, never, {}, {}, never, never, true, never>;
1242
+ }
1243
+
1244
+ /**
1245
+ * Logic-only base of the object audio description tab (MOB-1801), from Muzeum
1246
+ * Podlasia's `audio-description-tab.component.ts` (sztuki-2 and the template
1247
+ * differ by one template class only): the main image above the players and
1248
+ * the names of each recording (`ObjectAudioMediaTabBaseComponent`, label
1249
+ * `OBJECTS.filters.multimedia.audio`). The tab keeps its template, styles and `host`.
1250
+ *
1251
+ * ```ts
1252
+ * export class AudioDescriptionTabComponent extends ObjectAudioDescriptionTabBaseComponent {}
1253
+ * ```
1254
+ */
1255
+ declare abstract class ObjectAudioDescriptionTabBaseComponent extends ObjectAudioMediaTabBaseComponent {
1256
+ /** The object's main image (`big` = full resolution without cache); `null` without one or for the no-image placeholder. */
1257
+ readonly mainImageUrl: Signal<string | null>;
1258
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectAudioDescriptionTabBaseComponent, never>;
1259
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectAudioDescriptionTabBaseComponent, never, never, {}, {}, never, never, true, never>;
1260
+ }
1261
+
1262
+ /**
1263
+ * Logic-only base of the object documents tab (MOB-1801), from Muzeum
1264
+ * Podlasia's `documents-tab.component.ts` (sztuki-2 and the template differ by
1265
+ * one template class only): each document's URL, display name and download
1266
+ * file name. The tab keeps its template, styles and `host`.
1267
+ *
1268
+ * ```ts
1269
+ * export class DocumentsTabComponent extends ObjectDocumentsTabBaseComponent {}
1270
+ * ```
1271
+ */
1272
+ declare abstract class ObjectDocumentsTabBaseComponent extends ObjectMediaTabBaseComponent<IAnimationObject> {
1273
+ /** The document's file URL (`noCache`). */
1274
+ getDocumentUrl(doc: IAnimationObject): string;
1275
+ /** Alt text in the current language, then the description, then the upper-case extension (`PDF` by default). */
1276
+ getDocumentDisplayName(doc: IAnimationObject): string;
1277
+ /** Alt text in the current language, description or `document`, plus the extension (`pdf` by default). */
1278
+ getDocumentFileName(doc: IAnimationObject): string;
1279
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectDocumentsTabBaseComponent, never>;
1280
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectDocumentsTabBaseComponent, never, never, {}, {}, never, never, true, never>;
1281
+ }
1282
+
1283
+ /**
1284
+ * Logic-only base of an object tab with one video at a time and a dropdown
1285
+ * (MOB-1801), shared by `ObjectAnimationTabBaseComponent` and
1286
+ * `ObjectVideoTabBaseComponent`, 1:1 from Muzeum Podlasia's animation and
1287
+ * video tabs: the selector state, the player reset on a change and the
1288
+ * player helpers. The translation keys and the download fallback name are
1289
+ * abstract fields, read lazily.
1290
+ */
1291
+ declare abstract class ObjectVideoMediaTabBaseComponent<TMedia extends IAnimationObject = IAnimationObject> extends ObjectMediaTabBaseComponent<TMedia> {
1292
+ /** Translation key of a dropdown option without a name (`<label> <n>`). */
1293
+ protected abstract readonly videoMediaTabOptionLabelKey: string;
1294
+ /** Translation key of the player title and aria label. */
1295
+ protected abstract readonly videoMediaTabTitleKey: string;
1296
+ /** Download file name without the object title, alt text and description. */
1297
+ protected abstract readonly videoMediaTabDownloadName: string;
1298
+ /** The template's native `<video #videoPlayer>`, if it has one. */
1299
+ readonly videoPlayer: Signal<ElementRef<HTMLVideoElement>>;
1300
+ private readonly videoMediaTabPicker;
1301
+ /** The chosen video's key; the first video of each new object. */
1302
+ readonly selectedVideoKey: WritableSignal<string | null>;
1303
+ /** Dropdown options: alt text, description or `<label> <n>`. */
1304
+ readonly videoOptions: Signal<IKeyValue[]>;
1305
+ /** The chosen video, the first one by default. */
1306
+ readonly selectedVideo: Signal<TMedia | null>;
1307
+ /** The dropdown option of `selectedVideo`. */
1308
+ readonly selectedVideoOption: Signal<IKeyValue>;
1309
+ /** Selects a video; a native `#videoPlayer` is paused and rewound. */
1310
+ videoChange(key: string): void;
1311
+ /** The video's file URL (`noCache`). */
1312
+ getVideoUrl(video: TMedia): string;
1313
+ /** Alt text in the current language, then the description, then the title key. */
1314
+ getVideoTitle(video: TMedia): string;
1315
+ /** `<title key>: <title>`. */
1316
+ getVideoAriaLabel(video: TMedia): string;
1317
+ /** The object title, alt text, description or the fallback name, plus the extension (`mp4` by default). */
1318
+ getDownloadFilename(video: TMedia): string;
1319
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectVideoMediaTabBaseComponent<any>, never>;
1320
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectVideoMediaTabBaseComponent<any>, never, never, {}, {}, never, never, true, never>;
1321
+ }
1322
+
1323
+ /**
1324
+ * Logic-only base of the object animation tab (MOB-1801), 1:1 from Muzeum
1325
+ * Podlasia (sztuki-2 and the template are identical): options without a name
1326
+ * are `OBJECTS.filters.multimedia.animation <n>`, the player is titled with
1327
+ * `OBJECTS.filters.multimedia.video`, the download falls back to
1328
+ * `animation.mp4`, and `videoChange` pauses and rewinds `#videoPlayer`. The
1329
+ * tab keeps its template, styles and `host`.
1330
+ *
1331
+ * ```ts
1332
+ * export class AnimationTabComponent extends ObjectAnimationTabBaseComponent {}
1333
+ * ```
1334
+ */
1335
+ declare abstract class ObjectAnimationTabBaseComponent extends ObjectVideoMediaTabBaseComponent {
1336
+ protected readonly videoMediaTabOptionLabelKey: string;
1337
+ protected readonly videoMediaTabTitleKey: string;
1338
+ protected readonly videoMediaTabDownloadName: string;
1339
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectAnimationTabBaseComponent, never>;
1340
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectAnimationTabBaseComponent, never, never, {}, {}, never, never, true, never>;
1341
+ }
1342
+
1343
+ /**
1344
+ * Logic-only base of the object video tab (MOB-1801). Options, title and
1345
+ * aria label use `DETAILS_PAGE.tabs.video`. Muzeum Podlasia renders the app's
1346
+ * video player (a new source resets it — a still frame with a play button,
1347
+ * no playback), so its template has no `#videoPlayer` and `videoChange` only
1348
+ * selects the video. Sztuki-2 and the template render a native
1349
+ * `<video #videoPlayer>`, which `videoChange` pauses and rewinds, and a
1350
+ * download button named by `getDownloadFilename` (fallback `video.mp4`). The
1351
+ * tab keeps its template, styles and `host`.
1352
+ *
1353
+ * ```ts
1354
+ * export class VideoTabComponent extends ObjectVideoTabBaseComponent {}
1355
+ * ```
1356
+ */
1357
+ declare abstract class ObjectVideoTabBaseComponent extends ObjectVideoMediaTabBaseComponent {
1358
+ protected readonly videoMediaTabOptionLabelKey: string;
1359
+ protected readonly videoMediaTabTitleKey: string;
1360
+ protected readonly videoMediaTabDownloadName: string;
1361
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectVideoTabBaseComponent, never>;
1362
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectVideoTabBaseComponent, never, never, {}, {}, never, never, true, never>;
1363
+ }
1364
+
1365
+ /**
1366
+ * Logic-only base of the object virtual walk tab (MOB-1801), 1:1 from Muzeum
1367
+ * Podlasia (sztuki-2 and the template are identical): the walk dropdown, the
1368
+ * trusted iframe source and the fullscreen toggle of `#walkContainer`. The
1369
+ * `fullscreenchange` listener is registered in the browser only, through the
1370
+ * injected `DOCUMENT`, and removed on destroy. The tab keeps its template,
1371
+ * styles and `host`.
1372
+ *
1373
+ * ```ts
1374
+ * export class VirtualWalkTabComponent extends ObjectVirtualWalkTabBaseComponent {
1375
+ * constructor() {
1376
+ * super();
1377
+ * }
1378
+ * }
1379
+ * ```
1380
+ */
1381
+ declare abstract class ObjectVirtualWalkTabBaseComponent extends ObjectMediaTabBaseComponent<IModel3DObject> {
1382
+ private readonly virtualWalkTabSanitizer;
1383
+ private readonly virtualWalkTabDocument;
1384
+ /** The template's `#iframeContainer`. */
1385
+ readonly iframeContainer: Signal<ElementRef<any>>;
1386
+ /** The template's `#walkContainer`, the element shown fullscreen. */
1387
+ readonly walkContainer: Signal<ElementRef<any>>;
1388
+ private readonly virtualWalkTabPicker;
1389
+ /** The chosen walk's key; the first walk of each new object. */
1390
+ readonly selectedWalkKey: WritableSignal<string | null>;
1391
+ /** Dropdown options: alt text, description or `OBJECTS.filters.multimedia.virtualWalk <n>`. */
1392
+ readonly walkOptions: Signal<IKeyValue[]>;
1393
+ /** The chosen walk, the first one by default. */
1394
+ readonly selectedWalk: Signal<IModel3DObject | null>;
1395
+ /** The dropdown option of `selectedWalk`. */
1396
+ readonly selectedWalkOption: Signal<IKeyValue>;
1397
+ /** The selected walk's `iframeSource`, trusted; `null` without one. */
1398
+ readonly safeIframeUrl: Signal<SafeResourceUrl | null>;
1399
+ /** Whether the document is in fullscreen (follows `fullscreenchange`, e.g. Escape). */
1400
+ readonly isFullscreen: WritableSignal<boolean>;
1401
+ protected constructor();
1402
+ /** Selects a walk. */
1403
+ walkChange(key: string): void;
1404
+ /** Alt text in the current language, then the description, then `OBJECTS.filters.multimedia.virtualWalk`. */
1405
+ getWalkTitle(walk: IModel3DObject): string;
1406
+ /** Shows `#walkContainer` fullscreen, or leaves fullscreen. */
1407
+ toggleFullscreen(): void;
1408
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectVirtualWalkTabBaseComponent, never>;
1409
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectVirtualWalkTabBaseComponent, never, never, {}, {}, never, never, true, never>;
1410
+ }
1411
+
1412
+ /** The `online-3d-viewer` `Viewer` calls the 3D tab makes. */
1413
+ interface IObjectModel3dViewer {
1414
+ SetUpVector(direction: unknown, animate: boolean): void;
1415
+ GetBoundingSphere(filter: (meshUserData: unknown) => boolean): unknown;
1416
+ AdjustClippingPlanesToSphere(sphere: unknown): void;
1417
+ FitSphereToWindow(sphere: unknown, animate: boolean): void;
1418
+ SetEdgeSettings(settings: unknown): void;
1419
+ }
1420
+ /** The `online-3d-viewer` `EmbeddedViewer` calls the 3D tab makes. */
1421
+ interface IObjectModel3dEmbeddedViewer {
1422
+ LoadModelFromUrlList(urls: string[]): void;
1423
+ Destroy(): void;
1424
+ GetViewer(): IObjectModel3dViewer;
1425
+ }
1426
+ /**
1427
+ * The part of the `online-3d-viewer` module the 3D tab uses. The framework
1428
+ * does not depend on the library: the museum returns its own
1429
+ * `import('online-3d-viewer')` from `loadModel3dLibrary()`, which is
1430
+ * assignable without a cast.
1431
+ *
1432
+ * The colour and edge slots of the `EmbeddedViewer` parameters and the
1433
+ * `EdgeSettings` colour are `any`: constructor parameters are checked
1434
+ * contravariantly (`strictFunctionTypes`), so anything narrower would have to
1435
+ * restate the library's `RGBAColor`, `RGBColor` and `EdgeSettings` classes
1436
+ * member by member. The values come from the same module's constructors.
1437
+ */
1438
+ interface IObjectModel3dViewerLibrary {
1439
+ EmbeddedViewer: new (parentElement: HTMLElement, parameters: {
1440
+ backgroundColor: any;
1441
+ defaultColor: any;
1442
+ edgeSettings: any;
1443
+ onModelLoaded: () => void;
1444
+ }) => IObjectModel3dEmbeddedViewer;
1445
+ RGBAColor: new (r: number, g: number, b: number, a: number) => unknown;
1446
+ RGBColor: new (r: number, g: number, b: number) => unknown;
1447
+ EdgeSettings: new (showEdges: boolean, edgeColor: any, edgeThreshold: number) => unknown;
1448
+ Direction: {
1449
+ Y: unknown;
1450
+ };
1451
+ }
1452
+ /** Options of `ObjectModel3dTabBaseComponent`, passed to `super(options)`. */
1453
+ interface IObjectModel3dTabOptions {
1454
+ /**
1455
+ * Keep only models with at least one file to load (`files[].filePath`) —
1456
+ * the same condition as the tab counter, so the default model does not end
1457
+ * in "No files found" (MOB-1872 review). Default `true` (Muzeum Podlasia);
1458
+ * `false` keeps the unfiltered list (sztuki-2, template).
1459
+ */
1460
+ loadableOnly?: boolean;
1461
+ }
1462
+ /**
1463
+ * Logic-only base of the object 3D model tab (MOB-1801), 1:1 from Muzeum
1464
+ * Podlasia: the model list, the lazily loaded `online-3d-viewer`, the model
1465
+ * switch, the camera reset, the wireframe and the fullscreen toggle. The tab
1466
+ * keeps its template, styles and `host`, and returns its own
1467
+ * `import('online-3d-viewer')` from `loadModel3dLibrary()` — the framework does
1468
+ * not depend on the library, and the viewer is never loaded on the server.
1469
+ * Podlasie's model file URI panel (MOB-981) stays in Podlasie and follows
1470
+ * `selectedModel`.
1471
+ *
1472
+ * ```ts
1473
+ * export class Model3dTabComponent extends ObjectModel3dTabBaseComponent {
1474
+ * constructor() {
1475
+ * super(); // sztuki-2 / template: super({ loadableOnly: false })
1476
+ * }
1477
+ *
1478
+ * protected loadModel3dLibrary() {
1479
+ * return import('online-3d-viewer');
1480
+ * }
1481
+ * }
1482
+ * ```
1483
+ */
1484
+ declare abstract class ObjectModel3dTabBaseComponent extends ObjectMediaTabBaseComponent<IModel3DObject> {
1485
+ /** The template's `#viewer3d`, the viewer's canvas container. */
1486
+ readonly viewer3d: _angular_core.Signal<ElementRef<any>>;
1487
+ /** The chosen model's index, bound with `ngModel` (may arrive as a string). */
1488
+ selectedModelIndex: number;
1489
+ /** The chosen model's index as a signal, next to `selectedModelIndex` (`onModelChange`). */
1490
+ readonly selectedModel: WritableSignal<number>;
1491
+ /** A model is loading. */
1492
+ readonly isLoading: WritableSignal<boolean>;
1493
+ /** The load error, `null` without one. */
1494
+ readonly error: WritableSignal<string | null>;
1495
+ /** The edges are shown. */
1496
+ readonly isWireframe: WritableSignal<boolean>;
1497
+ /** Whether the document is in fullscreen (follows `fullscreenchange`, e.g. Escape). */
1498
+ readonly isFullscreen: WritableSignal<boolean>;
1499
+ private readonly model3dTabOptions;
1500
+ private readonly model3dTabDocument;
1501
+ private readonly model3dTabPlatformId;
1502
+ private readonly model3dTabTimeouts;
1503
+ /**
1504
+ * `online-3d-viewer` (+ `three`, ~1.1 MB) is loaded only on the first
1505
+ * init — a static import put the library in the chunk of the whole objects
1506
+ * module, loaded on the `/obiekty` list and every card, also without a 3D
1507
+ * model (Lighthouse, MOB-1850, MOB-1895). One load is shared between
1508
+ * concurrent calls. Created on first use.
1509
+ */
1510
+ private model3dTabLibraryLoader;
1511
+ /** The number of the latest init — an older call after `await` does not overwrite a newer one. */
1512
+ private model3dTabInitToken;
1513
+ private model3dTabViewer;
1514
+ protected constructor(options?: IObjectModel3dTabOptions);
1515
+ /** The museum's `import('online-3d-viewer')`. Called once, in the browser, on the first init. */
1516
+ protected abstract loadModel3dLibrary(): Promise<IObjectModel3dViewerLibrary>;
1517
+ /** With `loadableOnly` (default) only models with a file to load. */
1518
+ protected mediaTabFilterModels(models: IModel3DObject[]): IModel3DObject[];
1519
+ /** Follows the `selectedModelIndex` dropdown: sets `selectedModel` and loads that model. */
1520
+ onModelChange(): void;
1521
+ /** Fits the model to the window with the Y axis up. A no-op before the library is loaded. */
1522
+ resetCamera(): void;
1523
+ /** Shows or hides the edges. A no-op before the library is loaded. */
1524
+ toggleWireframe(): void;
1525
+ /** Shows the parent of `#viewer3d` fullscreen, or leaves fullscreen. */
1526
+ toggleFullscreen(): void;
1527
+ private model3dTabLibrary;
1528
+ private model3dTabInitViewer;
1529
+ private model3dTabLoadModel;
1530
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectModel3dTabBaseComponent, never>;
1531
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectModel3dTabBaseComponent, never, never, {}, {}, never, never, true, never>;
1532
+ }
1533
+
1534
+ /**
1535
+ * Logic-only base of the sztuki-2 / template `media-sections`: an object's
1536
+ * multimedia as landing-page sections (Figma), each with a heading like
1537
+ * „Galeria zdjęć”; a section without data is not rendered. Order: HD photos →
1538
+ * 3D model → animation → video → audio → virtual walk → audio description →
1539
+ * map → other files. The component keeps its template, heading class and
1540
+ * tab imports.
1541
+ *
1542
+ * ```ts
1543
+ * export class MediaSectionsComponent extends ObjectMediaSectionsBaseComponent {
1544
+ * readonly sectionHeadingClass = '…';
1545
+ * }
1546
+ * ```
1547
+ */
1548
+ declare abstract class ObjectMediaSectionsBaseComponent {
1549
+ private readonly mediaSectionsFileUrl;
1550
+ private readonly mediaSectionsMedia;
1551
+ /** The object whose multimedia the sections show. */
1552
+ readonly item: _angular_core.InputSignal<MsObject>;
1553
+ /**
1554
+ * Multimedia already shown in the object card's gallery frame (the video /
1555
+ * 3D tabs, MOB-1961) — not repeated in the sections. Default `[]`.
1556
+ */
1557
+ readonly exclude: _angular_core.InputSignal<readonly ("video" | "model3d")[]>;
1558
+ /** `[IMAGES_HD]` */
1559
+ readonly imagesHDTypes: FormFeatureType[];
1560
+ /** `[MODEL_3D]` */
1561
+ readonly model3DTypes: FormFeatureType[];
1562
+ /** `[ANIMATION]` */
1563
+ readonly animationTypes: FormFeatureType[];
1564
+ /** `[AUDIO_DESKRYPCJA]` */
1565
+ readonly adTypes: FormFeatureType[];
1566
+ /** `[VIRTUAL_WALK]` */
1567
+ readonly virtualWalkTypes: FormFeatureType[];
1568
+ /** `[VIDEO]` */
1569
+ readonly videoTypes: FormFeatureType[];
1570
+ /** `[AUDIO]` */
1571
+ readonly audioTypes: FormFeatureType[];
1572
+ /** `[OTHER]` */
1573
+ readonly otherTypes: FormFeatureType[];
1574
+ /** HD photo thumbnails (without the main image) — fullscreen on click. */
1575
+ readonly hdThumbnailUrls: _angular_core.Signal<string[]>;
1576
+ /** HD photo gallery items (without the main image) for the fullscreen. */
1577
+ readonly hdGalleryItems: _angular_core.Signal<_smartsoft001_mobilems_objects_shell_angular.IObjectGalleryItem[]>;
1578
+ /** Whether the HD fullscreen gallery is open. */
1579
+ readonly hdFullscreenOpen: _angular_core.WritableSignal<boolean>;
1580
+ /** The photo the HD fullscreen gallery shows. */
1581
+ readonly hdFullscreenIndex: _angular_core.WritableSignal<number>;
1582
+ /** Opens the HD fullscreen gallery at the clicked thumbnail. */
1583
+ openHdFullscreen(index: number): void;
1584
+ /** The object title without HTML tags (alt text). */
1585
+ readonly altTitle: _angular_core.Signal<string>;
1586
+ /** HD photos section: any HD thumbnail. */
1587
+ readonly showPhotosHD: _angular_core.Signal<boolean>;
1588
+ /** 3D model section: a real file URL, unless excluded. */
1589
+ readonly showModel3D: _angular_core.Signal<boolean>;
1590
+ /** Animation section: a real file URL. */
1591
+ readonly showAnimation: _angular_core.Signal<boolean>;
1592
+ /**
1593
+ * Video section: a file with a `filePath` (`FileUrlService` gives a
1594
+ * placeholder for non-image extensions), unless excluded.
1595
+ */
1596
+ readonly showVideo: _angular_core.Signal<boolean>;
1597
+ /** Audio section: a file with a `filePath`. */
1598
+ readonly showAudio: _angular_core.Signal<boolean>;
1599
+ /** Virtual walk section: a walk with an `iframeSource` (not a file URL). */
1600
+ readonly showVirtualWalk: _angular_core.Signal<boolean>;
1601
+ /** The number of audio description files with a real URL. */
1602
+ readonly audioDescriptionCount: _angular_core.Signal<number>;
1603
+ /** Audio description section: any audio description. */
1604
+ readonly showAudioDescription: _angular_core.Signal<boolean>;
1605
+ /** Map section: both `archeoMap` coordinates set. */
1606
+ readonly showMap: _angular_core.Signal<boolean>;
1607
+ /** Other files section (PDF, etc.): a real file URL. */
1608
+ readonly showOther: _angular_core.Signal<boolean>;
1609
+ /** Whether any section is visible. */
1610
+ readonly hasVisibleSections: _angular_core.Signal<boolean>;
1611
+ /**
1612
+ * Whether an additional file of the types has a URL from `FileUrlService`
1613
+ * that is not the no-image placeholder. Reads `item()`, so the calling
1614
+ * `computed` tracks it.
1615
+ */
1616
+ private mediaSectionsHasContent;
1617
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectMediaSectionsBaseComponent, never>;
1618
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectMediaSectionsBaseComponent, never, never, { "item": { "alias": "item"; "required": true; "isSignal": true; }; "exclude": { "alias": "exclude"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1619
+ }
1620
+
1621
+ export { ASK_ABOUT_OBJECT_KEYS, AdvancedFilterType, ComponentsModule, FiltersComponent, FormFeatureType, ListComponent, MULTIMEDIA_DICTIONARY, OBJECTS_CATALOG_DEFAULTS, OBJECTS_CATALOG_SEO, OBJECTS_FILTER_SINGLE_VALUE_LABELS, OBJECTS_LIMIT_OPTIONS, OBJECTS_NEW_TYPE_SORT_OPTIONS, OBJECTS_SHARE_COPIED_TIMEOUT, OBJECTS_SORT_OPTIONS, OBJECTS_THEME_TAGS_FILTER_KEY, ObjectAnimationTabBaseComponent, ObjectAudioDescriptionTabBaseComponent, ObjectAudioMediaTabBaseComponent, ObjectAudioTabBaseComponent, ObjectDetailsBaseComponent, ObjectDocumentsTabBaseComponent, ObjectDownloadButtonBaseComponent, ObjectMapTabBaseComponent, ObjectMediaSectionsBaseComponent, ObjectMediaService, ObjectMediaTabBaseComponent, ObjectModel3dTabBaseComponent, ObjectVideoMediaTabBaseComponent, ObjectVideoTabBaseComponent, ObjectVirtualWalkTabBaseComponent, ObjectsAdvancedFiltersBaseComponent, ObjectsCatalogBaseComponent, ObjectsDataService, ObjectsFacade, ObjectsFiltersBarBaseComponent, ObjectsItemComponent, ObjectsListComponent, ObjectsModule, ObjectsSearchPanelBaseComponent, ObjectsService, ObjectsShareResultsBaseComponent, ObjectsSharedModule, SERVICES, askAboutObjectHref, bibliography, buildObjectsResultsUrl, descriptionHtml, getObjectsState, getReducer, initialState, inventoryValues, objectTitle, objectsSortFromKey, objectsSortKey, relatedArticles, tagValues };
1622
+ export type { ArchaeologicalSegregation, AskTranslate, FileType, IAnimationObject, IAskAboutObject, IKeyValue, IModel3DObject, IMultimediaDictionaryItem, IObjectArcheoMap, IObjectAudioTabOptions, IObjectBibliographyEntry, IObjectCollectionSummary, IObjectDetailLink, IObjectDetailSource, IObjectDetailsOptions, IObjectGalleryItem, IObjectModel3dEmbeddedViewer, IObjectModel3dTabOptions, IObjectModel3dViewer, IObjectModel3dViewerLibrary, IObjectRelated, IObjectsAdvancedFilterField, IObjectsAdvancedFilterWrite, IObjectsAdvancedFiltersOptions, IObjectsCatalogLoadMore, IObjectsCatalogOptions, IObjectsCatalogSeo, IObjectsDateRange, IObjectsFilterWrite, IObjectsFiltersBarOptions, ISpecificObject, ObjectDetailValue, ObjectsAdvancedFilterBoolean, ObjectsAdvancedFilterMode, SortType, State };