UNPKG

hslayers-ng

Version:
472 lines (467 loc) 248 kB
import * as i0 from '@angular/core'; import { inject, input, computed, Component, Injectable, signal, Input, EventEmitter, Output, CUSTOM_ELEMENTS_SCHEMA, NgModule, output, ChangeDetectionStrategy, DestroyRef, ViewChild } from '@angular/core'; import * as i2$1 from '@ngx-translate/core'; import { TranslatePipe } from '@ngx-translate/core'; import { transform } from 'ol/proj'; import { HsAddDataCatalogueService, HsAddDataCatalogueMapService, HsLaymanBrowserService, HsAddDataService, HsAddDataCommonFileService, HsAddDataVectorService, HsAddDataUrlService, HsAddDataCommonService, HsAddDataVectorUploadService, HsUrlArcGisService, HsAddDataOwsService, HsUrlWfsService, HsUrlWmsService, HsUrlWmtsService, HsUrlXyzService } from 'hslayers-ng/services/add-data'; import { HsConfig } from 'hslayers-ng/config'; import { HsDialogContainerService } from 'hslayers-ng/common/dialogs'; import { HsUiExtensionsRecursiveDdComponent } from 'hslayers-ng/common/widgets'; import { HsMapService } from 'hslayers-ng/services/map'; import { isPOJO, structuredClone, isLayerClustered, undefineEmptyString, isLayerVectorLayer } from 'hslayers-ng/services/utils'; import * as i1 from '@angular/forms'; import { FormsModule, FormBuilder, Validators, ReactiveFormsModule } from '@angular/forms'; import * as i3 from '@ng-bootstrap/ng-bootstrap'; import { NgbDropdownModule, NgbProgressbarModule, NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap'; import * as i1$1 from 'hslayers-ng/common/layman'; import { HsCommonLaymanService, HsLaymanCurrentUserComponent } from 'hslayers-ng/common/layman'; import { HsLanguageService } from 'hslayers-ng/services/language'; import { HsLaymanService, HsLayerSynchronizerService } from 'hslayers-ng/services/save-map'; import { HsLayoutService } from 'hslayers-ng/services/layout'; import * as i2 from 'hslayers-ng/common/pager'; import { HsPagerModule } from 'hslayers-ng/common/pager'; import * as i1$2 from '@angular/common'; import { NgClass, NgStyle, CommonModule } from '@angular/common'; import { HsLogService } from 'hslayers-ng/services/log'; import { HsRemoveLayerDialogService } from 'hslayers-ng/common/remove-multiple'; import { HsSetPermissionsDialogComponent } from 'hslayers-ng/common/dialog-set-permissions'; import * as i3$2 from 'hslayers-ng/common/pipes'; import { EpsgPipe, FilterPipe, TrackByPropertyPipe } from 'hslayers-ng/common/pipes'; import * as i3$1 from 'hslayers-ng/common/add-to-map'; import { HsAddToMapButtonComponent } from 'hslayers-ng/common/add-to-map'; import { HsLayerManagerService } from 'hslayers-ng/services/layer-manager'; import * as i5 from 'hslayers-ng/common/layer-table'; import { HsLayerTableComponent } from 'hslayers-ng/common/layer-table'; import { HsEventBusService } from 'hslayers-ng/services/event-bus'; import * as i2$2 from 'hslayers-ng/common/history-list'; import { HsHistoryListService, HsHistoryListModule } from 'hslayers-ng/common/history-list'; import { FILES_SUPPORTED, SERVICES_SUPPORTED_BY_URL } from 'hslayers-ng/types'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import * as i4 from 'hslayers-ng/common/upload'; import { HsUploadComponent, HsUploadModule } from 'hslayers-ng/common/upload'; import { GeoJSON } from 'ol/format'; import { HsToastService } from 'hslayers-ng/common/toast'; import { getShowInLayerManager } from 'hslayers-ng/common/extensions'; import { HsShareUrlService } from 'hslayers-ng/services/share'; import { HttpClient } from '@angular/common/http'; import { lastValueFrom, takeUntil, switchMap, of } from 'rxjs'; import { HsConfirmDialogComponent } from 'hslayers-ng/common/confirm'; import * as i4$1 from 'hslayers-ng/common/panels'; import { HsPanelBaseComponent, HsPanelHelpersModule, HsPanelHeaderComponent } from 'hslayers-ng/common/panels'; class HsCatalogueMetadataComponent { constructor() { this.hsConfig = inject(HsConfig); this.hsAddDataCatalogueService = inject(HsAddDataCatalogueService); this.hsAddDataCatalogueMapService = inject(HsAddDataCatalogueMapService); this.hsDialogContainerService = inject(HsDialogContainerService); this.hsMapService = inject(HsMapService); this.data = input(...(ngDevMode ? [undefined, { debugName: "data" }] : [])); this.selectedLayer = computed(() => this.data().selectedLayer, ...(ngDevMode ? [{ debugName: "selectedLayer" }] : [])); this.selectedDS = computed(() => this.data().selectedDS, ...(ngDevMode ? [{ debugName: "selectedDS" }] : [])); this.endpointType = computed(() => this.selectedDS().type, ...(ngDevMode ? [{ debugName: "endpointType" }] : [])); this.addAvailable = computed(() => { const layer = this.selectedLayer(); const endpointType = this.endpointType(); return endpointType === 'micka' || layer.wfsWmsStatus === 'AVAILABLE'; }, ...(ngDevMode ? [{ debugName: "addAvailable" }] : [])); this.availableTypes = computed(() => { let types = []; const layer = this.selectedLayer(); if (this.isMickaLayer(layer)) { types = layer.links .map((l) => { return ['WMS', 'WFS'].some((t) => l.protocol.includes(t)) ? l.protocol.includes('WMS') ? 'WMS' : 'WFS' : null; }) .filter((type) => !!type); } else { types = layer.type; } return types.includes('WMS') ? [...types, 'WMTS'] : types; }, ...(ngDevMode ? [{ debugName: "availableTypes" }] : [])); this.metadataUrl = computed(() => { const layer = this.selectedLayer(); if (this.isMickaLayer(layer)) { return `${this.selectedDS().url.replace('csw', 'record/basic')}/${layer.id}`; } return layer.metadata.record_url; }, ...(ngDevMode ? [{ debugName: "metadataUrl" }] : [])); this.bbox = computed(() => { const layer = this.selectedLayer(); if (this.isLaymanLayer(layer)) { return layer.bounding_box; } return layer.bbox; }, ...(ngDevMode ? [{ debugName: "bbox" }] : [])); this.excludedKeys = ['feature', 'thumbnail', 'endpoint']; } /** * @param type - Type in which the layer shall be added (WMS, WFS, etc.) */ async addLayerToMap(type) { const ds = this.selectedDS(); const layer = this.selectedLayer(); const whatToAdd = await this.hsAddDataCatalogueService.describeCatalogueLayer(ds, layer); whatToAdd.type = type === 'WMS' || type === 'WMTS' ? 'WMS' : type; this.hsAddDataCatalogueService.addLayerToMap(ds, whatToAdd, { useTiles: type === 'WMTS', }); this.close(); } isMickaLayer(layer) { return 'links' in layer && Array.isArray(layer.links); } isLaymanLayer(layer) { return 'native_bounding_box' in layer; } close() { this.hsDialogContainerService.destroy(this); } /** * ZoomTo to selected layer overview * Micka layers bbox is defined in EPSG:4326 * Layman layers bbox is defined in EPSG:3857 (using bounding_box property) */ zoomTo() { const b = this.bbox(); if (!b) { return; } let first_pair = [b[0], b[1]]; let second_pair = [b[2], b[3]]; const currentProjection = this.hsMapService .getMap() .getView() .getProjection(); const sourceProjection = this.isLaymanLayer(this.selectedLayer()) ? 'EPSG:3857' : 'EPSG:4326'; first_pair = transform(first_pair, sourceProjection, currentProjection); second_pair = transform(second_pair, sourceProjection, currentProjection); if (first_pair.some(isNaN) || second_pair.some(isNaN)) { return; } const extent = [ first_pair[0], first_pair[1], second_pair[0], second_pair[1], ]; this.hsMapService.fitExtent(extent); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: HsCatalogueMetadataComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.3", type: HsCatalogueMetadataComponent, isStandalone: true, selector: "hs-catalogue-metadata", inputs: { data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"modal in hs-datasource_selector-metadata-dialog\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-lg\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">\n {{'DATASOURCE_SELECTOR.metadataFor' | translate }} {{ selectedLayer().title}}\n </h4>\n <button type=\"button\" (click)=\"close()\" class=\"btn-close\" data-dismiss=\"modal\"\n [attr.aria-label]=\"'COMMON.close' | translate \"></button>\n </div>\n <div class=\"modal-body\" style=\"max-height:400px; overflow-y:auto\">\n @if (selectedLayer().thumbnail) {\n <div class=\"bg-light mb-3 text-center\">\n <img [src]=\"selectedLayer().thumbnail.url\" class=\"img-fluid\" alt=\"Thumbnail\">\n </div>\n }\n <hs-widgets-recursive-dd [value]=\"selectedLayer()\" [firstLevel]=\"true\" [excludeKeys]=\"excludedKeys\">\n </hs-widgets-recursive-dd>\n </div>\n <div class=\"modal-footer\">\n @if (addAvailable()) {\n <div class=\"d-flex\">\n @for (type of availableTypes(); track type) {\n <button type=\"button\" class=\"btn btn-primary ms-2 d-flex gap-2 align-items-center\"\n (click)=\"addLayerToMap(type)\" data-dismiss=\"modal\">\n <span class=\"fa-solid fa-plus\"></span><span>{{'DATASOURCE_SELECTOR.addToMapAs' | translate }}\n {{type}}</span>\n </button>\n }\n </div>\n }\n <div class=\"d-flex w-100 justify-content-between\">\n @if (metadataUrl()) {\n <a target=\"_blank\" [href]=\"metadataUrl()\" class=\"btn btn-primary\"\n (click)=\"close()\">{{'DATASOURCE_SELECTOR.seeFullRecord' | translate}} <i\n class=\"fa-solid fa-up-right-from-square\"></i></a>\n }\n <div class=\"d-flex gap-2\">\n <a role=\"button\" class=\"btn btn-success\"\n [href]='hsAddDataCatalogueService.layerRDF(selectedDS(), selectedLayer())' data-toggle=\"tooltip\"\n title=\"GeoDCAT-AP\" target=\"_blank\"\n [hidden]='endpointType()!==\"micka\" || hsAddDataCatalogueService.layerRDF(selectedDS(), selectedLayer()) === \"#\"'>\n <i class=\"fa-solid fa-share-nodes\"></i> RDF\n </a><!-- TODO: Remove function call from template -->\n <button type=\"button\" class=\"btn btn-success\" [hidden]=\"bbox() === undefined\"\n (click)=\"zoomTo()\">{{'LAYERMANAGER.layerEditor.zoomToLayer'\n |\n translate }}</button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"close()\" data-dismiss=\"modal\"\n [title]=\"'COMMON.close' | translate \">\n {{'COMMON.close' | translate }}\n </button>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: HsUiExtensionsRecursiveDdComponent, selector: "hs-widgets-recursive-dd", inputs: ["value", "excludeKeys", "firstLevel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: HsCatalogueMetadataComponent, decorators: [{ type: Component, args: [{ selector: 'hs-catalogue-metadata', imports: [HsUiExtensionsRecursiveDdComponent, TranslatePipe], template: "<div class=\"modal in hs-datasource_selector-metadata-dialog\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-lg\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h4 class=\"modal-title\">\n {{'DATASOURCE_SELECTOR.metadataFor' | translate }} {{ selectedLayer().title}}\n </h4>\n <button type=\"button\" (click)=\"close()\" class=\"btn-close\" data-dismiss=\"modal\"\n [attr.aria-label]=\"'COMMON.close' | translate \"></button>\n </div>\n <div class=\"modal-body\" style=\"max-height:400px; overflow-y:auto\">\n @if (selectedLayer().thumbnail) {\n <div class=\"bg-light mb-3 text-center\">\n <img [src]=\"selectedLayer().thumbnail.url\" class=\"img-fluid\" alt=\"Thumbnail\">\n </div>\n }\n <hs-widgets-recursive-dd [value]=\"selectedLayer()\" [firstLevel]=\"true\" [excludeKeys]=\"excludedKeys\">\n </hs-widgets-recursive-dd>\n </div>\n <div class=\"modal-footer\">\n @if (addAvailable()) {\n <div class=\"d-flex\">\n @for (type of availableTypes(); track type) {\n <button type=\"button\" class=\"btn btn-primary ms-2 d-flex gap-2 align-items-center\"\n (click)=\"addLayerToMap(type)\" data-dismiss=\"modal\">\n <span class=\"fa-solid fa-plus\"></span><span>{{'DATASOURCE_SELECTOR.addToMapAs' | translate }}\n {{type}}</span>\n </button>\n }\n </div>\n }\n <div class=\"d-flex w-100 justify-content-between\">\n @if (metadataUrl()) {\n <a target=\"_blank\" [href]=\"metadataUrl()\" class=\"btn btn-primary\"\n (click)=\"close()\">{{'DATASOURCE_SELECTOR.seeFullRecord' | translate}} <i\n class=\"fa-solid fa-up-right-from-square\"></i></a>\n }\n <div class=\"d-flex gap-2\">\n <a role=\"button\" class=\"btn btn-success\"\n [href]='hsAddDataCatalogueService.layerRDF(selectedDS(), selectedLayer())' data-toggle=\"tooltip\"\n title=\"GeoDCAT-AP\" target=\"_blank\"\n [hidden]='endpointType()!==\"micka\" || hsAddDataCatalogueService.layerRDF(selectedDS(), selectedLayer()) === \"#\"'>\n <i class=\"fa-solid fa-share-nodes\"></i> RDF\n </a><!-- TODO: Remove function call from template -->\n <button type=\"button\" class=\"btn btn-success\" [hidden]=\"bbox() === undefined\"\n (click)=\"zoomTo()\">{{'LAYERMANAGER.layerEditor.zoomToLayer'\n |\n translate }}</button>\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"close()\" data-dismiss=\"modal\"\n [title]=\"'COMMON.close' | translate \">\n {{'COMMON.close' | translate }}\n </button>\n </div>\n </div>\n\n </div>\n </div>\n </div>\n</div>\n" }] }] }); var catalogueMetadata_component = /*#__PURE__*/Object.freeze({ __proto__: null, HsCatalogueMetadataComponent: HsCatalogueMetadataComponent }); class HsCatalogueMetadataService { decomposeMetadata(input, prestring) { if (isPOJO(input)) { return this.decomposeObject(input, prestring); } if (Array.isArray(input)) { return this.decomposeArray(input, prestring); } return false; } decomposeObject(obj, substring) { let decomposed = {}; let subvalue = undefined; Object.entries(obj).forEach((entry) => { const [key, value] = entry; if (key == 'feature') { return; } let newstring = ''; if (substring !== undefined) { newstring = substring + ' - ' + key; } else { newstring = key; } if (isPOJO(value)) { subvalue = this.decomposeObject(value, newstring); } else if (Array.isArray(value)) { subvalue = this.decomposeArray(value, newstring); } else { subvalue = value; } if (isPOJO(subvalue)) { decomposed = structuredClone(subvalue, decomposed); } else { decomposed[newstring] = subvalue; } }); return decomposed; } decomposeArray(arr, substring) { let decomposed = undefined; let sub = ''; arr.forEach((value) => { if (isPOJO(value)) { sub = this.decomposeObject(value, substring); } else if (Array.isArray(value)) { sub = this.decomposeArray(value, substring); } else { sub += value; } if (isPOJO(sub)) { decomposed = structuredClone(sub, decomposed); } else { decomposed[substring] = sub; } }); return decomposed; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: HsCatalogueMetadataService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: HsCatalogueMetadataService, providedIn: 'root' }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: HsCatalogueMetadataService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }] }); class HsCatalogueListItemComponent { constructor() { this.hsDatasourcesMetadataService = inject(HsCatalogueMetadataService); this.hsAddDataCatalogueService = inject(HsAddDataCatalogueService); this.hsDialogContainerService = inject(HsDialogContainerService); this.hsLaymanBrowserService = inject(HsLaymanBrowserService); this.hsLog = inject(HsLogService); this.hsRemoveLayerDialogService = inject(HsRemoveLayerDialogService); this.hsCommonLaymanService = inject(HsCommonLaymanService); this.layer = input(...(ngDevMode ? [undefined, { debugName: "layer" }] : [])); this.title = computed(() => this.layer().title, ...(ngDevMode ? [{ debugName: "title" }] : [])); this.abstract = computed(() => { const layer = this.layer(); const hasAbstract = layer['abstract']; return hasAbstract ? layer['abstract'] : ''; }, ...(ngDevMode ? [{ debugName: "abstract" }] : [])); //** Layers wfsWmsStatus is AVAILABLE */ this.layerAvailable = computed(() => { const layer = this.layer(); return (layer.endpoint.type === 'micka' || layer.wfsWmsStatus === 'AVAILABLE'); }, ...(ngDevMode ? [{ debugName: "layerAvailable" }] : [])); this.loadingInfo = false; this.loadingMetadata = false; } /** * Toggle add layer options */ toggleAddOptions() { if (!this.selectTypeToAddLayerVisible) { this.loadingInfo = true; this.describeCatalogueLayer(this.layer().endpoint, this.layer()); return; } this.abortAdd(); } /** * Get layer descriptor, show available options or add to map directly if only WFS available */ async describeCatalogueLayer(endpoint, layer) { this.whatToAdd = await this.hsAddDataCatalogueService.describeCatalogueLayer(endpoint, layer); this.loadingInfo = false; let availableTypes = this.whatToAdd.type; /** * Layer is available only as a WFS or its service */ if (this.whatToAdd.type === 'WFS' || layer.type.includes('service')) { this.selectTypeAndAdd(this.whatToAdd.type, new MouseEvent('click')); } else if (Array.isArray(availableTypes) || availableTypes == 'WMS') { availableTypes = availableTypes === 'WMS' ? [availableTypes] : availableTypes; /** * Add another type allowing user to choose image source type */ if (availableTypes.includes('WMS')) { availableTypes.splice(1, 0, 'WMTS'); } this.whatToAddTypes = availableTypes; } this.selectTypeToAddLayerVisible = Array.isArray(availableTypes); this.explanationsVisible = false; } abortAdd() { this.selectTypeToAddLayerVisible = Array.isArray(this.whatToAddTypes); this.explanationsVisible = false; } /** * Add layer by type click wrapper. Prevents bubbling of DOM event * @param type - One of 'WMS', 'WFS' * @param event - Mouse click event */ async selectTypeAndAdd(type, event) { event.preventDefault(); const layer = this.layer(); if (!this.whatToAdd) { this.whatToAdd = await this.hsAddDataCatalogueService.describeCatalogueLayer(layer.endpoint, layer); } if (!this.whatToAdd.type || this.whatToAdd.type === 'none') { this.hsLog.error('Could not get catalogue layer descriptor!'); return; } this.whatToAdd.type = type === 'WMS' || type === 'WMTS' ? 'WMS' : type; this.hsAddDataCatalogueService.addLayerToMap(layer.endpoint, this.whatToAdd, { useTiles: type === 'WMTS', }); } toggleExplanations() { this.explanationsVisible = !this.explanationsVisible; } /** * Show metadata record dialog window for selected layer. * @param endpoint - Datasource of selected layer * @param layer - Metadata record of selected layer */ async showMetadata() { const layer = this.layer(); const endpoint = layer.endpoint; let layerWithMetadata; if (endpoint.type.includes('layman')) { this.loadingMetadata = true; layerWithMetadata = await this.hsLaymanBrowserService.fillLayerMetadata(endpoint, layer); } //this.metadata = this.hsDatasourcesMetadataService.decomposeMetadata(layer); //console.log(this.metadata); const { HsCatalogueMetadataComponent } = await Promise.resolve().then(function () { return catalogueMetadata_component; }); this.hsDialogContainerService.create(HsCatalogueMetadataComponent, { data: { selectedLayer: layerWithMetadata || layer, selectedDS: endpoint, }, signalInput: true, }); this.loadingMetadata = false; } /** * Show permissions dialog window for selected layer. * @param layer - Metadata record of selected layer */ async showPermissions() { const layer = this.layer(); if (!this.hsCommonLaymanService.isAuthenticated()) { return; } this.hsDialogContainerService.create(HsSetPermissionsDialogComponent, { recordType: 'layer', selectedRecord: layer, onPermissionSaved: { service: this.hsAddDataCatalogueService, method: 'reloadData', }, }); } /** * @param endpoint - Datasource of selected layer * @param layer - Metadata record of selected layer * @returns URL to record file */ layerRDF(endpoint, layer) { return this.hsAddDataCatalogueService.layerRDF(endpoint, layer); } /** * Removes selected drawing layer from both Layermanager and Layman * @param layer - Metadata record of selected layer */ async removeLayer() { const layer = this.layer(); if (!layer.editable) { return; } const confirmed = await this.hsRemoveLayerDialogService.removeLayer(layer.name, ['catalogue']); if (confirmed) { this.hsAddDataCatalogueService.catalogEntries = this.hsAddDataCatalogueService.catalogEntries.filter((item) => { return item.id != layer.id; }); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: HsCatalogueListItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.3", type: HsCatalogueListItemComponent, isStandalone: true, selector: "hs-catalogue-list-item", inputs: { layer: { classPropertyName: "layer", publicName: "layer", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@let editable = layer().editable;\n<div class=\"d-flex flex-column\" [class.disabled]=\"!layerAvailable\">\n <div style=\" display: flex; justify-content: space-between;\">\n <a class=\"hs-catalogue-list-item-title\" data-toggle=\"tooltip\" [title]=\"abstract()\">{{title() ||\n abstract()}}</a>\n <!-- STATUS BADGE -->\n @if (loadingMetadata) {\n <span class=\"pe-2 hs-loader hs-loader-dark\"></span>\n }\n @if (!layerAvailable) {\n <span class=\"badge rounded-pill w-auto\" [class.bg-danger]=\"layer().wfsWmsStatus === 'NOT_AVAILABLE'\"\n [class.bg-warning]=\"layer().wfsWmsStatus === 'PREPARING'\"> {{'COMMON.' + layer().wfsWmsStatus | translate }}</span>\n }\n </div>\n @if (hsAddDataCatalogueService.selectedLayer?.id === layer().id) {\n <div class=\"hs-catalogue-item-body d-flex flex-column w-100 justify-content-around mt-2\">\n <div class=\"d-flex flex-row justify-content-around align-items-end\">\n <div class=\"btn-group\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"btn btn-sm border-0\" [class.disabled]=\"!layerAvailable\"\n (click)=\"selectTypeAndAdd('WMS',$event)\">\n <i class=\"fa-solid fa-plus icon-primary\"></i>\n @if (layerAvailable) {\n <span class=\"ms-1\">{{'COMMON.addToMap' |\n translate }}</span>\n }\n </button>\n @if (layerAvailable) {\n <div class=\"btn-group\" role=\"group\">\n <button type=\"button\" class=\"btn btn-sm dropdown-toggle-split btn-outline-primary border-0 dropdown-toggle\"\n (click)=\"$event.stopPropagation();toggleAddOptions()\">\n </button>\n </div>\n }\n </div>\n <a class=\"btn btn-sm border-0\" (click)=\"showMetadata()\">\n <i class=\"fa-solid fa-circle-info icon-primary\"></i><span class=\"ms-1\">{{'COMMON.metadata' |\n translate }}</span>\n </a>\n <a class=\"btn btn-sm border-0\" (click)=\"$event.stopPropagation();showPermissions()\" data-toggle=\"tooltip\"\n data-placement=\"bottom\"\n [title]=\"layer().editable ? '' : 'DATASOURCE_SELECTOR.datasourceListItem.notAllowedToEditLayer' | translate \">\n <i class=\"fa-solid fa-lock icon-primary\" [ngClass]=\"{'text-muted': !layer().editable}\"\n [ngStyle]=\"{'cursor' : layer().editable ? 'pointer' : 'default'}\"></i>@if (layer().editable) {\n <span class=\"ms-1\">{{'COMMON.setPermissions' | translate }}</span>\n }\n </a>\n <a class=\"btn btn-sm border-0\" (click)=\"$event.stopPropagation();removeLayer()\" data-toggle=\"tooltip\"\n data-placement=\"bottom\"\n [title]=\"editable ? '' : 'DATASOURCE_SELECTOR.datasourceListItem.notAllowedToEditLayer' | translate \">\n <i class=\"fa-solid fa-trash text-danger\" [ngClass]=\"editable ? 'text-danger' : 'text-muted'\"\n [ngStyle]=\"{'cursor' : editable ? 'pointer' : 'default'}\"></i>@if (editable) {\n <span class=\"ms-1\">{{'COMMON.removeLayer' | translate }}</span>\n }\n </a>\n </div>\n </div>\n }\n <div class=\"d-none\">\n <div class=\"p-0\" [hidden]='hsAddDataCatalogueService.layerDownload(layer().endpoint,layer()) === \"#\"'>\n <!-- TODO: Remove function call from template -->\n <a class=\"btn btn-sm border-0 btn-secondary\"\n [href]='hsAddDataCatalogueService.layerDownload(layer().endpoint, layer())' data-toggle=\"tooltip\"\n [title]=\"'COMMON.download' | translate \"><i class=\"fa-solid fa-download\"></i></a>\n </div>\n </div>\n</div>\n<div>\n <div [hidden]=\"!loadingInfo\" class=\"list-group-item text-primary text-center py-2\">\n <span class=\"pe-2 hs-loader hs-loader-dark\"></span>\n &emsp;{{'ADDDATA.CATALOGUE.loading' | translate }}\n </div>\n <div class=\"card bg-light align-items-center\"\n [hidden]=\"!selectTypeToAddLayerVisible || loadingInfo || hsAddDataCatalogueService.selectedLayer?.id !== layer().id\">\n <div class=\"d-flex flex-row justify-content-between align-items-center w-100\">\n <div class=\"px-3 py-2\">\n <span class=\"btn btn-sm disabled border-0\" disabled=\"true\" aria-disabled=\"true\">{{\n 'COMMON.addAs' |\n translate }}&nbsp;</span>\n <div class=\"btn-group btn-group-toggle h-100 pe-2 align-items-center\" data-toggle=\"buttons\">\n @for (type of whatToAddTypes; track type) {\n <label class=\"btn btn-sm btn-outline-secondary\" style=\"width:6em\" (click)=\"selectTypeAndAdd(type,$event)\">\n {{type}}\n </label>\n }\n </div>\n <a class=\"btn btn-sm border-0 px-0\" style=\"margin-top: -1rem;\"\n (click)=\"$event.stopPropagation();toggleExplanations()\"\n [title]=\"'DATASOURCE_SELECTOR.datasourceListItem.whatDoesItMean' | translate \"> \n <i class=\"fa-solid fa-circle-question text-primary\"></i>\n </a>\n </div>\n <a class=\"btn btn-sm border-0\" [title]=\"'COMMON.close' | translate \"\n (click)=\"$event.stopPropagation();abortAdd()\" [hidden]=\"!selectTypeToAddLayerVisible\">\n <i class=\"fa-solid fa-xmark text-danger\"></i>\n </a>\n </div>\n <div class=\"d-flex\">\n <ul class=\"ms-auto p-2 list-unstyled\" [hidden]=\"!explanationsVisible\">\n @for (type of whatToAddTypes; track type) {\n <li class=\"text-secondary small\">\n {{type}} &ndash; {{'ADDDATA.CATALOGUE.DESC.' + type | translate }}\n </li>\n }\n </ul>\n </div>\n </div>\n</div>\n", styles: [".dropdown-toggle:after{font-size:1.25rem;vertical-align:initial}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: HsCatalogueListItemComponent, decorators: [{ type: Component, args: [{ selector: 'hs-catalogue-list-item', imports: [NgClass, NgStyle, TranslatePipe], template: "@let editable = layer().editable;\n<div class=\"d-flex flex-column\" [class.disabled]=\"!layerAvailable\">\n <div style=\" display: flex; justify-content: space-between;\">\n <a class=\"hs-catalogue-list-item-title\" data-toggle=\"tooltip\" [title]=\"abstract()\">{{title() ||\n abstract()}}</a>\n <!-- STATUS BADGE -->\n @if (loadingMetadata) {\n <span class=\"pe-2 hs-loader hs-loader-dark\"></span>\n }\n @if (!layerAvailable) {\n <span class=\"badge rounded-pill w-auto\" [class.bg-danger]=\"layer().wfsWmsStatus === 'NOT_AVAILABLE'\"\n [class.bg-warning]=\"layer().wfsWmsStatus === 'PREPARING'\"> {{'COMMON.' + layer().wfsWmsStatus | translate }}</span>\n }\n </div>\n @if (hsAddDataCatalogueService.selectedLayer?.id === layer().id) {\n <div class=\"hs-catalogue-item-body d-flex flex-column w-100 justify-content-around mt-2\">\n <div class=\"d-flex flex-row justify-content-around align-items-end\">\n <div class=\"btn-group\" (click)=\"$event.stopPropagation()\">\n <button type=\"button\" class=\"btn btn-sm border-0\" [class.disabled]=\"!layerAvailable\"\n (click)=\"selectTypeAndAdd('WMS',$event)\">\n <i class=\"fa-solid fa-plus icon-primary\"></i>\n @if (layerAvailable) {\n <span class=\"ms-1\">{{'COMMON.addToMap' |\n translate }}</span>\n }\n </button>\n @if (layerAvailable) {\n <div class=\"btn-group\" role=\"group\">\n <button type=\"button\" class=\"btn btn-sm dropdown-toggle-split btn-outline-primary border-0 dropdown-toggle\"\n (click)=\"$event.stopPropagation();toggleAddOptions()\">\n </button>\n </div>\n }\n </div>\n <a class=\"btn btn-sm border-0\" (click)=\"showMetadata()\">\n <i class=\"fa-solid fa-circle-info icon-primary\"></i><span class=\"ms-1\">{{'COMMON.metadata' |\n translate }}</span>\n </a>\n <a class=\"btn btn-sm border-0\" (click)=\"$event.stopPropagation();showPermissions()\" data-toggle=\"tooltip\"\n data-placement=\"bottom\"\n [title]=\"layer().editable ? '' : 'DATASOURCE_SELECTOR.datasourceListItem.notAllowedToEditLayer' | translate \">\n <i class=\"fa-solid fa-lock icon-primary\" [ngClass]=\"{'text-muted': !layer().editable}\"\n [ngStyle]=\"{'cursor' : layer().editable ? 'pointer' : 'default'}\"></i>@if (layer().editable) {\n <span class=\"ms-1\">{{'COMMON.setPermissions' | translate }}</span>\n }\n </a>\n <a class=\"btn btn-sm border-0\" (click)=\"$event.stopPropagation();removeLayer()\" data-toggle=\"tooltip\"\n data-placement=\"bottom\"\n [title]=\"editable ? '' : 'DATASOURCE_SELECTOR.datasourceListItem.notAllowedToEditLayer' | translate \">\n <i class=\"fa-solid fa-trash text-danger\" [ngClass]=\"editable ? 'text-danger' : 'text-muted'\"\n [ngStyle]=\"{'cursor' : editable ? 'pointer' : 'default'}\"></i>@if (editable) {\n <span class=\"ms-1\">{{'COMMON.removeLayer' | translate }}</span>\n }\n </a>\n </div>\n </div>\n }\n <div class=\"d-none\">\n <div class=\"p-0\" [hidden]='hsAddDataCatalogueService.layerDownload(layer().endpoint,layer()) === \"#\"'>\n <!-- TODO: Remove function call from template -->\n <a class=\"btn btn-sm border-0 btn-secondary\"\n [href]='hsAddDataCatalogueService.layerDownload(layer().endpoint, layer())' data-toggle=\"tooltip\"\n [title]=\"'COMMON.download' | translate \"><i class=\"fa-solid fa-download\"></i></a>\n </div>\n </div>\n</div>\n<div>\n <div [hidden]=\"!loadingInfo\" class=\"list-group-item text-primary text-center py-2\">\n <span class=\"pe-2 hs-loader hs-loader-dark\"></span>\n &emsp;{{'ADDDATA.CATALOGUE.loading' | translate }}\n </div>\n <div class=\"card bg-light align-items-center\"\n [hidden]=\"!selectTypeToAddLayerVisible || loadingInfo || hsAddDataCatalogueService.selectedLayer?.id !== layer().id\">\n <div class=\"d-flex flex-row justify-content-between align-items-center w-100\">\n <div class=\"px-3 py-2\">\n <span class=\"btn btn-sm disabled border-0\" disabled=\"true\" aria-disabled=\"true\">{{\n 'COMMON.addAs' |\n translate }}&nbsp;</span>\n <div class=\"btn-group btn-group-toggle h-100 pe-2 align-items-center\" data-toggle=\"buttons\">\n @for (type of whatToAddTypes; track type) {\n <label class=\"btn btn-sm btn-outline-secondary\" style=\"width:6em\" (click)=\"selectTypeAndAdd(type,$event)\">\n {{type}}\n </label>\n }\n </div>\n <a class=\"btn btn-sm border-0 px-0\" style=\"margin-top: -1rem;\"\n (click)=\"$event.stopPropagation();toggleExplanations()\"\n [title]=\"'DATASOURCE_SELECTOR.datasourceListItem.whatDoesItMean' | translate \"> \n <i class=\"fa-solid fa-circle-question text-primary\"></i>\n </a>\n </div>\n <a class=\"btn btn-sm border-0\" [title]=\"'COMMON.close' | translate \"\n (click)=\"$event.stopPropagation();abortAdd()\" [hidden]=\"!selectTypeToAddLayerVisible\">\n <i class=\"fa-solid fa-xmark text-danger\"></i>\n </a>\n </div>\n <div class=\"d-flex\">\n <ul class=\"ms-auto p-2 list-unstyled\" [hidden]=\"!explanationsVisible\">\n @for (type of whatToAddTypes; track type) {\n <li class=\"text-secondary small\">\n {{type}} &ndash; {{'ADDDATA.CATALOGUE.DESC.' + type | translate }}\n </li>\n }\n </ul>\n </div>\n </div>\n</div>\n", styles: [".dropdown-toggle:after{font-size:1.25rem;vertical-align:initial}\n"] }] }] }); class HsAddDataCatalogueComponent { constructor() { this.hsLanguageService = inject(HsLanguageService); this.hsConfig = inject(HsConfig); this.hsAddDataCatalogueService = inject(HsAddDataCatalogueService); this.hsAddDataCatalogueMapService = inject(HsAddDataCatalogueMapService); this.hsLayoutService = inject(HsLayoutService); this.hsLaymanService = inject(HsLaymanService); this.hsCommonLaymanService = inject(HsCommonLaymanService); this.hsAddDataService = inject(HsAddDataService); this.filterTypeMenu = signal(false, ...(ngDevMode ? [{ debugName: "filterTypeMenu" }] : [])); this.optionsButtonLabel = computed(() => this.filterTypeMenu() ? 'less' : 'more', ...(ngDevMode ? [{ debugName: "optionsButtonLabel" }] : [])); this.textFieldTypes = ['AnyText', 'Abstract', 'Title']; this.dataTypes = ['all', 'service', 'dataset']; this.sortbyTypes = ['date', 'title', 'bbox']; this.advancedSearch = false; } ngOnInit() { this.data = this.hsAddDataCatalogueService.data; } layerSelected(layer) { this.hsAddDataCatalogueService.selectedLayer = this.hsAddDataCatalogueService.selectedLayer == layer ? {} : layer; } toggleFilterTypeMenu() { this.filterTypeMenu.update((value) => !value); } queryByFilter() { /* * A bit tricky way how to force add-data hs-panel-header to refresh its template * in order to show/hide buttons. Previously done by reloadData call. * This achieves the same via datasetTypeSelected subscription in catalogue service */ this.hsAddDataService.datasetSelected.next(this.hsAddDataService.datasetSelected.getValue()); } selectType(type) { this.data.textField = type; if (this.data.query.textFilter.length > 0) { this.queryByFilter(); } } selectQueryType(type, query) { this.data.query[query] = type; this.queryByFilter(); } highlightLayer(layer, state) { layer.highlighted = state; this.hsAddDataCatalogueMapService.highlightLayer(layer, state); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: HsAddDataCatalogueComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.3", type: HsAddDataCatalogueComponent, isStandalone: true, selector: "hs-add-data-catalogue", ngImport: i0, template: "<div class=\"card hs-main-panel h-100\">\n <div class=\"hs-add-data-catalogue-header\">\n <div class=\"mt-3 mx-3 ps-1 d-flex justify-content-between\">\n <div class=\"input-group w-50\">\n <input type=\"search\" class=\"form-control w-50\" [placeholder]=\"'COMMON.search' | translate \" name=\"search\"\n [(ngModel)]=\"data.query.textFilter\" (ngModelChange)=\"queryByFilter()\">\n <button class=\"input-group-text text-secondary border-start-0\" (click)=\"queryByFilter()\">\n <i class=\"fa-solid fa-magnifying-glass icon-primary\"></i>\n </button>\n </div>\n <hs-layman-current-user />\n </div>\n <div class=\"d-flex ms-4 me-3 justify-content-between py-1 \">\n <div class=\"d-flex\">\n <div class=\"input-group-text border-0\" style=\"line-height: normal;\">\n <input type=\"checkbox\" class=\"checkbox-lg\" [(ngModel)]=\"data.filterByExtent\" (change)=\"queryByFilter()\"\n name=\"filterByExtent\">\n <span class=\"ms-2\">{{'COMPOSITIONS.filterByMap' | translate }}</span>\n </div>\n @if (hsCommonLaymanService.isAuthenticated()) {\n <div class=\"input-group-text border-0 ms-1\" style=\"line-height: normal;\">\n <input type=\"checkbox\" class=\"checkbox-lg\" [(ngModel)]=\"data.onlyMine\" (ngModelChange)=\"queryByFilter()\"\n name=\"onlyMine\">\n <span class=\"ms-2\">{{'COMPOSITIONS.onlyMine' | translate }}</span>\n </div>\n }\n </div>\n <div ngbDropdown display=\"dynamic\" placement=\"bottom-right\" class=\"d-inline-block\"\n data-cy=\"hs-addData-catalogue-filter\">\n <button class=\"btn btn-light hs-white-background hs-custom-toggle\" (click)=\"toggleFilterTypeMenu()\"\n ngbDropdownToggle>{{'COMMON.' + optionsButtonLabel() | translate}}</button>\n <div ngbDropdownMenu class=\"dropdown-menu-right p-2 m-1\"\n style=\"min-width: 23rem; max-width: 23rem; overflow: visible\" aria-labelledby=\"filtersDropdown\">\n <table class=\"p-1 ps-3\" style=\"border-collapse:separate; border-spacing:0.5rem 0.5rem;\">\n <tbody>\n <tr>\n <td class=\"tdbreak\">\n {{'ADDDATA.CATALOGUE.filterType' | translate }}\n </td>\n <td ngbDropdown display=\"dynamic\" placement=\"bottom-right\" #searchTypeDropdown=\"ngbDropdown\">\n <button type=\"button\" ngbDropdownToggle\n class=\"btn btn-light btn-sm hs-custom-toggle hs-background-alfa p-2 ps-1 border-0\"\n style=\"text-align:start; min-width: 11rem; max-width: 11rem; border-radius: 0px; justify-content: space-between; display:flex; align-items: center;\">\n {{'ADDDATA.CATALOGUE.searchFilterTypes.' + data.textField | translate}}\n </button>\n <ul ngbDropdownMenu aria-labelledby=\"searchType\" class=\"ps-2\"\n style=\"overflow-y: auto; max-height: 10rem; min-width:10rem\">\n @for (searchType of textFieldTypes; track searchType; let index = $index) {\n <li class=\"p-2 p-md-0\">\n <label style=\"cursor: pointer;\"><input class=\"me-2\" type=\"radio\" name=\"searchType-index\"\n [checked]=\"(index === 0)\"\n (change)=\"selectType(searchType); searchTypeDropdown.close()\">{{'ADDDATA.CATALOGUE.searchFilterTypes.' + searchType | translate}}</label>\n </li>\n }\n </ul>\n </td>\n </tr>\n <tr>\n <td class=\"tdbreak\">\n {{'ADDDATA.CATALOGUE.resourceType' | translate }}\n </td>\n <td ngbDropdown display=\"dynamic\" placement=\"bottom-right\" #resourceType=\"ngbDropdown\">\n <button type=\"button\" ngbDropdownToggle\n class=\"btn btn-light btn-sm hs-custom-toggle hs-background-alfa p-2 ps-1 border-0\"\n style=\"text-align:start; min-width: 11rem; max-width: 11rem; border-radius: 0px; justify-content: space-between; display:flex; align-items: center;\">\n {{'ADDDATA.CATALOGUE.queryDataTypes.' + data.query.type | translate}}\n </button>\n <ul ngbDropdownMenu aria-labelledby=\"type\" class=\"ps-2\"\n style=\"overflow-y: auto; max-height: 10rem; min-width:10rem\">\n @for (type of dataTypes; track type; let index = $index) {\n <li class=\"p-2 p-md-0\">\n <label style=\"cursor: pointer;\"><input class=\"me-2\" type=\"radio\" name=\"type-index\"\n [checked]=\"(index === 0)\"\n (change)=\"selectQueryType(type, 'type');resourceType.close()\">{{'ADDDATA.CATALOGUE.queryDataTypes.' + type | translate}}</label>\n </li>\n }\n </ul>\n </td>\n </tr>\n <tr>\n <td class=\"tdbreak\">\n {{'COMMON.sortBy' | translate }}\n </td>\n <td ngbDropdown display=\"dynamic\" placement=\"bottom-right\" #sortByDrop=\"ngbDropdown\">\n <button type=\"button\" ngbDropdownToggle\n class=\"btn btn-light btn-sm hs-custom-toggle hs-background-alfa p-2 ps-1 border-0\"\n style=\"text-align:start; min-width: 11rem; max-width: 11rem; border-radius: 0px; justify-content: space-between; display:flex; align-items: center;\">\n {{'ADDDATA.CATALOGUE.sortbyTypes.' + data.query.sortby | translate}}\n <!-- TODO: Remove function call from template -->\n </button>\n <ul ngbDropdownMenu aria-labelledby=\"sortBy\" class=\"ps-2\"\n style=\"overflow-y: auto; max-height: 10rem; min-width:10rem\">\n @for (sortType of sortbyTypes; track sortType; let index = $index) {\n <li class=\"p-2 p-md-0\">\n <label style=\"cursor: pointer;\"><input class=\"me-2\" type=\"radio\" name=\"sort-index\"\n [checked]=\"(index === 0)\"\n (change)=\"selectQueryType(sortType, 'sortby');sortByDrop.close()\">{{'ADDDATA.CATALOGUE.sortbyTypes.' + sortType | translate}}</label>\n </li>\n }\n </ul>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n </div>\n </div>\n </div>\n <div class=\"card d-flex border-0 flex-fill\" style=\"font-size: 1rem !important; overflow-y: auto;\">\n <div class=\"card-body\">\n <ul class=\"list-group\">\n @for (layer of hsAddDataCatalogueService.catalogEntries; track layer.id) {\n <li [hidden]=\"hsAddDataCatalogueService.dataLoading\" style=\"cursor: pointer;\"\n class=\"list-group-item border-0 border-bottom\" [class.hs-endpoint-item-active]=\"layer.highlighted\"\n (click)=\"layerSelected(layer)\" (mouseover)=\"highlightLayer(layer, true)\"\n (mouseleave)=\"highlightLayer(layer, false)\">\n <hs-catalogue-list-item [layer]=\"layer\" class=\"w-100\"></hs-catalogue-list-item>\n </li>\n }\n <li class='list-group-item text-primary text-center py-2 border-0' style=\"font-size: 1.25rem;\"\n [hidden]=\"!hsAddDataCatalogueService.dataLoading\"><span\n class=\"pe-2 hs-loader hs-loader-dark\"></span>&emsp;{{'ADDDATA.CATALOGUE.loading' | translate\n }}</li>\n <li [hidden]='hsAddDataCatalogueService.catalogEntries.length > 0 || hsAddDataCatalogueService.dataLoading'\n class='list-group-item' style=\"border-top-width: 1px; border-radius: inherit\">\n {{'DATASOURCE_SELECTOR.noResults' | translate }}</li>\n </ul>\n </div>\n </div>\n @if (hsAddDataCatalogueService.matchedRecords !== 0 && !hsAddDataCatalogueService.dataLoading) {\n <hs-pager class=\"sticky-bottom bg-white border-0\" [pagerService]=\"hsAddDataCatalogueService\"></hs-pager>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: HsPagerModule }, { kind: "component", type: i2.HsPagerComponent, selector: "hs-pager", inputs: ["pagerService"] }, { kind: "ngmodule", type: NgbDropdownModule }, { kind: "directive", type: i3.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "popperOptions", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { kind: "directive", type: i3.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { kind: "directive", type: i3.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { kind: "component", type: HsCatalogueListItemComponent, selector: "hs-catalogue-list-item", inputs: ["layer"] }, { kind: "component", type: HsLaymanCurrentUserComponent, selector: "hs-layman-current-user" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.3", ngImport: i0, type: HsAddDataCatalogueComponent, decorators: [{ type: Component, args: [{ selector: 'hs-add-data-catalogue', imports: [ FormsModule, HsPagerModule, NgbDropdownModule, TranslatePipe, HsCatalogueListItemComponent, HsLaymanCurrentUserComponent