@smartsoft001-mobilems/objects-shell-angular 2.128.0 → 2.129.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.128.0",
3
+ "version": "2.129.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
- import * as i0 from '@angular/core';
1
+ import * as _angular_core from '@angular/core';
2
2
  import { TemplateRef, ModuleWithProviders, Signal, AfterViewInit, WritableSignal, OnInit, ResourceRef } from '@angular/core';
3
3
  import * as _smartsoft001_crud_shell_angular from '@smartsoft001/crud-shell-angular';
4
- import { ICrudModuleOptionsWithoutRoutng, CrudFacade, State as State$1, CrudListPageBaseComponent, CrudItemPageBaseComponent, CrudService, ICrudFilter } from '@smartsoft001/crud-shell-angular';
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
- import * as i1$1 from '@smartsoft001-mobilems/angular';
7
- import { FiltersBaseComponent, CrudBaseService, SeoService, TranslationService, IDictionaryPage, ICatalogOptions, ICatalog, ISeoMetadata, INamedEntrySource, INamedEntryParts } from '@smartsoft001-mobilems/angular';
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';
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';
@@ -14,48 +14,49 @@ import * as _ngrx_store from '@ngrx/store';
14
14
  import { Action } from '@ngrx/store';
15
15
  import { MsFile } from '@smartsoft001-mobilems/models';
16
16
  import { ListMode } from '@smartsoft001/angular';
17
+ import * as rxjs from 'rxjs';
17
18
  import { Observable } from 'rxjs';
18
19
 
19
20
  declare class FiltersComponent extends FiltersBaseComponent<MsObject> {
20
- static ɵfac: i0.ɵɵFactoryDeclaration<FiltersComponent, never>;
21
- static ɵcmp: i0.ɵɵComponentDeclaration<FiltersComponent, "smart-mobilems-objects-filters", never, {}, {}, never, never, true, never>;
21
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FiltersComponent, never>;
22
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FiltersComponent, "smart-mobilems-objects-filters", never, {}, {}, never, never, true, never>;
22
23
  }
23
24
 
24
25
  declare class ListComponent {
25
26
  private facade;
26
- list: i0.Signal<dist_packages_objects_domain_src.MsObject[]>;
27
- loading: i0.Signal<boolean>;
28
- itemTpl: i0.Signal<TemplateRef<any>>;
29
- loadingTpl: i0.Signal<TemplateRef<any>>;
30
- static ɵfac: i0.ɵɵFactoryDeclaration<ListComponent, never>;
31
- static ɵcmp: i0.ɵɵComponentDeclaration<ListComponent, "smart-mobilems-objects-list", never, {}, {}, ["itemTpl", "loadingTpl"], never, true, never>;
27
+ list: _angular_core.Signal<dist_packages_objects_domain_src.MsObject[]>;
28
+ loading: _angular_core.Signal<boolean>;
29
+ itemTpl: _angular_core.Signal<TemplateRef<any>>;
30
+ loadingTpl: _angular_core.Signal<TemplateRef<any>>;
31
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ListComponent, never>;
32
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ListComponent, "smart-mobilems-objects-list", never, {}, {}, ["itemTpl", "loadingTpl"], never, true, never>;
32
33
  }
33
34
 
34
35
  declare class ComponentsModule {
35
- static ɵfac: i0.ɵɵFactoryDeclaration<ComponentsModule, never>;
36
- static ɵmod: i0.ɵɵNgModuleDeclaration<ComponentsModule, never, [typeof i1.CommonModule, typeof FiltersComponent, typeof ListComponent], [typeof FiltersComponent, typeof ListComponent]>;
37
- static ɵinj: i0.ɵɵInjectorDeclaration<ComponentsModule>;
36
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ComponentsModule, never>;
37
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<ComponentsModule, never, [typeof i1.CommonModule, typeof FiltersComponent, typeof ListComponent], [typeof FiltersComponent, typeof ListComponent]>;
38
+ static ɵinj: _angular_core.ɵɵInjectorDeclaration<ComponentsModule>;
38
39
  }
39
40
 
40
41
  declare class ObjectsModule {
41
42
  static forFeature<T extends IEntity<string>>(options: ICrudModuleOptionsWithoutRoutng<T>): ModuleWithProviders<ObjectsModule>;
42
- static ɵfac: i0.ɵɵFactoryDeclaration<ObjectsModule, never>;
43
- static ɵmod: i0.ɵɵNgModuleDeclaration<ObjectsModule, never, [typeof i1$1.SharedModule, typeof ComponentsModule, typeof _smartsoft001_crud_shell_angular.CrudCoreModule], [typeof ComponentsModule]>;
44
- static ɵinj: i0.ɵɵInjectorDeclaration<ObjectsModule>;
43
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectsModule, never>;
44
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<ObjectsModule, never, [typeof _smartsoft001_mobilems_angular.SharedModule, typeof ComponentsModule, typeof _smartsoft001_crud_shell_angular.CrudCoreModule], [typeof ComponentsModule]>;
45
+ static ɵinj: _angular_core.ɵɵInjectorDeclaration<ObjectsModule>;
45
46
  }
46
47
 
47
48
  declare class ObjectsSharedModule {
48
49
  static forFeature<T extends IEntity<string>>(options: ICrudModuleOptionsWithoutRoutng<T>): ModuleWithProviders<ObjectsSharedModule>;
49
- static ɵfac: i0.ɵɵFactoryDeclaration<ObjectsSharedModule, never>;
50
- static ɵmod: i0.ɵɵNgModuleDeclaration<ObjectsSharedModule, never, [typeof i1$1.SharedModule, typeof ComponentsModule, typeof _smartsoft001_crud_shell_angular.CrudModule], [typeof ComponentsModule, typeof _smartsoft001_crud_shell_angular.CrudModule]>;
51
- static ɵinj: i0.ɵɵInjectorDeclaration<ObjectsSharedModule>;
50
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectsSharedModule, never>;
51
+ static ɵmod: _angular_core.ɵɵNgModuleDeclaration<ObjectsSharedModule, never, [typeof _smartsoft001_mobilems_angular.SharedModule, typeof ComponentsModule, typeof _smartsoft001_crud_shell_angular.CrudModule], [typeof ComponentsModule, typeof _smartsoft001_crud_shell_angular.CrudModule]>;
52
+ static ɵinj: _angular_core.ɵɵInjectorDeclaration<ObjectsSharedModule>;
52
53
  }
53
54
 
54
55
  declare class ObjectsService extends CrudBaseService<MsObject> {
55
56
  getUrlNameForDetails(): string;
56
57
  getUrlNameForList(): string;
57
- static ɵfac: i0.ɵɵFactoryDeclaration<ObjectsService, never>;
58
- static ɵprov: i0.ɵɵInjectableDeclaration<ObjectsService>;
58
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectsService, never>;
59
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ObjectsService>;
59
60
  }
60
61
 
61
62
  declare class ObjectsFacade extends CrudFacade<MsObject> {
@@ -64,8 +65,8 @@ declare class ObjectsFacade extends CrudFacade<MsObject> {
64
65
  title: string;
65
66
  id: string;
66
67
  }): Promise<void>;
67
- static ɵfac: i0.ɵɵFactoryDeclaration<ObjectsFacade, never>;
68
- static ɵprov: i0.ɵɵInjectableDeclaration<ObjectsFacade>;
68
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectsFacade, never>;
69
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ObjectsFacade>;
69
70
  }
70
71
 
71
72
  type State = State$1<MsObject>;
@@ -115,25 +116,25 @@ declare abstract class ObjectsListComponent extends CrudListPageBaseComponent<Ms
115
116
  list: Signal<MsObject[]>;
116
117
  loading: Signal<boolean>;
117
118
  filter: Signal<_smartsoft001_crud_shell_angular.ICrudFilter>;
118
- static ɵfac: i0.ɵɵFactoryDeclaration<ObjectsListComponent, never>;
119
- static ɵdir: i0.ɵɵDirectiveDeclaration<ObjectsListComponent, never, never, {}, {}, never, never, true, never>;
119
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectsListComponent, never>;
120
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectsListComponent, never, never, {}, {}, never, never, true, never>;
120
121
  }
121
122
 
122
123
  declare abstract class ObjectsItemComponent extends CrudItemPageBaseComponent<MsObject> {
123
124
  protected readonly route: ActivatedRoute;
124
125
  protected readonly seoService: SeoService;
125
126
  protected readonly translationService: TranslationService;
126
- protected readonly params: i0.Signal<_angular_router.Params>;
127
+ protected readonly params: _angular_core.Signal<_angular_router.Params>;
127
128
  facade: ObjectsFacade;
128
- readonly loading: i0.Signal<boolean>;
129
- readonly item: i0.Signal<MsObject>;
129
+ readonly loading: _angular_core.Signal<boolean>;
130
+ readonly item: _angular_core.Signal<MsObject>;
130
131
  /** @deprecated No museum uses it; download the card through the app's own download service. */
131
- readonly isPdfDownloading: i0.WritableSignal<boolean>;
132
+ readonly isPdfDownloading: _angular_core.WritableSignal<boolean>;
132
133
  protected constructor();
133
134
  /** @deprecated No museum uses it; download the card through the app's own download service. */
134
135
  onDownload(): Promise<void>;
135
- static ɵfac: i0.ɵɵFactoryDeclaration<ObjectsItemComponent, never>;
136
- static ɵdir: i0.ɵɵDirectiveDeclaration<ObjectsItemComponent, never, never, {}, {}, never, never, true, never>;
136
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectsItemComponent, never>;
137
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectsItemComponent, never, never, {}, {}, never, never, true, never>;
137
138
  }
138
139
 
139
140
  /** Response of `GET object/:id/related`. */
@@ -231,8 +232,8 @@ declare class ObjectsDataService extends ObjectsService {
231
232
  loadRelatedCollections(objectId: number | string): Observable<IObjectCollectionSummary[]>;
232
233
  /** Whether `search/Object` with the collection's `filter[entryCollections]` contains the object; an error → unknown → `false`. */
233
234
  private objectsDataCollectionContains;
234
- static ɵfac: i0.ɵɵFactoryDeclaration<ObjectsDataService, never>;
235
- static ɵprov: i0.ɵɵInjectableDeclaration<ObjectsDataService>;
235
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectsDataService, never>;
236
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ObjectsDataService>;
236
237
  }
237
238
 
238
239
  type SortType = 'random' | 'date-asc' | 'date-desc' | 'name-asc' | 'name-desc';
@@ -375,8 +376,8 @@ declare class ObjectMediaService {
375
376
  private objectMediaAdditional;
376
377
  /** Replaces the extension with `.jpg` — CDN cache compatibility. */
377
378
  private objectMediaJpg;
378
- static ɵfac: i0.ɵɵFactoryDeclaration<ObjectMediaService, never>;
379
- static ɵprov: i0.ɵɵInjectableDeclaration<ObjectMediaService>;
379
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectMediaService, never>;
380
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ObjectMediaService>;
380
381
  }
381
382
 
382
383
  declare const SERVICES: (typeof ObjectsService | {
@@ -512,8 +513,8 @@ declare abstract class ObjectsCatalogBaseComponent extends ObjectsListComponent
512
513
  protected applyListSeo(seo: IObjectsCatalogSeo): void;
513
514
  private objectsCatalogInitMasonry;
514
515
  private objectsCatalogDestroyMasonry;
515
- static ɵfac: i0.ɵɵFactoryDeclaration<ObjectsCatalogBaseComponent, never>;
516
- static ɵdir: i0.ɵɵDirectiveDeclaration<ObjectsCatalogBaseComponent, never, never, {}, {}, never, never, true, never>;
516
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectsCatalogBaseComponent, never>;
517
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectsCatalogBaseComponent, never, never, {}, {}, never, never, true, never>;
517
518
  }
518
519
 
519
520
  /** Options of an object details page, passed to `super(options)`. */
@@ -605,8 +606,8 @@ declare abstract class ObjectDetailsBaseComponent extends ObjectsItemComponent i
605
606
  */
606
607
  protected onObjectShown(item: MsObject): void;
607
608
  private objectDetailsFetchSsrSeo;
608
- static ɵfac: i0.ɵɵFactoryDeclaration<ObjectDetailsBaseComponent, never>;
609
- static ɵdir: i0.ɵɵDirectiveDeclaration<ObjectDetailsBaseComponent, never, never, {}, {}, never, never, true, never>;
609
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectDetailsBaseComponent, never>;
610
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectDetailsBaseComponent, never, never, {}, {}, never, never, true, never>;
610
611
  }
611
612
 
612
613
  /**
@@ -709,5 +710,375 @@ interface IAskAboutObject {
709
710
  */
710
711
  declare function askAboutObjectHref(translate: AskTranslate, object: IAskAboutObject): string | null;
711
712
 
712
- export { ASK_ABOUT_OBJECT_KEYS, AdvancedFilterType, ComponentsModule, FiltersComponent, FormFeatureType, ListComponent, MULTIMEDIA_DICTIONARY, OBJECTS_CATALOG_DEFAULTS, OBJECTS_CATALOG_SEO, ObjectDetailsBaseComponent, ObjectMediaService, ObjectsCatalogBaseComponent, ObjectsDataService, ObjectsFacade, ObjectsItemComponent, ObjectsListComponent, ObjectsModule, ObjectsService, ObjectsSharedModule, SERVICES, askAboutObjectHref, bibliography, descriptionHtml, getObjectsState, getReducer, initialState, inventoryValues, objectTitle, relatedArticles, tagValues };
713
- export type { ArchaeologicalSegregation, AskTranslate, FileType, IAnimationObject, IAskAboutObject, IKeyValue, IModel3DObject, IMultimediaDictionaryItem, IObjectBibliographyEntry, IObjectCollectionSummary, IObjectDetailLink, IObjectDetailSource, IObjectDetailsOptions, IObjectGalleryItem, IObjectRelated, IObjectsCatalogLoadMore, IObjectsCatalogOptions, IObjectsCatalogSeo, ISpecificObject, ObjectDetailValue, SortType, State };
713
+ /** How a field of the advanced filters panel is rendered. */
714
+ type ObjectsAdvancedFilterMode = 'dictionary' | 'tree' | 'text' | 'boolean';
715
+ /** The yes/no checkboxes of the panel ("Na ekspozycji", "Pokaż tylko"). */
716
+ type ObjectsAdvancedFilterBoolean = 'onExhibition' | 'hasImage' | 'hasVideo';
717
+ /**
718
+ * One field of the advanced filters panel. `dictionaryKey` is the API
719
+ * dictionary name (`DataService.loadFilterDictionary`); `key` is the query
720
+ * filter key written through `FiltersContext.filters`. Picking a value in a
721
+ * field with `dependsOn` checks the referenced boolean field (MOB-1802: the
722
+ * field stays enabled); unchecking that boolean clears the field.
723
+ */
724
+ interface IObjectsAdvancedFilterField {
725
+ key: string;
726
+ labelKey: string;
727
+ mode: ObjectsAdvancedFilterMode;
728
+ dictionaryKey?: string;
729
+ /**
730
+ * The field's own source (`FilterDictionarySource`) instead of the default
731
+ * `DataService.loadFilterDictionary`:
732
+ * - `publicCollections` — `GET public-collections/page/{n}` through
733
+ * `ObjectsDataService.loadCollectionsDictionary`;
734
+ * - `archaeologicalData` — `GET dictionary/{segregation}/search/page/{n}`
735
+ * (one type per segregation) through `ObjectsDataService.loadArchaeologicalDictionary`.
736
+ */
737
+ source?: 'publicCollections' | 'archaeologicalData';
738
+ /** Segregation of the `ArchaeologicalData` dictionary (only with `source: 'archaeologicalData'`). */
739
+ segregation?: ArchaeologicalSegregation;
740
+ dependsOn?: string;
741
+ }
742
+ /** One write of the panel's batch — handed to `FiltersContext.filters` by the bar. */
743
+ interface IObjectsAdvancedFilterWrite {
744
+ key: string;
745
+ type: '=';
746
+ val: FilterType;
747
+ }
748
+ /** Options of {@link ObjectsAdvancedFiltersBaseComponent}, passed to `super(…)`. */
749
+ interface IObjectsAdvancedFiltersOptions {
750
+ /** The panel's fields — the app's config (Podlasie: `OBJECTS_ADVANCED_FILTER_FIELDS`). */
751
+ fields: readonly IObjectsAdvancedFilterField[];
752
+ /** Query keys the panel writes in its single batch, in this order. */
753
+ managedKeys: readonly string[];
754
+ /**
755
+ * Keys the panel no longer has (MOB-1844). `FiltersContext.filters` changes
756
+ * only the keys it is given, so an old deep link or saved filter would stay
757
+ * active with no field to remove it — "Zastosuj" and "Resetuj" always send
758
+ * them with `val: undefined`. Default `[]`.
759
+ */
760
+ retiredKeys?: readonly string[];
761
+ /** `locationType` value of "Na ekspozycji: Tak". Default `'Ekspozycja'`. */
762
+ onExhibitionValue?: string;
763
+ }
764
+ /**
765
+ * Logic of the "Filtry zaawansowane" panel (Muzeum Podlasia's
766
+ * `objects-advanced-filters`, MOB-1596, layout per the MOB-1802 mockup).
767
+ * Presentational: reads `filter()`, keeps every edit in a local draft and only
768
+ * writes through `apply` — the parent (the filters bar) performs the single
769
+ * `context.filters` assignment. The template and the field config stay in the app.
770
+ */
771
+ declare abstract class ObjectsAdvancedFiltersBaseComponent {
772
+ private readonly objectsAdvancedFiltersTranslate;
773
+ private readonly objectsAdvancedFiltersService;
774
+ private readonly objectsAdvancedFiltersOptions;
775
+ /**
776
+ * "Kolekcja tematyczna" (MOB-1844): pages of the `public-collections` list
777
+ * (with the phrase in `filter[phrase]`) instead of a `dictionary/*` dictionary.
778
+ */
779
+ protected readonly collectionsSource: (page: number, query?: string) => rxjs.Observable<_smartsoft001_mobilems_angular.IDictionaryPage>;
780
+ /**
781
+ * "Filtry archeologiczne" (MOB-1844): the `ArchaeologicalData` dictionary
782
+ * with a segregation — names planned by MobileMS (Kanbanize 50040).
783
+ */
784
+ protected readonly archeoTownsSource: (page: number, query?: string) => rxjs.Observable<_smartsoft001_mobilems_angular.IDictionaryPage>;
785
+ protected readonly archeoPeriodsSource: (page: number, query?: string) => rxjs.Observable<_smartsoft001_mobilems_angular.IDictionaryPage>;
786
+ protected readonly archeoCulturesSource: (page: number, query?: string) => rxjs.Observable<_smartsoft001_mobilems_angular.IDictionaryPage>;
787
+ readonly filter: _angular_core.InputSignal<ICrudFilter>;
788
+ /** Toggled by the parent — reopening re-derives the draft, discarding it. */
789
+ readonly isOpen: _angular_core.InputSignal<boolean>;
790
+ /** The `/obiekty` list — a full-width band with the content in the page container. */
791
+ readonly fullBleed: _angular_core.InputSignal<boolean>;
792
+ readonly apply: _angular_core.OutputEmitterRef<IObjectsAdvancedFilterWrite[]>;
793
+ protected readonly fields: readonly IObjectsAdvancedFilterField[];
794
+ /** Mobile: the "Filtry archeologiczne" section collapses with a chevron (2276:7709). */
795
+ protected readonly archaeologicalOpen: _angular_core.WritableSignal<boolean>;
796
+ protected readonly draftQuery: _angular_core.WritableSignal<ICrudFilterQueryItem[]>;
797
+ /** Synthetic filter fed to the reused `app-filter-*` inputs so they read the draft. */
798
+ protected readonly draftFilter: _angular_core.Signal<ICrudFilter>;
799
+ protected constructor(options: IObjectsAdvancedFiltersOptions);
800
+ readDictionaryValue(key: string): IDictionaryEntry[];
801
+ onDictionaryToggle(key: string, item: IDictionaryEntry): void;
802
+ onDictionaryClearAll(key: string): void;
803
+ toggleArchaeological(): void;
804
+ onInventoryNumberChange(value: string): void;
805
+ onBooleanToggle(key: ObjectsAdvancedFilterBoolean, checked: boolean): void;
806
+ isBooleanChecked(key: ObjectsAdvancedFilterBoolean): boolean;
807
+ applyDraft(): void;
808
+ reset(): void;
809
+ private objectsAdvancedFiltersToggleFormFeature;
810
+ private objectsAdvancedFiltersWriteDictionary;
811
+ private objectsAdvancedFiltersSetDraftEntry;
812
+ private objectsAdvancedFiltersBuildPayload;
813
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectsAdvancedFiltersBaseComponent, never>;
814
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectsAdvancedFiltersBaseComponent, never, never, { "filter": { "alias": "filter"; "required": true; "isSignal": true; }; "isOpen": { "alias": "isOpen"; "required": false; "isSignal": true; }; "fullBleed": { "alias": "fullBleed"; "required": false; "isSignal": true; }; }, { "apply": "apply"; }, never, never, true, never>;
815
+ }
816
+
817
+ /** Sort options of the objects list (the default order). */
818
+ declare const OBJECTS_SORT_OPTIONS: IKeyValue[];
819
+ /** Sort order shown for `?type=new` — newest first. */
820
+ declare const OBJECTS_NEW_TYPE_SORT_OPTIONS: IKeyValue[];
821
+ /** Page sizes of the objects list. */
822
+ declare const OBJECTS_LIMIT_OPTIONS: IKeyValue[];
823
+ /** API query key of the theme tags (cycles) filter. */
824
+ declare const OBJECTS_THEME_TAGS_FILTER_KEY = "cycles";
825
+ /** Chip labels of the yes/no filters from the advanced filters panel. */
826
+ declare const OBJECTS_FILTER_SINGLE_VALUE_LABELS: Readonly<Record<string, string>>;
827
+ /** A filter write in the shape `FiltersContext.filters` accepts. */
828
+ interface IObjectsFilterWrite {
829
+ key: string;
830
+ type: string;
831
+ val: FilterType;
832
+ }
833
+ /** A date range of the date filters (`null` — an open end). */
834
+ interface IObjectsDateRange {
835
+ from: string | null;
836
+ to: string | null;
837
+ }
838
+ /** The sort dropdown key (e.g. `publication-date-desc`) of a sort; no `by` → `random`. */
839
+ declare function objectsSortKey(sort?: {
840
+ by?: string;
841
+ desc?: boolean;
842
+ }): string;
843
+ /** The sort of a sort dropdown key; `random` → an empty `by`. */
844
+ declare function objectsSortFromKey(key: string): {
845
+ by: string;
846
+ desc: boolean;
847
+ };
848
+ /** The list URL (`/obiekty` by default) restoring the current filter (phrase + query items). */
849
+ declare function buildObjectsResultsUrl(origin: string, filter: ICrudFilter | null | undefined, listPath?: string): string;
850
+
851
+ /** Options of {@link ObjectsFiltersBarBaseComponent}, passed to `super(…)`. */
852
+ interface IObjectsFiltersBarOptions {
853
+ /**
854
+ * Load the `Cycle` dictionary for the theme tags (`themeTags`, `tagsQuery`).
855
+ * Default `false`: no `dictionary/Cycle` request; `themeTags` holds only the
856
+ * cycles selected in the filter.
857
+ */
858
+ cycleTags?: boolean;
859
+ /**
860
+ * Chip labels (translation keys) of the yes/no filters, by query key.
861
+ * Default `OBJECTS_FILTER_SINGLE_VALUE_LABELS`.
862
+ */
863
+ singleValueLabels?: Readonly<Record<string, string>>;
864
+ /**
865
+ * Single-value filters — their chip clears the whole query item.
866
+ * Default `['categories', 'inventoryNumber', 'locationType']`.
867
+ */
868
+ singleValueKeys?: readonly string[];
869
+ }
870
+ /**
871
+ * Logic of the objects list top filter bar (Muzeum Podlasia's `filters-top`):
872
+ * theme tags, applied-filter chips, sort/limit dropdowns, pagination and the
873
+ * grid/list view toggle. The template stays in the app.
874
+ *
875
+ * Every mutation goes through the framework `FiltersContext` provided by
876
+ * `<smart-mobilems-objects-filters>` (passed to each method by the template),
877
+ * which dispatches to the objects facade. With `redirectChanges` on (the search
878
+ * results tab, MOB-1818) filter, sort and page size changes are emitted as one
879
+ * complete filter through `filterRedirect` instead.
880
+ */
881
+ declare abstract class ObjectsFiltersBarBaseComponent {
882
+ private readonly objectsFiltersBarTranslate;
883
+ private readonly objectsFiltersBarSingleValueLabels;
884
+ private readonly objectsFiltersBarSingleValueKeys;
885
+ private readonly objectsFiltersBarCycleTags;
886
+ /** Query key of the panel's theme tags — `filter[cycles][]`. */
887
+ protected readonly themeTagsFilterKey = "cycles";
888
+ /**
889
+ * The page's current filter, bound straight through to the filter fields.
890
+ * Reads come from here; writes go through the FiltersContext — both sides are
891
+ * the same facade state.
892
+ */
893
+ readonly filter: _angular_core.InputSignal<ICrudFilter>;
894
+ readonly listMode: _angular_core.InputSignal<ListMode>;
895
+ /**
896
+ * The result count from the list page — only for the response to the
897
+ * current filter (the shared slice guard). Without it the count comes from
898
+ * the framework context.
899
+ */
900
+ readonly totalCount: _angular_core.InputSignal<number>;
901
+ readonly sortOptions: _angular_core.InputSignal<IKeyValue[]>;
902
+ /**
903
+ * The search results tab (MOB-1818): filter, sort and page size changes do
904
+ * not narrow the list in place, they go to `filterRedirect` with the
905
+ * complete filter. Paging stays in the tab.
906
+ */
907
+ readonly redirectChanges: _angular_core.InputSignal<boolean>;
908
+ /** The complete filter after a change in the results tab — the list moves to `/obiekty` with it. */
909
+ readonly filterRedirect: _angular_core.OutputEmitterRef<ICrudFilter>;
910
+ readonly listModeChange: _angular_core.OutputEmitterRef<ListMode>;
911
+ /** Free-text search — the list page owns the read so it can persist it. */
912
+ readonly searchEvent: _angular_core.OutputEmitterRef<string>;
913
+ readonly isAdvancedFiltersOn: WritableSignal<boolean>;
914
+ limitOptions: IKeyValue[];
915
+ /** The "Wyszukaj więcej tagów" phrase — empty = the panel's default tags. */
916
+ readonly tagsQuery: WritableSignal<string>;
917
+ /**
918
+ * Panel chips: the selected cycles (from the filter) first, then the
919
+ * dictionary or the phrase result — a selected cycle missing from the `q`
920
+ * result stays and can be unselected (MOB-1826 review). Without the
921
+ * `cycleTags` option only the selected cycles.
922
+ */
923
+ readonly themeTags: Signal<IDictionaryEntry[]>;
924
+ protected constructor(options?: IObjectsFiltersBarOptions);
925
+ toggleAdvancedFilters(force?: boolean): void;
926
+ onListMode(value: ListMode): void;
927
+ /** Map a sort dropdown key (e.g. `publication-date-desc`) to the matching option. */
928
+ selectedSort(sort?: {
929
+ by?: string;
930
+ desc?: boolean;
931
+ }): IKeyValue;
932
+ selectedLimit(limit?: number): IKeyValue;
933
+ sortChange(context: FiltersContext<MsObject>, value: string): void;
934
+ limitChange(context: FiltersContext<MsObject>, value: string): void;
935
+ pageChange(context: FiltersContext<MsObject>, value: number): void;
936
+ /** Toggle a single dictionary entry on/off for `key`. */
937
+ advancedFilterChange(context: FiltersContext<MsObject>, entry: IDictionaryEntry, key: string): void;
938
+ /** The year field already debounces typing (500 ms, MOB-1866). */
939
+ onCreateDatesFilterChange(context: FiltersContext<MsObject>, range: IObjectsDateRange): void;
940
+ /**
941
+ * Batched write from the "Filtry zaawansowane" panel (MOB-1596) — the panel
942
+ * keeps its own draft and hands over the full snapshot on Zastosuj/Resetuj,
943
+ * so this is the single `context.filters` assignment for that whole edit.
944
+ */
945
+ onAdvancedFiltersApply(context: FiltersContext<MsObject>, payload: IObjectsFilterWrite[]): void;
946
+ /** A yes/no filter — unchecking sends `undefined`, which removes the query item. */
947
+ onBooleanFilterChange(context: FiltersContext<MsObject>, event: {
948
+ key: string;
949
+ checked: boolean;
950
+ }): void;
951
+ clearFilter(context: FiltersContext<MsObject>, item: ICrudFilterQueryItem, value?: IDictionaryEntry): void;
952
+ isListValue(value: unknown): boolean;
953
+ /** List entries for the chips — no `null` and no entries without an id (MOB-1826 review). */
954
+ listEntries(value: unknown): Array<IDictionaryEntry & {
955
+ text?: string;
956
+ }>;
957
+ /** Chip label of a filter without a list of values — a yes/no one has no value after the colon. */
958
+ singleValueLabel(item: ICrudFilterQueryItem): string;
959
+ $context(context: unknown): FiltersContext<MsObject>;
960
+ /**
961
+ * Write a dictionary filter through the generic `filters` setter. An empty
962
+ * selection must be sent as `undefined` — that is what removes the query item.
963
+ */
964
+ protected objectsFiltersBarSetDictionary(context: FiltersContext<MsObject>, key: string, value: IDictionaryEntry[]): void;
965
+ /**
966
+ * Where a filter write goes: the framework context (read through the facade)
967
+ * or — in the results tab — the redirect context to `/obiekty` (MOB-1818).
968
+ */
969
+ private objectsFiltersBarWriteTarget;
970
+ private objectsFiltersBarDictionaryValue;
971
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectsFiltersBarBaseComponent, never>;
972
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectsFiltersBarBaseComponent, never, never, { "filter": { "alias": "filter"; "required": true; "isSignal": true; }; "listMode": { "alias": "listMode"; "required": false; "isSignal": true; }; "totalCount": { "alias": "totalCount"; "required": false; "isSignal": true; }; "sortOptions": { "alias": "sortOptions"; "required": false; "isSignal": true; }; "redirectChanges": { "alias": "redirectChanges"; "required": false; "isSignal": true; }; }, { "filterRedirect": "filterRedirect"; "listModeChange": "listModeChange"; "searchEvent": "searchEvent"; }, never, never, true, never>;
973
+ }
974
+
975
+ /**
976
+ * Logic of the grey objects search panel (Muzeum Podlasia's
977
+ * `objects-search-panel`, mockup "search tagi filtry" 458:7898, desktop
978
+ * "Frame 502" 2300:51176, mobile "Panel wyszukiwarki" 2300:51195): phrase →
979
+ * theme tags + "Wyszukaj więcej tagów" → date range, "Pokaż" and "Szukaj" →
980
+ * advanced filters. On mobile a "Filtry ↓" button under the phrase field
981
+ * expands the rest of the panel.
982
+ *
983
+ * Presentational — it reads its state from `filter()` and emits events; the
984
+ * parent (the filters bar) writes to `FiltersContext`. No template: each
985
+ * museum extends it and keeps its own HTML, with the phrase input marked
986
+ * `#phraseField`.
987
+ */
988
+ declare abstract class ObjectsSearchPanelBaseComponent {
989
+ readonly phrase: _angular_core.InputSignal<string>;
990
+ readonly filter: _angular_core.InputSignal<ICrudFilter>;
991
+ /**
992
+ * Theme tags — the whole `Cycle` dictionary or the "Wyszukaj więcej tagów"
993
+ * result; the template decides how many show at once (MOB-1826).
994
+ */
995
+ readonly tags: _angular_core.InputSignal<ThemeTag[]>;
996
+ /** The parent controls the advanced filters panel state. */
997
+ readonly isAdvancedFiltersOn: _angular_core.InputSignal<boolean>;
998
+ /**
999
+ * The `/obiekty` list also searches by filters alone — "Szukaj" with an
1000
+ * empty phrase is allowed there. In the search results the phrase is part
1001
+ * of the address, so an empty phrase has nowhere to go.
1002
+ */
1003
+ readonly allowEmptyPhrase: _angular_core.InputSignal<boolean>;
1004
+ /** A full-bleed band (the `/obiekty` list) instead of a grey box (search results). */
1005
+ readonly fullBleed: _angular_core.InputSignal<boolean>;
1006
+ /**
1007
+ * Selected filter chips (state "Selected" 2193:3301 / mobile 2276:7726) —
1008
+ * rendered by the parent and inserted once by the panel; only CSS places
1009
+ * them, so the DOM is the same after SSR and in the browser.
1010
+ */
1011
+ readonly selectedFiltersTpl: _angular_core.InputSignal<TemplateRef<unknown>>;
1012
+ readonly searchPhrase: _angular_core.OutputEmitterRef<string>;
1013
+ readonly tagToggle: _angular_core.OutputEmitterRef<ThemeTag>;
1014
+ /**
1015
+ * Passed through unchanged — the date field debounces the year typing
1016
+ * (MOB-1866), the panel delays nothing here.
1017
+ */
1018
+ readonly dateRangeChange: _angular_core.OutputEmitterRef<IObjectsDateRange>;
1019
+ readonly booleanFilterChange: _angular_core.OutputEmitterRef<{
1020
+ key: string;
1021
+ checked: boolean;
1022
+ }>;
1023
+ /** "Wyszukaj więcej tagów" — an empty phrase goes back to the default tags. */
1024
+ readonly tagsSearch: _angular_core.OutputEmitterRef<string>;
1025
+ readonly advancedFiltersToggle: _angular_core.OutputEmitterRef<void>;
1026
+ /** One batched payload from the "Filtry zaawansowane" panel's Zastosuj/Resetuj. */
1027
+ readonly advancedFiltersApply: _angular_core.OutputEmitterRef<IObjectsFilterWrite[]>;
1028
+ /** The selected theme tags read from the current filter. */
1029
+ protected readonly selectedTagIds: _angular_core.Signal<number[]>;
1030
+ /** The field text — starts from `phrase()` and follows a change from the URL. */
1031
+ protected readonly searchText: _angular_core.WritableSignal<string>;
1032
+ /** The "Wyszukaj więcej tagów" phrase and the last query sent. */
1033
+ protected readonly tagQuery: _angular_core.WritableSignal<string>;
1034
+ protected readonly submittedTagQuery: _angular_core.WritableSignal<string>;
1035
+ /** "Pokaż wszystkie tagi (N)" expanded — a new search collapses it. */
1036
+ protected readonly tagsExpanded: _angular_core.WritableSignal<boolean>;
1037
+ /** Mobile: "Filtry ↓" expands the tags, dates and buttons (always visible from lg). */
1038
+ protected readonly filtersOpen: _angular_core.WritableSignal<boolean>;
1039
+ /** Mobile: "Więcej tagów" reveals the tag search field (2276:7913). */
1040
+ protected readonly moreTagsOpen: _angular_core.WritableSignal<boolean>;
1041
+ private readonly objectsSearchPanelPhraseField;
1042
+ /** The "Pokaż" boxes' state read from the filter — e.g. after a link with filters. */
1043
+ protected isBooleanFilterOn(key: string): boolean;
1044
+ protected toggleMoreTags(): void;
1045
+ protected toggleFilters(): void;
1046
+ /**
1047
+ * "×" in the phrase field. On the list it also clears the search; in the
1048
+ * search results it only empties the field (a new phrase is a new address).
1049
+ */
1050
+ protected clearPhrase(): void;
1051
+ protected searchTags(): void;
1052
+ protected onBooleanFilterChange(key: string, checked: boolean): void;
1053
+ /**
1054
+ * Only an explicit action (button / Enter) searches — the panel has no
1055
+ * live search, so there is no debounce here either.
1056
+ */
1057
+ protected search(): void;
1058
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectsSearchPanelBaseComponent, never>;
1059
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectsSearchPanelBaseComponent, never, never, { "phrase": { "alias": "phrase"; "required": false; "isSignal": true; }; "filter": { "alias": "filter"; "required": true; "isSignal": true; }; "tags": { "alias": "tags"; "required": false; "isSignal": true; }; "isAdvancedFiltersOn": { "alias": "isAdvancedFiltersOn"; "required": false; "isSignal": true; }; "allowEmptyPhrase": { "alias": "allowEmptyPhrase"; "required": false; "isSignal": true; }; "fullBleed": { "alias": "fullBleed"; "required": false; "isSignal": true; }; "selectedFiltersTpl": { "alias": "selectedFiltersTpl"; "required": false; "isSignal": true; }; }, { "searchPhrase": "searchPhrase"; "tagToggle": "tagToggle"; "dateRangeChange": "dateRangeChange"; "booleanFilterChange": "booleanFilterChange"; "tagsSearch": "tagsSearch"; "advancedFiltersToggle": "advancedFiltersToggle"; "advancedFiltersApply": "advancedFiltersApply"; }, never, never, true, never>;
1060
+ }
1061
+
1062
+ /** How long (ms) the "link copied" message stays after a click. */
1063
+ declare const OBJECTS_SHARE_COPIED_TIMEOUT = 3000;
1064
+ /**
1065
+ * Logic of "Share search results" (mock-up "Action panel" 2300:51184): a link
1066
+ * to the objects list with the current filters, shared through
1067
+ * `ShareLinkBaseComponent` — the native share sheet, or a clipboard copy with a
1068
+ * "link copied" flag when the browser has no share sheet. The template stays in
1069
+ * the app.
1070
+ */
1071
+ declare abstract class ObjectsShareResultsBaseComponent extends ShareLinkBaseComponent {
1072
+ readonly filter: _angular_core.InputSignal<ICrudFilter>;
1073
+ /** The list path the link opens; overridable, read inside `share`. */
1074
+ protected readonly objectsShareResultsListPath: string;
1075
+ /** How long (ms) "copied" stays on; overridable, read inside `share`. */
1076
+ protected readonly objectsShareResultsCopiedTimeout: number;
1077
+ protected get shareLinkCopiedTimeout(): number;
1078
+ protected shareLinkUrl(): string;
1079
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ObjectsShareResultsBaseComponent, never>;
1080
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ObjectsShareResultsBaseComponent, never, never, { "filter": { "alias": "filter"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1081
+ }
1082
+
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 };