hslayers-ng
Version:
HSLayers-NG mapping library
472 lines (467 loc) • 248 kB
JavaScript
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  {{'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 }} </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}} – {{'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  {{'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 }} </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}} – {{'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> {{'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