geonetwork-ui 2.9.0-dev.083d7682e → 2.9.0-dev.0a933c7e0
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/fesm2022/geonetwork-ui.mjs +141 -27
- package/fesm2022/geonetwork-ui.mjs.map +1 -1
- package/index.d.ts +14 -3
- package/index.d.ts.map +1 -1
- package/package.json +7 -7
- package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.html +8 -10
- package/src/libs/feature/dataviz/src/lib/service/data.service.ts +13 -3
- package/src/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.ts +2 -0
- package/src/libs/feature/record/src/lib/map-view/map-view.component.html +10 -18
- package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +96 -9
- package/src/libs/feature/record/src/lib/state/mdview.facade.ts +1 -1
- package/src/libs/feature/router/src/lib/default/services/router-search.service.ts +15 -3
- package/src/libs/feature/router/src/lib/default/state/router.effects.ts +40 -4
- package/src/libs/feature/router/src/lib/default/state/router.facade.ts +2 -0
- package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +1 -0
- package/src/libs/feature/search/src/lib/state/reducer.ts +4 -0
- package/src/libs/feature/search/src/lib/utils/service/search.service.ts +2 -0
- package/src/libs/ui/map/src/lib/map-utils.ts +1 -1
- package/translations/de.json +2 -1
- package/translations/en.json +1 -0
- package/translations/es.json +1 -0
- package/translations/fr.json +1 -0
- package/translations/it.json +1 -0
- package/translations/nl.json +1 -0
- package/translations/pt.json +1 -0
- package/translations/sk.json +1 -0
|
@@ -18970,6 +18970,7 @@ var de = {
|
|
|
18970
18970
|
"map.ogc.urlInput.hint": "Die URL des OGC API-Dienstes eingeben",
|
|
18971
18971
|
"map.select.layer": "Datenquelle",
|
|
18972
18972
|
"map.select.style": "Style",
|
|
18973
|
+
"map.style.default": "Standard",
|
|
18973
18974
|
"map.wfs.urlInput.hint": "Die WFS URL eingeben",
|
|
18974
18975
|
"map.wms.urlInput.hint": "Die WMS URL eingeben",
|
|
18975
18976
|
"multiselect.filter.placeholder": "Suche",
|
|
@@ -19192,6 +19193,7 @@ var de = {
|
|
|
19192
19193
|
"search.filters.producerOrg": "Herausgeber",
|
|
19193
19194
|
"search.filters.publicationYear": "Veröffentlichungsjahr",
|
|
19194
19195
|
"search.filters.publisherOrg": "Vertreiber",
|
|
19196
|
+
"search.filters.recordKind": "",
|
|
19195
19197
|
"search.filters.recordKind.all": "Alle",
|
|
19196
19198
|
"search.filters.recordKind.dataset": "Datensätze",
|
|
19197
19199
|
"search.filters.recordKind.reuse": "Wiederverwendungen",
|
|
@@ -19230,8 +19232,8 @@ var de = {
|
|
|
19230
19232
|
"service.metadata.spatialExtent": "Räumliche Ausdehnung",
|
|
19231
19233
|
"share.tab.permalink": "Teilen",
|
|
19232
19234
|
"share.tab.webComponent": "Integrieren",
|
|
19233
|
-
"stac.filter.reset": "",
|
|
19234
19235
|
"stac.filter.enable": "",
|
|
19236
|
+
"stac.filter.reset": "",
|
|
19235
19237
|
"stac.results.noResults": "Ihre Suchfilter lieferten keine Ergebnisse",
|
|
19236
19238
|
"table.loading.data": "Daten werden geladen...",
|
|
19237
19239
|
"table.object.count": "Objekte in diesem Datensatz",
|
|
@@ -19641,6 +19643,7 @@ var en = {
|
|
|
19641
19643
|
"map.ogc.urlInput.hint": "Enter OGC API service URL",
|
|
19642
19644
|
"map.select.layer": "Data source",
|
|
19643
19645
|
"map.select.style": "Style",
|
|
19646
|
+
"map.style.default": "Default",
|
|
19644
19647
|
"map.wfs.urlInput.hint": "Enter WFS service URL",
|
|
19645
19648
|
"map.wms.urlInput.hint": "Enter WMS service URL",
|
|
19646
19649
|
"multiselect.filter.placeholder": "Search",
|
|
@@ -20313,6 +20316,7 @@ var es = {
|
|
|
20313
20316
|
"map.ogc.urlInput.hint": "",
|
|
20314
20317
|
"map.select.layer": "",
|
|
20315
20318
|
"map.select.style": "",
|
|
20319
|
+
"map.style.default": "Por defecto",
|
|
20316
20320
|
"map.wfs.urlInput.hint": "",
|
|
20317
20321
|
"map.wms.urlInput.hint": "",
|
|
20318
20322
|
"multiselect.filter.placeholder": "",
|
|
@@ -20985,6 +20989,7 @@ var fr = {
|
|
|
20985
20989
|
"map.ogc.urlInput.hint": "Entrez l'URL du service OGC API",
|
|
20986
20990
|
"map.select.layer": "Source de données",
|
|
20987
20991
|
"map.select.style": "Style",
|
|
20992
|
+
"map.style.default": "Par défaut",
|
|
20988
20993
|
"map.wfs.urlInput.hint": "Entrez l'URL du service WFS",
|
|
20989
20994
|
"map.wms.urlInput.hint": "Entrez l'URL du service WMS",
|
|
20990
20995
|
"multiselect.filter.placeholder": "Rechercher",
|
|
@@ -21657,6 +21662,7 @@ var it = {
|
|
|
21657
21662
|
"map.ogc.urlInput.hint": "Inserisci URL del servizio OGC API",
|
|
21658
21663
|
"map.select.layer": "Sorgente dati",
|
|
21659
21664
|
"map.select.style": "Style",
|
|
21665
|
+
"map.style.default": "Predefinito",
|
|
21660
21666
|
"map.wfs.urlInput.hint": "Inserisci URL del servizio WFS",
|
|
21661
21667
|
"map.wms.urlInput.hint": "Inserisci URL del servizio WMS",
|
|
21662
21668
|
"multiselect.filter.placeholder": "Cerca",
|
|
@@ -22329,6 +22335,7 @@ var nl = {
|
|
|
22329
22335
|
"map.ogc.urlInput.hint": "",
|
|
22330
22336
|
"map.select.layer": "",
|
|
22331
22337
|
"map.select.style": "",
|
|
22338
|
+
"map.style.default": "Standaard",
|
|
22332
22339
|
"map.wfs.urlInput.hint": "",
|
|
22333
22340
|
"map.wms.urlInput.hint": "",
|
|
22334
22341
|
"multiselect.filter.placeholder": "",
|
|
@@ -23001,6 +23008,7 @@ var pt = {
|
|
|
23001
23008
|
"map.ogc.urlInput.hint": "",
|
|
23002
23009
|
"map.select.layer": "",
|
|
23003
23010
|
"map.select.style": "",
|
|
23011
|
+
"map.style.default": "Padrão",
|
|
23004
23012
|
"map.wfs.urlInput.hint": "",
|
|
23005
23013
|
"map.wms.urlInput.hint": "",
|
|
23006
23014
|
"multiselect.filter.placeholder": "",
|
|
@@ -23673,6 +23681,7 @@ var sk = {
|
|
|
23673
23681
|
"map.ogc.urlInput.hint": "",
|
|
23674
23682
|
"map.select.layer": "Zdroj dát",
|
|
23675
23683
|
"map.select.style": "",
|
|
23684
|
+
"map.style.default": "Predvolené",
|
|
23676
23685
|
"map.wfs.urlInput.hint": "Zadajte URL adresu služby WFS",
|
|
23677
23686
|
"map.wms.urlInput.hint": "Zadajte URL adresu služby WMS",
|
|
23678
23687
|
"multiselect.filter.placeholder": "Hľadať",
|
|
@@ -25508,7 +25517,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
25508
25517
|
}] } });
|
|
25509
25518
|
|
|
25510
25519
|
var name = "geonetwork-ui";
|
|
25511
|
-
var version = "2.9.0-dev.
|
|
25520
|
+
var version = "2.9.0-dev.0a933c7e0";
|
|
25512
25521
|
var engines = {
|
|
25513
25522
|
node: ">=20"
|
|
25514
25523
|
};
|
|
@@ -25548,11 +25557,11 @@ var peerDependencies = {
|
|
|
25548
25557
|
};
|
|
25549
25558
|
var dependencies = {
|
|
25550
25559
|
"@biesbjerg/ngx-translate-extract-marker": "~1.0.0",
|
|
25551
|
-
"@camptocamp/ogc-client": "1.3.1-dev.
|
|
25552
|
-
"@geospatial-sdk/core": "0.0.5-dev.
|
|
25553
|
-
"@geospatial-sdk/geocoding": "0.0.5-dev.
|
|
25554
|
-
"@geospatial-sdk/legend": "0.0.5-dev.
|
|
25555
|
-
"@geospatial-sdk/openlayers": "0.0.5-dev.
|
|
25560
|
+
"@camptocamp/ogc-client": "1.3.1-dev.12086e8",
|
|
25561
|
+
"@geospatial-sdk/core": "0.0.5-dev.61",
|
|
25562
|
+
"@geospatial-sdk/geocoding": "0.0.5-dev.61",
|
|
25563
|
+
"@geospatial-sdk/legend": "0.0.5-dev.61",
|
|
25564
|
+
"@geospatial-sdk/openlayers": "0.0.5-dev.61",
|
|
25556
25565
|
"@ltd/j-toml": "~1.35.2",
|
|
25557
25566
|
"@messageformat/core": "^3.0.1",
|
|
25558
25567
|
"@ng-icons/core": "29.10.0",
|
|
@@ -25578,7 +25587,7 @@ var dependencies = {
|
|
|
25578
25587
|
"ngx-chips": "3.0.0",
|
|
25579
25588
|
"ngx-dropzone": "3.1.0",
|
|
25580
25589
|
"ngx-translate-messageformat-compiler": "~7.1.0",
|
|
25581
|
-
ol: "^
|
|
25590
|
+
ol: "^10.0.0",
|
|
25582
25591
|
papaparse: "5.4.1",
|
|
25583
25592
|
pg: "^8.9.0",
|
|
25584
25593
|
proj4: "^2.9.2",
|
|
@@ -32011,7 +32020,10 @@ function reducerSearch(state, action) {
|
|
|
32011
32020
|
},
|
|
32012
32021
|
};
|
|
32013
32022
|
}
|
|
32023
|
+
// From router.effects
|
|
32024
|
+
// From home - fuzzy-search - search.service
|
|
32014
32025
|
case SET_FILTERS: {
|
|
32026
|
+
console.log('reducerSearch - SET_FILTERS', action.payload);
|
|
32015
32027
|
return {
|
|
32016
32028
|
...state,
|
|
32017
32029
|
params: {
|
|
@@ -32032,6 +32044,7 @@ function reducerSearch(state, action) {
|
|
|
32032
32044
|
},
|
|
32033
32045
|
};
|
|
32034
32046
|
}
|
|
32047
|
+
// From results WC
|
|
32035
32048
|
case SET_SEARCH: {
|
|
32036
32049
|
return {
|
|
32037
32050
|
...state,
|
|
@@ -32541,10 +32554,12 @@ class SearchService {
|
|
|
32541
32554
|
this.facade = inject(SearchFacade);
|
|
32542
32555
|
}
|
|
32543
32556
|
setSortAndFilters(filters, sort) {
|
|
32557
|
+
console.log('SearchService - setSortAndFilters', { filters, sort });
|
|
32544
32558
|
this.setFilters(filters);
|
|
32545
32559
|
this.setSortBy(sort);
|
|
32546
32560
|
}
|
|
32547
32561
|
updateFilters(params) {
|
|
32562
|
+
console.log('SearchService - updateFilters', params);
|
|
32548
32563
|
this.facade.searchFilters$
|
|
32549
32564
|
.pipe(first$1(), map$1((filters) => ({ ...filters, ...params })))
|
|
32550
32565
|
.subscribe((filters) => this.facade.setFilters(filters));
|
|
@@ -36147,6 +36162,7 @@ class FuzzySearchComponent {
|
|
|
36147
36162
|
this.inputSubmitted.emit(any);
|
|
36148
36163
|
}
|
|
36149
36164
|
else {
|
|
36165
|
+
console.log('FuzzySearchComponent - handleInputSubmission', any);
|
|
36150
36166
|
this.searchService.updateFilters({ any });
|
|
36151
36167
|
}
|
|
36152
36168
|
}
|
|
@@ -38370,12 +38386,12 @@ class DataService {
|
|
|
38370
38386
|
throw new Error(`ogc.unreachable.unknown`);
|
|
38371
38387
|
});
|
|
38372
38388
|
}
|
|
38373
|
-
async getItemsFromOgcApi(url) {
|
|
38389
|
+
async getItemsFromOgcApi(url, limit) {
|
|
38374
38390
|
const endpoint = new OgcApiEndpoint(url);
|
|
38375
38391
|
return await endpoint.featureCollections
|
|
38376
38392
|
.then((collections) => {
|
|
38377
38393
|
return collections.length
|
|
38378
|
-
? endpoint.getCollectionItems(collections[0])
|
|
38394
|
+
? endpoint.getCollectionItems(collections[0], limit)
|
|
38379
38395
|
: null;
|
|
38380
38396
|
})
|
|
38381
38397
|
.catch(() => {
|
|
@@ -38471,7 +38487,9 @@ class DataService {
|
|
|
38471
38487
|
if (!geojsonUrl) {
|
|
38472
38488
|
return throwError(() => 'ogc.geojson.notsupported');
|
|
38473
38489
|
}
|
|
38474
|
-
|
|
38490
|
+
const urlWithoutLimit = new URL(geojsonUrl);
|
|
38491
|
+
urlWithoutLimit.searchParams.delete('limit');
|
|
38492
|
+
return openDataset(urlWithoutLimit.toString(), 'geojson', undefined, cacheActive);
|
|
38475
38493
|
}));
|
|
38476
38494
|
}
|
|
38477
38495
|
return throwError(() => 'protocol not supported');
|
|
@@ -39148,7 +39166,7 @@ class ChartViewComponent {
|
|
|
39148
39166
|
this.changeDetector.detectChanges();
|
|
39149
39167
|
}
|
|
39150
39168
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ChartViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
39151
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ChartViewComponent, isStandalone: true, selector: "gn-ui-chart-view", inputs: { featureCatalog: "featureCatalog", cacheActive: "cacheActive", link: "link", aggregation: "aggregation", xProperty: "xProperty", yProperty: "yProperty", chartType: "chartType", userChartConfig: "userChartConfig" }, outputs: { chartConfig$: "chartConfig$" }, ngImport: i0, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n @if (yChoices$ | async; as yChoices) {\n
|
|
39169
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ChartViewComponent, isStandalone: true, selector: "gn-ui-chart-view", inputs: { featureCatalog: "featureCatalog", cacheActive: "cacheActive", link: "link", aggregation: "aggregation", xProperty: "xProperty", yProperty: "yProperty", chartType: "chartType", userChartConfig: "userChartConfig" }, outputs: { chartConfig$: "chartConfig$" }, ngImport: i0, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n @if (yChoices$ | async; as yChoices) {\n <gn-ui-dropdown-selector\n class=\"basis-1/4 select-y-prop\"\n [choices]=\"yChoices\"\n [disabled]=\"isCountAggregation\"\n (selectValue)=\"yProperty$.next($event)\"\n [selected]=\"yProperty$.value\"\n [title]=\"'chart.dropdown.yProperty' | translate\"\n ></gn-ui-dropdown-selector>\n }\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"aggregationChoices\"\n class=\"aggregation-choices\"\n (selectValue)=\"aggregation$.next($event)\"\n [selected]=\"aggregation$.value\"\n [title]=\"'chart.dropdown.aggregation' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n <div\n class=\"relative h-full mt-2 bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n @if (!error) {\n <gn-ui-chart\n [data]=\"chartData$ | async\"\n [type]=\"chartType$.value\"\n [prettyLabel]=\"prettyLabel$ | async\"\n [labelProperty]=\"labelProperty\"\n [valueProperty]=\"valueProperty\"\n ></gn-ui-chart>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'chart.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: ChartComponent, selector: "gn-ui-chart", inputs: ["data", "labelProperty", "prettyLabel", "valueProperty", "secondaryValueProperty", "type"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
39152
39170
|
}
|
|
39153
39171
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ChartViewComponent, decorators: [{
|
|
39154
39172
|
type: Component,
|
|
@@ -39159,7 +39177,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
39159
39177
|
LoadingMaskComponent,
|
|
39160
39178
|
PopupAlertComponent,
|
|
39161
39179
|
TranslatePipe,
|
|
39162
|
-
], standalone: true, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n @if (yChoices$ | async; as yChoices) {\n
|
|
39180
|
+
], standalone: true, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n @if (yChoices$ | async; as yChoices) {\n <gn-ui-dropdown-selector\n class=\"basis-1/4 select-y-prop\"\n [choices]=\"yChoices\"\n [disabled]=\"isCountAggregation\"\n (selectValue)=\"yProperty$.next($event)\"\n [selected]=\"yProperty$.value\"\n [title]=\"'chart.dropdown.yProperty' | translate\"\n ></gn-ui-dropdown-selector>\n }\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"aggregationChoices\"\n class=\"aggregation-choices\"\n (selectValue)=\"aggregation$.next($event)\"\n [selected]=\"aggregation$.value\"\n [title]=\"'chart.dropdown.aggregation' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n <div\n class=\"relative h-full mt-2 bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n @if (!error) {\n <gn-ui-chart\n [data]=\"chartData$ | async\"\n [type]=\"chartType$.value\"\n [prettyLabel]=\"prettyLabel$ | async\"\n [labelProperty]=\"labelProperty\"\n [valueProperty]=\"valueProperty\"\n ></gn-ui-chart>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'chart.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n</div>\n" }]
|
|
39163
39181
|
}], propDecorators: { featureCatalog: [{
|
|
39164
39182
|
type: Input
|
|
39165
39183
|
}], cacheActive: [{
|
|
@@ -39472,7 +39490,7 @@ class MdViewFacade {
|
|
|
39472
39490
|
if (this.linkClassifier.hasUsage(link, LinkUsage.GEODATA)) {
|
|
39473
39491
|
if (link.type === 'service' &&
|
|
39474
39492
|
link.accessServiceProtocol === 'ogcFeatures') {
|
|
39475
|
-
return from(this.dataService.getItemsFromOgcApi(link.url.href)).pipe(map$1((collectionRecords) => {
|
|
39493
|
+
return from(this.dataService.getItemsFromOgcApi(link.url.href, 1)).pipe(map$1((collectionRecords) => {
|
|
39476
39494
|
return collectionRecords &&
|
|
39477
39495
|
collectionRecords[0] &&
|
|
39478
39496
|
collectionRecords[0].geometry
|
|
@@ -39890,6 +39908,7 @@ class ExternalViewerButtonComponent {
|
|
|
39890
39908
|
this.translateService = inject(TranslateService);
|
|
39891
39909
|
this.urlTemplate = inject(EXTERNAL_VIEWER_URL_TEMPLATE, { optional: true });
|
|
39892
39910
|
this.openinNewTab = inject(EXTERNAL_VIEWER_OPEN_NEW_TAB);
|
|
39911
|
+
this.mimeType = '';
|
|
39893
39912
|
this.extraClass = '';
|
|
39894
39913
|
}
|
|
39895
39914
|
get externalViewer() {
|
|
@@ -39920,11 +39939,12 @@ class ExternalViewerButtonComponent {
|
|
|
39920
39939
|
const url = templateUrl
|
|
39921
39940
|
.replace('${layer_name}', `${layerName}`)
|
|
39922
39941
|
.replace('${service_url}', `${encodeURIComponent(this.link.url.toString())}`)
|
|
39923
|
-
.replace('${service_type}', `${this.supportedLinkLayerType}`)
|
|
39942
|
+
.replace('${service_type}', `${this.supportedLinkLayerType}`)
|
|
39943
|
+
.replace('${mime_type}', `${encodeURIComponent(this.mimeType)}`);
|
|
39924
39944
|
window.open(url, this.openinNewTab ? '_blank' : '_self').focus();
|
|
39925
39945
|
}
|
|
39926
39946
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ExternalViewerButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
39927
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ExternalViewerButtonComponent, isStandalone: true, selector: "gn-ui-external-viewer-button", inputs: { link: "link", extraClass: "extraClass" }, ngImport: i0, template: "@if (externalViewer) {\n <gn-ui-button\n (buttonClick)=\"openInExternalViewer()\"\n type=\"primary\"\n [title]=\"'record.externalViewer.open' | translate\"\n [extraClass]=\"extraClass + 'bg-primary ms-2 !rounded-lg'\"\n >\n <ng-icon name=\"matOpenInNew\"></ng-icon>\n </gn-ui-button>\n}\n", styles: [""], dependencies: [{ kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
|
|
39947
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ExternalViewerButtonComponent, isStandalone: true, selector: "gn-ui-external-viewer-button", inputs: { link: "link", mimeType: "mimeType", extraClass: "extraClass" }, ngImport: i0, template: "@if (externalViewer) {\n <gn-ui-button\n (buttonClick)=\"openInExternalViewer()\"\n type=\"primary\"\n [title]=\"'record.externalViewer.open' | translate\"\n [extraClass]=\"extraClass + 'bg-primary ms-2 !rounded-lg'\"\n >\n <ng-icon name=\"matOpenInNew\"></ng-icon>\n </gn-ui-button>\n}\n", styles: [""], dependencies: [{ kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
|
|
39928
39948
|
provideIcons({ matOpenInNew }),
|
|
39929
39949
|
provideNgIconsConfig({
|
|
39930
39950
|
size: '1.5em',
|
|
@@ -39941,6 +39961,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
39941
39961
|
], template: "@if (externalViewer) {\n <gn-ui-button\n (buttonClick)=\"openInExternalViewer()\"\n type=\"primary\"\n [title]=\"'record.externalViewer.open' | translate\"\n [extraClass]=\"extraClass + 'bg-primary ms-2 !rounded-lg'\"\n >\n <ng-icon name=\"matOpenInNew\"></ng-icon>\n </gn-ui-button>\n}\n" }]
|
|
39942
39962
|
}], propDecorators: { link: [{
|
|
39943
39963
|
type: Input
|
|
39964
|
+
}], mimeType: [{
|
|
39965
|
+
type: Input
|
|
39944
39966
|
}], extraClass: [{
|
|
39945
39967
|
type: Input
|
|
39946
39968
|
}] } });
|
|
@@ -40155,6 +40177,7 @@ marker('map.dropdown.placeholder');
|
|
|
40155
40177
|
marker('wfs.feature.limit');
|
|
40156
40178
|
marker('dataset.error.restrictedAccess');
|
|
40157
40179
|
marker('map.select.style');
|
|
40180
|
+
marker('map.style.default');
|
|
40158
40181
|
class MapViewComponent {
|
|
40159
40182
|
constructor() {
|
|
40160
40183
|
this.mdViewFacade = inject(MdViewFacade);
|
|
@@ -40221,7 +40244,8 @@ class MapViewComponent {
|
|
|
40221
40244
|
return compatibleLinks[0];
|
|
40222
40245
|
}
|
|
40223
40246
|
}
|
|
40224
|
-
}));
|
|
40247
|
+
}), shareReplay$1(1));
|
|
40248
|
+
this.isWmsStyleMode$ = this.selectedSourceLink$.pipe(map$1((src) => src?.type === 'service' && src?.accessServiceProtocol === 'wms'), distinctUntilChanged(), shareReplay$1(1));
|
|
40225
40249
|
this.styleLinks$ = this.selectedSourceLink$.pipe(switchMap$1((src) => {
|
|
40226
40250
|
if (src &&
|
|
40227
40251
|
src.type === 'service' &&
|
|
@@ -40238,6 +40262,17 @@ class MapViewComponent {
|
|
|
40238
40262
|
return of(src);
|
|
40239
40263
|
}));
|
|
40240
40264
|
}
|
|
40265
|
+
if (src &&
|
|
40266
|
+
src.type === 'service' &&
|
|
40267
|
+
src.accessServiceProtocol === 'wms') {
|
|
40268
|
+
return from(new WmsEndpoint(src.url.toString()).isReady()).pipe(map$1((endpoint) => {
|
|
40269
|
+
const layer = endpoint.getLayerByName(src.name);
|
|
40270
|
+
return layer?.styles || [];
|
|
40271
|
+
}), catchError((error) => {
|
|
40272
|
+
this.handleError(error);
|
|
40273
|
+
return of([]);
|
|
40274
|
+
}));
|
|
40275
|
+
}
|
|
40241
40276
|
return of([]);
|
|
40242
40277
|
}), tap$1((styles) => {
|
|
40243
40278
|
if (this._styleFromConfig && this._styleFromConfig <= styles.length) {
|
|
@@ -40247,23 +40282,60 @@ class MapViewComponent {
|
|
|
40247
40282
|
this.selectedStyleId$.next(0);
|
|
40248
40283
|
}
|
|
40249
40284
|
}), shareReplay$1(1));
|
|
40250
|
-
this.styleDropdownChoices$ =
|
|
40285
|
+
this.styleDropdownChoices$ = combineLatest([
|
|
40286
|
+
this.styleLinks$,
|
|
40287
|
+
this.isWmsStyleMode$,
|
|
40288
|
+
]).pipe(map$1(([links, isWmsStyleMode]) => links.length
|
|
40251
40289
|
? links.map((link, index) => ({
|
|
40252
|
-
label:
|
|
40290
|
+
label: isWmsStyleMode
|
|
40291
|
+
? link.title || link.name
|
|
40292
|
+
: getLinkLabel(link),
|
|
40253
40293
|
value: index,
|
|
40254
40294
|
}))
|
|
40255
40295
|
: [
|
|
40256
40296
|
{
|
|
40257
|
-
label: '
|
|
40297
|
+
label: this.translateService.instant('map.style.default'),
|
|
40258
40298
|
value: 0,
|
|
40259
40299
|
},
|
|
40260
40300
|
]));
|
|
40301
|
+
this.selectedWmsStyleName$ = combineLatest([
|
|
40302
|
+
this.styleLinks$,
|
|
40303
|
+
this.isWmsStyleMode$,
|
|
40304
|
+
this.selectedStyleId$.pipe(distinctUntilChanged()),
|
|
40305
|
+
]).pipe(map$1(([styles, isWmsStyleMode, styleIdx]) => isWmsStyleMode && Array.isArray(styles)
|
|
40306
|
+
? styles[styleIdx]?.name
|
|
40307
|
+
: undefined));
|
|
40261
40308
|
this.selectedLink$ = combineLatest([
|
|
40262
40309
|
this.selectedSourceLink$,
|
|
40263
40310
|
this.styleLinks$,
|
|
40264
40311
|
this.selectedStyleId$.pipe(distinctUntilChanged()),
|
|
40265
|
-
|
|
40266
|
-
|
|
40312
|
+
this.isWmsStyleMode$,
|
|
40313
|
+
]).pipe(map$1(([src, styles, styleIdx, isWmsStyleMode]) => !isWmsStyleMode && styles.length ? styles[styleIdx] : src), shareReplay$1(1));
|
|
40314
|
+
this.wmsMimeType$ = this.selectedSourceLink$.pipe(switchMap$1((link) => {
|
|
40315
|
+
if (link?.type === 'service' && link?.accessServiceProtocol === 'wms') {
|
|
40316
|
+
return from(new WmsEndpoint(link.url.toString())
|
|
40317
|
+
.isReady()
|
|
40318
|
+
.then((endpoint) => {
|
|
40319
|
+
return endpoint.describeLayer(link.name).then((description) => {
|
|
40320
|
+
if (description) {
|
|
40321
|
+
return description.owsType === 'wfs'
|
|
40322
|
+
? 'image/png'
|
|
40323
|
+
: 'image/jpeg';
|
|
40324
|
+
}
|
|
40325
|
+
const layer = endpoint.getLayerByName(link.name);
|
|
40326
|
+
return layer?.opaque ? 'image/jpeg' : 'image/png';
|
|
40327
|
+
});
|
|
40328
|
+
})
|
|
40329
|
+
.catch(() => 'image/png'));
|
|
40330
|
+
}
|
|
40331
|
+
return of('');
|
|
40332
|
+
}), shareReplay$1(1));
|
|
40333
|
+
this.currentLayers$ = combineLatest([
|
|
40334
|
+
this.selectedLink$,
|
|
40335
|
+
this.excludeWfs$,
|
|
40336
|
+
this.selectedWmsStyleName$,
|
|
40337
|
+
this.wmsMimeType$,
|
|
40338
|
+
]).pipe(switchMap$1(([link, excludeWfs, wmsStyleName, wmsMimeType]) => {
|
|
40267
40339
|
if (!link) {
|
|
40268
40340
|
return of([]);
|
|
40269
40341
|
}
|
|
@@ -40277,7 +40349,13 @@ class MapViewComponent {
|
|
|
40277
40349
|
this.handleError('dataset.error.restrictedAccess');
|
|
40278
40350
|
return of([]);
|
|
40279
40351
|
}
|
|
40280
|
-
return this.getLayerFromLink(link).pipe(map$1((layer) =>
|
|
40352
|
+
return this.getLayerFromLink(link).pipe(map$1((layer) => layer.type === 'wms'
|
|
40353
|
+
? {
|
|
40354
|
+
...layer,
|
|
40355
|
+
...(wmsStyleName && { style: wmsStyleName }),
|
|
40356
|
+
...(wmsMimeType && { format: wmsMimeType }),
|
|
40357
|
+
}
|
|
40358
|
+
: layer), map$1((layer) => [layer]), catchError((e) => {
|
|
40281
40359
|
this.handleError(e);
|
|
40282
40360
|
return of([]);
|
|
40283
40361
|
}), finalize(() => (this.loading = false)));
|
|
@@ -40431,7 +40509,7 @@ class MapViewComponent {
|
|
|
40431
40509
|
this.changeRef.detectChanges();
|
|
40432
40510
|
}
|
|
40433
40511
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MapViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
40434
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: MapViewComponent, isStandalone: true, selector: "gn-ui-map-view", inputs: { exceedsLimit: "exceedsLimit", selectedView: "selectedView", datavizConfig: "datavizConfig", displaySource: "displaySource" }, outputs: { linkSelected: "linkSelected", styleSelected: "styleSelected" }, viewQueries: [{ propertyName: "mapContainer", first: true, predicate: ["mapContainer"], descendants: true }], ngImport: i0, template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n
|
|
40512
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: MapViewComponent, isStandalone: true, selector: "gn-ui-map-view", inputs: { exceedsLimit: "exceedsLimit", selectedView: "selectedView", datavizConfig: "datavizConfig", displaySource: "displaySource" }, outputs: { linkSelected: "linkSelected", styleSelected: "styleSelected" }, viewQueries: [{ propertyName: "mapContainer", first: true, predicate: ["mapContainer"], descendants: true }], ngImport: i0, template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.style' | translate\"\n [choices]=\"styleDropdownChoices$ | async\"\n [selected]=\"selectedStyleId$ | async\"\n [disabled]=\"(styleDropdownChoices$ | async)?.length <= 1\"\n (selectValue)=\"selectStyleToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n\n <div class=\"self-end md:ml-2\">\n <gn-ui-external-viewer-button\n extraClass=\"w-[44px] h-[44px]\"\n [link]=\"selectedLink$ | async\"\n [mimeType]=\"wmsMimeType$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n </div>\n @if (hidePreview) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n } @else {\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n (sourceLoadError)=\"onSourceLoadError($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail\n [featureCatalog]=\"mdViewFacade.featureCatalog$ | async\"\n [feature]=\"selection\"\n ></gn-ui-feature-detail>\n </div>\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\" translate>map.legend.title</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n @if (!showLegend && legendExists && !selection) {\n <gn-ui-button\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n translate\n >\n {{ 'map.legend.title' | translate }}\n </gn-ui-button>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick", "extentChange", "sourceLoadError", "resolvedExtentChange"] }, { kind: "component", type: FeatureDetailComponent, selector: "gn-ui-feature-detail", inputs: ["feature", "featureCatalog"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ExternalViewerButtonComponent, selector: "gn-ui-external-viewer-button", inputs: ["link", "mimeType", "extraClass"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: MapLegendComponent, selector: "gn-ui-map-legend", inputs: ["context"], outputs: ["legendStatusChange"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
|
|
40435
40513
|
provideIcons({ matClose }),
|
|
40436
40514
|
provideNgIconsConfig({
|
|
40437
40515
|
size: '1.5em',
|
|
@@ -40458,7 +40536,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
40458
40536
|
provideNgIconsConfig({
|
|
40459
40537
|
size: '1.5em',
|
|
40460
40538
|
}),
|
|
40461
|
-
], template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n
|
|
40539
|
+
], template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.style' | translate\"\n [choices]=\"styleDropdownChoices$ | async\"\n [selected]=\"selectedStyleId$ | async\"\n [disabled]=\"(styleDropdownChoices$ | async)?.length <= 1\"\n (selectValue)=\"selectStyleToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n\n <div class=\"self-end md:ml-2\">\n <gn-ui-external-viewer-button\n extraClass=\"w-[44px] h-[44px]\"\n [link]=\"selectedLink$ | async\"\n [mimeType]=\"wmsMimeType$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n </div>\n @if (hidePreview) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n } @else {\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n (sourceLoadError)=\"onSourceLoadError($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail\n [featureCatalog]=\"mdViewFacade.featureCatalog$ | async\"\n [feature]=\"selection\"\n ></gn-ui-feature-detail>\n </div>\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\" translate>map.legend.title</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n @if (!showLegend && legendExists && !selection) {\n <gn-ui-button\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n translate\n >\n {{ 'map.legend.title' | translate }}\n </gn-ui-button>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n }\n</div>\n" }]
|
|
40462
40540
|
}], propDecorators: { exceedsLimit: [{
|
|
40463
40541
|
type: Input
|
|
40464
40542
|
}], selectedView: [{
|
|
@@ -44292,6 +44370,7 @@ class RouterFacade {
|
|
|
44292
44370
|
});
|
|
44293
44371
|
}
|
|
44294
44372
|
updateSearch(query) {
|
|
44373
|
+
console.log('RouterFacade - updateSearch', query);
|
|
44295
44374
|
this.go({
|
|
44296
44375
|
path: this.routerService.getSearchRoute(),
|
|
44297
44376
|
...(query && { query: flattenQueryParams(query) }),
|
|
@@ -44299,6 +44378,7 @@ class RouterFacade {
|
|
|
44299
44378
|
});
|
|
44300
44379
|
}
|
|
44301
44380
|
setSearch(query) {
|
|
44381
|
+
console.log('RouterFacade - setSearch', query);
|
|
44302
44382
|
this.go({
|
|
44303
44383
|
path: this.routerService.getSearchRoute(),
|
|
44304
44384
|
...(query && { query: flattenQueryParams(query) }),
|
|
@@ -44338,6 +44418,12 @@ class RouterEffects {
|
|
|
44338
44418
|
this.syncSearchState$ = createEffect(() => this.facade.searchParams$.pipe(mergeMap((searchParams) => this.fieldsService
|
|
44339
44419
|
.buildFiltersFromFieldValues(searchParams)
|
|
44340
44420
|
.pipe(map$1((filters) => [searchParams, filters]))), startWith([null, {}]), pairwise(), map$1(([[oldParams, oldFilters], [newParams, newFilters]]) => {
|
|
44421
|
+
console.log('RouterEffects - syncSearchState', {
|
|
44422
|
+
oldParams,
|
|
44423
|
+
newParams,
|
|
44424
|
+
oldFilters,
|
|
44425
|
+
newFilters,
|
|
44426
|
+
});
|
|
44341
44427
|
let sortBy = ROUTE_PARAMS.SORT in newParams
|
|
44342
44428
|
? sortByFromString(newParams[ROUTE_PARAMS.SORT])
|
|
44343
44429
|
: this.routerService.getDefaultSort();
|
|
@@ -44375,6 +44461,23 @@ class RouterEffects {
|
|
|
44375
44461
|
}
|
|
44376
44462
|
return of(...actions);
|
|
44377
44463
|
})));
|
|
44464
|
+
/**
|
|
44465
|
+
* This effect is needed because on the page load, the search params from the URL are
|
|
44466
|
+
* directly applied to the underlying search facade; this means that it doesn't go
|
|
44467
|
+
* through the RouterSearchService which makes sure that a relevancy sort is applied
|
|
44468
|
+
* whenever there's a full text search criteria set.
|
|
44469
|
+
*/
|
|
44470
|
+
this.applyInitialRelevancySort$ = createEffect(() => this.facade.searchParams$.pipe(take(1), tap$1((filters) => {
|
|
44471
|
+
const relevancySort = sortByToString(SortByEnum.RELEVANCY);
|
|
44472
|
+
if (filters['q'] &&
|
|
44473
|
+
(!Array.isArray(filters['q']) || filters['q'].length > 0) &&
|
|
44474
|
+
!filters[ROUTE_PARAMS.SORT]) {
|
|
44475
|
+
this.facade.updateSearch({
|
|
44476
|
+
...filters,
|
|
44477
|
+
[ROUTE_PARAMS.SORT]: relevancySort,
|
|
44478
|
+
});
|
|
44479
|
+
}
|
|
44480
|
+
})), { dispatch: false });
|
|
44378
44481
|
/**
|
|
44379
44482
|
* This effect will load the metadata when a navigation to
|
|
44380
44483
|
* a metadata record happens
|
|
@@ -44465,6 +44568,7 @@ class RouterSearchService {
|
|
|
44465
44568
|
this.fieldsService = inject(FieldsService);
|
|
44466
44569
|
}
|
|
44467
44570
|
setSortAndFilters(filters, sortBy) {
|
|
44571
|
+
console.log('RouterSearchService - setSortAndFilters', { filters, sortBy });
|
|
44468
44572
|
this.fieldsService
|
|
44469
44573
|
.readFieldValuesFromFilters(filters)
|
|
44470
44574
|
.subscribe((values) => {
|
|
@@ -44475,17 +44579,27 @@ class RouterSearchService {
|
|
|
44475
44579
|
});
|
|
44476
44580
|
}
|
|
44477
44581
|
async setFilters(newFilters) {
|
|
44478
|
-
|
|
44582
|
+
let sortBy = await firstValueFrom(this.searchFacade.sortBy$);
|
|
44479
44583
|
const fieldSearchParams = await firstValueFrom(this.fieldsService.readFieldValuesFromFilters(newFilters));
|
|
44584
|
+
// apply relevancy sort if a full text criteria is given
|
|
44585
|
+
sortBy = newFilters['any'] ? SortByEnum.RELEVANCY : sortBy;
|
|
44480
44586
|
this.facade.setSearch({
|
|
44481
44587
|
...fieldSearchParams,
|
|
44482
44588
|
[ROUTE_PARAMS.SORT]: sortBy ? sortByToString(sortBy) : undefined,
|
|
44483
44589
|
});
|
|
44484
44590
|
}
|
|
44485
44591
|
async updateFilters(newFilters) {
|
|
44592
|
+
console.log('RouterSearchService - updateFilters', newFilters);
|
|
44486
44593
|
const currentFilters = await firstValueFrom(this.searchFacade.searchFilters$);
|
|
44487
44594
|
const updatedFilters = { ...currentFilters, ...newFilters };
|
|
44488
|
-
|
|
44595
|
+
let newParams = await firstValueFrom(this.fieldsService.readFieldValuesFromFilters(updatedFilters));
|
|
44596
|
+
if (newFilters['any']) {
|
|
44597
|
+
newParams = {
|
|
44598
|
+
...newParams,
|
|
44599
|
+
[ROUTE_PARAMS.SORT]: sortByToString(SortByEnum.RELEVANCY),
|
|
44600
|
+
};
|
|
44601
|
+
}
|
|
44602
|
+
console.log('RouterSearchService - updateFilters - newParams', newParams);
|
|
44489
44603
|
this.facade.updateSearch(newParams);
|
|
44490
44604
|
}
|
|
44491
44605
|
setSortBy(sortBy) {
|