geonetwork-ui 2.11.0-dev.b7f9a229d → 2.11.0-dev.bc1acb627
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 +1280 -1150
- package/fesm2022/geonetwork-ui.mjs.map +1 -1
- package/index.d.ts +103 -57
- package/index.d.ts.map +1 -1
- package/package.json +6 -5
- package/src/libs/api/metadata-converter/src/lib/dcat-ap/dcat-ap.converter.ts +2 -0
- package/src/libs/api/metadata-converter/src/lib/fixtures/mel.records.dataset+featurecatalog.ts +317 -0
- package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +35 -8
- package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +19 -0
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.ts +2 -0
- package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +98 -0
- package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +7 -0
- package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +2 -1
- package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +29 -3
- package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +5 -34
- package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +6 -13
- package/src/libs/common/domain/src/lib/model/search/aggregation.model.ts +2 -0
- package/src/libs/common/domain/src/lib/model/search/filter.model.ts +4 -1
- package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +1 -1
- package/src/libs/common/fixtures/src/lib/records.fixtures.ts +42 -62
- package/src/libs/feature/dataviz/src/lib/service/data.service.ts +32 -19
- package/src/libs/feature/map/src/index.ts +0 -1
- package/src/libs/feature/notify-reuse/src/lib/notify-reuse-form/notify-reuse-form.component.ts +8 -3
- package/src/libs/feature/record/src/lib/state/mdview.effects.ts +3 -1
- package/src/libs/feature/record/src/lib/state/mdview.facade.ts +1 -1
- package/src/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.html +7 -1
- package/src/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.ts +26 -4
- package/src/libs/feature/search/src/lib/geocoding/geocoding.service.ts +41 -2
- package/src/libs/feature/search/src/lib/location-search/location-search.component.html +11 -1
- package/src/libs/feature/search/src/lib/location-search/location-search.component.ts +77 -3
- package/src/libs/feature/search/src/lib/search-filters-summary-item/search-filters-summary-item.component.ts +1 -0
- package/src/libs/feature/search/src/lib/state/reducer.ts +1 -4
- package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +56 -4
- package/src/libs/feature/search/src/lib/utils/service/fields.ts +33 -9
- package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.html +2 -2
- package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.ts +2 -2
- package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.css +0 -4
- package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +2 -2
- package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.ts +3 -3
- package/src/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.ts +2 -1
- package/src/libs/ui/inputs/src/lib/spatial-extent-dropdown/spatial-extent-dropdown.component.html +7 -1
- package/src/libs/ui/inputs/src/lib/spatial-extent-dropdown/spatial-extent-dropdown.component.ts +26 -3
- package/src/libs/util/app-config/src/lib/app-config.ts +29 -0
- package/src/libs/util/app-config/src/lib/fixtures.ts +34 -1
- package/src/libs/util/app-config/src/lib/model.ts +21 -2
- package/translations/de.json +8 -2
- package/translations/en.json +8 -2
- package/translations/es.json +8 -2
- package/translations/fr.json +12 -6
- package/translations/it.json +8 -2
- package/translations/nl.json +8 -2
- package/translations/pt.json +8 -2
- package/translations/sk.json +8 -2
- package/src/libs/feature/map/src/lib/style/index.ts +0 -2
- package/src/libs/feature/map/src/lib/style/map-style.fixtures.ts +0 -47
- package/src/libs/feature/map/src/lib/style/map-style.service.ts +0 -108
|
@@ -36,9 +36,6 @@ import { createLegendFromLayer } from '@geospatial-sdk/legend';
|
|
|
36
36
|
import { mouseOnly, noModifierKeys, primaryAction, platformModifierKeyOnly } from 'ol/events/condition.js';
|
|
37
37
|
import { defaults, DragPan, MouseWheelZoom } from 'ol/interaction.js';
|
|
38
38
|
import { extend } from 'ol/extent.js';
|
|
39
|
-
import * as TOML from '@ltd/j-toml';
|
|
40
|
-
import { Style, Stroke, Fill, Circle } from 'ol/style.js';
|
|
41
|
-
import CircleStyle from 'ol/style/Circle.js';
|
|
42
39
|
import EmblaCarousel from 'embla-carousel';
|
|
43
40
|
import { iconoirNavArrowLeft, iconoirNavArrowRight, iconoirLongArrowDownLeft, iconoirSearch, iconoirCalendar, iconoirArrowUp, iconoirLink, iconoirFramePlusIn, iconoirCloudUpload, iconoirUpload, iconoirTrash, iconoirSquareDashed, iconoirCheckCircle, iconoirReduce, iconoirNavArrowUp, iconoirNavArrowDown, iconoirExpand, iconoirSettings, iconoirDownload, iconoirPlus, iconoirBin, iconoirMediaImageXmark, iconoirMediaImage, iconoirAppWindow, iconoirCode, iconoirDatabase, iconoirAppleWallet, iconoirBank, iconoirList, iconoirTranslate, iconoirLock, iconoirUser, iconoirArrowLeft, iconoirLightBulbOn, iconoirImport, iconoirBadgeCheck, iconoirSystemShut, iconoirCircle, iconoirAttachment, iconoirRefresh } from '@ng-icons/iconoir';
|
|
44
41
|
import { MatButtonModule } from '@angular/material/button';
|
|
@@ -74,6 +71,7 @@ import * as i2$2 from '@ngrx/effects';
|
|
|
74
71
|
import { Actions, createEffect, ofType, EffectsModule } from '@ngrx/effects';
|
|
75
72
|
import { valid as valid$1 } from 'geojson-validation';
|
|
76
73
|
import { queryGeoplateforme, queryGeonames, queryGeoadmin } from '@geospatial-sdk/geocoding';
|
|
74
|
+
import pointer from 'jsonpointer';
|
|
77
75
|
import { TemplatePortal } from '@angular/cdk/portal';
|
|
78
76
|
import { parse as parse$3 } from 'marked';
|
|
79
77
|
import * as i2$3 from '@angular/cdk/scrolling';
|
|
@@ -101,6 +99,7 @@ import { TextFieldModule } from '@angular/cdk/text-field';
|
|
|
101
99
|
import * as i2$5 from '@ngrx/router-store';
|
|
102
100
|
import { getRouterSelectors, routerReducer, StoreRouterConnectingModule, FullRouterStateSerializer } from '@ngrx/router-store';
|
|
103
101
|
import { navigation } from '@ngrx/router-store/data-persistence';
|
|
102
|
+
import * as TOML from '@ltd/j-toml';
|
|
104
103
|
|
|
105
104
|
class MetadataMapperContext {
|
|
106
105
|
}
|
|
@@ -1139,7 +1138,7 @@ function kindToCodeListValue(record) {
|
|
|
1139
1138
|
}
|
|
1140
1139
|
|
|
1141
1140
|
function extractCharacterString() {
|
|
1142
|
-
return pipe(fallback(findChildElement('gco:CharacterString', false), findChildElement('gmx:Anchor', false), findChildElement('gmx:MimeFileType', false)), readText());
|
|
1141
|
+
return pipe(fallback(findChildElement('gco:CharacterString', false), findChildElement('gmx:Anchor', false), findChildElement('gmx:MimeFileType', false), findChildElement('gco:LocalName', false)), readText());
|
|
1143
1142
|
}
|
|
1144
1143
|
/**
|
|
1145
1144
|
* Translated values will also be collected in the translations object
|
|
@@ -2202,6 +2201,7 @@ class Iso19139Converter extends BaseConverter {
|
|
|
2202
2201
|
lineage: readLineage$1,
|
|
2203
2202
|
sourceRecords: readSourceRecords$1,
|
|
2204
2203
|
associatedRecords: readAssociatedRecords$1,
|
|
2204
|
+
featureTypeDescriptions: () => undefined,
|
|
2205
2205
|
onlineResources: readOnlineResources$2,
|
|
2206
2206
|
temporalExtents: readTemporalExtents,
|
|
2207
2207
|
spatialExtents: readSpatialExtents$1,
|
|
@@ -2241,6 +2241,7 @@ class Iso19139Converter extends BaseConverter {
|
|
|
2241
2241
|
lineage: writeLineage$1,
|
|
2242
2242
|
sourceRecords: writeSourceRecords$1,
|
|
2243
2243
|
associatedRecords: writeAssociatedRecords$1,
|
|
2244
|
+
featureTypeDescriptions: () => undefined,
|
|
2244
2245
|
onlineResources: writeOnlineResources$1,
|
|
2245
2246
|
temporalExtents: writeTemporalExtents,
|
|
2246
2247
|
spatialExtents: writeSpatialExtents,
|
|
@@ -2367,6 +2368,7 @@ class Iso19139Converter extends BaseConverter {
|
|
|
2367
2368
|
const sourceRecords = this.readers['sourceRecords'](rootEl, tr);
|
|
2368
2369
|
const associatedRecords = this.readers['associatedRecords'](rootEl, tr);
|
|
2369
2370
|
const updateFrequency = this.readers['updateFrequency'](rootEl, tr);
|
|
2371
|
+
const featureTypeDescriptions = this.readers['featureTypeDescriptions'](rootEl, tr);
|
|
2370
2372
|
return this.afterRecordRead({
|
|
2371
2373
|
...this.readBaseRecord(rootEl, tr),
|
|
2372
2374
|
kind,
|
|
@@ -2377,6 +2379,7 @@ class Iso19139Converter extends BaseConverter {
|
|
|
2377
2379
|
...(spatialRepresentation && { spatialRepresentation }),
|
|
2378
2380
|
temporalExtents,
|
|
2379
2381
|
updateFrequency,
|
|
2382
|
+
...(featureTypeDescriptions?.length && { featureTypeDescriptions }),
|
|
2380
2383
|
translations: tr,
|
|
2381
2384
|
});
|
|
2382
2385
|
}
|
|
@@ -2633,6 +2636,31 @@ function readDefaultLanguage$1(rootEl) {
|
|
|
2633
2636
|
function readOtherLanguages(rootEl) {
|
|
2634
2637
|
return pipe(findChildrenElement('mdb:otherLocale', false), mapArray(readLocaleElement()), map((languages) => languages.filter((lang) => lang !== null)))(rootEl);
|
|
2635
2638
|
}
|
|
2639
|
+
function extractCharacterStringOrText() {
|
|
2640
|
+
return fallback(extractCharacterString(), readText());
|
|
2641
|
+
}
|
|
2642
|
+
function extractListedValue() {
|
|
2643
|
+
return pipe(combine(pipe(findChildElement('gfc:code', false), extractCharacterString()), pipe(findChildElement('gfc:label', false), extractCharacterString())), map(([code, label]) => ({
|
|
2644
|
+
...(code && { code }),
|
|
2645
|
+
...(label && { label }),
|
|
2646
|
+
})));
|
|
2647
|
+
}
|
|
2648
|
+
function extractFeatureAttribute() {
|
|
2649
|
+
return pipe(combine(pipe(findChildElement('gfc:memberName', false), extractCharacterStringOrText()), pipe(findChildElement('gfc:definition', false), extractCharacterString()), pipe(findChildElement('gfc:code', false), extractCharacterString()), pipe(findNestedElement('gfc:valueType', 'gco:TypeName', 'gco:aName'), extractCharacterString()), pipe(findNestedElements('gfc:listedValue', 'gfc:FC_ListedValue'), mapArray(extractListedValue()), filterArray((value) => !!(value.code || value.label)))), map(([name, description, code, type, values]) => ({
|
|
2650
|
+
name: name ?? '',
|
|
2651
|
+
...(description && { description }),
|
|
2652
|
+
...(code && { code }),
|
|
2653
|
+
...(type && { type }),
|
|
2654
|
+
...(values.length > 0 && { values }),
|
|
2655
|
+
})));
|
|
2656
|
+
}
|
|
2657
|
+
function readFeatureTypeDescriptions(rootEl) {
|
|
2658
|
+
return pipe(findNestedElements('mdb:contentInfo', 'mrc:MD_FeatureCatalogue', 'mrc:featureCatalogue', 'gfc:FC_FeatureCatalogue', 'gfc:featureType', 'gfc:FC_FeatureType'), mapArray(pipe(combine(pipe(findChildElement('gfc:typeName', false), extractCharacterStringOrText()), pipe(findChildElement('gfc:definition', false), extractCharacterString()), pipe(findNestedElements('gfc:carrierOfCharacteristics', 'gfc:FC_FeatureAttribute'), mapArray(extractFeatureAttribute()))), map(([name, description, attributes]) => ({
|
|
2659
|
+
name: name ?? '',
|
|
2660
|
+
...(description && { description }),
|
|
2661
|
+
attributes,
|
|
2662
|
+
})))))(rootEl);
|
|
2663
|
+
}
|
|
2636
2664
|
|
|
2637
2665
|
function writeUniqueIdentifier$1(record, rootEl) {
|
|
2638
2666
|
pipe(findNestedChildOrCreate('mdb:metadataIdentifier', 'mcc:MD_Identifier', 'mcc:code'), writeCharacterString(record.uniqueIdentifier))(rootEl);
|
|
@@ -2803,6 +2831,7 @@ class Iso191153Converter extends Iso19139Converter {
|
|
|
2803
2831
|
this.readers['lineage'] = readLineage;
|
|
2804
2832
|
this.readers['sourceRecords'] = readSourceRecords;
|
|
2805
2833
|
this.readers['associatedRecords'] = readAssociatedRecords;
|
|
2834
|
+
this.readers['featureTypeDescriptions'] = readFeatureTypeDescriptions;
|
|
2806
2835
|
this.readers['onlineResources'] = readOnlineResources$1;
|
|
2807
2836
|
this.readers['defaultLanguage'] = readDefaultLanguage$1;
|
|
2808
2837
|
this.readers['otherLanguages'] = readOtherLanguages;
|
|
@@ -3459,6 +3488,7 @@ class DcatApConverter extends BaseConverter {
|
|
|
3459
3488
|
lineage: () => '',
|
|
3460
3489
|
sourceRecords: () => [],
|
|
3461
3490
|
associatedRecords: () => [],
|
|
3491
|
+
featureTypeDescriptions: () => undefined,
|
|
3462
3492
|
temporalExtents: () => [],
|
|
3463
3493
|
spatialRepresentation: () => undefined,
|
|
3464
3494
|
extras: () => undefined,
|
|
@@ -3494,6 +3524,7 @@ class DcatApConverter extends BaseConverter {
|
|
|
3494
3524
|
lineage: () => undefined,
|
|
3495
3525
|
sourceRecords: () => [],
|
|
3496
3526
|
associatedRecords: () => [],
|
|
3527
|
+
featureTypeDescriptions: () => undefined,
|
|
3497
3528
|
onlineResources: () => undefined,
|
|
3498
3529
|
temporalExtents: () => undefined,
|
|
3499
3530
|
spatialExtents: () => undefined,
|
|
@@ -18904,9 +18935,15 @@ class Gn4FieldMapper {
|
|
|
18904
18935
|
isOpenData: (output, source) => this.addExtra({
|
|
18905
18936
|
isOpenData: selectField(source, 'isOpenData') !== 'false',
|
|
18906
18937
|
}, output),
|
|
18907
|
-
featureTypes: (output, source) =>
|
|
18908
|
-
featureTypes
|
|
18909
|
-
|
|
18938
|
+
featureTypes: (output, source) => {
|
|
18939
|
+
const featureTypes = getAsArray(selectField(source, 'featureTypes'));
|
|
18940
|
+
if (!featureTypes.length)
|
|
18941
|
+
return output;
|
|
18942
|
+
return {
|
|
18943
|
+
...output,
|
|
18944
|
+
featureTypeDescriptions: this.featureTypesField(featureTypes),
|
|
18945
|
+
};
|
|
18946
|
+
},
|
|
18910
18947
|
related: (output, source) => {
|
|
18911
18948
|
const related = selectField(source, 'related');
|
|
18912
18949
|
const fcatSource = selectField(getFirstValue(selectField(related, 'fcats')) ?? {}, '_source');
|
|
@@ -19042,6 +19079,27 @@ class Gn4FieldMapper {
|
|
|
19042
19079
|
},
|
|
19043
19080
|
};
|
|
19044
19081
|
this.genericField = (output) => output;
|
|
19082
|
+
this.featureTypesField = (featureTypes) => featureTypes.map((featureType) => ({
|
|
19083
|
+
name: featureType.typeName ?? '',
|
|
19084
|
+
...(featureType.definition && {
|
|
19085
|
+
description: featureType.definition,
|
|
19086
|
+
}),
|
|
19087
|
+
attributes: getAsArray(featureType.attributeTable ?? []).map((attr) => {
|
|
19088
|
+
const values = (attr.values ?? [])
|
|
19089
|
+
.filter((value) => value.code || value.label)
|
|
19090
|
+
.map((value) => ({
|
|
19091
|
+
...(value.code && { code: value.code }),
|
|
19092
|
+
...(value.label && { label: value.label }),
|
|
19093
|
+
}));
|
|
19094
|
+
return {
|
|
19095
|
+
name: attr.name ?? '',
|
|
19096
|
+
...(attr.definition && { description: attr.definition }),
|
|
19097
|
+
...(attr.code && { code: attr.code }),
|
|
19098
|
+
...(attr.type && { type: attr.type }),
|
|
19099
|
+
...(values.length > 0 && { values }),
|
|
19100
|
+
};
|
|
19101
|
+
}),
|
|
19102
|
+
}));
|
|
19045
19103
|
this.constraintField = (type, output, constraintArray) => {
|
|
19046
19104
|
let outputField;
|
|
19047
19105
|
switch (type) {
|
|
@@ -20452,7 +20510,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
20452
20510
|
}] } });
|
|
20453
20511
|
|
|
20454
20512
|
var name = "geonetwork-ui";
|
|
20455
|
-
var version = "2.11.0-dev.
|
|
20513
|
+
var version = "2.11.0-dev.bc1acb627";
|
|
20456
20514
|
var engines = {
|
|
20457
20515
|
node: ">=24"
|
|
20458
20516
|
};
|
|
@@ -20494,10 +20552,10 @@ var dependencies = {
|
|
|
20494
20552
|
"@biesbjerg/ngx-translate-extract-marker": "~1.0.0",
|
|
20495
20553
|
"@camptocamp/ogc-client": "1.3.1-dev.200c02a",
|
|
20496
20554
|
"@duckdb/duckdb-wasm": "~1.32.0",
|
|
20497
|
-
"@geospatial-sdk/core": "0.0.5-dev.
|
|
20498
|
-
"@geospatial-sdk/geocoding": "0.0.5-dev.
|
|
20499
|
-
"@geospatial-sdk/legend": "0.0.5-dev.
|
|
20500
|
-
"@geospatial-sdk/openlayers": "0.0.5-dev.
|
|
20555
|
+
"@geospatial-sdk/core": "0.0.5-dev.86.sha-124eae3",
|
|
20556
|
+
"@geospatial-sdk/geocoding": "0.0.5-dev.86.sha-124eae3",
|
|
20557
|
+
"@geospatial-sdk/legend": "0.0.5-dev.86.sha-124eae3",
|
|
20558
|
+
"@geospatial-sdk/openlayers": "0.0.5-dev.86.sha-124eae3",
|
|
20501
20559
|
"@ltd/j-toml": "~1.38.0",
|
|
20502
20560
|
"@messageformat/core": "~3.4.0",
|
|
20503
20561
|
"@ng-icons/core": "~32.5.0",
|
|
@@ -20514,6 +20572,7 @@ var dependencies = {
|
|
|
20514
20572
|
"embla-carousel": "~8.6.0",
|
|
20515
20573
|
"flag-icons": "~7.5.0",
|
|
20516
20574
|
"geojson-validation": "~1.0.2",
|
|
20575
|
+
jsonpointer: "^5.0.1",
|
|
20517
20576
|
marked: "~17.0.4",
|
|
20518
20577
|
"ngx-dropzone": "~3.1.0",
|
|
20519
20578
|
"ngx-translate-messageformat-compiler": "~7.2.0",
|
|
@@ -20690,6 +20749,7 @@ class ElasticsearchService {
|
|
|
20690
20749
|
// runtime fields are computed using a Painless script
|
|
20691
20750
|
// see: https://www.elastic.co/guide/en/elasticsearch/reference/current/runtime-mapping-fields.html
|
|
20692
20751
|
this.runtimeFields = {};
|
|
20752
|
+
this.fieldAliases = {};
|
|
20693
20753
|
}
|
|
20694
20754
|
// we're using getters in case the defined languages change over time
|
|
20695
20755
|
get metadataLang() {
|
|
@@ -20761,6 +20821,9 @@ class ElasticsearchService {
|
|
|
20761
20821
|
registerRuntimeField(fieldName, expression, type = 'keyword') {
|
|
20762
20822
|
this.runtimeFields[fieldName] = { script: expression, type };
|
|
20763
20823
|
}
|
|
20824
|
+
registerFieldAlias(fieldIdentifier, esFieldName) {
|
|
20825
|
+
this.fieldAliases[fieldIdentifier] = esFieldName;
|
|
20826
|
+
}
|
|
20764
20827
|
getMetadataByIdsPayload(uuids) {
|
|
20765
20828
|
return {
|
|
20766
20829
|
query: {
|
|
@@ -20882,12 +20945,25 @@ class ElasticsearchService {
|
|
|
20882
20945
|
}
|
|
20883
20946
|
return Object.values(filters).find(isBoundingBox);
|
|
20884
20947
|
}
|
|
20885
|
-
//
|
|
20886
|
-
// the record matches if that interval intersects the filter range
|
|
20948
|
+
// builds a query matching records whose dates intersect the filter range
|
|
20887
20949
|
buildDateRangeQuery(searchField, dateRange) {
|
|
20950
|
+
// fields ending with 'DateRange' maps as ES range type
|
|
20951
|
+
if (searchField.endsWith('DateRange')) {
|
|
20952
|
+
return {
|
|
20953
|
+
range: {
|
|
20954
|
+
[searchField]: {
|
|
20955
|
+
...(dateRange.start && { gte: formatDate(dateRange.start) }),
|
|
20956
|
+
...(dateRange.end && { lte: formatDate(dateRange.end) }),
|
|
20957
|
+
format: 'yyyy-MM-dd',
|
|
20958
|
+
relation: 'intersects',
|
|
20959
|
+
},
|
|
20960
|
+
},
|
|
20961
|
+
};
|
|
20962
|
+
}
|
|
20888
20963
|
const minField = `${searchField}Min`;
|
|
20889
20964
|
const maxField = `${searchField}Max`;
|
|
20890
20965
|
if (minField in this.runtimeFields && maxField in this.runtimeFields) {
|
|
20966
|
+
// min/max runtime fields form an interval per record; match if it intersects the filter range
|
|
20891
20967
|
const filter = [
|
|
20892
20968
|
dateRange.start && {
|
|
20893
20969
|
range: {
|
|
@@ -20942,7 +21018,7 @@ class ElasticsearchService {
|
|
|
20942
21018
|
.filter((fieldname) => !Array.isArray(filters[fieldname]))
|
|
20943
21019
|
.filter((fieldname) => filters[fieldname] &&
|
|
20944
21020
|
JSON.stringify(filters[fieldname]) !== '{}')
|
|
20945
|
-
.map((fieldname) => `${fieldname}:(${makeQuery(filters[fieldname])})`)
|
|
21021
|
+
.map((fieldname) => `${this.fieldAliases[fieldname] ?? fieldname}:(${makeQuery(filters[fieldname])})`)
|
|
20946
21022
|
.join(' AND ');
|
|
20947
21023
|
if (filters['gn-ui-crossFieldFilter']) {
|
|
20948
21024
|
queryString = `${queryString} AND (${filters['gn-ui-crossFieldFilter']})`;
|
|
@@ -21240,6 +21316,12 @@ class ElasticsearchService {
|
|
|
21240
21316
|
order: {
|
|
21241
21317
|
[`_${aggregation.sort[1]}`]: aggregation.sort[0],
|
|
21242
21318
|
},
|
|
21319
|
+
...(aggregation.includeValues && {
|
|
21320
|
+
include: aggregation.includeValues,
|
|
21321
|
+
}),
|
|
21322
|
+
...(aggregation.excludeValues && {
|
|
21323
|
+
exclude: aggregation.excludeValues,
|
|
21324
|
+
}),
|
|
21243
21325
|
},
|
|
21244
21326
|
};
|
|
21245
21327
|
case 'histogram':
|
|
@@ -21374,42 +21456,16 @@ class Gn4Repository {
|
|
|
21374
21456
|
? this.gn4Mapper.readRecords(records)
|
|
21375
21457
|
: of(null)));
|
|
21376
21458
|
}
|
|
21377
|
-
|
|
21378
|
-
return {
|
|
21379
|
-
featureTypes: featureTypes.map((featureType) => ({
|
|
21380
|
-
name: featureType.typeName || '',
|
|
21381
|
-
definition: featureType.definition || '',
|
|
21382
|
-
attributes: Array.isArray(featureType.attributeTable)
|
|
21383
|
-
? featureType.attributeTable.map((attr) => {
|
|
21384
|
-
const values = attr.values
|
|
21385
|
-
?.filter((v) => v.code || v.label)
|
|
21386
|
-
.map((v) => ({
|
|
21387
|
-
code: v.code,
|
|
21388
|
-
label: v.label,
|
|
21389
|
-
}));
|
|
21390
|
-
return {
|
|
21391
|
-
name: attr.name,
|
|
21392
|
-
code: attr.code,
|
|
21393
|
-
definition: attr.definition,
|
|
21394
|
-
type: attr.type,
|
|
21395
|
-
...(values?.length > 0 ? { values } : {}),
|
|
21396
|
-
};
|
|
21397
|
-
})
|
|
21398
|
-
: [],
|
|
21399
|
-
})),
|
|
21400
|
-
};
|
|
21401
|
-
}
|
|
21402
|
-
getFeatureCatalog(record, visited = new Set() // prevent looping
|
|
21459
|
+
queryLinkedFeatureCatalog(record, visited = new Set() // prevent looping
|
|
21403
21460
|
) {
|
|
21404
|
-
if (
|
|
21405
|
-
|
|
21406
|
-
record.
|
|
21407
|
-
return of(this.mapEmbeddedFeatureCatalog(record.extras['featureTypes']));
|
|
21461
|
+
if ('featureTypeDescriptions' in record &&
|
|
21462
|
+
record.featureTypeDescriptions?.length > 0) {
|
|
21463
|
+
return of({ featureTypes: record.featureTypeDescriptions });
|
|
21408
21464
|
}
|
|
21409
21465
|
const featureCatalogIdentifier = record.extras['featureCatalogIdentifier'];
|
|
21410
21466
|
if (featureCatalogIdentifier && !visited.has(featureCatalogIdentifier)) {
|
|
21411
21467
|
visited.add(featureCatalogIdentifier);
|
|
21412
|
-
return this.getRecord(featureCatalogIdentifier).pipe(switchMap((record) => record ? this.
|
|
21468
|
+
return this.getRecord(featureCatalogIdentifier).pipe(switchMap((record) => record ? this.queryLinkedFeatureCatalog(record, visited) : of(null)));
|
|
21413
21469
|
}
|
|
21414
21470
|
return of(null);
|
|
21415
21471
|
}
|
|
@@ -23082,1089 +23138,374 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
23082
23138
|
}]
|
|
23083
23139
|
}] });
|
|
23084
23140
|
|
|
23085
|
-
|
|
23086
|
-
|
|
23087
|
-
|
|
23088
|
-
|
|
23089
|
-
|
|
23141
|
+
class AnchorLinkDirective {
|
|
23142
|
+
constructor() {
|
|
23143
|
+
this.changeDetector = inject(ChangeDetectorRef);
|
|
23144
|
+
this.disabled = false;
|
|
23145
|
+
this.observer = new MutationObserver(() => {
|
|
23146
|
+
this.refreshDisabledState();
|
|
23147
|
+
});
|
|
23148
|
+
this.inView = false;
|
|
23149
|
+
this.initialized = false;
|
|
23090
23150
|
}
|
|
23091
|
-
|
|
23092
|
-
|
|
23093
|
-
|
|
23094
|
-
|
|
23095
|
-
|
|
23151
|
+
get elementClass() {
|
|
23152
|
+
if (this.disabled) {
|
|
23153
|
+
return this.disabledClass;
|
|
23154
|
+
}
|
|
23155
|
+
if (this.inView) {
|
|
23156
|
+
return `${this.inViewClass} ${this.enabledClass}`;
|
|
23157
|
+
}
|
|
23158
|
+
else {
|
|
23159
|
+
return `${this.outOfViewClass} ${this.enabledClass}`;
|
|
23160
|
+
}
|
|
23096
23161
|
}
|
|
23097
|
-
|
|
23098
|
-
|
|
23162
|
+
ngOnInit() {
|
|
23163
|
+
this.observer.observe(document.body, {
|
|
23164
|
+
childList: true,
|
|
23165
|
+
subtree: true,
|
|
23166
|
+
});
|
|
23167
|
+
this.refreshDisabledState();
|
|
23099
23168
|
}
|
|
23100
|
-
|
|
23101
|
-
|
|
23102
|
-
|
|
23103
|
-
|
|
23104
|
-
|
|
23105
|
-
|
|
23106
|
-
|
|
23107
|
-
|
|
23108
|
-
};
|
|
23109
|
-
};
|
|
23110
|
-
/**
|
|
23111
|
-
* Only keeps recognized keys, flatten nested values (to allow having "." in keys),
|
|
23112
|
-
* pushes warnings and errors to the given arrays; returns null in case of error
|
|
23113
|
-
*/
|
|
23114
|
-
function parseConfigSection(fullConfigObj, sectionName, mandatoryKeys, optionalKeys, outWarnings, outErrors) {
|
|
23115
|
-
if (typeof fullConfigObj[sectionName] !== 'object') {
|
|
23116
|
-
if (mandatoryKeys.length === 0)
|
|
23117
|
-
return null;
|
|
23118
|
-
outErrors.push(`The [${sectionName}] mandatory section is missing.`);
|
|
23119
|
-
return null;
|
|
23169
|
+
ngAfterViewChecked() {
|
|
23170
|
+
if (!this.initialized && !this.disabled) {
|
|
23171
|
+
const target = document.getElementById(this.targetId);
|
|
23172
|
+
if (target) {
|
|
23173
|
+
this.initializeIntersectionObserver(target);
|
|
23174
|
+
this.initialized = true;
|
|
23175
|
+
}
|
|
23176
|
+
}
|
|
23120
23177
|
}
|
|
23121
|
-
|
|
23122
|
-
|
|
23123
|
-
|
|
23124
|
-
|
|
23125
|
-
|
|
23126
|
-
|
|
23178
|
+
initializeIntersectionObserver(target) {
|
|
23179
|
+
this.intersectionObserver = new IntersectionObserver((entries) => {
|
|
23180
|
+
entries.forEach((entry) => {
|
|
23181
|
+
this.inView = entry.isIntersecting;
|
|
23182
|
+
this.changeDetector.detectChanges();
|
|
23183
|
+
});
|
|
23184
|
+
}, {
|
|
23185
|
+
root: null,
|
|
23186
|
+
rootMargin: '-30% 0% -60% 0%',
|
|
23187
|
+
});
|
|
23188
|
+
this.intersectionObserver.observe(target);
|
|
23127
23189
|
}
|
|
23128
|
-
|
|
23129
|
-
|
|
23130
|
-
|
|
23190
|
+
ngOnDestroy() {
|
|
23191
|
+
this.observer.disconnect();
|
|
23192
|
+
if (this.intersectionObserver) {
|
|
23193
|
+
this.intersectionObserver.disconnect();
|
|
23194
|
+
}
|
|
23131
23195
|
}
|
|
23132
|
-
|
|
23196
|
+
refreshDisabledState() {
|
|
23197
|
+
const targetNotPresent = !document.getElementById(this.targetId);
|
|
23198
|
+
if (targetNotPresent !== this.disabled) {
|
|
23199
|
+
this.disabled = targetNotPresent;
|
|
23200
|
+
this.changeDetector.detectChanges();
|
|
23201
|
+
}
|
|
23202
|
+
}
|
|
23203
|
+
scrollToTarget() {
|
|
23204
|
+
const target = document.getElementById(this.targetId);
|
|
23205
|
+
if (!target)
|
|
23206
|
+
return;
|
|
23207
|
+
target.scrollIntoView({
|
|
23208
|
+
behavior: 'smooth',
|
|
23209
|
+
block: 'start',
|
|
23210
|
+
});
|
|
23211
|
+
}
|
|
23212
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: AnchorLinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
23213
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.19", type: AnchorLinkDirective, isStandalone: true, selector: "[gnUiAnchorLink]", inputs: { targetId: ["gnUiAnchorLink", "targetId"], disabledClass: ["gnUiAnchorLinkDisabledClass", "disabledClass"], enabledClass: ["gnUiAnchorLinkEnabledClass", "enabledClass"], inViewClass: ["gnUiAnchorLinkInViewClass", "inViewClass"], outOfViewClass: ["gnUiAnchorLinkOutOfViewClass", "outOfViewClass"] }, host: { listeners: { "click": "scrollToTarget()" }, properties: { "class": "this.elementClass" } }, ngImport: i0 }); }
|
|
23133
23214
|
}
|
|
23134
|
-
|
|
23135
|
-
|
|
23136
|
-
|
|
23137
|
-
|
|
23138
|
-
|
|
23139
|
-
|
|
23140
|
-
|
|
23141
|
-
|
|
23215
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: AnchorLinkDirective, decorators: [{
|
|
23216
|
+
type: Directive,
|
|
23217
|
+
args: [{
|
|
23218
|
+
selector: '[gnUiAnchorLink]',
|
|
23219
|
+
standalone: true,
|
|
23220
|
+
}]
|
|
23221
|
+
}], propDecorators: { targetId: [{
|
|
23222
|
+
type: Input,
|
|
23223
|
+
args: ['gnUiAnchorLink']
|
|
23224
|
+
}], disabledClass: [{
|
|
23225
|
+
type: Input,
|
|
23226
|
+
args: ['gnUiAnchorLinkDisabledClass']
|
|
23227
|
+
}], enabledClass: [{
|
|
23228
|
+
type: Input,
|
|
23229
|
+
args: ['gnUiAnchorLinkEnabledClass']
|
|
23230
|
+
}], inViewClass: [{
|
|
23231
|
+
type: Input,
|
|
23232
|
+
args: ['gnUiAnchorLinkInViewClass']
|
|
23233
|
+
}], outOfViewClass: [{
|
|
23234
|
+
type: Input,
|
|
23235
|
+
args: ['gnUiAnchorLinkOutOfViewClass']
|
|
23236
|
+
}], elementClass: [{
|
|
23237
|
+
type: HostBinding,
|
|
23238
|
+
args: ['class']
|
|
23239
|
+
}], scrollToTarget: [{
|
|
23240
|
+
type: HostListener,
|
|
23241
|
+
args: ['click']
|
|
23242
|
+
}] } });
|
|
23243
|
+
|
|
23244
|
+
class PaginationDotsComponent {
|
|
23245
|
+
constructor() {
|
|
23246
|
+
this.containerClass = '';
|
|
23142
23247
|
}
|
|
23143
|
-
|
|
23248
|
+
// 1-based
|
|
23249
|
+
get steps() {
|
|
23250
|
+
return Array.from({ length: this.listComponent.pagesCount }, (_, i) => i + 1);
|
|
23251
|
+
}
|
|
23252
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PaginationDotsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23253
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: PaginationDotsComponent, isStandalone: true, selector: "gn-ui-pagination-dots", inputs: { listComponent: "listComponent", containerClass: "containerClass" }, ngImport: i0, template: "@if (listComponent.pagesCount > 1) {\n <div\n class=\"overflow-hidden flex flex-row justify-center gap-[14px] p-1\"\n [ngClass]=\"containerClass\"\n >\n @for (step of steps; track step) {\n <button\n type=\"button\"\n class=\"pagination-dot\"\n (click)=\"listComponent.goToPage(step)\"\n [ngClass]=\"\n listComponent.currentPage === step ? 'bg-primary' : 'bg-gray-400'\n \"\n ></button>\n }\n </div>\n}\n", styles: [".pagination-dot{width:6px;height:6px;border-radius:6px;position:relative;flex-shrink:0}.pagination-dot:after{content:\"\";position:absolute;left:-7px;top:-7px;width:20px;height:20px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], viewProviders: [
|
|
23254
|
+
provideIcons({
|
|
23255
|
+
iconoirNavArrowRight,
|
|
23256
|
+
iconoirNavArrowLeft,
|
|
23257
|
+
}),
|
|
23258
|
+
] }); }
|
|
23144
23259
|
}
|
|
23145
|
-
|
|
23146
|
-
|
|
23147
|
-
|
|
23148
|
-
|
|
23149
|
-
|
|
23150
|
-
|
|
23151
|
-
|
|
23152
|
-
|
|
23153
|
-
|
|
23260
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PaginationDotsComponent, decorators: [{
|
|
23261
|
+
type: Component,
|
|
23262
|
+
args: [{ selector: 'gn-ui-pagination-dots', standalone: true, imports: [CommonModule], viewProviders: [
|
|
23263
|
+
provideIcons({
|
|
23264
|
+
iconoirNavArrowRight,
|
|
23265
|
+
iconoirNavArrowLeft,
|
|
23266
|
+
}),
|
|
23267
|
+
], template: "@if (listComponent.pagesCount > 1) {\n <div\n class=\"overflow-hidden flex flex-row justify-center gap-[14px] p-1\"\n [ngClass]=\"containerClass\"\n >\n @for (step of steps; track step) {\n <button\n type=\"button\"\n class=\"pagination-dot\"\n (click)=\"listComponent.goToPage(step)\"\n [ngClass]=\"\n listComponent.currentPage === step ? 'bg-primary' : 'bg-gray-400'\n \"\n ></button>\n }\n </div>\n}\n", styles: [".pagination-dot{width:6px;height:6px;border-radius:6px;position:relative;flex-shrink:0}.pagination-dot:after{content:\"\";position:absolute;left:-7px;top:-7px;width:20px;height:20px}\n"] }]
|
|
23268
|
+
}], propDecorators: { listComponent: [{
|
|
23269
|
+
type: Input
|
|
23270
|
+
}], containerClass: [{
|
|
23271
|
+
type: Input
|
|
23272
|
+
}] } });
|
|
23273
|
+
|
|
23274
|
+
class CarouselComponent {
|
|
23275
|
+
constructor() {
|
|
23276
|
+
this.changeDetector = inject(ChangeDetectorRef);
|
|
23277
|
+
this.containerClass = '';
|
|
23278
|
+
this.stepsContainerClass = 'w-full bottom-0 top-auto';
|
|
23279
|
+
this.currentStepChange = new EventEmitter();
|
|
23280
|
+
this.steps = [];
|
|
23281
|
+
this.currentStep = 0;
|
|
23282
|
+
this.refreshSteps = () => {
|
|
23283
|
+
this.steps = this.emblaApi.scrollSnapList();
|
|
23284
|
+
this.currentStep = this.emblaApi.selectedScrollSnap();
|
|
23285
|
+
this.currentStepChange.emit(this.currentStep);
|
|
23286
|
+
this.changeDetector.detectChanges();
|
|
23287
|
+
};
|
|
23154
23288
|
}
|
|
23155
|
-
|
|
23156
|
-
|
|
23157
|
-
return
|
|
23289
|
+
// Paginable API
|
|
23290
|
+
get isFirstPage() {
|
|
23291
|
+
return this.currentStep === 0;
|
|
23158
23292
|
}
|
|
23159
|
-
|
|
23160
|
-
|
|
23161
|
-
return null;
|
|
23293
|
+
get isLastPage() {
|
|
23294
|
+
return this.currentStep === this.steps.length - 1;
|
|
23162
23295
|
}
|
|
23163
|
-
|
|
23164
|
-
|
|
23165
|
-
function checkMetadataLanguage(parsedConfigSection, outWarnings) {
|
|
23166
|
-
const lang2 = toLang2(parsedConfigSection.metadata_language.toLowerCase());
|
|
23167
|
-
if (lang2?.length !== 2) {
|
|
23168
|
-
outWarnings.push(`In the [global] section: metadata_language = "${parsedConfigSection.metadata_language}" is not a recognized ISO 639 language code`);
|
|
23296
|
+
get currentPage() {
|
|
23297
|
+
return this.currentStep + 1; // this is 1-based
|
|
23169
23298
|
}
|
|
23170
|
-
|
|
23171
|
-
|
|
23172
|
-
function checkNewRecordDefaultLanguage(parsedConfigSection, outWarnings) {
|
|
23173
|
-
const lang2 = toLang2(parsedConfigSection.new_record_default_language.toLowerCase());
|
|
23174
|
-
if (!(lang2 in LANG_2_TO_3_MAPPER)) {
|
|
23175
|
-
outWarnings.push(`In the [editing] section: new_record_default_language = "${parsedConfigSection.new_record_default_language}" is not a recognized ISO 639 language code`);
|
|
23176
|
-
return {
|
|
23177
|
-
...parsedConfigSection,
|
|
23178
|
-
new_record_default_language: undefined,
|
|
23179
|
-
};
|
|
23299
|
+
get pagesCount() {
|
|
23300
|
+
return this.steps.length;
|
|
23180
23301
|
}
|
|
23181
|
-
|
|
23182
|
-
|
|
23183
|
-
new_record_default_language: lang2,
|
|
23184
|
-
};
|
|
23185
|
-
}
|
|
23186
|
-
function checkNewRecordStandard(parsedConfigSection, outWarnings) {
|
|
23187
|
-
const standard = parsedConfigSection.new_record_standard;
|
|
23188
|
-
const normalizedStandard = typeof standard === 'string' ? standard.trim().toLowerCase() : null;
|
|
23189
|
-
if (normalizedStandard === 'iso19139' ||
|
|
23190
|
-
normalizedStandard === 'iso19115-3') {
|
|
23191
|
-
return {
|
|
23192
|
-
...parsedConfigSection,
|
|
23193
|
-
new_record_standard: normalizedStandard,
|
|
23194
|
-
};
|
|
23302
|
+
goToPage(stepIndex) {
|
|
23303
|
+
this.emblaApi.scrollTo(stepIndex - 1); // this is 0-based
|
|
23195
23304
|
}
|
|
23196
|
-
|
|
23197
|
-
|
|
23198
|
-
|
|
23199
|
-
|
|
23200
|
-
}
|
|
23305
|
+
goToPrevPage() {
|
|
23306
|
+
if (this.isFirstPage)
|
|
23307
|
+
return;
|
|
23308
|
+
this.emblaApi.scrollPrev();
|
|
23309
|
+
}
|
|
23310
|
+
goToNextPage() {
|
|
23311
|
+
if (this.isLastPage)
|
|
23312
|
+
return;
|
|
23313
|
+
this.emblaApi.scrollNext();
|
|
23314
|
+
}
|
|
23315
|
+
ngAfterViewInit() {
|
|
23316
|
+
this.emblaApi = EmblaCarousel(this.carouselOverflowContainer.nativeElement, {
|
|
23317
|
+
duration: 15,
|
|
23318
|
+
});
|
|
23319
|
+
this.emblaApi
|
|
23320
|
+
.on('init', this.refreshSteps)
|
|
23321
|
+
.on('reInit', this.refreshSteps)
|
|
23322
|
+
.on('select', this.refreshSteps);
|
|
23323
|
+
}
|
|
23324
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: CarouselComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23325
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: CarouselComponent, isStandalone: true, selector: "gn-ui-carousel", inputs: { containerClass: "containerClass", stepsContainerClass: "stepsContainerClass" }, outputs: { currentStepChange: "currentStepChange" }, viewQueries: [{ propertyName: "carouselOverflowContainer", first: true, predicate: ["carouselOverflowContainer"], descendants: true }], ngImport: i0, template: "<div #carouselOverflowContainer class=\"w-full block\">\n <div class=\"carousel-container flex\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + stepsContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host{position:relative}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: PaginationDotsComponent, selector: "gn-ui-pagination-dots", inputs: ["listComponent", "containerClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
23201
23326
|
}
|
|
23327
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: CarouselComponent, decorators: [{
|
|
23328
|
+
type: Component,
|
|
23329
|
+
args: [{ selector: 'gn-ui-carousel', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, PaginationDotsComponent], template: "<div #carouselOverflowContainer class=\"w-full block\">\n <div class=\"carousel-container flex\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + stepsContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host{position:relative}\n"] }]
|
|
23330
|
+
}], propDecorators: { carouselOverflowContainer: [{
|
|
23331
|
+
type: ViewChild,
|
|
23332
|
+
args: ['carouselOverflowContainer']
|
|
23333
|
+
}], containerClass: [{
|
|
23334
|
+
type: Input
|
|
23335
|
+
}], stepsContainerClass: [{
|
|
23336
|
+
type: Input
|
|
23337
|
+
}], currentStepChange: [{
|
|
23338
|
+
type: Output
|
|
23339
|
+
}] } });
|
|
23202
23340
|
|
|
23203
|
-
|
|
23204
|
-
|
|
23205
|
-
|
|
23206
|
-
|
|
23207
|
-
|
|
23208
|
-
|
|
23209
|
-
|
|
23210
|
-
|
|
23211
|
-
|
|
23212
|
-
|
|
23213
|
-
|
|
23214
|
-
|
|
23341
|
+
class ProgressBarComponent {
|
|
23342
|
+
constructor() {
|
|
23343
|
+
this.value = 0;
|
|
23344
|
+
this.type = 'default';
|
|
23345
|
+
}
|
|
23346
|
+
get progress() {
|
|
23347
|
+
return this.value > 0 ? (this.value < 100 ? this.value : 100) : 0;
|
|
23348
|
+
}
|
|
23349
|
+
get color() {
|
|
23350
|
+
switch (this.type) {
|
|
23351
|
+
case 'default':
|
|
23352
|
+
return {
|
|
23353
|
+
outerBar: 'bg-gray-200',
|
|
23354
|
+
innerBar: 'bg-gray-100',
|
|
23355
|
+
text: 'text-gray-900',
|
|
23356
|
+
};
|
|
23357
|
+
case 'primary':
|
|
23358
|
+
return {
|
|
23359
|
+
outerBar: 'bg-primary',
|
|
23360
|
+
innerBar: 'bg-primary-lighter',
|
|
23361
|
+
text: 'text-white',
|
|
23362
|
+
};
|
|
23363
|
+
case 'secondary':
|
|
23364
|
+
return {
|
|
23365
|
+
outerBar: 'bg-secondary',
|
|
23366
|
+
innerBar: 'bg-secondary-lighter',
|
|
23367
|
+
text: 'text-white',
|
|
23368
|
+
};
|
|
23369
|
+
case 'light':
|
|
23370
|
+
return {
|
|
23371
|
+
outerBar: 'bg-primary-white',
|
|
23372
|
+
innerBar: 'bg-primary',
|
|
23373
|
+
text: 'text-main',
|
|
23374
|
+
};
|
|
23375
|
+
}
|
|
23215
23376
|
}
|
|
23377
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23378
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: ProgressBarComponent, isStandalone: true, selector: "gn-ui-progress-bar", inputs: { value: "value", type: "type" }, ngImport: i0, template: "@switch (type) {\n <!-- Light Theme -->\n @case ('light') {\n <div class=\"flex items-center relative\">\n <div\n class=\"flex-shrink-0 {{ color.text }} font-medium mr-2\n text-opacity-100 !text-slate-800\"\n data-cy=\"progressPercentage\"\n >\n {{ progress }}%\n </div>\n <div class=\"flex-grow h-[4px] w-[52px] {{ color.outerBar }} rounded-full\">\n <div\n [style.width.%]=\"progress\"\n class=\"{{ color.innerBar }} transition-width duration-500\n ease-in-out rounded-full shadow-sm w-[52px] h-[4px]\"\n ></div>\n </div>\n </div>\n }\n <!-- Default / Primary / Secondary Themes -->\n @default {\n <div class=\"flex h-full {{ color.outerBar }} rounded-t-lg rounded-b-lg\">\n <div\n [style.width.%]=\"progress\"\n class=\"flex {{ color.innerBar }} my-1 mx-1 transition-width\n duration-500 ease-in-out rounded-t-md rounded-b-md shadow-xl\"\n >\n <div\n class=\"flex items-center pl-2 py-1 {{ color.text }} font-bold text-4\"\n >\n {{ progress }}%\n </div>\n </div>\n </div>\n }\n}\n", styles: [".font-bold{font-weight:var(--progress-bar-font-weight, \"bold\")}\n"] }); }
|
|
23216
23379
|
}
|
|
23380
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ProgressBarComponent, decorators: [{
|
|
23381
|
+
type: Component,
|
|
23382
|
+
args: [{ selector: 'gn-ui-progress-bar', standalone: true, imports: [], template: "@switch (type) {\n <!-- Light Theme -->\n @case ('light') {\n <div class=\"flex items-center relative\">\n <div\n class=\"flex-shrink-0 {{ color.text }} font-medium mr-2\n text-opacity-100 !text-slate-800\"\n data-cy=\"progressPercentage\"\n >\n {{ progress }}%\n </div>\n <div class=\"flex-grow h-[4px] w-[52px] {{ color.outerBar }} rounded-full\">\n <div\n [style.width.%]=\"progress\"\n class=\"{{ color.innerBar }} transition-width duration-500\n ease-in-out rounded-full shadow-sm w-[52px] h-[4px]\"\n ></div>\n </div>\n </div>\n }\n <!-- Default / Primary / Secondary Themes -->\n @default {\n <div class=\"flex h-full {{ color.outerBar }} rounded-t-lg rounded-b-lg\">\n <div\n [style.width.%]=\"progress\"\n class=\"flex {{ color.innerBar }} my-1 mx-1 transition-width\n duration-500 ease-in-out rounded-t-md rounded-b-md shadow-xl\"\n >\n <div\n class=\"flex items-center pl-2 py-1 {{ color.text }} font-bold text-4\"\n >\n {{ progress }}%\n </div>\n </div>\n </div>\n }\n}\n", styles: [".font-bold{font-weight:var(--progress-bar-font-weight, \"bold\")}\n"] }]
|
|
23383
|
+
}], propDecorators: { value: [{
|
|
23384
|
+
type: Input
|
|
23385
|
+
}], type: [{
|
|
23386
|
+
type: Input
|
|
23387
|
+
}] } });
|
|
23217
23388
|
|
|
23218
|
-
|
|
23219
|
-
|
|
23220
|
-
|
|
23221
|
-
|
|
23222
|
-
|
|
23223
|
-
|
|
23224
|
-
|
|
23225
|
-
|
|
23226
|
-
|
|
23227
|
-
}
|
|
23228
|
-
|
|
23229
|
-
|
|
23230
|
-
|
|
23231
|
-
|
|
23232
|
-
|
|
23233
|
-
}
|
|
23234
|
-
|
|
23235
|
-
|
|
23236
|
-
|
|
23237
|
-
}
|
|
23238
|
-
|
|
23239
|
-
|
|
23240
|
-
|
|
23241
|
-
|
|
23242
|
-
|
|
23243
|
-
function getOptionalEditorConfig() {
|
|
23244
|
-
return editorConfig;
|
|
23245
|
-
}
|
|
23246
|
-
let metadataQualityConfig = null;
|
|
23247
|
-
function getMetadataQualityConfig() {
|
|
23248
|
-
return (metadataQualityConfig ||
|
|
23249
|
-
{
|
|
23250
|
-
ENABLED: false,
|
|
23389
|
+
class PopoverComponent {
|
|
23390
|
+
constructor() {
|
|
23391
|
+
this.viewContainerRef = inject(ViewContainerRef);
|
|
23392
|
+
this.renderer = inject(Renderer2);
|
|
23393
|
+
}
|
|
23394
|
+
getContent() {
|
|
23395
|
+
if (this.content instanceof TemplateRef) {
|
|
23396
|
+
if (this.view) {
|
|
23397
|
+
this.view.destroy();
|
|
23398
|
+
}
|
|
23399
|
+
this.view = this.viewContainerRef.createEmbeddedView(this.content);
|
|
23400
|
+
this.view.detectChanges();
|
|
23401
|
+
const wrapper = this.renderer.createElement('div'); // Create a wrapper div
|
|
23402
|
+
this.view.rootNodes.forEach((node) => {
|
|
23403
|
+
this.renderer.appendChild(wrapper, node); // Append each root node to the wrapper
|
|
23404
|
+
});
|
|
23405
|
+
return wrapper;
|
|
23406
|
+
}
|
|
23407
|
+
return this.content;
|
|
23408
|
+
}
|
|
23409
|
+
ngAfterViewInit() {
|
|
23410
|
+
this.tippyInstance = tippy(this.popoverContent.nativeElement, {
|
|
23411
|
+
content: this.getContent(),
|
|
23412
|
+
allowHTML: true,
|
|
23413
|
+
theme: this.theme,
|
|
23251
23414
|
});
|
|
23252
|
-
}
|
|
23253
|
-
|
|
23254
|
-
|
|
23255
|
-
|
|
23256
|
-
|
|
23257
|
-
|
|
23258
|
-
}
|
|
23259
|
-
let appConfigLoaded = false;
|
|
23260
|
-
function loadAppConfig(configUrl = 'assets/configuration/default.toml') {
|
|
23261
|
-
console.log(`[geonetwork-ui] Loading application configuration from ${configUrl}`);
|
|
23262
|
-
return fetch(configUrl)
|
|
23263
|
-
.then((resp) => {
|
|
23264
|
-
if (!resp.ok)
|
|
23265
|
-
throw new Error('Configuration file could not be loaded');
|
|
23266
|
-
return resp.text();
|
|
23267
|
-
})
|
|
23268
|
-
.then((conf) => {
|
|
23269
|
-
let parsed;
|
|
23270
|
-
try {
|
|
23271
|
-
parsed = TOML.parse(conf, { joiner: '\n', bigint: false });
|
|
23415
|
+
}
|
|
23416
|
+
ngOnChanges(changes) {
|
|
23417
|
+
if (changes['theme']) {
|
|
23418
|
+
this.theme = changes['theme'].currentValue;
|
|
23419
|
+
if (this.tippyInstance) {
|
|
23420
|
+
this.tippyInstance.setProps({ theme: this.theme });
|
|
23421
|
+
}
|
|
23272
23422
|
}
|
|
23273
|
-
|
|
23274
|
-
|
|
23423
|
+
if (changes['content']) {
|
|
23424
|
+
this.content = changes['content'].currentValue;
|
|
23425
|
+
if (this.tippyInstance) {
|
|
23426
|
+
this.tippyInstance.setContent(this.getContent());
|
|
23427
|
+
}
|
|
23275
23428
|
}
|
|
23276
|
-
|
|
23277
|
-
|
|
23278
|
-
|
|
23279
|
-
|
|
23280
|
-
'edit_url_template',
|
|
23281
|
-
'proxy_path',
|
|
23282
|
-
'metadata_language',
|
|
23283
|
-
'login_url',
|
|
23284
|
-
'logout_url',
|
|
23285
|
-
'settings_url',
|
|
23286
|
-
'web_component_embedder_url',
|
|
23287
|
-
'languages',
|
|
23288
|
-
'contact_email',
|
|
23289
|
-
'reuse_form_url',
|
|
23290
|
-
], warnings, errors);
|
|
23291
|
-
if (parsedGlobalSection?.metadata_language) {
|
|
23292
|
-
parsedGlobalSection = checkMetadataLanguage(parsedGlobalSection, warnings);
|
|
23429
|
+
}
|
|
23430
|
+
ngOnDestroy() {
|
|
23431
|
+
if (this.tippyInstance) {
|
|
23432
|
+
this.tippyInstance.destroy();
|
|
23293
23433
|
}
|
|
23294
|
-
|
|
23295
|
-
|
|
23296
|
-
? null
|
|
23297
|
-
: {
|
|
23298
|
-
GN4_API_URL: parsedGlobalSection.geonetwork4_api_url,
|
|
23299
|
-
DATAHUB_URL: parsedGlobalSection.datahub_url,
|
|
23300
|
-
EDIT_URL_TEMPLATE: parsedGlobalSection.edit_url_template,
|
|
23301
|
-
PROXY_PATH: parsedGlobalSection.proxy_path,
|
|
23302
|
-
METADATA_LANGUAGE: parsedGlobalSection.metadata_language
|
|
23303
|
-
? parsedGlobalSection.metadata_language.toLowerCase()
|
|
23304
|
-
: undefined,
|
|
23305
|
-
LOGIN_URL: parsedGlobalSection.login_url,
|
|
23306
|
-
LOGOUT_URL: parsedGlobalSection.logout_url,
|
|
23307
|
-
SETTINGS_URL: parsedGlobalSection.settings_url,
|
|
23308
|
-
WEB_COMPONENT_EMBEDDER_URL: parsedGlobalSection.web_component_embedder_url,
|
|
23309
|
-
LANGUAGES: parsedGlobalSection.languages,
|
|
23310
|
-
CONTACT_EMAIL: parsedGlobalSection.contact_email,
|
|
23311
|
-
REUSE_FORM_URL: parsedGlobalSection.reuse_form_url,
|
|
23312
|
-
};
|
|
23313
|
-
const parsedLayersSections = parseMultiConfigSection(parsed, 'map_layer', ['type'], ['name', 'url', 'data', 'styleUrl', 'accessToken'], warnings, errors);
|
|
23314
|
-
const parsedMapSection = parseConfigSection(parsed, 'map', [], [
|
|
23315
|
-
'max_zoom',
|
|
23316
|
-
'do_not_tile_wms',
|
|
23317
|
-
'max_extent',
|
|
23318
|
-
'max_feature_count',
|
|
23319
|
-
'baselayer',
|
|
23320
|
-
'do_not_use_default_basemap',
|
|
23321
|
-
'external_viewer_url_template',
|
|
23322
|
-
'external_viewer_open_new_tab',
|
|
23323
|
-
], warnings, errors);
|
|
23324
|
-
mapConfig =
|
|
23325
|
-
parsedMapSection === null || parsedLayersSections === null
|
|
23326
|
-
? null
|
|
23327
|
-
: {
|
|
23328
|
-
MAX_ZOOM: parsedMapSection.max_zoom,
|
|
23329
|
-
DO_NOT_TILE_WMS: parsedMapSection.do_not_tile_wms,
|
|
23330
|
-
MAX_EXTENT: parsedMapSection.max_extent,
|
|
23331
|
-
MAX_FEATURE_COUNT: parsedMapSection.max_feature_count,
|
|
23332
|
-
EXTERNAL_VIEWER_URL_TEMPLATE: parsedMapSection.external_viewer_url_template,
|
|
23333
|
-
EXTERNAL_VIEWER_OPEN_NEW_TAB: parsedMapSection.external_viewer_open_new_tab,
|
|
23334
|
-
DO_NOT_USE_DEFAULT_BASEMAP: !!parsedMapSection.do_not_use_default_basemap,
|
|
23335
|
-
MAP_LAYERS: parsedLayersSections.map((map_layer) => ({
|
|
23336
|
-
TYPE: map_layer.type,
|
|
23337
|
-
URL: map_layer.url,
|
|
23338
|
-
NAME: map_layer.name,
|
|
23339
|
-
DATA: map_layer.data,
|
|
23340
|
-
STYLE_URL: map_layer.styleUrl,
|
|
23341
|
-
ACCESS_TOKEN: map_layer.accessToken,
|
|
23342
|
-
})),
|
|
23343
|
-
};
|
|
23344
|
-
const parsedThemeSection = parseConfigSection(parsed, 'theme', ['primary_color', 'secondary_color', 'main_color', 'background_color'], [
|
|
23345
|
-
'header_foreground_color',
|
|
23346
|
-
'main_font',
|
|
23347
|
-
'title_font',
|
|
23348
|
-
'fonts_stylesheet_url',
|
|
23349
|
-
'thumbnail_placeholder',
|
|
23350
|
-
'header_background',
|
|
23351
|
-
'favicon',
|
|
23352
|
-
], warnings, errors);
|
|
23353
|
-
themeConfig =
|
|
23354
|
-
parsedThemeSection === null
|
|
23355
|
-
? null
|
|
23356
|
-
: {
|
|
23357
|
-
PRIMARY_COLOR: parsedThemeSection.primary_color,
|
|
23358
|
-
SECONDARY_COLOR: parsedThemeSection.secondary_color,
|
|
23359
|
-
MAIN_COLOR: parsedThemeSection.main_color,
|
|
23360
|
-
BACKGROUND_COLOR: parsedThemeSection.background_color,
|
|
23361
|
-
HEADER_FOREGROUND_COLOR: parsedThemeSection.header_foreground_color,
|
|
23362
|
-
THUMBNAIL_PLACEHOLDER: parsedThemeSection.thumbnail_placeholder,
|
|
23363
|
-
HEADER_BACKGROUND: parsedThemeSection.header_background,
|
|
23364
|
-
TITLE_FONT: parsedThemeSection.title_font,
|
|
23365
|
-
MAIN_FONT: parsedThemeSection.main_font,
|
|
23366
|
-
FONTS_STYLESHEET_URL: parsedThemeSection.fonts_stylesheet_url,
|
|
23367
|
-
FAVICON: parsedThemeSection.favicon,
|
|
23368
|
-
};
|
|
23369
|
-
const parsedSearchSection = parseConfigSection(parsed, 'search', [], [
|
|
23370
|
-
'record_kind_quick_filter',
|
|
23371
|
-
'filter_geometry_data',
|
|
23372
|
-
'filter_geometry_url',
|
|
23373
|
-
'do_not_use_default_search_preset',
|
|
23374
|
-
'search_preset',
|
|
23375
|
-
'advanced_filters',
|
|
23376
|
-
'limit',
|
|
23377
|
-
'spatial_extent_max_file_size',
|
|
23378
|
-
'geocoding_provider',
|
|
23379
|
-
'geocoding_provider_options',
|
|
23380
|
-
], warnings, errors);
|
|
23381
|
-
const parsedSearchParams = parseMultiConfigSection(parsed, 'search_preset', ['name'], ['sort', 'filters'], warnings, errors);
|
|
23382
|
-
searchConfig =
|
|
23383
|
-
parsedSearchSection === null
|
|
23384
|
-
? null
|
|
23385
|
-
: {
|
|
23386
|
-
RECORD_KIND_QUICK_FILTER: parsedSearchSection.record_kind_quick_filter,
|
|
23387
|
-
FILTER_GEOMETRY_DATA: parsedSearchSection.filter_geometry_data,
|
|
23388
|
-
FILTER_GEOMETRY_URL: parsedSearchSection.filter_geometry_url,
|
|
23389
|
-
DO_NOT_USE_DEFAULT_SEARCH_PRESET: !!parsedSearchSection.do_not_use_default_search_preset,
|
|
23390
|
-
SEARCH_PRESET: parsedSearchParams.map((param) => ({
|
|
23391
|
-
sort: param.sort,
|
|
23392
|
-
name: param.name,
|
|
23393
|
-
filters: param.filters,
|
|
23394
|
-
})),
|
|
23395
|
-
ADVANCED_FILTERS: parsedSearchSection.advanced_filters,
|
|
23396
|
-
LIMIT: parsedSearchSection.limit,
|
|
23397
|
-
SPATIAL_EXTENT_MAX_FILE_SIZE: parsedSearchSection.spatial_extent_max_file_size,
|
|
23398
|
-
GEOCODING_PROVIDER: parsedSearchSection.geocoding_provider,
|
|
23399
|
-
GEOCODING_PROVIDER_OPTIONS: parsedSearchSection.geocoding_provider_options,
|
|
23400
|
-
};
|
|
23401
|
-
const parsedMetadataQualitySection = parseConfigSection(parsed, 'metadata-quality', [], ['enabled'], warnings, errors);
|
|
23402
|
-
metadataQualityConfig =
|
|
23403
|
-
parsedMetadataQualitySection === null
|
|
23404
|
-
? null
|
|
23405
|
-
: {
|
|
23406
|
-
ENABLED: parsedMetadataQualitySection.enabled,
|
|
23407
|
-
SORTABLE: parsedMetadataQualitySection.sortable,
|
|
23408
|
-
};
|
|
23409
|
-
let parsedEditingSection = parseConfigSection(parsed, 'editing', [], ['new_record_default_language', 'new_record_standard'], warnings, errors);
|
|
23410
|
-
if (parsedEditingSection !== null &&
|
|
23411
|
-
parsedEditingSection.new_record_default_language !== undefined) {
|
|
23412
|
-
parsedEditingSection = checkNewRecordDefaultLanguage(parsedEditingSection, warnings);
|
|
23413
|
-
}
|
|
23414
|
-
if (parsedEditingSection !== null &&
|
|
23415
|
-
parsedEditingSection.new_record_standard !== undefined) {
|
|
23416
|
-
parsedEditingSection = checkNewRecordStandard(parsedEditingSection, warnings);
|
|
23417
|
-
}
|
|
23418
|
-
editorConfig =
|
|
23419
|
-
parsedEditingSection === null
|
|
23420
|
-
? null
|
|
23421
|
-
: {
|
|
23422
|
-
NEW_RECORD_DEFAULT_LANGUAGE: parsedEditingSection.new_record_default_language,
|
|
23423
|
-
NEW_RECORD_STANDARD: parsedEditingSection.new_record_standard,
|
|
23424
|
-
};
|
|
23425
|
-
customTranslations = parseTranslationsConfigSection(parsed, 'translations');
|
|
23426
|
-
if (errors.length) {
|
|
23427
|
-
throw new Error(`One or more mandatory settings were missing from the configuration file.
|
|
23428
|
-
${errors.join('\n')}`);
|
|
23429
|
-
}
|
|
23430
|
-
else if (warnings.length) {
|
|
23431
|
-
console.warn(`One or more unexpected settings were encountered in the configuration file.
|
|
23432
|
-
${warnings.join('\n')}`);
|
|
23434
|
+
if (this.view) {
|
|
23435
|
+
this.view.destroy();
|
|
23433
23436
|
}
|
|
23434
|
-
|
|
23435
|
-
});
|
|
23436
|
-
}
|
|
23437
|
-
function isConfigLoaded() {
|
|
23438
|
-
return appConfigLoaded;
|
|
23439
|
-
}
|
|
23440
|
-
function _reset() {
|
|
23441
|
-
globalConfig = null;
|
|
23442
|
-
themeConfig = null;
|
|
23443
|
-
editorConfig = null;
|
|
23444
|
-
customTranslations = null;
|
|
23445
|
-
}
|
|
23446
|
-
const TRANSLATE_WITH_OVERRIDES_CONFIG = {
|
|
23447
|
-
compiler: {
|
|
23448
|
-
provide: TranslateCompiler,
|
|
23449
|
-
useClass: TranslateMessageFormatCompiler,
|
|
23450
|
-
},
|
|
23451
|
-
loader: [
|
|
23452
|
-
{
|
|
23453
|
-
provide: TRANSLATE_HTTP_LOADER_CONFIG,
|
|
23454
|
-
useValue: {
|
|
23455
|
-
prefix: './assets/i18n/',
|
|
23456
|
-
suffix: '.json',
|
|
23457
|
-
},
|
|
23458
|
-
},
|
|
23459
|
-
{
|
|
23460
|
-
provide: TranslateLoader,
|
|
23461
|
-
useClass: FileWithOverridesTranslateLoader,
|
|
23462
|
-
deps: [HttpClient, TRANSLATE_HTTP_LOADER_CONFIG],
|
|
23463
|
-
},
|
|
23464
|
-
],
|
|
23465
|
-
};
|
|
23466
|
-
|
|
23467
|
-
const okAppConfigFixture = () => `
|
|
23468
|
-
[global]
|
|
23469
|
-
geonetwork4_api_url = "/geonetwork/srv/api"
|
|
23470
|
-
proxy_path = "/proxy/?url="
|
|
23471
|
-
metadata_language = "fre"
|
|
23472
|
-
login_url = "/cas/login?service="
|
|
23473
|
-
logout_url = "/geonetwork/signout"
|
|
23474
|
-
settings_url = "/geonetwork/settings"
|
|
23475
|
-
web_component_embedder_url = "/datahub/wc-embedder.html"
|
|
23476
|
-
|
|
23477
|
-
[map]
|
|
23478
|
-
max_zoom = 10
|
|
23479
|
-
max_extent = [-418263.418776, 5251529.591305, 961272.067714, 6706890.609855]
|
|
23480
|
-
do_not_use_default_basemap = false
|
|
23481
|
-
external_viewer_url_template = 'https://example.com/myviewer?'
|
|
23482
|
-
external_viewer_open_new_tab = true
|
|
23483
|
-
[[map_layer]]
|
|
23484
|
-
type = "wms"
|
|
23485
|
-
url = "https://www.geo2france.fr/geoserver/cr_hdf/ows"
|
|
23486
|
-
name = "masque_hdf_ign_carto_latin1"
|
|
23487
|
-
[[map_layer]]
|
|
23488
|
-
type = "wfs"
|
|
23489
|
-
url = "https://www.geo2france.fr/geoserver/cr_hdf/ows"
|
|
23490
|
-
name = "masque_hdf_ign_carto_latin1"
|
|
23491
|
-
|
|
23492
|
-
[theme]
|
|
23493
|
-
primary_color = "#093564"
|
|
23494
|
-
secondary_color = "#c2e9dc"
|
|
23495
|
-
main_color = "#212029" # All-purpose text color
|
|
23496
|
-
background_color = "#fdfbff"
|
|
23497
|
-
thumbnail_placeholder = 'assets/img/placeholder.svg'
|
|
23498
|
-
header_background = 'teal'
|
|
23499
|
-
header_foreground_color = "#872e2e"
|
|
23500
|
-
main_font = 'sans-serif'
|
|
23501
|
-
title_font = 'serif'
|
|
23502
|
-
fonts_stylesheet_url = "https://fonts.googleapis.com/css2?family=Open+Sans"
|
|
23503
|
-
|
|
23504
|
-
[search]
|
|
23505
|
-
record_kind_quick_filter = false
|
|
23506
|
-
filter_geometry_url = 'https://my.domain.org/geom.json'
|
|
23507
|
-
do_not_use_default_search_preset = false
|
|
23508
|
-
geocoding_provider = "geoplateforme"
|
|
23509
|
-
geocoding_provider_options.category = "administratif"
|
|
23510
|
-
geocoding_provider_options.limit = 5
|
|
23511
|
-
advanced_filters = ['publicationYear', 'documentStandard', 'inspireKeyword', 'topic', 'license']
|
|
23512
|
-
|
|
23513
|
-
[[search_preset]]
|
|
23514
|
-
sort = "-createDate"
|
|
23515
|
-
name = 'filterByOrgs'
|
|
23516
|
-
filters.q = 'Carto'
|
|
23517
|
-
filters.organisation = ['Org1', 'Org2']
|
|
23518
|
-
filters.format = ['ESRI Shapefile']
|
|
23519
|
-
filters.topic = ['boundaries']
|
|
23520
|
-
filters.publicationYear = ['2023', '2022']
|
|
23521
|
-
filters.spatial = ['yes']
|
|
23522
|
-
|
|
23523
|
-
[translations.en]
|
|
23524
|
-
"my.first.key" = 'First label.'
|
|
23525
|
-
"my.second.key" = """
|
|
23526
|
-
Second label,
|
|
23527
|
-
on two lines."""
|
|
23528
|
-
|
|
23529
|
-
[translations.de]
|
|
23530
|
-
my.first.key = 'Erste Etikett.'
|
|
23531
|
-
|
|
23532
|
-
[translations.fr]
|
|
23533
|
-
my.sample.text = "Un bon exemple de texte."
|
|
23534
|
-
"my.quoted.text" = 'du texte entre guillements.'
|
|
23535
|
-
`;
|
|
23536
|
-
const appConfigWithTranslationFixture = () => okAppConfigFixture();
|
|
23537
|
-
const minimalAppConfigFixture = () => `
|
|
23538
|
-
[global]
|
|
23539
|
-
geonetwork4_api_url = "/geonetwork/srv/api"
|
|
23540
|
-
proxy_path = "/proxy/?url="
|
|
23541
|
-
|
|
23542
|
-
[theme]
|
|
23543
|
-
primary_color = "#093564"
|
|
23544
|
-
secondary_color = "#c2e9dc"
|
|
23545
|
-
main_color = "#212029" # All-purpose text color
|
|
23546
|
-
background_color = "#fdfbff"
|
|
23547
|
-
`;
|
|
23548
|
-
const mapConfigFixture = () => ({
|
|
23549
|
-
MAX_ZOOM: 10,
|
|
23550
|
-
MAX_EXTENT: [-418263.418776, 5251529.591305, 961272.067714, 6706890.609855],
|
|
23551
|
-
DO_NOT_USE_DEFAULT_BASEMAP: false,
|
|
23552
|
-
DO_NOT_TILE_WMS: false,
|
|
23553
|
-
EXTERNAL_VIEWER_URL_TEMPLATE: 'https://example.com/myviewer/#/?actions=[{"type":"CATALOG:ADD_LAYERS_FROM_CATALOGS","layers":["${layer_name}"],"sources":[{"url":"${service_url}","type":"${service_type}"}]}]',
|
|
23554
|
-
EXTERNAL_VIEWER_OPEN_NEW_TAB: true,
|
|
23555
|
-
MAP_LAYERS: [
|
|
23556
|
-
{
|
|
23557
|
-
TYPE: 'xyz',
|
|
23558
|
-
URL: 'https://some-basemap-server',
|
|
23559
|
-
},
|
|
23560
|
-
{
|
|
23561
|
-
TYPE: 'wms',
|
|
23562
|
-
URL: 'https://some-wms-server',
|
|
23563
|
-
NAME: 'some_layername',
|
|
23564
|
-
},
|
|
23565
|
-
{
|
|
23566
|
-
TYPE: 'wfs',
|
|
23567
|
-
URL: 'https://some-wfs-server',
|
|
23568
|
-
NAME: 'some_layername',
|
|
23569
|
-
},
|
|
23570
|
-
],
|
|
23571
|
-
});
|
|
23572
|
-
const malformedConfigFixture = () => `
|
|
23573
|
-
{
|
|
23574
|
-
"I thought": "we were still doing json"
|
|
23437
|
+
}
|
|
23438
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23439
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: PopoverComponent, isStandalone: true, selector: "gn-ui-popover", inputs: { content: "content", theme: "theme" }, viewQueries: [{ propertyName: "popoverContent", first: true, predicate: ["popoverContent"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<span #popoverContent>\n <ng-content></ng-content>\n</span>\n", styles: [""] }); }
|
|
23575
23440
|
}
|
|
23576
|
-
|
|
23577
|
-
|
|
23578
|
-
[
|
|
23579
|
-
|
|
23580
|
-
|
|
23581
|
-
|
|
23582
|
-
|
|
23583
|
-
|
|
23584
|
-
|
|
23585
|
-
|
|
23586
|
-
|
|
23587
|
-
proxy_path = "/proxy/?url="
|
|
23588
|
-
metadata_language = "abc"
|
|
23589
|
-
|
|
23590
|
-
[map]
|
|
23591
|
-
|
|
23592
|
-
[theme]
|
|
23593
|
-
primary_color = "#093564"
|
|
23594
|
-
secondary_color = "#c2e9dc"
|
|
23595
|
-
main_color = "#212029" # All-purpose text color
|
|
23596
|
-
background_color = "#fdfbff"
|
|
23597
|
-
`;
|
|
23598
|
-
const unrecognizedKeysConfigFixture = () => `
|
|
23599
|
-
[global]
|
|
23600
|
-
geonetwork4_api_url = "/geonetwork/srv/api"
|
|
23601
|
-
proxy_path = "/proxy/?url="
|
|
23602
|
-
metadata_language = "fre"
|
|
23603
|
-
another_path = '/whatever'
|
|
23604
|
-
|
|
23605
|
-
[map]
|
|
23606
|
-
max_zoom = 10
|
|
23607
|
-
max_extent = [-418263.418776, 5251529.591305, 961272.067714, 6706890.609855]
|
|
23608
|
-
do_not_use_default_basemap = false
|
|
23609
|
-
external_viewer_url_template = 'https://example.com/myviewer?'
|
|
23610
|
-
external_viewer_open_new_tab = true
|
|
23611
|
-
another_zoom = 15
|
|
23612
|
-
[[map_layer]]
|
|
23613
|
-
type = "wms"
|
|
23614
|
-
url = "https://www.geo2france.fr/geoserver/cr_hdf/ows"
|
|
23615
|
-
name = "masque_hdf_ign_carto_latin1"
|
|
23616
|
-
[[map_layer]]
|
|
23617
|
-
type = "wfs"
|
|
23618
|
-
url = "https://www.geo2france.fr/geoserver/cr_hdf/ows"
|
|
23619
|
-
name = "masque_hdf_ign_carto_latin1"
|
|
23620
|
-
another_layer = "wrong layer definition"
|
|
23621
|
-
|
|
23622
|
-
[theme]
|
|
23623
|
-
primary_color = "#093564"
|
|
23624
|
-
secondary_color = "#c2e9dc"
|
|
23625
|
-
main_color = "#212029" # All-purpose text color
|
|
23626
|
-
background_color = "#fdfbff"
|
|
23627
|
-
thumbnail_placeholder = 'assets/img/placeholder.svg'
|
|
23628
|
-
header_background = 'teal'
|
|
23629
|
-
header_foreground_color = "#872e2e"
|
|
23630
|
-
main_font = 'sans-serif'
|
|
23631
|
-
title_font = 'serif'
|
|
23632
|
-
another_color = 'red'
|
|
23633
|
-
`;
|
|
23441
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PopoverComponent, decorators: [{
|
|
23442
|
+
type: Component,
|
|
23443
|
+
args: [{ selector: 'gn-ui-popover', standalone: true, imports: [], template: "<span #popoverContent>\n <ng-content></ng-content>\n</span>\n" }]
|
|
23444
|
+
}], propDecorators: { popoverContent: [{
|
|
23445
|
+
type: ViewChild,
|
|
23446
|
+
args: ['popoverContent', { static: false }]
|
|
23447
|
+
}], content: [{
|
|
23448
|
+
type: Input
|
|
23449
|
+
}], theme: [{
|
|
23450
|
+
type: Input
|
|
23451
|
+
}] } });
|
|
23634
23452
|
|
|
23635
|
-
|
|
23636
|
-
|
|
23637
|
-
|
|
23638
|
-
return {
|
|
23639
|
-
type: 'wms',
|
|
23640
|
-
url: config.URL,
|
|
23641
|
-
name: config.NAME,
|
|
23642
|
-
};
|
|
23643
|
-
case 'wfs':
|
|
23644
|
-
return {
|
|
23645
|
-
type: 'wfs',
|
|
23646
|
-
url: config.URL,
|
|
23647
|
-
featureType: config.NAME,
|
|
23648
|
-
};
|
|
23649
|
-
case 'xyz':
|
|
23650
|
-
return {
|
|
23651
|
-
type: config.TYPE,
|
|
23652
|
-
url: config.URL,
|
|
23653
|
-
};
|
|
23654
|
-
case 'geojson':
|
|
23655
|
-
return {
|
|
23656
|
-
type: config.TYPE,
|
|
23657
|
-
...(config.DATA ? { data: config.DATA } : { url: config.URL }),
|
|
23658
|
-
};
|
|
23659
|
-
case 'maplibre-style':
|
|
23660
|
-
return {
|
|
23661
|
-
type: config.TYPE,
|
|
23662
|
-
styleUrl: config.STYLE_URL,
|
|
23663
|
-
accessToken: config.ACCESS_TOKEN,
|
|
23664
|
-
};
|
|
23665
|
-
}
|
|
23453
|
+
class LoadingMaskComponent {
|
|
23454
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: LoadingMaskComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23455
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: LoadingMaskComponent, isStandalone: true, selector: "gn-ui-loading-mask", inputs: { message: "message" }, ngImport: i0, template: "<div class=\"h-full flex flex-col justify-center items-center relative backdrop\">\n <div class=\"absolute background bg-white inset-0\"></div>\n <mat-spinner [diameter]=\"28\" class=\"relative\"></mat-spinner>\n <span class=\"text-sm text-gray-700 mt-3 relative\">{{ message }}</span>\n</div>\n", styles: ["::ng-deep .mat-spinner circle{stroke:var(--color-gray-700);opacity:.5}.backdrop{background-color:#fff6}@supports (-webkit-backdrop-filter: blur()) or (backdrop-filter: blur()){.backdrop{background-color:transparent;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}}.background{opacity:.7}\n"], dependencies: [{ kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
23666
23456
|
}
|
|
23457
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: LoadingMaskComponent, decorators: [{
|
|
23458
|
+
type: Component,
|
|
23459
|
+
args: [{ selector: 'gn-ui-loading-mask', changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatProgressSpinnerModule], standalone: true, template: "<div class=\"h-full flex flex-col justify-center items-center relative backdrop\">\n <div class=\"absolute background bg-white inset-0\"></div>\n <mat-spinner [diameter]=\"28\" class=\"relative\"></mat-spinner>\n <span class=\"text-sm text-gray-700 mt-3 relative\">{{ message }}</span>\n</div>\n", styles: ["::ng-deep .mat-spinner circle{stroke:var(--color-gray-700);opacity:.5}.backdrop{background-color:#fff6}@supports (-webkit-backdrop-filter: blur()) or (backdrop-filter: blur()){.backdrop{background-color:transparent;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}}.background{opacity:.7}\n"] }]
|
|
23460
|
+
}], propDecorators: { message: [{
|
|
23461
|
+
type: Input
|
|
23462
|
+
}] } });
|
|
23667
23463
|
|
|
23668
|
-
class
|
|
23669
|
-
|
|
23670
|
-
|
|
23671
|
-
default: this.createStyleFunction(this.createGeometryStyles({
|
|
23672
|
-
color: isConfigLoaded() ? getThemeConfig().PRIMARY_COLOR : 'blue',
|
|
23673
|
-
})),
|
|
23674
|
-
defaultHL: this.createStyleFunction(this.createGeometryStyles({
|
|
23675
|
-
color: isConfigLoaded() ? getThemeConfig().SECONDARY_COLOR : 'red',
|
|
23676
|
-
isFocused: true,
|
|
23677
|
-
})),
|
|
23678
|
-
};
|
|
23679
|
-
}
|
|
23680
|
-
createGeometryStyles(options) {
|
|
23681
|
-
const { color, isFocused } = options;
|
|
23682
|
-
const zIndex = isFocused ? 10 : undefined;
|
|
23683
|
-
return {
|
|
23684
|
-
polygon: new Style({
|
|
23685
|
-
fill: new Fill({
|
|
23686
|
-
color: this.computeTransparentFillColor(color),
|
|
23687
|
-
}),
|
|
23688
|
-
stroke: new Stroke({
|
|
23689
|
-
color: 'white',
|
|
23690
|
-
width: 2,
|
|
23691
|
-
}),
|
|
23692
|
-
zIndex,
|
|
23693
|
-
}),
|
|
23694
|
-
point: new Style({
|
|
23695
|
-
image: new CircleStyle({
|
|
23696
|
-
fill: new Fill({
|
|
23697
|
-
color,
|
|
23698
|
-
}),
|
|
23699
|
-
stroke: new Stroke({
|
|
23700
|
-
color: 'white',
|
|
23701
|
-
width: isFocused ? 3 : 2,
|
|
23702
|
-
}),
|
|
23703
|
-
radius: isFocused ? 8 : 7,
|
|
23704
|
-
}),
|
|
23705
|
-
zIndex,
|
|
23706
|
-
}),
|
|
23707
|
-
line: [
|
|
23708
|
-
new Style({
|
|
23709
|
-
stroke: new Stroke({
|
|
23710
|
-
color: 'white',
|
|
23711
|
-
width: isFocused ? 8 : 6,
|
|
23712
|
-
}),
|
|
23713
|
-
zIndex,
|
|
23714
|
-
}),
|
|
23715
|
-
new Style({
|
|
23716
|
-
stroke: new Stroke({
|
|
23717
|
-
color,
|
|
23718
|
-
width: isFocused ? 3 : 2,
|
|
23719
|
-
}),
|
|
23720
|
-
zIndex,
|
|
23721
|
-
}),
|
|
23722
|
-
],
|
|
23723
|
-
};
|
|
23724
|
-
}
|
|
23725
|
-
createStyleFunction(styleByGeometryType) {
|
|
23726
|
-
return (feature) => {
|
|
23727
|
-
const geometryType = feature?.getGeometry()?.getType();
|
|
23728
|
-
switch (geometryType) {
|
|
23729
|
-
case 'LinearRing':
|
|
23730
|
-
case 'LineString':
|
|
23731
|
-
case 'MultiLineString':
|
|
23732
|
-
return styleByGeometryType.line;
|
|
23733
|
-
case 'Point':
|
|
23734
|
-
case 'MultiPoint':
|
|
23735
|
-
return styleByGeometryType.point;
|
|
23736
|
-
case 'Circle':
|
|
23737
|
-
case 'Polygon':
|
|
23738
|
-
case 'MultiPolygon':
|
|
23739
|
-
return styleByGeometryType.polygon;
|
|
23740
|
-
default:
|
|
23741
|
-
return styleByGeometryType.point;
|
|
23742
|
-
}
|
|
23743
|
-
};
|
|
23744
|
-
}
|
|
23745
|
-
computeTransparentFillColor(color, alpha = 0.25) {
|
|
23746
|
-
return chroma(color).alpha(alpha).css();
|
|
23747
|
-
}
|
|
23748
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: MapStyleService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
23749
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: MapStyleService, providedIn: 'root' }); }
|
|
23464
|
+
class ColorScaleComponent {
|
|
23465
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ColorScaleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23466
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: ColorScaleComponent, isStandalone: true, selector: "gn-ui-color-scale", ngImport: i0, template: "<div class=\"flex flex-row items-center\">\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32 text-right\">primary</div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-black\"\n title=\"primary-black\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-darkest\"\n title=\"primary-darkest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-darker\"\n title=\"primary-darker\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary border-2 border-primary-darkest\"\n title=\"primary\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-lighter\"\n title=\"primary-lighter\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-lightest\"\n title=\"primary-lightest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-white\"\n title=\"primary-white\"\n ></div>\n</div>\n<div class=\"flex flex-row\">\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32 text-right\">\n secondary\n </div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-black\"\n title=\"secondary-black\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-darkest\"\n title=\"secondary-darkest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-darker\"\n title=\"secondary-darker\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary border-2 border-secondary-darkest\"\n title=\"secondary\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-lighter\"\n title=\"secondary-lighter\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-lightest\"\n title=\"secondary-lightest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-white\"\n title=\"secondary-white\"\n ></div>\n</div>\n<div class=\"flex flex-row\">\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32 text-right\">main</div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-main\" title=\"main\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-900\" title=\"gray-900\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-800\" title=\"gray-800\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-700\" title=\"gray-700\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-600\" title=\"gray-600\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-500\" title=\"gray-500\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-400\" title=\"gray-400\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-300\" title=\"gray-300\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-200\" title=\"gray-200\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-100\" title=\"gray-100\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-50\" title=\"gray-50\"></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-background\"\n title=\"background\"\n ></div>\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32\">background</div>\n</div>\n", styles: [""] }); }
|
|
23750
23467
|
}
|
|
23751
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type:
|
|
23752
|
-
type:
|
|
23753
|
-
args: [{
|
|
23754
|
-
providedIn: 'root',
|
|
23755
|
-
}]
|
|
23468
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ColorScaleComponent, decorators: [{
|
|
23469
|
+
type: Component,
|
|
23470
|
+
args: [{ selector: 'gn-ui-color-scale', standalone: true, template: "<div class=\"flex flex-row items-center\">\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32 text-right\">primary</div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-black\"\n title=\"primary-black\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-darkest\"\n title=\"primary-darkest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-darker\"\n title=\"primary-darker\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary border-2 border-primary-darkest\"\n title=\"primary\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-lighter\"\n title=\"primary-lighter\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-lightest\"\n title=\"primary-lightest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-white\"\n title=\"primary-white\"\n ></div>\n</div>\n<div class=\"flex flex-row\">\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32 text-right\">\n secondary\n </div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-black\"\n title=\"secondary-black\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-darkest\"\n title=\"secondary-darkest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-darker\"\n title=\"secondary-darker\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary border-2 border-secondary-darkest\"\n title=\"secondary\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-lighter\"\n title=\"secondary-lighter\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-lightest\"\n title=\"secondary-lightest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-white\"\n title=\"secondary-white\"\n ></div>\n</div>\n<div class=\"flex flex-row\">\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32 text-right\">main</div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-main\" title=\"main\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-900\" title=\"gray-900\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-800\" title=\"gray-800\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-700\" title=\"gray-700\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-600\" title=\"gray-600\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-500\" title=\"gray-500\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-400\" title=\"gray-400\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-300\" title=\"gray-300\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-200\" title=\"gray-200\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-100\" title=\"gray-100\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-50\" title=\"gray-50\"></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-background\"\n title=\"background\"\n ></div>\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32\">background</div>\n</div>\n" }]
|
|
23756
23471
|
}] });
|
|
23757
23472
|
|
|
23758
|
-
|
|
23759
|
-
const colorSecondary = 'red';
|
|
23760
|
-
const colorStroke = 'white';
|
|
23761
|
-
const defaultMapStyleFixture = () => new Style({
|
|
23762
|
-
image: new Circle({
|
|
23763
|
-
fill: new Fill({
|
|
23764
|
-
color: colorPrimary,
|
|
23765
|
-
}),
|
|
23766
|
-
stroke: new Stroke({
|
|
23767
|
-
color: colorStroke,
|
|
23768
|
-
width: 2,
|
|
23769
|
-
}),
|
|
23770
|
-
radius: 5,
|
|
23771
|
-
}),
|
|
23772
|
-
fill: new Fill({
|
|
23773
|
-
color: 'rgba(0,0,255,0.25)',
|
|
23774
|
-
}),
|
|
23775
|
-
stroke: new Stroke({
|
|
23776
|
-
color: colorStroke,
|
|
23777
|
-
width: 2,
|
|
23778
|
-
}),
|
|
23779
|
-
});
|
|
23780
|
-
const defaultMapStyleHlFixture = () => new Style({
|
|
23781
|
-
image: new Circle({
|
|
23782
|
-
fill: new Fill({
|
|
23783
|
-
color: colorSecondary,
|
|
23784
|
-
}),
|
|
23785
|
-
stroke: new Stroke({
|
|
23786
|
-
color: colorStroke,
|
|
23787
|
-
width: 3,
|
|
23788
|
-
}),
|
|
23789
|
-
radius: 6,
|
|
23790
|
-
}),
|
|
23791
|
-
fill: new Fill({
|
|
23792
|
-
color: 'rgba(255,0,0,0.25)',
|
|
23793
|
-
}),
|
|
23794
|
-
stroke: new Stroke({
|
|
23795
|
-
color: colorSecondary,
|
|
23796
|
-
width: 3,
|
|
23797
|
-
}),
|
|
23798
|
-
});
|
|
23799
|
-
|
|
23800
|
-
class AnchorLinkDirective {
|
|
23473
|
+
class PopupAlertComponent {
|
|
23801
23474
|
constructor() {
|
|
23802
23475
|
this.changeDetector = inject(ChangeDetectorRef);
|
|
23803
|
-
this.
|
|
23804
|
-
this.
|
|
23805
|
-
|
|
23806
|
-
|
|
23807
|
-
this.inView = false;
|
|
23808
|
-
this.initialized = false;
|
|
23476
|
+
this.type = 'info';
|
|
23477
|
+
this.position = 'top';
|
|
23478
|
+
this.expanded = false;
|
|
23479
|
+
this.timeout = null;
|
|
23809
23480
|
}
|
|
23810
|
-
get
|
|
23811
|
-
|
|
23812
|
-
|
|
23813
|
-
}
|
|
23814
|
-
if (this.inView) {
|
|
23815
|
-
return `${this.inViewClass} ${this.enabledClass}`;
|
|
23816
|
-
}
|
|
23817
|
-
else {
|
|
23818
|
-
return `${this.outOfViewClass} ${this.enabledClass}`;
|
|
23819
|
-
}
|
|
23481
|
+
get showDuration() {
|
|
23482
|
+
const chars = this.content.nativeElement.innerHTML.length;
|
|
23483
|
+
return Math.max(3000, chars * 20);
|
|
23820
23484
|
}
|
|
23821
23485
|
ngOnInit() {
|
|
23822
|
-
this.
|
|
23823
|
-
childList: true,
|
|
23824
|
-
subtree: true,
|
|
23825
|
-
});
|
|
23826
|
-
this.refreshDisabledState();
|
|
23827
|
-
}
|
|
23828
|
-
ngAfterViewChecked() {
|
|
23829
|
-
if (!this.initialized && !this.disabled) {
|
|
23830
|
-
const target = document.getElementById(this.targetId);
|
|
23831
|
-
if (target) {
|
|
23832
|
-
this.initializeIntersectionObserver(target);
|
|
23833
|
-
this.initialized = true;
|
|
23834
|
-
}
|
|
23835
|
-
}
|
|
23836
|
-
}
|
|
23837
|
-
initializeIntersectionObserver(target) {
|
|
23838
|
-
this.intersectionObserver = new IntersectionObserver((entries) => {
|
|
23839
|
-
entries.forEach((entry) => {
|
|
23840
|
-
this.inView = entry.isIntersecting;
|
|
23841
|
-
this.changeDetector.detectChanges();
|
|
23842
|
-
});
|
|
23843
|
-
}, {
|
|
23844
|
-
root: null,
|
|
23845
|
-
rootMargin: '-30% 0% -60% 0%',
|
|
23846
|
-
});
|
|
23847
|
-
this.intersectionObserver.observe(target);
|
|
23486
|
+
this.expandAndClose();
|
|
23848
23487
|
}
|
|
23849
|
-
|
|
23850
|
-
this.
|
|
23851
|
-
|
|
23852
|
-
|
|
23853
|
-
}
|
|
23488
|
+
expand() {
|
|
23489
|
+
this.expanded = true;
|
|
23490
|
+
this.changeDetector.detectChanges();
|
|
23491
|
+
clearTimeout(this.timeout);
|
|
23854
23492
|
}
|
|
23855
|
-
|
|
23856
|
-
|
|
23857
|
-
|
|
23858
|
-
|
|
23493
|
+
expandAndClose() {
|
|
23494
|
+
this.expanded = true;
|
|
23495
|
+
this.changeDetector.detectChanges();
|
|
23496
|
+
clearTimeout(this.timeout);
|
|
23497
|
+
this.timeout = setTimeout(() => {
|
|
23498
|
+
this.expanded = false;
|
|
23859
23499
|
this.changeDetector.detectChanges();
|
|
23860
|
-
}
|
|
23861
|
-
}
|
|
23862
|
-
scrollToTarget() {
|
|
23863
|
-
const target = document.getElementById(this.targetId);
|
|
23864
|
-
if (!target)
|
|
23865
|
-
return;
|
|
23866
|
-
target.scrollIntoView({
|
|
23867
|
-
behavior: 'smooth',
|
|
23868
|
-
block: 'start',
|
|
23869
|
-
});
|
|
23500
|
+
}, this.showDuration);
|
|
23870
23501
|
}
|
|
23871
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type:
|
|
23872
|
-
static { this.ɵ
|
|
23873
|
-
}
|
|
23874
|
-
|
|
23875
|
-
|
|
23876
|
-
|
|
23877
|
-
|
|
23878
|
-
standalone: true,
|
|
23879
|
-
}]
|
|
23880
|
-
}], propDecorators: { targetId: [{
|
|
23881
|
-
type: Input,
|
|
23882
|
-
args: ['gnUiAnchorLink']
|
|
23883
|
-
}], disabledClass: [{
|
|
23884
|
-
type: Input,
|
|
23885
|
-
args: ['gnUiAnchorLinkDisabledClass']
|
|
23886
|
-
}], enabledClass: [{
|
|
23887
|
-
type: Input,
|
|
23888
|
-
args: ['gnUiAnchorLinkEnabledClass']
|
|
23889
|
-
}], inViewClass: [{
|
|
23890
|
-
type: Input,
|
|
23891
|
-
args: ['gnUiAnchorLinkInViewClass']
|
|
23892
|
-
}], outOfViewClass: [{
|
|
23893
|
-
type: Input,
|
|
23894
|
-
args: ['gnUiAnchorLinkOutOfViewClass']
|
|
23895
|
-
}], elementClass: [{
|
|
23896
|
-
type: HostBinding,
|
|
23897
|
-
args: ['class']
|
|
23898
|
-
}], scrollToTarget: [{
|
|
23899
|
-
type: HostListener,
|
|
23900
|
-
args: ['click']
|
|
23901
|
-
}] } });
|
|
23902
|
-
|
|
23903
|
-
class PaginationDotsComponent {
|
|
23904
|
-
constructor() {
|
|
23905
|
-
this.containerClass = '';
|
|
23906
|
-
}
|
|
23907
|
-
// 1-based
|
|
23908
|
-
get steps() {
|
|
23909
|
-
return Array.from({ length: this.listComponent.pagesCount }, (_, i) => i + 1);
|
|
23910
|
-
}
|
|
23911
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PaginationDotsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23912
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: PaginationDotsComponent, isStandalone: true, selector: "gn-ui-pagination-dots", inputs: { listComponent: "listComponent", containerClass: "containerClass" }, ngImport: i0, template: "@if (listComponent.pagesCount > 1) {\n <div\n class=\"overflow-hidden flex flex-row justify-center gap-[14px] p-1\"\n [ngClass]=\"containerClass\"\n >\n @for (step of steps; track step) {\n <button\n type=\"button\"\n class=\"pagination-dot\"\n (click)=\"listComponent.goToPage(step)\"\n [ngClass]=\"\n listComponent.currentPage === step ? 'bg-primary' : 'bg-gray-400'\n \"\n ></button>\n }\n </div>\n}\n", styles: [".pagination-dot{width:6px;height:6px;border-radius:6px;position:relative;flex-shrink:0}.pagination-dot:after{content:\"\";position:absolute;left:-7px;top:-7px;width:20px;height:20px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], viewProviders: [
|
|
23913
|
-
provideIcons({
|
|
23914
|
-
iconoirNavArrowRight,
|
|
23915
|
-
iconoirNavArrowLeft,
|
|
23916
|
-
}),
|
|
23917
|
-
] }); }
|
|
23918
|
-
}
|
|
23919
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PaginationDotsComponent, decorators: [{
|
|
23920
|
-
type: Component,
|
|
23921
|
-
args: [{ selector: 'gn-ui-pagination-dots', standalone: true, imports: [CommonModule], viewProviders: [
|
|
23922
|
-
provideIcons({
|
|
23923
|
-
iconoirNavArrowRight,
|
|
23924
|
-
iconoirNavArrowLeft,
|
|
23925
|
-
}),
|
|
23926
|
-
], template: "@if (listComponent.pagesCount > 1) {\n <div\n class=\"overflow-hidden flex flex-row justify-center gap-[14px] p-1\"\n [ngClass]=\"containerClass\"\n >\n @for (step of steps; track step) {\n <button\n type=\"button\"\n class=\"pagination-dot\"\n (click)=\"listComponent.goToPage(step)\"\n [ngClass]=\"\n listComponent.currentPage === step ? 'bg-primary' : 'bg-gray-400'\n \"\n ></button>\n }\n </div>\n}\n", styles: [".pagination-dot{width:6px;height:6px;border-radius:6px;position:relative;flex-shrink:0}.pagination-dot:after{content:\"\";position:absolute;left:-7px;top:-7px;width:20px;height:20px}\n"] }]
|
|
23927
|
-
}], propDecorators: { listComponent: [{
|
|
23928
|
-
type: Input
|
|
23929
|
-
}], containerClass: [{
|
|
23930
|
-
type: Input
|
|
23931
|
-
}] } });
|
|
23932
|
-
|
|
23933
|
-
class CarouselComponent {
|
|
23934
|
-
constructor() {
|
|
23935
|
-
this.changeDetector = inject(ChangeDetectorRef);
|
|
23936
|
-
this.containerClass = '';
|
|
23937
|
-
this.stepsContainerClass = 'w-full bottom-0 top-auto';
|
|
23938
|
-
this.currentStepChange = new EventEmitter();
|
|
23939
|
-
this.steps = [];
|
|
23940
|
-
this.currentStep = 0;
|
|
23941
|
-
this.refreshSteps = () => {
|
|
23942
|
-
this.steps = this.emblaApi.scrollSnapList();
|
|
23943
|
-
this.currentStep = this.emblaApi.selectedScrollSnap();
|
|
23944
|
-
this.currentStepChange.emit(this.currentStep);
|
|
23945
|
-
this.changeDetector.detectChanges();
|
|
23946
|
-
};
|
|
23947
|
-
}
|
|
23948
|
-
// Paginable API
|
|
23949
|
-
get isFirstPage() {
|
|
23950
|
-
return this.currentStep === 0;
|
|
23951
|
-
}
|
|
23952
|
-
get isLastPage() {
|
|
23953
|
-
return this.currentStep === this.steps.length - 1;
|
|
23954
|
-
}
|
|
23955
|
-
get currentPage() {
|
|
23956
|
-
return this.currentStep + 1; // this is 1-based
|
|
23957
|
-
}
|
|
23958
|
-
get pagesCount() {
|
|
23959
|
-
return this.steps.length;
|
|
23960
|
-
}
|
|
23961
|
-
goToPage(stepIndex) {
|
|
23962
|
-
this.emblaApi.scrollTo(stepIndex - 1); // this is 0-based
|
|
23963
|
-
}
|
|
23964
|
-
goToPrevPage() {
|
|
23965
|
-
if (this.isFirstPage)
|
|
23966
|
-
return;
|
|
23967
|
-
this.emblaApi.scrollPrev();
|
|
23968
|
-
}
|
|
23969
|
-
goToNextPage() {
|
|
23970
|
-
if (this.isLastPage)
|
|
23971
|
-
return;
|
|
23972
|
-
this.emblaApi.scrollNext();
|
|
23973
|
-
}
|
|
23974
|
-
ngAfterViewInit() {
|
|
23975
|
-
this.emblaApi = EmblaCarousel(this.carouselOverflowContainer.nativeElement, {
|
|
23976
|
-
duration: 15,
|
|
23977
|
-
});
|
|
23978
|
-
this.emblaApi
|
|
23979
|
-
.on('init', this.refreshSteps)
|
|
23980
|
-
.on('reInit', this.refreshSteps)
|
|
23981
|
-
.on('select', this.refreshSteps);
|
|
23982
|
-
}
|
|
23983
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: CarouselComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23984
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: CarouselComponent, isStandalone: true, selector: "gn-ui-carousel", inputs: { containerClass: "containerClass", stepsContainerClass: "stepsContainerClass" }, outputs: { currentStepChange: "currentStepChange" }, viewQueries: [{ propertyName: "carouselOverflowContainer", first: true, predicate: ["carouselOverflowContainer"], descendants: true }], ngImport: i0, template: "<div #carouselOverflowContainer class=\"w-full block\">\n <div class=\"carousel-container flex\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + stepsContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host{position:relative}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: PaginationDotsComponent, selector: "gn-ui-pagination-dots", inputs: ["listComponent", "containerClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
23985
|
-
}
|
|
23986
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: CarouselComponent, decorators: [{
|
|
23987
|
-
type: Component,
|
|
23988
|
-
args: [{ selector: 'gn-ui-carousel', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, PaginationDotsComponent], template: "<div #carouselOverflowContainer class=\"w-full block\">\n <div class=\"carousel-container flex\" [ngClass]=\"containerClass\">\n <ng-content></ng-content>\n </div>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + stepsContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host{position:relative}\n"] }]
|
|
23989
|
-
}], propDecorators: { carouselOverflowContainer: [{
|
|
23990
|
-
type: ViewChild,
|
|
23991
|
-
args: ['carouselOverflowContainer']
|
|
23992
|
-
}], containerClass: [{
|
|
23993
|
-
type: Input
|
|
23994
|
-
}], stepsContainerClass: [{
|
|
23995
|
-
type: Input
|
|
23996
|
-
}], currentStepChange: [{
|
|
23997
|
-
type: Output
|
|
23998
|
-
}] } });
|
|
23999
|
-
|
|
24000
|
-
class ProgressBarComponent {
|
|
24001
|
-
constructor() {
|
|
24002
|
-
this.value = 0;
|
|
24003
|
-
this.type = 'default';
|
|
24004
|
-
}
|
|
24005
|
-
get progress() {
|
|
24006
|
-
return this.value > 0 ? (this.value < 100 ? this.value : 100) : 0;
|
|
24007
|
-
}
|
|
24008
|
-
get color() {
|
|
24009
|
-
switch (this.type) {
|
|
24010
|
-
case 'default':
|
|
24011
|
-
return {
|
|
24012
|
-
outerBar: 'bg-gray-200',
|
|
24013
|
-
innerBar: 'bg-gray-100',
|
|
24014
|
-
text: 'text-gray-900',
|
|
24015
|
-
};
|
|
24016
|
-
case 'primary':
|
|
24017
|
-
return {
|
|
24018
|
-
outerBar: 'bg-primary',
|
|
24019
|
-
innerBar: 'bg-primary-lighter',
|
|
24020
|
-
text: 'text-white',
|
|
24021
|
-
};
|
|
24022
|
-
case 'secondary':
|
|
24023
|
-
return {
|
|
24024
|
-
outerBar: 'bg-secondary',
|
|
24025
|
-
innerBar: 'bg-secondary-lighter',
|
|
24026
|
-
text: 'text-white',
|
|
24027
|
-
};
|
|
24028
|
-
case 'light':
|
|
24029
|
-
return {
|
|
24030
|
-
outerBar: 'bg-primary-white',
|
|
24031
|
-
innerBar: 'bg-primary',
|
|
24032
|
-
text: 'text-main',
|
|
24033
|
-
};
|
|
24034
|
-
}
|
|
24035
|
-
}
|
|
24036
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
24037
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: ProgressBarComponent, isStandalone: true, selector: "gn-ui-progress-bar", inputs: { value: "value", type: "type" }, ngImport: i0, template: "@switch (type) {\n <!-- Light Theme -->\n @case ('light') {\n <div class=\"flex items-center relative\">\n <div\n class=\"flex-shrink-0 {{ color.text }} font-medium mr-2\n text-opacity-100 !text-slate-800\"\n data-cy=\"progressPercentage\"\n >\n {{ progress }}%\n </div>\n <div class=\"flex-grow h-[4px] w-[52px] {{ color.outerBar }} rounded-full\">\n <div\n [style.width.%]=\"progress\"\n class=\"{{ color.innerBar }} transition-width duration-500\n ease-in-out rounded-full shadow-sm w-[52px] h-[4px]\"\n ></div>\n </div>\n </div>\n }\n <!-- Default / Primary / Secondary Themes -->\n @default {\n <div class=\"flex h-full {{ color.outerBar }} rounded-t-lg rounded-b-lg\">\n <div\n [style.width.%]=\"progress\"\n class=\"flex {{ color.innerBar }} my-1 mx-1 transition-width\n duration-500 ease-in-out rounded-t-md rounded-b-md shadow-xl\"\n >\n <div\n class=\"flex items-center pl-2 py-1 {{ color.text }} font-bold text-4\"\n >\n {{ progress }}%\n </div>\n </div>\n </div>\n }\n}\n", styles: [".font-bold{font-weight:var(--progress-bar-font-weight, \"bold\")}\n"] }); }
|
|
24038
|
-
}
|
|
24039
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ProgressBarComponent, decorators: [{
|
|
24040
|
-
type: Component,
|
|
24041
|
-
args: [{ selector: 'gn-ui-progress-bar', standalone: true, imports: [], template: "@switch (type) {\n <!-- Light Theme -->\n @case ('light') {\n <div class=\"flex items-center relative\">\n <div\n class=\"flex-shrink-0 {{ color.text }} font-medium mr-2\n text-opacity-100 !text-slate-800\"\n data-cy=\"progressPercentage\"\n >\n {{ progress }}%\n </div>\n <div class=\"flex-grow h-[4px] w-[52px] {{ color.outerBar }} rounded-full\">\n <div\n [style.width.%]=\"progress\"\n class=\"{{ color.innerBar }} transition-width duration-500\n ease-in-out rounded-full shadow-sm w-[52px] h-[4px]\"\n ></div>\n </div>\n </div>\n }\n <!-- Default / Primary / Secondary Themes -->\n @default {\n <div class=\"flex h-full {{ color.outerBar }} rounded-t-lg rounded-b-lg\">\n <div\n [style.width.%]=\"progress\"\n class=\"flex {{ color.innerBar }} my-1 mx-1 transition-width\n duration-500 ease-in-out rounded-t-md rounded-b-md shadow-xl\"\n >\n <div\n class=\"flex items-center pl-2 py-1 {{ color.text }} font-bold text-4\"\n >\n {{ progress }}%\n </div>\n </div>\n </div>\n }\n}\n", styles: [".font-bold{font-weight:var(--progress-bar-font-weight, \"bold\")}\n"] }]
|
|
24042
|
-
}], propDecorators: { value: [{
|
|
24043
|
-
type: Input
|
|
24044
|
-
}], type: [{
|
|
24045
|
-
type: Input
|
|
24046
|
-
}] } });
|
|
24047
|
-
|
|
24048
|
-
class PopoverComponent {
|
|
24049
|
-
constructor() {
|
|
24050
|
-
this.viewContainerRef = inject(ViewContainerRef);
|
|
24051
|
-
this.renderer = inject(Renderer2);
|
|
24052
|
-
}
|
|
24053
|
-
getContent() {
|
|
24054
|
-
if (this.content instanceof TemplateRef) {
|
|
24055
|
-
if (this.view) {
|
|
24056
|
-
this.view.destroy();
|
|
24057
|
-
}
|
|
24058
|
-
this.view = this.viewContainerRef.createEmbeddedView(this.content);
|
|
24059
|
-
this.view.detectChanges();
|
|
24060
|
-
const wrapper = this.renderer.createElement('div'); // Create a wrapper div
|
|
24061
|
-
this.view.rootNodes.forEach((node) => {
|
|
24062
|
-
this.renderer.appendChild(wrapper, node); // Append each root node to the wrapper
|
|
24063
|
-
});
|
|
24064
|
-
return wrapper;
|
|
24065
|
-
}
|
|
24066
|
-
return this.content;
|
|
24067
|
-
}
|
|
24068
|
-
ngAfterViewInit() {
|
|
24069
|
-
this.tippyInstance = tippy(this.popoverContent.nativeElement, {
|
|
24070
|
-
content: this.getContent(),
|
|
24071
|
-
allowHTML: true,
|
|
24072
|
-
theme: this.theme,
|
|
24073
|
-
});
|
|
24074
|
-
}
|
|
24075
|
-
ngOnChanges(changes) {
|
|
24076
|
-
if (changes['theme']) {
|
|
24077
|
-
this.theme = changes['theme'].currentValue;
|
|
24078
|
-
if (this.tippyInstance) {
|
|
24079
|
-
this.tippyInstance.setProps({ theme: this.theme });
|
|
24080
|
-
}
|
|
24081
|
-
}
|
|
24082
|
-
if (changes['content']) {
|
|
24083
|
-
this.content = changes['content'].currentValue;
|
|
24084
|
-
if (this.tippyInstance) {
|
|
24085
|
-
this.tippyInstance.setContent(this.getContent());
|
|
24086
|
-
}
|
|
24087
|
-
}
|
|
24088
|
-
}
|
|
24089
|
-
ngOnDestroy() {
|
|
24090
|
-
if (this.tippyInstance) {
|
|
24091
|
-
this.tippyInstance.destroy();
|
|
24092
|
-
}
|
|
24093
|
-
if (this.view) {
|
|
24094
|
-
this.view.destroy();
|
|
24095
|
-
}
|
|
24096
|
-
}
|
|
24097
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
24098
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: PopoverComponent, isStandalone: true, selector: "gn-ui-popover", inputs: { content: "content", theme: "theme" }, viewQueries: [{ propertyName: "popoverContent", first: true, predicate: ["popoverContent"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<span #popoverContent>\n <ng-content></ng-content>\n</span>\n", styles: [""] }); }
|
|
24099
|
-
}
|
|
24100
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PopoverComponent, decorators: [{
|
|
24101
|
-
type: Component,
|
|
24102
|
-
args: [{ selector: 'gn-ui-popover', standalone: true, imports: [], template: "<span #popoverContent>\n <ng-content></ng-content>\n</span>\n" }]
|
|
24103
|
-
}], propDecorators: { popoverContent: [{
|
|
24104
|
-
type: ViewChild,
|
|
24105
|
-
args: ['popoverContent', { static: false }]
|
|
24106
|
-
}], content: [{
|
|
24107
|
-
type: Input
|
|
24108
|
-
}], theme: [{
|
|
24109
|
-
type: Input
|
|
24110
|
-
}] } });
|
|
24111
|
-
|
|
24112
|
-
class LoadingMaskComponent {
|
|
24113
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: LoadingMaskComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
24114
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: LoadingMaskComponent, isStandalone: true, selector: "gn-ui-loading-mask", inputs: { message: "message" }, ngImport: i0, template: "<div class=\"h-full flex flex-col justify-center items-center relative backdrop\">\n <div class=\"absolute background bg-white inset-0\"></div>\n <mat-spinner [diameter]=\"28\" class=\"relative\"></mat-spinner>\n <span class=\"text-sm text-gray-700 mt-3 relative\">{{ message }}</span>\n</div>\n", styles: ["::ng-deep .mat-spinner circle{stroke:var(--color-gray-700);opacity:.5}.backdrop{background-color:#fff6}@supports (-webkit-backdrop-filter: blur()) or (backdrop-filter: blur()){.backdrop{background-color:transparent;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}}.background{opacity:.7}\n"], dependencies: [{ kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
24115
|
-
}
|
|
24116
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: LoadingMaskComponent, decorators: [{
|
|
24117
|
-
type: Component,
|
|
24118
|
-
args: [{ selector: 'gn-ui-loading-mask', changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatProgressSpinnerModule], standalone: true, template: "<div class=\"h-full flex flex-col justify-center items-center relative backdrop\">\n <div class=\"absolute background bg-white inset-0\"></div>\n <mat-spinner [diameter]=\"28\" class=\"relative\"></mat-spinner>\n <span class=\"text-sm text-gray-700 mt-3 relative\">{{ message }}</span>\n</div>\n", styles: ["::ng-deep .mat-spinner circle{stroke:var(--color-gray-700);opacity:.5}.backdrop{background-color:#fff6}@supports (-webkit-backdrop-filter: blur()) or (backdrop-filter: blur()){.backdrop{background-color:transparent;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}}.background{opacity:.7}\n"] }]
|
|
24119
|
-
}], propDecorators: { message: [{
|
|
24120
|
-
type: Input
|
|
24121
|
-
}] } });
|
|
24122
|
-
|
|
24123
|
-
class ColorScaleComponent {
|
|
24124
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ColorScaleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
24125
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: ColorScaleComponent, isStandalone: true, selector: "gn-ui-color-scale", ngImport: i0, template: "<div class=\"flex flex-row items-center\">\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32 text-right\">primary</div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-black\"\n title=\"primary-black\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-darkest\"\n title=\"primary-darkest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-darker\"\n title=\"primary-darker\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary border-2 border-primary-darkest\"\n title=\"primary\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-lighter\"\n title=\"primary-lighter\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-lightest\"\n title=\"primary-lightest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-white\"\n title=\"primary-white\"\n ></div>\n</div>\n<div class=\"flex flex-row\">\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32 text-right\">\n secondary\n </div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-black\"\n title=\"secondary-black\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-darkest\"\n title=\"secondary-darkest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-darker\"\n title=\"secondary-darker\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary border-2 border-secondary-darkest\"\n title=\"secondary\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-lighter\"\n title=\"secondary-lighter\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-lightest\"\n title=\"secondary-lightest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-white\"\n title=\"secondary-white\"\n ></div>\n</div>\n<div class=\"flex flex-row\">\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32 text-right\">main</div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-main\" title=\"main\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-900\" title=\"gray-900\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-800\" title=\"gray-800\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-700\" title=\"gray-700\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-600\" title=\"gray-600\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-500\" title=\"gray-500\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-400\" title=\"gray-400\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-300\" title=\"gray-300\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-200\" title=\"gray-200\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-100\" title=\"gray-100\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-50\" title=\"gray-50\"></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-background\"\n title=\"background\"\n ></div>\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32\">background</div>\n</div>\n", styles: [""] }); }
|
|
24126
|
-
}
|
|
24127
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ColorScaleComponent, decorators: [{
|
|
24128
|
-
type: Component,
|
|
24129
|
-
args: [{ selector: 'gn-ui-color-scale', standalone: true, template: "<div class=\"flex flex-row items-center\">\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32 text-right\">primary</div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-black\"\n title=\"primary-black\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-darkest\"\n title=\"primary-darkest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-darker\"\n title=\"primary-darker\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary border-2 border-primary-darkest\"\n title=\"primary\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-lighter\"\n title=\"primary-lighter\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-lightest\"\n title=\"primary-lightest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-white\"\n title=\"primary-white\"\n ></div>\n</div>\n<div class=\"flex flex-row\">\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32 text-right\">\n secondary\n </div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-black\"\n title=\"secondary-black\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-darkest\"\n title=\"secondary-darkest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-darker\"\n title=\"secondary-darker\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary border-2 border-secondary-darkest\"\n title=\"secondary\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-lighter\"\n title=\"secondary-lighter\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-lightest\"\n title=\"secondary-lightest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-white\"\n title=\"secondary-white\"\n ></div>\n</div>\n<div class=\"flex flex-row\">\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32 text-right\">main</div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-main\" title=\"main\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-900\" title=\"gray-900\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-800\" title=\"gray-800\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-700\" title=\"gray-700\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-600\" title=\"gray-600\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-500\" title=\"gray-500\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-400\" title=\"gray-400\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-300\" title=\"gray-300\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-200\" title=\"gray-200\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-100\" title=\"gray-100\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-50\" title=\"gray-50\"></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-background\"\n title=\"background\"\n ></div>\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32\">background</div>\n</div>\n" }]
|
|
24130
|
-
}] });
|
|
24131
|
-
|
|
24132
|
-
class PopupAlertComponent {
|
|
24133
|
-
constructor() {
|
|
24134
|
-
this.changeDetector = inject(ChangeDetectorRef);
|
|
24135
|
-
this.type = 'info';
|
|
24136
|
-
this.position = 'top';
|
|
24137
|
-
this.expanded = false;
|
|
24138
|
-
this.timeout = null;
|
|
24139
|
-
}
|
|
24140
|
-
get showDuration() {
|
|
24141
|
-
const chars = this.content.nativeElement.innerHTML.length;
|
|
24142
|
-
return Math.max(3000, chars * 20);
|
|
24143
|
-
}
|
|
24144
|
-
ngOnInit() {
|
|
24145
|
-
this.expandAndClose();
|
|
24146
|
-
}
|
|
24147
|
-
expand() {
|
|
24148
|
-
this.expanded = true;
|
|
24149
|
-
this.changeDetector.detectChanges();
|
|
24150
|
-
clearTimeout(this.timeout);
|
|
24151
|
-
}
|
|
24152
|
-
expandAndClose() {
|
|
24153
|
-
this.expanded = true;
|
|
24154
|
-
this.changeDetector.detectChanges();
|
|
24155
|
-
clearTimeout(this.timeout);
|
|
24156
|
-
this.timeout = setTimeout(() => {
|
|
24157
|
-
this.expanded = false;
|
|
24158
|
-
this.changeDetector.detectChanges();
|
|
24159
|
-
}, this.showDuration);
|
|
24160
|
-
}
|
|
24161
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PopupAlertComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
24162
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: PopupAlertComponent, isStandalone: true, selector: "gn-ui-popup-alert", inputs: { icon: "icon", type: "type", position: "position" }, providers: [
|
|
24163
|
-
provideIcons({ matErrorOutlineOutline }),
|
|
24164
|
-
provideNgIconsConfig({
|
|
24165
|
-
size: '1.5em',
|
|
24166
|
-
}),
|
|
24167
|
-
], viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true }], ngImport: i0, template: "<div class=\"h-full relative container\">\n <div\n class=\"pointer-events-auto absolute text-white flex flex-row p-2 rounded message\"\n role=\"alert\"\n [ngClass]=\"{\n 'position-bottom': position === 'bottom',\n 'position-top': position === 'top',\n expanded: this.expanded,\n 'bg-red-500': type === 'danger',\n 'bg-yellow-500': type === 'warning',\n 'bg-blue-500': type === 'info',\n }\"\n (mouseenter)=\"expand()\"\n (mouseleave)=\"expandAndClose()\"\n >\n <ng-icon class=\"mr-2 shrink-0 select-none\" [name]=\"icon\"></ng-icon>\n <div class=\"grow\" #content [ngClass]=\"{ invisible: !expanded }\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: [":host{pointer-events:none}.container{filter:drop-shadow(0px 4px 3px rgba(0,0,0,.2))}.message{transition:clip-path .3s cubic-bezier(.25,.46,.45,.94)}.message.expanded{clip-path:circle(100%)}.position-top{clip-path:circle(19px at 20px 20px);align-items:start;top:0;left:0}.position-bottom{clip-path:circle(19px at 20px calc(100% - 20px));align-items:end;bottom:0;left:0}.container ::ng-deep a{text-decoration:underline;font-weight:700}.container ::ng-deep a:hover{opacity:.85}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
23502
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PopupAlertComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23503
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: PopupAlertComponent, isStandalone: true, selector: "gn-ui-popup-alert", inputs: { icon: "icon", type: "type", position: "position" }, providers: [
|
|
23504
|
+
provideIcons({ matErrorOutlineOutline }),
|
|
23505
|
+
provideNgIconsConfig({
|
|
23506
|
+
size: '1.5em',
|
|
23507
|
+
}),
|
|
23508
|
+
], viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true }], ngImport: i0, template: "<div class=\"h-full relative container\">\n <div\n class=\"pointer-events-auto absolute text-white flex flex-row p-2 rounded message\"\n role=\"alert\"\n [ngClass]=\"{\n 'position-bottom': position === 'bottom',\n 'position-top': position === 'top',\n expanded: this.expanded,\n 'bg-red-500': type === 'danger',\n 'bg-yellow-500': type === 'warning',\n 'bg-blue-500': type === 'info',\n }\"\n (mouseenter)=\"expand()\"\n (mouseleave)=\"expandAndClose()\"\n >\n <ng-icon class=\"mr-2 shrink-0 select-none\" [name]=\"icon\"></ng-icon>\n <div class=\"grow\" #content [ngClass]=\"{ invisible: !expanded }\">\n <ng-content></ng-content>\n </div>\n </div>\n</div>\n", styles: [":host{pointer-events:none}.container{filter:drop-shadow(0px 4px 3px rgba(0,0,0,.2))}.message{transition:clip-path .3s cubic-bezier(.25,.46,.45,.94)}.message.expanded{clip-path:circle(100%)}.position-top{clip-path:circle(19px at 20px 20px);align-items:start;top:0;left:0}.position-bottom{clip-path:circle(19px at 20px calc(100% - 20px));align-items:end;bottom:0;left:0}.container ::ng-deep a{text-decoration:underline;font-weight:700}.container ::ng-deep a:hover{opacity:.85}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
24168
23509
|
}
|
|
24169
23510
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PopupAlertComponent, decorators: [{
|
|
24170
23511
|
type: Component,
|
|
@@ -24313,15 +23654,15 @@ class AutocompleteComponent {
|
|
|
24313
23654
|
getExtraClass() {
|
|
24314
23655
|
if (this.allowSubmit) {
|
|
24315
23656
|
if (this.enterButton) {
|
|
24316
|
-
return 'border rounded-lg absolute w-8 h-8 right-[calc(var(--icon-width)+var(--icon-padding))]
|
|
23657
|
+
return 'border rounded-lg absolute w-8 h-8 right-[calc(var(--icon-width)+var(--icon-padding))] top-1/2 -translate-y-1/2';
|
|
24317
23658
|
}
|
|
24318
23659
|
else {
|
|
24319
|
-
return 'border rounded-lg absolute w-8 h-8 right-[calc(var(--icon-width)+0.25*var(--icon-width))]
|
|
23660
|
+
return 'border rounded-lg absolute w-8 h-8 right-[calc(var(--icon-width)+0.25*var(--icon-width))] top-1/2 -translate-y-1/2';
|
|
24320
23661
|
}
|
|
24321
23662
|
}
|
|
24322
23663
|
else {
|
|
24323
23664
|
if (!this.enterButton) {
|
|
24324
|
-
return 'border rounded-lg absolute w-8 h-8 right-2
|
|
23665
|
+
return 'border rounded-lg absolute w-8 h-8 right-2 top-1/2 -translate-y-1/2';
|
|
24325
23666
|
}
|
|
24326
23667
|
}
|
|
24327
23668
|
return 'border rounded-lg absolute w-8 h-8';
|
|
@@ -24466,7 +23807,7 @@ class AutocompleteComponent {
|
|
|
24466
23807
|
provideNgIconsConfig({
|
|
24467
23808
|
size: '1.75rem',
|
|
24468
23809
|
}),
|
|
24469
|
-
], viewQueries: [{ propertyName: "triggerRef", first: true, predicate: MatAutocompleteTrigger, descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "inputRef", first: true, predicate: ["searchInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<span class=\"w-full inline-block relative\">\n @if (!allowSubmit) {\n <div\n class=\"absolute inset-y-[--icon-padding] left-[--icon-padding] w-[--icon-width] pointer-events-none\"\n >\n <ng-icon name=\"iconoirSearch\" class=\"text-primary
|
|
23810
|
+
], viewQueries: [{ propertyName: "triggerRef", first: true, predicate: MatAutocompleteTrigger, descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "inputRef", first: true, predicate: ["searchInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<span class=\"w-full inline-block relative\">\n @if (!allowSubmit) {\n <div\n class=\"absolute inset-y-[--icon-padding] left-[--icon-padding] w-[--icon-width] pointer-events-none flex items-center justify-center\"\n >\n <ng-icon name=\"iconoirSearch\" class=\"text-primary\"></ng-icon>\n </div>\n }\n <div class=\"flex flex-row\">\n <input\n #searchInput\n type=\"text\"\n class=\"gn-ui-text-input\"\n (input)=\"handleInput($event)\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleSearch()\"\n [ngClass]=\"{\n 'text-primary': searchActive && enterButton,\n 'text-gray-900': !searchActive,\n 'px-[--icon-width]': !allowSubmit,\n }\"\n />\n @if (searchInput.value && displayEnterBtn) {\n <gn-ui-button\n type=\"gray\"\n extraClass=\"w-32 h-8 !opacity-100\"\n [ngStyle]=\"{ left: enterBtnPosition + 'px' }\"\n class=\"absolute\"\n disabled=\"true\"\n >\n <ng-icon\n name=\"iconoirLongArrowDownLeft\"\n class=\"!w-4 text-gray-900 font-bold\"\n ></ng-icon>\n <span translate class=\"text-bold text-gray-900 font-bold\">\n Enter to search\n </span>\n </gn-ui-button>\n }\n </div>\n @if (searchInput.value) {\n <gn-ui-button\n type=\"primary\"\n [extraClass]=\"getExtraClass()\"\n data-test=\"clear-btn\"\n aria-label=\"Clear\"\n (buttonClick)=\"clear()\"\n >\n <ng-icon class=\"text-white\" name=\"matClose\"></ng-icon>\n </gn-ui-button>\n }\n @if (allowSubmit) {\n <gn-ui-button\n type=\"light\"\n extraClass=\"border-0 border-l-[1px] border-gray-300 hover:border-gray-500 text-primary hover:text-primary-darkest focus:text-primary-darkest absolute inset-y-[--icon-padding] right-[--icon-padding]\"\n aria-label=\"Trigger search\"\n data-test=\"autocomplete-submit-btn\"\n (buttonClick)=\"handleSearch()\"\n >\n <ng-icon name=\"iconoirSearch\"></ng-icon>\n </gn-ui-button>\n }\n\n @if (error) {\n <gn-ui-popup-alert\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"matErrorOutlineOutline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n }\n</span>\n\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFnInternal\"\n>\n @for (suggestion of suggestions$ | async; track suggestion) {\n <mat-option [value]=\"suggestion\" class=\"p-2 suggestion text-start\">\n @if (displayWithTemplate) {\n <ng-container\n *ngTemplateOutlet=\"\n displayWithTemplate;\n context: { $implicit: suggestion }\n \"\n ></ng-container>\n } @else {\n {{ displayWithFnInternal(suggestion) }}\n }\n </mat-option>\n }\n</mat-autocomplete>\n", styles: ["span{--icon-padding: var(--gn-ui-text-input-border-size, 2px);--icon-width: calc(var(--gn-ui-text-input-padding, .6em) * 2 + 1.25em)}span>*:not(gn-ui-popup-alert){font-size:var(--gn-ui-text-input-font-size, 1em)}input:placeholder-shown{text-overflow:ellipsis}gn-ui-button{--gn-ui-button-rounded: 0;--gn-ui-button-width: var(--icon-width);--gn-ui-button-padding: 0;font-size:1em}gn-ui-button:last-of-type{--gn-ui-button-rounded: 0 var(--gn-ui-text-input-rounded, .25em) var(--gn-ui-text-input-rounded, .25em) 0}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"], dependencies: [{ kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i1$2.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i1$2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i1$2.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.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$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
24470
23811
|
}
|
|
24471
23812
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: AutocompleteComponent, decorators: [{
|
|
24472
23813
|
type: Component,
|
|
@@ -24487,7 +23828,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
24487
23828
|
provideNgIconsConfig({
|
|
24488
23829
|
size: '1.75rem',
|
|
24489
23830
|
}),
|
|
24490
|
-
], template: "<span class=\"w-full inline-block relative\">\n @if (!allowSubmit) {\n <div\n class=\"absolute inset-y-[--icon-padding] left-[--icon-padding] w-[--icon-width] pointer-events-none\"\n >\n <ng-icon name=\"iconoirSearch\" class=\"text-primary
|
|
23831
|
+
], template: "<span class=\"w-full inline-block relative\">\n @if (!allowSubmit) {\n <div\n class=\"absolute inset-y-[--icon-padding] left-[--icon-padding] w-[--icon-width] pointer-events-none flex items-center justify-center\"\n >\n <ng-icon name=\"iconoirSearch\" class=\"text-primary\"></ng-icon>\n </div>\n }\n <div class=\"flex flex-row\">\n <input\n #searchInput\n type=\"text\"\n class=\"gn-ui-text-input\"\n (input)=\"handleInput($event)\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleSearch()\"\n [ngClass]=\"{\n 'text-primary': searchActive && enterButton,\n 'text-gray-900': !searchActive,\n 'px-[--icon-width]': !allowSubmit,\n }\"\n />\n @if (searchInput.value && displayEnterBtn) {\n <gn-ui-button\n type=\"gray\"\n extraClass=\"w-32 h-8 !opacity-100\"\n [ngStyle]=\"{ left: enterBtnPosition + 'px' }\"\n class=\"absolute\"\n disabled=\"true\"\n >\n <ng-icon\n name=\"iconoirLongArrowDownLeft\"\n class=\"!w-4 text-gray-900 font-bold\"\n ></ng-icon>\n <span translate class=\"text-bold text-gray-900 font-bold\">\n Enter to search\n </span>\n </gn-ui-button>\n }\n </div>\n @if (searchInput.value) {\n <gn-ui-button\n type=\"primary\"\n [extraClass]=\"getExtraClass()\"\n data-test=\"clear-btn\"\n aria-label=\"Clear\"\n (buttonClick)=\"clear()\"\n >\n <ng-icon class=\"text-white\" name=\"matClose\"></ng-icon>\n </gn-ui-button>\n }\n @if (allowSubmit) {\n <gn-ui-button\n type=\"light\"\n extraClass=\"border-0 border-l-[1px] border-gray-300 hover:border-gray-500 text-primary hover:text-primary-darkest focus:text-primary-darkest absolute inset-y-[--icon-padding] right-[--icon-padding]\"\n aria-label=\"Trigger search\"\n data-test=\"autocomplete-submit-btn\"\n (buttonClick)=\"handleSearch()\"\n >\n <ng-icon name=\"iconoirSearch\"></ng-icon>\n </gn-ui-button>\n }\n\n @if (error) {\n <gn-ui-popup-alert\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"matErrorOutlineOutline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n }\n</span>\n\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFnInternal\"\n>\n @for (suggestion of suggestions$ | async; track suggestion) {\n <mat-option [value]=\"suggestion\" class=\"p-2 suggestion text-start\">\n @if (displayWithTemplate) {\n <ng-container\n *ngTemplateOutlet=\"\n displayWithTemplate;\n context: { $implicit: suggestion }\n \"\n ></ng-container>\n } @else {\n {{ displayWithFnInternal(suggestion) }}\n }\n </mat-option>\n }\n</mat-autocomplete>\n", styles: ["span{--icon-padding: var(--gn-ui-text-input-border-size, 2px);--icon-width: calc(var(--gn-ui-text-input-padding, .6em) * 2 + 1.25em)}span>*:not(gn-ui-popup-alert){font-size:var(--gn-ui-text-input-font-size, 1em)}input:placeholder-shown{text-overflow:ellipsis}gn-ui-button{--gn-ui-button-rounded: 0;--gn-ui-button-width: var(--icon-width);--gn-ui-button-padding: 0;font-size:1em}gn-ui-button:last-of-type{--gn-ui-button-rounded: 0 var(--gn-ui-text-input-rounded, .25em) var(--gn-ui-text-input-rounded, .25em) 0}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"] }]
|
|
24491
23832
|
}], propDecorators: { placeholder: [{
|
|
24492
23833
|
type: Input
|
|
24493
23834
|
}], enterButton: [{
|
|
@@ -25963,7 +25304,8 @@ class SearchFeatureCatalogComponent {
|
|
|
25963
25304
|
const filtered = (this.featureCatalog?.featureTypes || []).filter((featureType) => {
|
|
25964
25305
|
const fuzzyFilter = createFuzzyFilter(searchTerm);
|
|
25965
25306
|
return (fuzzyFilter(featureType.name) ||
|
|
25966
|
-
(featureType.
|
|
25307
|
+
(featureType.description &&
|
|
25308
|
+
fuzzyFilter(featureType.description)));
|
|
25967
25309
|
});
|
|
25968
25310
|
this.filteredFeatureCatalog = {
|
|
25969
25311
|
...this.featureCatalog,
|
|
@@ -26051,6 +25393,8 @@ marker('search.filters.spatialExtent.error.title');
|
|
|
26051
25393
|
marker('search.filters.spatialExtent.error.outOfBounds');
|
|
26052
25394
|
const LABEL_FROM_FILE = marker('search.filters.spatialExtent.bboxFromFile');
|
|
26053
25395
|
const LABEL_FROM_FILE_DELETE = marker('search.filters.spatialExtent.bboxFromFileDelete');
|
|
25396
|
+
const LABEL_FROM_LOCATION = marker('search.filters.spatialExtent.bboxFromLocation');
|
|
25397
|
+
const LABEL_FROM_LOCATION_DELETE = marker('search.filters.spatialExtent.bboxFromLocationDelete');
|
|
26054
25398
|
const LABEL_INITIAL = marker('search.filters.spatialExtent.bboxInitial');
|
|
26055
25399
|
const LABEL_INITIAL_DELETE = marker('search.filters.spatialExtent.bboxInitialDelete');
|
|
26056
25400
|
class SpatialExtentDropdownComponent {
|
|
@@ -26062,6 +25406,7 @@ class SpatialExtentDropdownComponent {
|
|
|
26062
25406
|
this.errorChange = new EventEmitter();
|
|
26063
25407
|
this.bbox = null;
|
|
26064
25408
|
this.fileName = '';
|
|
25409
|
+
this.locationName = '';
|
|
26065
25410
|
this.overlayPositions = [
|
|
26066
25411
|
{
|
|
26067
25412
|
originX: 'start',
|
|
@@ -26092,13 +25437,21 @@ class SpatialExtentDropdownComponent {
|
|
|
26092
25437
|
return !!this.bbox;
|
|
26093
25438
|
}
|
|
26094
25439
|
get selectionLabelKey() {
|
|
26095
|
-
|
|
25440
|
+
if (this.fileName)
|
|
25441
|
+
return LABEL_FROM_FILE;
|
|
25442
|
+
if (this.locationName)
|
|
25443
|
+
return LABEL_FROM_LOCATION;
|
|
25444
|
+
return LABEL_INITIAL;
|
|
26096
25445
|
}
|
|
26097
25446
|
get selectionDeleteLabelKey() {
|
|
26098
|
-
|
|
25447
|
+
if (this.fileName)
|
|
25448
|
+
return LABEL_FROM_FILE_DELETE;
|
|
25449
|
+
if (this.locationName)
|
|
25450
|
+
return LABEL_FROM_LOCATION_DELETE;
|
|
25451
|
+
return LABEL_INITIAL_DELETE;
|
|
26099
25452
|
}
|
|
26100
25453
|
get selectionLabelParams() {
|
|
26101
|
-
return { fileName: this.fileName };
|
|
25454
|
+
return { fileName: this.fileName, locationName: this.locationName };
|
|
26102
25455
|
}
|
|
26103
25456
|
openOverlay() {
|
|
26104
25457
|
this.overlayMinWidth =
|
|
@@ -26135,6 +25488,7 @@ class SpatialExtentDropdownComponent {
|
|
|
26135
25488
|
}
|
|
26136
25489
|
this.bbox = bbox;
|
|
26137
25490
|
this.fileName = file.name;
|
|
25491
|
+
this.locationName = '';
|
|
26138
25492
|
this.bboxChange.emit(bbox);
|
|
26139
25493
|
this.cd.markForCheck();
|
|
26140
25494
|
}
|
|
@@ -26143,6 +25497,15 @@ class SpatialExtentDropdownComponent {
|
|
|
26143
25497
|
return;
|
|
26144
25498
|
}
|
|
26145
25499
|
}
|
|
25500
|
+
setLocationBbox(bbox, name) {
|
|
25501
|
+
this.errorKey = null;
|
|
25502
|
+
this.bbox = bbox;
|
|
25503
|
+
this.locationName = name;
|
|
25504
|
+
this.fileName = '';
|
|
25505
|
+
this.fileInput?.clear();
|
|
25506
|
+
this.bboxChange.emit(bbox);
|
|
25507
|
+
this.cd.markForCheck();
|
|
25508
|
+
}
|
|
26146
25509
|
handleFileError(error) {
|
|
26147
25510
|
if (error === 'file-too-large') {
|
|
26148
25511
|
this.setError(marker('search.filters.spatialExtent.error.fileTooLarge'), {
|
|
@@ -26161,6 +25524,7 @@ class SpatialExtentDropdownComponent {
|
|
|
26161
25524
|
removeSelection(event) {
|
|
26162
25525
|
this.bbox = null;
|
|
26163
25526
|
this.fileName = '';
|
|
25527
|
+
this.locationName = '';
|
|
26164
25528
|
this.errorKey = null;
|
|
26165
25529
|
this.fileInput?.clear();
|
|
26166
25530
|
this.bboxChange.emit(null);
|
|
@@ -26177,7 +25541,7 @@ class SpatialExtentDropdownComponent {
|
|
|
26177
25541
|
matExpandLess,
|
|
26178
25542
|
matExpandMore,
|
|
26179
25543
|
}),
|
|
26180
|
-
], viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "fileInput", first: true, predicate: DragAndDropFileInputComponent, descendants: true }], ngImport: i0, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"bg-background w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n (buttonClick)=\"toggleOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n @if (hasSelection) {\n <div\n class=\"bg-primary-lighter text-white shrink-0 rounded-full font-bold text-[12px] w-[22px] h-[22px] flex items-center justify-center\"\n >\n 1\n </div>\n }\n </div>\n <button class=\"h-6 w-6 flex items-center\" data-cy=\"clearSelection\">\n @if (hasSelection && !overlayOpen) {\n <ng-icon\n class=\"shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n (click)=\"removeSelection($event)\"\n name=\"matClose\"\n ></ng-icon>\n }\n </button>\n <ng-icon\n [name]=\"overlayOpen ? 'matExpandLess' : 'matExpandMore'\"\n class=\"shrink-0 opacity-40\"\n >\n </ng-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-400 rounded shadow-lg pt-[12px] px-[16px] overlay-container w-[280px] flex flex-col gap-2\"\n [style.min-width]=\"overlayMinWidth\"\n >\n <div class=\"text-xs text-black\">\n {{ 'search.filters.spatialExtent.helpText' | translate }}\n </div>\n\n <div\n [class]=\"\n (hasSelection\n ? 'border-b-[1px] border-gray-400 pb-[20px]'\n : 'pb-[12px]') + ' text-black'\n \"\n >\n <gn-ui-drag-and-drop-file-input\n accept=\".json,.geojson\"\n [placeholder]=\"'search.filters.spatialExtent.import' | translate\"\n [maxFileSizeMb]=\"maxFileSizeMb\"\n [showFileName]=\"false\"\n textClass=\"text-black truncate\"\n dropzoneBackgroundColor=\"transparent\"\n icon=\"iconoirUpload\"\n extraClass=\"gn-ui-gray-outline-input w-full !h-[32px] px-[8px] py-[4px] justify-between\"\n (fileChange)=\"handleFileSelected($event)\"\n (errorChange)=\"handleFileError($event)\"\n data-cy=\"importGeojson\"\n ></gn-ui-drag-and-drop-file-input>\n </div>\n\n @if (hasSelection) {\n <gn-ui-button\n [type]=\"'primary-light'\"\n [title]=\"selectionDeleteLabelKey | translate: selectionLabelParams\"\n (buttonClick)=\"removeSelection($event)\"\n extraClass=\"group gap-x-2 w-full h-[28px] px-[8px] py-[4px] mb-[12px] bg-primary-lighter text-white\"\n data-test=\"spatial-extent-selected-item\"\n >\n <ng-icon\n name=\"iconoirSquareDashed\"\n class=\"shrink-0\"\n size=\"15px\"\n ></ng-icon>\n <span class=\"group-hover:hidden truncate text-sm m-auto\">\n {{ selectionLabelKey | translate: selectionLabelParams }}\n </span>\n <span class=\"hidden group-hover:block truncate text-sm m-auto\">\n {{ selectionDeleteLabelKey | translate: selectionLabelParams }}\n </span>\n <ng-icon\n name=\"iconoirCheckCircle\"\n class=\"group-hover:hidden shrink-0\"\n size=\"14px\"\n ></ng-icon>\n <ng-icon\n name=\"iconoirTrash\"\n class=\"!hidden group-hover:!block shrink-0\"\n size=\"15px\"\n ></ng-icon>\n </gn-ui-button>\n }\n </div>\n</ng-template>\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: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1$7.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$7.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: DragAndDropFileInputComponent, selector: "gn-ui-drag-and-drop-file-input", inputs: ["placeholder", "accept", "maxFileSizeMb", "icon", "dropzoneBackgroundColor", "textClass", "extraClass", "showFileName"], outputs: ["fileChange", "errorChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
25544
|
+
], viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "fileInput", first: true, predicate: DragAndDropFileInputComponent, descendants: true }], ngImport: i0, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"bg-background w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n (buttonClick)=\"toggleOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n @if (hasSelection) {\n <div\n class=\"bg-primary-lighter text-white shrink-0 rounded-full font-bold text-[12px] w-[22px] h-[22px] flex items-center justify-center\"\n >\n 1\n </div>\n }\n </div>\n <button class=\"h-6 w-6 flex items-center\" data-cy=\"clearSelection\">\n @if (hasSelection && !overlayOpen) {\n <ng-icon\n class=\"shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n (click)=\"removeSelection($event)\"\n name=\"matClose\"\n ></ng-icon>\n }\n </button>\n <ng-icon\n [name]=\"overlayOpen ? 'matExpandLess' : 'matExpandMore'\"\n class=\"shrink-0 opacity-40\"\n >\n </ng-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-400 rounded shadow-lg pt-[12px] px-[16px] overlay-container w-[280px] flex flex-col gap-2\"\n [style.min-width]=\"overlayMinWidth\"\n >\n <div class=\"text-xs text-black\">\n {{ 'search.filters.spatialExtent.helpText' | translate }}\n </div>\n\n <div\n [class]=\"\n (hasSelection\n ? 'border-b-[1px] border-gray-400 pb-[20px]'\n : 'pb-[12px]') + ' text-black flex flex-col gap-[8px]'\n \"\n style=\"\n --gn-ui-text-input-rounded: 8px;\n --gn-ui-text-input-border-size: 1px;\n --gn-ui-text-input-padding: 6px;\n \"\n >\n <gn-ui-drag-and-drop-file-input\n accept=\".json,.geojson\"\n [placeholder]=\"'search.filters.spatialExtent.import' | translate\"\n [maxFileSizeMb]=\"maxFileSizeMb\"\n [showFileName]=\"false\"\n textClass=\"text-black truncate\"\n dropzoneBackgroundColor=\"transparent\"\n icon=\"iconoirUpload\"\n extraClass=\"gn-ui-gray-outline-input w-full !h-[32px] px-[8px] py-[4px] justify-between\"\n (fileChange)=\"handleFileSelected($event)\"\n (errorChange)=\"handleFileError($event)\"\n data-cy=\"importGeojson\"\n ></gn-ui-drag-and-drop-file-input>\n <ng-content></ng-content>\n </div>\n\n @if (hasSelection) {\n <gn-ui-button\n [type]=\"'primary-light'\"\n [title]=\"selectionDeleteLabelKey | translate: selectionLabelParams\"\n (buttonClick)=\"removeSelection($event)\"\n extraClass=\"group gap-x-2 w-full h-[28px] px-[8px] py-[4px] mb-[12px] bg-primary-lighter text-white\"\n data-test=\"spatial-extent-selected-item\"\n >\n <ng-icon\n name=\"iconoirSquareDashed\"\n class=\"shrink-0\"\n size=\"15px\"\n ></ng-icon>\n <span class=\"group-hover:hidden truncate text-sm m-auto\">\n {{ selectionLabelKey | translate: selectionLabelParams }}\n </span>\n <span class=\"hidden group-hover:block truncate text-sm m-auto\">\n {{ selectionDeleteLabelKey | translate: selectionLabelParams }}\n </span>\n <ng-icon\n name=\"iconoirCheckCircle\"\n class=\"group-hover:hidden shrink-0\"\n size=\"14px\"\n ></ng-icon>\n <ng-icon\n name=\"iconoirTrash\"\n class=\"!hidden group-hover:!block shrink-0\"\n size=\"15px\"\n ></ng-icon>\n </gn-ui-button>\n }\n </div>\n</ng-template>\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: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1$7.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$7.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: DragAndDropFileInputComponent, selector: "gn-ui-drag-and-drop-file-input", inputs: ["placeholder", "accept", "maxFileSizeMb", "icon", "dropzoneBackgroundColor", "textClass", "extraClass", "showFileName"], outputs: ["fileChange", "errorChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
26181
25545
|
}
|
|
26182
25546
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: SpatialExtentDropdownComponent, decorators: [{
|
|
26183
25547
|
type: Component,
|
|
@@ -26197,7 +25561,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
26197
25561
|
matExpandLess,
|
|
26198
25562
|
matExpandMore,
|
|
26199
25563
|
}),
|
|
26200
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"bg-background w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n (buttonClick)=\"toggleOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n @if (hasSelection) {\n <div\n class=\"bg-primary-lighter text-white shrink-0 rounded-full font-bold text-[12px] w-[22px] h-[22px] flex items-center justify-center\"\n >\n 1\n </div>\n }\n </div>\n <button class=\"h-6 w-6 flex items-center\" data-cy=\"clearSelection\">\n @if (hasSelection && !overlayOpen) {\n <ng-icon\n class=\"shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n (click)=\"removeSelection($event)\"\n name=\"matClose\"\n ></ng-icon>\n }\n </button>\n <ng-icon\n [name]=\"overlayOpen ? 'matExpandLess' : 'matExpandMore'\"\n class=\"shrink-0 opacity-40\"\n >\n </ng-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-400 rounded shadow-lg pt-[12px] px-[16px] overlay-container w-[280px] flex flex-col gap-2\"\n [style.min-width]=\"overlayMinWidth\"\n >\n <div class=\"text-xs text-black\">\n {{ 'search.filters.spatialExtent.helpText' | translate }}\n </div>\n\n <div\n [class]=\"\n (hasSelection\n ? 'border-b-[1px] border-gray-400 pb-[20px]'\n : 'pb-[12px]') + ' text-black'\n \"\n >\n <gn-ui-drag-and-drop-file-input\n accept=\".json,.geojson\"\n [placeholder]=\"'search.filters.spatialExtent.import' | translate\"\n [maxFileSizeMb]=\"maxFileSizeMb\"\n [showFileName]=\"false\"\n textClass=\"text-black truncate\"\n dropzoneBackgroundColor=\"transparent\"\n icon=\"iconoirUpload\"\n extraClass=\"gn-ui-gray-outline-input w-full !h-[32px] px-[8px] py-[4px] justify-between\"\n (fileChange)=\"handleFileSelected($event)\"\n (errorChange)=\"handleFileError($event)\"\n data-cy=\"importGeojson\"\n ></gn-ui-drag-and-drop-file-input>\n </div>\n\n @if (hasSelection) {\n <gn-ui-button\n [type]=\"'primary-light'\"\n [title]=\"selectionDeleteLabelKey | translate: selectionLabelParams\"\n (buttonClick)=\"removeSelection($event)\"\n extraClass=\"group gap-x-2 w-full h-[28px] px-[8px] py-[4px] mb-[12px] bg-primary-lighter text-white\"\n data-test=\"spatial-extent-selected-item\"\n >\n <ng-icon\n name=\"iconoirSquareDashed\"\n class=\"shrink-0\"\n size=\"15px\"\n ></ng-icon>\n <span class=\"group-hover:hidden truncate text-sm m-auto\">\n {{ selectionLabelKey | translate: selectionLabelParams }}\n </span>\n <span class=\"hidden group-hover:block truncate text-sm m-auto\">\n {{ selectionDeleteLabelKey | translate: selectionLabelParams }}\n </span>\n <ng-icon\n name=\"iconoirCheckCircle\"\n class=\"group-hover:hidden shrink-0\"\n size=\"14px\"\n ></ng-icon>\n <ng-icon\n name=\"iconoirTrash\"\n class=\"!hidden group-hover:!block shrink-0\"\n size=\"15px\"\n ></ng-icon>\n </gn-ui-button>\n }\n </div>\n</ng-template>\n" }]
|
|
25564
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"bg-background w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n (buttonClick)=\"toggleOverlay()\"\n cdkOverlayOrigin\n #overlayOrigin=\"cdkOverlayOrigin\"\n>\n <div class=\"grow flex items-center mr-2 gap-2 overflow-hidden\">\n <div class=\"text-left font-medium truncate py-1\">\n {{ title }}\n </div>\n @if (hasSelection) {\n <div\n class=\"bg-primary-lighter text-white shrink-0 rounded-full font-bold text-[12px] w-[22px] h-[22px] flex items-center justify-center\"\n >\n 1\n </div>\n }\n </div>\n <button class=\"h-6 w-6 flex items-center\" data-cy=\"clearSelection\">\n @if (hasSelection && !overlayOpen) {\n <ng-icon\n class=\"shrink-0 opacity-40 mr-1.5 hover:opacity-80 transition-colors clear-btn\"\n (click)=\"removeSelection($event)\"\n name=\"matClose\"\n ></ng-icon>\n }\n </button>\n <ng-icon\n [name]=\"overlayOpen ? 'matExpandLess' : 'matExpandMore'\"\n class=\"shrink-0 opacity-40\"\n >\n </ng-icon>\n</gn-ui-button>\n\n<ng-template\n cdkConnectedOverlay\n cdkConnectedOverlayHasBackdrop\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"overlayOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayScrollStrategy]=\"scrollStrategy\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n (overlayOutsideClick)=\"closeOverlay()\"\n (detach)=\"closeOverlay()\"\n>\n <div\n class=\"bg-white border border-gray-400 rounded shadow-lg pt-[12px] px-[16px] overlay-container w-[280px] flex flex-col gap-2\"\n [style.min-width]=\"overlayMinWidth\"\n >\n <div class=\"text-xs text-black\">\n {{ 'search.filters.spatialExtent.helpText' | translate }}\n </div>\n\n <div\n [class]=\"\n (hasSelection\n ? 'border-b-[1px] border-gray-400 pb-[20px]'\n : 'pb-[12px]') + ' text-black flex flex-col gap-[8px]'\n \"\n style=\"\n --gn-ui-text-input-rounded: 8px;\n --gn-ui-text-input-border-size: 1px;\n --gn-ui-text-input-padding: 6px;\n \"\n >\n <gn-ui-drag-and-drop-file-input\n accept=\".json,.geojson\"\n [placeholder]=\"'search.filters.spatialExtent.import' | translate\"\n [maxFileSizeMb]=\"maxFileSizeMb\"\n [showFileName]=\"false\"\n textClass=\"text-black truncate\"\n dropzoneBackgroundColor=\"transparent\"\n icon=\"iconoirUpload\"\n extraClass=\"gn-ui-gray-outline-input w-full !h-[32px] px-[8px] py-[4px] justify-between\"\n (fileChange)=\"handleFileSelected($event)\"\n (errorChange)=\"handleFileError($event)\"\n data-cy=\"importGeojson\"\n ></gn-ui-drag-and-drop-file-input>\n <ng-content></ng-content>\n </div>\n\n @if (hasSelection) {\n <gn-ui-button\n [type]=\"'primary-light'\"\n [title]=\"selectionDeleteLabelKey | translate: selectionLabelParams\"\n (buttonClick)=\"removeSelection($event)\"\n extraClass=\"group gap-x-2 w-full h-[28px] px-[8px] py-[4px] mb-[12px] bg-primary-lighter text-white\"\n data-test=\"spatial-extent-selected-item\"\n >\n <ng-icon\n name=\"iconoirSquareDashed\"\n class=\"shrink-0\"\n size=\"15px\"\n ></ng-icon>\n <span class=\"group-hover:hidden truncate text-sm m-auto\">\n {{ selectionLabelKey | translate: selectionLabelParams }}\n </span>\n <span class=\"hidden group-hover:block truncate text-sm m-auto\">\n {{ selectionDeleteLabelKey | translate: selectionLabelParams }}\n </span>\n <ng-icon\n name=\"iconoirCheckCircle\"\n class=\"group-hover:hidden shrink-0\"\n size=\"14px\"\n ></ng-icon>\n <ng-icon\n name=\"iconoirTrash\"\n class=\"!hidden group-hover:!block shrink-0\"\n size=\"15px\"\n ></ng-icon>\n </gn-ui-button>\n }\n </div>\n</ng-template>\n" }]
|
|
26201
25565
|
}], propDecorators: { title: [{
|
|
26202
25566
|
type: Input
|
|
26203
25567
|
}], maxFileSizeMb: [{
|
|
@@ -27466,9 +26830,7 @@ const initSearch = () => {
|
|
|
27466
26830
|
},
|
|
27467
26831
|
params: {
|
|
27468
26832
|
filters: {},
|
|
27469
|
-
pageSize:
|
|
27470
|
-
? getOptionalSearchConfig().LIMIT
|
|
27471
|
-
: DEFAULT_PAGE_SIZE,
|
|
26833
|
+
pageSize: DEFAULT_PAGE_SIZE,
|
|
27472
26834
|
currentPage: 0,
|
|
27473
26835
|
favoritesOnly: false,
|
|
27474
26836
|
useSpatialFilter: true,
|
|
@@ -27925,6 +27287,28 @@ const GEOCODING_PROVIDER = new InjectionToken('geocoding-provider', {
|
|
|
27925
27287
|
providedIn: 'root',
|
|
27926
27288
|
factory: () => DEFAULT_GEOCODING_PROVIDER,
|
|
27927
27289
|
});
|
|
27290
|
+
// these options are arrays in the providers, but they can be configured
|
|
27291
|
+
// with a single value for simplicity
|
|
27292
|
+
const GEOCODING_PROVIDER_ARRAY_OPTIONS = {
|
|
27293
|
+
geoadmin: ['origins', 'features'],
|
|
27294
|
+
geoplateforme: [
|
|
27295
|
+
'index',
|
|
27296
|
+
'category',
|
|
27297
|
+
'type',
|
|
27298
|
+
'postCode',
|
|
27299
|
+
'cityCode',
|
|
27300
|
+
'depCode',
|
|
27301
|
+
],
|
|
27302
|
+
};
|
|
27303
|
+
function wrapArrayOptions(options, keys) {
|
|
27304
|
+
const wrapped = { ...options };
|
|
27305
|
+
for (const key of keys) {
|
|
27306
|
+
if (typeof wrapped[key] === 'string') {
|
|
27307
|
+
wrapped[key] = [wrapped[key]];
|
|
27308
|
+
}
|
|
27309
|
+
}
|
|
27310
|
+
return wrapped;
|
|
27311
|
+
}
|
|
27928
27312
|
class GeocodingService {
|
|
27929
27313
|
constructor() {
|
|
27930
27314
|
this.provider = inject(GEOCODING_PROVIDER);
|
|
@@ -27933,13 +27317,16 @@ class GeocodingService {
|
|
|
27933
27317
|
let queryObservable;
|
|
27934
27318
|
switch (this.provider[0]) {
|
|
27935
27319
|
case 'geoadmin':
|
|
27936
|
-
queryObservable = from(queryGeoadmin(text, this.provider[1]));
|
|
27320
|
+
queryObservable = from(queryGeoadmin(text, wrapArrayOptions(this.provider[1], GEOCODING_PROVIDER_ARRAY_OPTIONS.geoadmin)));
|
|
27937
27321
|
break;
|
|
27938
27322
|
case 'geonames':
|
|
27939
27323
|
queryObservable = from(queryGeonames(text, this.provider[1]));
|
|
27940
27324
|
break;
|
|
27941
27325
|
case 'geoplateforme':
|
|
27942
|
-
queryObservable = from(queryGeoplateforme(text,
|
|
27326
|
+
queryObservable = from(queryGeoplateforme(text, {
|
|
27327
|
+
...wrapArrayOptions(this.provider[1], GEOCODING_PROVIDER_ARRAY_OPTIONS.geoplateforme),
|
|
27328
|
+
returnTrueGeometry: true,
|
|
27329
|
+
}));
|
|
27943
27330
|
break;
|
|
27944
27331
|
default:
|
|
27945
27332
|
return throwError(() => new Error(`Unsupported geocoding provider: ${this.provider[0]}`));
|
|
@@ -27956,29 +27343,80 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
27956
27343
|
}]
|
|
27957
27344
|
}] });
|
|
27958
27345
|
|
|
27346
|
+
const GEOCODING_PROVIDER_LABELS = new InjectionToken('geocodingProviderLabels', {
|
|
27347
|
+
factory: () => ({}),
|
|
27348
|
+
});
|
|
27959
27349
|
class LocationSearchComponent {
|
|
27960
27350
|
constructor() {
|
|
27961
27351
|
this.geocodingService = inject(GeocodingService);
|
|
27352
|
+
this.labels = inject(GEOCODING_PROVIDER_LABELS);
|
|
27962
27353
|
this.placeholder = '';
|
|
27963
27354
|
this.resultSelected = new EventEmitter();
|
|
27355
|
+
this.bboxSelected = new EventEmitter();
|
|
27964
27356
|
this.displayWithFn = (item) => item.label;
|
|
27965
27357
|
this.searchAction = (text) => this.geocodingService.query(text);
|
|
27966
27358
|
}
|
|
27359
|
+
getSecondaryLabel(result) {
|
|
27360
|
+
return this.resolveLabel(result, this.labels.secondary);
|
|
27361
|
+
}
|
|
27362
|
+
getMainLabel(result) {
|
|
27363
|
+
return this.resolveLabel(result, this.labels.main) ?? result.label;
|
|
27364
|
+
}
|
|
27365
|
+
getTertiaryLabel(result) {
|
|
27366
|
+
return this.resolveLabel(result, this.labels.tertiary);
|
|
27367
|
+
}
|
|
27368
|
+
getDisplayLabel(result) {
|
|
27369
|
+
const tertiary = this.getTertiaryLabel(result);
|
|
27370
|
+
return this.getMainLabel(result) + (tertiary ? ', ' + tertiary : '');
|
|
27371
|
+
}
|
|
27372
|
+
resolveLabel(result, path) {
|
|
27373
|
+
if (!path)
|
|
27374
|
+
return undefined;
|
|
27375
|
+
let value;
|
|
27376
|
+
try {
|
|
27377
|
+
value = pointer.get(result, path);
|
|
27378
|
+
}
|
|
27379
|
+
catch {
|
|
27380
|
+
return undefined;
|
|
27381
|
+
}
|
|
27382
|
+
const values = Array.isArray(value) ? value : [value];
|
|
27383
|
+
const label = values
|
|
27384
|
+
.filter((v) => typeof v === 'string' || typeof v === 'number')
|
|
27385
|
+
.join(', ');
|
|
27386
|
+
return label || undefined;
|
|
27387
|
+
}
|
|
27388
|
+
// geoplateforme keeps a simplified geometry in geom and puts the real one,
|
|
27389
|
+
// as a JSON string, in properties.truegeometry when returnTrueGeometry is set
|
|
27390
|
+
getGeometry(result) {
|
|
27391
|
+
const trueGeometry = result.properties?.['truegeometry'];
|
|
27392
|
+
if (typeof trueGeometry === 'string') {
|
|
27393
|
+
return JSON.parse(trueGeometry);
|
|
27394
|
+
}
|
|
27395
|
+
return trueGeometry ?? result.geom;
|
|
27396
|
+
}
|
|
27967
27397
|
handleItemSelected(item) {
|
|
27968
|
-
|
|
27398
|
+
const result = item;
|
|
27399
|
+
this.resultSelected.emit(result);
|
|
27400
|
+
const geometry = this.getGeometry(result);
|
|
27401
|
+
if (geometry) {
|
|
27402
|
+
this.bboxSelected.emit({
|
|
27403
|
+
bbox: getGeometryBoundingBox(geometry),
|
|
27404
|
+
label: this.getDisplayLabel(result),
|
|
27405
|
+
});
|
|
27406
|
+
}
|
|
27969
27407
|
}
|
|
27970
27408
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: LocationSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
27971
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
27409
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: LocationSearchComponent, isStandalone: true, selector: "gn-ui-location-search", inputs: { placeholder: "placeholder" }, outputs: { resultSelected: "resultSelected", bboxSelected: "bboxSelected" }, ngImport: i0, template: "<gn-ui-autocomplete\n [action]=\"searchAction\"\n [displayWithFn]=\"displayWithFn\"\n [placeholder]=\"placeholder\"\n [displayWithTemplate]=\"defaultItemTpl\"\n [clearOnSelection]=\"true\"\n (itemSelected)=\"handleItemSelected($event)\"\n>\n</gn-ui-autocomplete>\n\n<ng-template #defaultItemTpl let-result>\n <div class=\"py-2\">\n @if (getSecondaryLabel(result)) {\n <div class=\"gn-ui-card-detail\">{{ getSecondaryLabel(result) }}</div>\n }\n <div class=\"gn-ui-card-title\">{{ getDisplayLabel(result) }}</div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "component", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: ["placeholder", "enterButton", "action", "value", "clearOnSelection", "preventCompleteOnSelection", "autoFocus", "minCharacterCount", "allowSubmit", "forceTrackPosition", "displayWithTemplate", "displayWithFn"], outputs: ["itemSelected", "inputSubmitted", "inputCleared", "isSearchActive"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
27972
27410
|
}
|
|
27973
27411
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: LocationSearchComponent, decorators: [{
|
|
27974
27412
|
type: Component,
|
|
27975
|
-
args: [{ selector: 'gn-ui-location-search', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [AutocompleteComponent], template: "<gn-ui-autocomplete\n [action]=\"searchAction\"\n [displayWithFn]=\"displayWithFn\"\n [placeholder]=\"placeholder\"\n [displayWithTemplate]=\"
|
|
27413
|
+
args: [{ selector: 'gn-ui-location-search', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [AutocompleteComponent], template: "<gn-ui-autocomplete\n [action]=\"searchAction\"\n [displayWithFn]=\"displayWithFn\"\n [placeholder]=\"placeholder\"\n [displayWithTemplate]=\"defaultItemTpl\"\n [clearOnSelection]=\"true\"\n (itemSelected)=\"handleItemSelected($event)\"\n>\n</gn-ui-autocomplete>\n\n<ng-template #defaultItemTpl let-result>\n <div class=\"py-2\">\n @if (getSecondaryLabel(result)) {\n <div class=\"gn-ui-card-detail\">{{ getSecondaryLabel(result) }}</div>\n }\n <div class=\"gn-ui-card-title\">{{ getDisplayLabel(result) }}</div>\n </div>\n</ng-template>\n" }]
|
|
27976
27414
|
}], propDecorators: { placeholder: [{
|
|
27977
27415
|
type: Input
|
|
27978
|
-
}], displayWithTemplate: [{
|
|
27979
|
-
type: Input
|
|
27980
27416
|
}], resultSelected: [{
|
|
27981
27417
|
type: Output
|
|
27418
|
+
}], bboxSelected: [{
|
|
27419
|
+
type: Output
|
|
27982
27420
|
}] } });
|
|
27983
27421
|
|
|
27984
27422
|
// expects the replacement key ${uuid}
|
|
@@ -28139,6 +27577,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
28139
27577
|
class AbstractSearchField {
|
|
28140
27578
|
}
|
|
28141
27579
|
class SimpleSearchField {
|
|
27580
|
+
get fieldIdentifier() {
|
|
27581
|
+
return this.customIdentifier ?? this.esFieldName;
|
|
27582
|
+
}
|
|
28142
27583
|
constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
|
|
28143
27584
|
this.esFieldName = esFieldName;
|
|
28144
27585
|
this.injector = injector;
|
|
@@ -28147,14 +27588,26 @@ class SimpleSearchField {
|
|
|
28147
27588
|
this.repository = this.injector.get(RecordsRepositoryInterface);
|
|
28148
27589
|
// FIXME: this is required to register runtime fields; abstract this as well
|
|
28149
27590
|
this.esService = this.injector.get(ElasticsearchService);
|
|
27591
|
+
this.includeValues = [];
|
|
27592
|
+
this.excludeValues = [];
|
|
27593
|
+
}
|
|
27594
|
+
setFieldIdentifier(fieldIdentifier) {
|
|
27595
|
+
this.customIdentifier = fieldIdentifier;
|
|
27596
|
+
this.esService.registerFieldAlias(fieldIdentifier, this.esFieldName);
|
|
28150
27597
|
}
|
|
28151
27598
|
getAggregations() {
|
|
28152
27599
|
return {
|
|
28153
|
-
[this.
|
|
27600
|
+
[this.fieldIdentifier]: {
|
|
28154
27601
|
type: 'terms',
|
|
28155
27602
|
field: this.esFieldName,
|
|
28156
27603
|
limit: 1000,
|
|
28157
27604
|
sort: [this.order, this.orderType],
|
|
27605
|
+
...(this.includeValues?.length && {
|
|
27606
|
+
includeValues: this.includeValues,
|
|
27607
|
+
}),
|
|
27608
|
+
...(this.excludeValues?.length && {
|
|
27609
|
+
excludeValues: this.excludeValues,
|
|
27610
|
+
}),
|
|
28158
27611
|
},
|
|
28159
27612
|
};
|
|
28160
27613
|
}
|
|
@@ -28162,7 +27615,7 @@ class SimpleSearchField {
|
|
|
28162
27615
|
return bucket.term.toString();
|
|
28163
27616
|
}
|
|
28164
27617
|
getAvailableValues() {
|
|
28165
|
-
return this.repository.aggregate(this.getAggregations()).pipe(map$1((response) => response[this.
|
|
27618
|
+
return this.repository.aggregate(this.getAggregations()).pipe(map$1((response) => response[this.fieldIdentifier].buckets || []), switchMap((buckets) => {
|
|
28166
27619
|
const bucketPromises = buckets.map(async (bucket) => ({
|
|
28167
27620
|
label: `${await this.getBucketLabel(bucket)} (${bucket.count})`,
|
|
28168
27621
|
value: bucket.term.toString(),
|
|
@@ -28175,7 +27628,7 @@ class SimpleSearchField {
|
|
|
28175
27628
|
// FieldValue[]
|
|
28176
27629
|
if (this.getType() === 'values') {
|
|
28177
27630
|
return of({
|
|
28178
|
-
[this.
|
|
27631
|
+
[this.fieldIdentifier]: values.reduce((acc, val) => {
|
|
28179
27632
|
const value = val.toString();
|
|
28180
27633
|
if (value !== '') {
|
|
28181
27634
|
return { ...acc, [value]: true };
|
|
@@ -28186,11 +27639,11 @@ class SimpleSearchField {
|
|
|
28186
27639
|
}
|
|
28187
27640
|
// DateRange
|
|
28188
27641
|
return of({
|
|
28189
|
-
[this.
|
|
27642
|
+
[this.fieldIdentifier]: values[0] !== '' ? values[0] : {},
|
|
28190
27643
|
});
|
|
28191
27644
|
}
|
|
28192
27645
|
getValuesForFilter(filters) {
|
|
28193
|
-
const filter = filters[this.
|
|
27646
|
+
const filter = filters[this.fieldIdentifier];
|
|
28194
27647
|
if (!filter)
|
|
28195
27648
|
return of([]);
|
|
28196
27649
|
// filter by expression
|
|
@@ -28208,6 +27661,9 @@ class SimpleSearchField {
|
|
|
28208
27661
|
getType() {
|
|
28209
27662
|
return 'values';
|
|
28210
27663
|
}
|
|
27664
|
+
clone() {
|
|
27665
|
+
return Object.create(this);
|
|
27666
|
+
}
|
|
28211
27667
|
}
|
|
28212
27668
|
class TranslatedSearchField extends SimpleSearchField {
|
|
28213
27669
|
constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
|
|
@@ -28477,11 +27933,11 @@ class BoundingBoxSearchField extends SimpleSearchField {
|
|
|
28477
27933
|
}
|
|
28478
27934
|
getFiltersForValues(values) {
|
|
28479
27935
|
return of({
|
|
28480
|
-
[this.
|
|
27936
|
+
[this.fieldIdentifier]: values.map(Number),
|
|
28481
27937
|
});
|
|
28482
27938
|
}
|
|
28483
27939
|
getValuesForFilter(filters) {
|
|
28484
|
-
const filter = filters[this.
|
|
27940
|
+
const filter = filters[this.fieldIdentifier];
|
|
28485
27941
|
return of(isBoundingBox(filter) ? filter : []);
|
|
28486
27942
|
}
|
|
28487
27943
|
getType() {
|
|
@@ -28580,7 +28036,7 @@ class RecordKindField extends SimpleSearchField {
|
|
|
28580
28036
|
}
|
|
28581
28037
|
getFiltersForValues(values) {
|
|
28582
28038
|
const filters = {
|
|
28583
|
-
[this.
|
|
28039
|
+
[this.fieldIdentifier]: values.reduce((acc, value) => {
|
|
28584
28040
|
if (value === '')
|
|
28585
28041
|
return { ...acc, [value]: true };
|
|
28586
28042
|
const keysToAdd = this.TYPE_MAPPING[value] || [value];
|
|
@@ -28603,7 +28059,7 @@ class RecordKindField extends SimpleSearchField {
|
|
|
28603
28059
|
return of(filters);
|
|
28604
28060
|
}
|
|
28605
28061
|
getValuesForFilter(filters) {
|
|
28606
|
-
const filter = filters[this.
|
|
28062
|
+
const filter = filters[this.fieldIdentifier];
|
|
28607
28063
|
if (!filter)
|
|
28608
28064
|
return of([]);
|
|
28609
28065
|
const activeValues = Object.keys(filter).filter((v) => filter[v]);
|
|
@@ -28633,11 +28089,15 @@ marker('search.filters.publisherOrg');
|
|
|
28633
28089
|
marker('search.filters.user');
|
|
28634
28090
|
marker('search.filters.changeDate');
|
|
28635
28091
|
marker('search.filters.resourceCreationRevisionDate');
|
|
28092
|
+
marker('search.filters.temporalExtent');
|
|
28636
28093
|
marker('search.filters.spatialExtent');
|
|
28094
|
+
marker('search.filters.documentStandard');
|
|
28095
|
+
const CUSTOM_FIELDS = new InjectionToken('custom-fields');
|
|
28637
28096
|
class FieldsService {
|
|
28638
28097
|
constructor() {
|
|
28639
28098
|
this.injector = inject(Injector);
|
|
28640
|
-
this.
|
|
28099
|
+
this.customFields = inject(CUSTOM_FIELDS, { optional: true }) ?? [];
|
|
28100
|
+
this.baseFields = {
|
|
28641
28101
|
organization: new OrganizationSearchField(this.injector),
|
|
28642
28102
|
format: new SimpleSearchField('format', this.injector, 'asc'),
|
|
28643
28103
|
resourceType: new ResourceTypeLegacyField(this.injector), // Deprecated, use `recordKind` instead
|
|
@@ -28657,9 +28117,31 @@ class FieldsService {
|
|
|
28657
28117
|
user: new UserSearchField(this.injector),
|
|
28658
28118
|
changeDate: new DateRangeSearchField('changeDate', this.injector, 'desc'),
|
|
28659
28119
|
resourceCreationRevisionDate: new ResourceCreationRevisionDateSearchField(this.injector, 'desc'),
|
|
28120
|
+
temporalExtent: new DateRangeSearchField('resourceTemporalExtentDateRange', this.injector, 'desc'),
|
|
28660
28121
|
availableServices: new AvailableServicesField(this.injector),
|
|
28661
28122
|
spatialExtent: new BoundingBoxSearchField('spatialExtent', this.injector),
|
|
28662
28123
|
};
|
|
28124
|
+
this.fields = { ...this.baseFields };
|
|
28125
|
+
for (const customField of this.customFields) {
|
|
28126
|
+
const baseField = this.baseFields[customField.baseFilter];
|
|
28127
|
+
if (!(baseField instanceof SimpleSearchField)) {
|
|
28128
|
+
console.warn(`The custom field '${customField.name}' relies on a base field '${customField.baseFilter}' that is not supported. This field will be ignored.`);
|
|
28129
|
+
continue;
|
|
28130
|
+
}
|
|
28131
|
+
if (!customField.name.includes(':')) {
|
|
28132
|
+
console.warn(`The custom field '${customField.name}' is not scoped with a prefix. Custom fields must have their names prefixed, for instance "myOrg:myKeywords". This field will be ignored.`);
|
|
28133
|
+
continue;
|
|
28134
|
+
}
|
|
28135
|
+
const newField = baseField.clone();
|
|
28136
|
+
newField.setFieldIdentifier(customField.name);
|
|
28137
|
+
if (customField.includeValues) {
|
|
28138
|
+
newField.includeValues = customField.includeValues;
|
|
28139
|
+
}
|
|
28140
|
+
if (customField.excludeValues) {
|
|
28141
|
+
newField.excludeValues = customField.excludeValues;
|
|
28142
|
+
}
|
|
28143
|
+
this.fields[customField.name] = newField;
|
|
28144
|
+
}
|
|
28663
28145
|
}
|
|
28664
28146
|
get supportedFields() {
|
|
28665
28147
|
return Object.keys(this.fields);
|
|
@@ -28707,7 +28189,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
28707
28189
|
args: [{
|
|
28708
28190
|
providedIn: 'root',
|
|
28709
28191
|
}]
|
|
28710
|
-
}] });
|
|
28192
|
+
}], ctorParameters: () => [] });
|
|
28711
28193
|
|
|
28712
28194
|
class ApiCardComponent {
|
|
28713
28195
|
constructor() {
|
|
@@ -30733,14 +30215,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
30733
30215
|
marker('feature.catalog.attribute.type');
|
|
30734
30216
|
marker('feature.catalog.attribute.name');
|
|
30735
30217
|
marker('feature.catalog.attribute.code');
|
|
30736
|
-
marker('feature.catalog.attribute.
|
|
30218
|
+
marker('feature.catalog.attribute.description');
|
|
30737
30219
|
marker('feature.catalog.attribute.values');
|
|
30738
30220
|
class FeatureCatalogListComponent {
|
|
30739
30221
|
constructor() {
|
|
30740
30222
|
this.COLUMNS_DEFAULT = [
|
|
30741
30223
|
{ key: 'type', width: '25%' },
|
|
30742
30224
|
{ key: 'name', width: '40%' },
|
|
30743
|
-
{ key: '
|
|
30225
|
+
{ key: 'description', width: 'minmax(0px, 1fr)' },
|
|
30744
30226
|
];
|
|
30745
30227
|
this.COLUMN_VALUES = {
|
|
30746
30228
|
key: 'values',
|
|
@@ -30761,7 +30243,7 @@ class FeatureCatalogListComponent {
|
|
|
30761
30243
|
return col.key;
|
|
30762
30244
|
}
|
|
30763
30245
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: FeatureCatalogListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
30764
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: FeatureCatalogListComponent, isStandalone: true, selector: "gn-ui-feature-catalog-list", inputs: { filteredFeatureCatalog: "filteredFeatureCatalog" }, providers: [provideIcons({ iconoirList })], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }, { propertyName: "scrollable", first: true, predicate: CdkScrollable, descendants: true, static: true }, { propertyName: "panelComponent", first: true, predicate: ["expanel"], descendants: true, read: ExpandablePanelComponent, static: true }], ngImport: i0, template: "<div\n cdkScrollable\n class=\"h-[562px] relative overflow-y-auto overflow-hidden\"\n data-cy=\"feat-catalog-scrollable\"\n>\n <div #scrollContainer class=\"flex flex-col gap-2 py-5 px-5\">\n @for (\n featureType of filteredFeatureCatalog?.featureTypes;\n track featureType\n ) {\n <div class=\"rounded shadow bg-white\">\n <gn-ui-expandable-panel\n #expanel\n [collapsed]=\"filteredFeatureCatalog?.featureTypes?.length !== 1\"\n iconColor=\"black\"\n >\n <ng-template #titleTemplate>\n <div class=\"px-2\">\n <div class=\"text-lg font-bold\">{{ featureType.name }}</div>\n @if (featureType.
|
|
30246
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: FeatureCatalogListComponent, isStandalone: true, selector: "gn-ui-feature-catalog-list", inputs: { filteredFeatureCatalog: "filteredFeatureCatalog" }, providers: [provideIcons({ iconoirList })], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }, { propertyName: "scrollable", first: true, predicate: CdkScrollable, descendants: true, static: true }, { propertyName: "panelComponent", first: true, predicate: ["expanel"], descendants: true, read: ExpandablePanelComponent, static: true }], ngImport: i0, template: "<div\n cdkScrollable\n class=\"h-[562px] relative overflow-y-auto overflow-hidden\"\n data-cy=\"feat-catalog-scrollable\"\n>\n <div #scrollContainer class=\"flex flex-col gap-2 py-5 px-5\">\n @for (\n featureType of filteredFeatureCatalog?.featureTypes;\n track featureType\n ) {\n <div class=\"rounded shadow bg-white\">\n <gn-ui-expandable-panel\n #expanel\n [collapsed]=\"filteredFeatureCatalog?.featureTypes?.length !== 1\"\n iconColor=\"black\"\n >\n <ng-template #titleTemplate>\n <div class=\"px-2\">\n <div class=\"text-lg font-bold\">{{ featureType.name }}</div>\n @if (featureType.description) {\n <div class=\"text-sm\">\n {{ featureType.description }}\n </div>\n }\n </div>\n </ng-template>\n @if (expanel && !expanel.collapsed) {\n <div\n class=\"grid gap-0\"\n [style.grid-template-columns]=\"\n getGridTemplateColumns(featureType.attributes)\n \"\n data-cy=\"feature-type-content\"\n >\n @for (\n col of getColumnsDefinition(featureType.attributes);\n track trackByColumn(i, col);\n let i = $index\n ) {\n <div\n class=\"py-1 px-2 text-sm font-bold text-left border-t break-all\"\n [class.border-l]=\"i > 0\"\n [class.border-gray-300]=\"i > 0\"\n [ngClass]=\"col.class || ''\"\n data-test=\"column-label\"\n >\n {{ 'feature.catalog.attribute.' + col.key | translate }}\n </div>\n }\n @if (expanel && !expanel.collapsed) {\n @for (row of featureType.attributes; track row) {\n @for (\n col of getColumnsDefinition(featureType.attributes);\n track trackByColumn(i, col);\n let i = $index\n ) {\n <div\n class=\"bg-white text-sm font-normal text-left border-t\"\n [class.border-l]=\"i > 0\"\n [class.border-gray-300]=\"i > 0\"\n data-test=\"cell-content\"\n >\n @if (col.key === 'values') {\n @if (row.values?.length > 0) {\n <gn-ui-cell-popin\n #popinRef\n [scrollContainer]=\"scrollContainer\"\n [cdkScrollContainer]=\"scrollable\"\n >\n <div\n cellContent\n data-cy=\"values-cell-popin-trigger\"\n >\n <gn-ui-button\n type=\"light\"\n extraClass=\"bg-transparent border-none\"\n (buttonClick)=\"popinRef.openOverlay()\"\n >\n <ng-icon name=\"iconoirList\" size=\"24\"></ng-icon>\n </gn-ui-button>\n </div>\n <div\n popinContent\n class=\"max-h-60 overflow-y-auto min-w-64 py-4 px-6\"\n style=\"scrollbar-width: thin\"\n >\n <ul class=\"list-disc list-inside mr-4\">\n @for (v of row.values; track v) {\n <li>\n {{ v.label || v.code }}\n </li>\n }\n </ul>\n </div>\n </gn-ui-cell-popin>\n }\n } @else {\n <gn-ui-truncated-text\n [scrollContainer]=\"scrollContainer\"\n [cdkScrollContainer]=\"scrollable\"\n [text]=\"row[col.key]\"\n ></gn-ui-truncated-text>\n }\n </div>\n }\n }\n }\n </div>\n }\n </gn-ui-expandable-panel>\n </div>\n }\n </div>\n</div>\n", dependencies: [{ kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: CellPopinComponent, selector: "gn-ui-cell-popin", inputs: ["extraClass", "cdkScrollContainer", "scrollContainer", "activePopin"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "iconColor", "collapsed"] }, { kind: "component", type: TruncatedTextComponent, selector: "gn-ui-truncated-text", inputs: ["text", "extraClass", "scrollContainer", "cdkScrollContainer"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i2$3.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
|
|
30765
30247
|
}
|
|
30766
30248
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: FeatureCatalogListComponent, decorators: [{
|
|
30767
30249
|
type: Component,
|
|
@@ -30774,7 +30256,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
30774
30256
|
TruncatedTextComponent,
|
|
30775
30257
|
NgIconComponent,
|
|
30776
30258
|
ScrollingModule,
|
|
30777
|
-
], providers: [provideIcons({ iconoirList })], template: "<div\n cdkScrollable\n class=\"h-[562px] relative overflow-y-auto overflow-hidden\"\n data-cy=\"feat-catalog-scrollable\"\n>\n <div #scrollContainer class=\"flex flex-col gap-2 py-5 px-5\">\n @for (\n featureType of filteredFeatureCatalog?.featureTypes;\n track featureType\n ) {\n <div class=\"rounded shadow bg-white\">\n <gn-ui-expandable-panel\n #expanel\n [collapsed]=\"filteredFeatureCatalog?.featureTypes?.length !== 1\"\n iconColor=\"black\"\n >\n <ng-template #titleTemplate>\n <div class=\"px-2\">\n <div class=\"text-lg font-bold\">{{ featureType.name }}</div>\n @if (featureType.
|
|
30259
|
+
], providers: [provideIcons({ iconoirList })], template: "<div\n cdkScrollable\n class=\"h-[562px] relative overflow-y-auto overflow-hidden\"\n data-cy=\"feat-catalog-scrollable\"\n>\n <div #scrollContainer class=\"flex flex-col gap-2 py-5 px-5\">\n @for (\n featureType of filteredFeatureCatalog?.featureTypes;\n track featureType\n ) {\n <div class=\"rounded shadow bg-white\">\n <gn-ui-expandable-panel\n #expanel\n [collapsed]=\"filteredFeatureCatalog?.featureTypes?.length !== 1\"\n iconColor=\"black\"\n >\n <ng-template #titleTemplate>\n <div class=\"px-2\">\n <div class=\"text-lg font-bold\">{{ featureType.name }}</div>\n @if (featureType.description) {\n <div class=\"text-sm\">\n {{ featureType.description }}\n </div>\n }\n </div>\n </ng-template>\n @if (expanel && !expanel.collapsed) {\n <div\n class=\"grid gap-0\"\n [style.grid-template-columns]=\"\n getGridTemplateColumns(featureType.attributes)\n \"\n data-cy=\"feature-type-content\"\n >\n @for (\n col of getColumnsDefinition(featureType.attributes);\n track trackByColumn(i, col);\n let i = $index\n ) {\n <div\n class=\"py-1 px-2 text-sm font-bold text-left border-t break-all\"\n [class.border-l]=\"i > 0\"\n [class.border-gray-300]=\"i > 0\"\n [ngClass]=\"col.class || ''\"\n data-test=\"column-label\"\n >\n {{ 'feature.catalog.attribute.' + col.key | translate }}\n </div>\n }\n @if (expanel && !expanel.collapsed) {\n @for (row of featureType.attributes; track row) {\n @for (\n col of getColumnsDefinition(featureType.attributes);\n track trackByColumn(i, col);\n let i = $index\n ) {\n <div\n class=\"bg-white text-sm font-normal text-left border-t\"\n [class.border-l]=\"i > 0\"\n [class.border-gray-300]=\"i > 0\"\n data-test=\"cell-content\"\n >\n @if (col.key === 'values') {\n @if (row.values?.length > 0) {\n <gn-ui-cell-popin\n #popinRef\n [scrollContainer]=\"scrollContainer\"\n [cdkScrollContainer]=\"scrollable\"\n >\n <div\n cellContent\n data-cy=\"values-cell-popin-trigger\"\n >\n <gn-ui-button\n type=\"light\"\n extraClass=\"bg-transparent border-none\"\n (buttonClick)=\"popinRef.openOverlay()\"\n >\n <ng-icon name=\"iconoirList\" size=\"24\"></ng-icon>\n </gn-ui-button>\n </div>\n <div\n popinContent\n class=\"max-h-60 overflow-y-auto min-w-64 py-4 px-6\"\n style=\"scrollbar-width: thin\"\n >\n <ul class=\"list-disc list-inside mr-4\">\n @for (v of row.values; track v) {\n <li>\n {{ v.label || v.code }}\n </li>\n }\n </ul>\n </div>\n </gn-ui-cell-popin>\n }\n } @else {\n <gn-ui-truncated-text\n [scrollContainer]=\"scrollContainer\"\n [cdkScrollContainer]=\"scrollable\"\n [text]=\"row[col.key]\"\n ></gn-ui-truncated-text>\n }\n </div>\n }\n }\n }\n </div>\n }\n </gn-ui-expandable-panel>\n </div>\n }\n </div>\n</div>\n" }]
|
|
30778
30260
|
}], propDecorators: { filteredFeatureCatalog: [{
|
|
30779
30261
|
type: Input
|
|
30780
30262
|
}], scrollContainer: [{
|
|
@@ -31912,6 +31394,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
31912
31394
|
], template: "<div class=\"flex flex-col gap-6 p-6 items-start pointer-events-none\">\n @for (\n notification of notificationsService.notifications$ | async;\n track trackById($index, notification)\n ) {\n <gn-ui-notification\n class=\"max-w-full pointer-events-auto\"\n [text]=\"notification.text\"\n [type]=\"notification.type\"\n [title]=\"notification.title\"\n [closeMessage]=\"notification.closeMessage\"\n (notificationClose)=\"\n notificationsService.removeNotificationById(notification.id)\n \"\n [@enterExit]\n ></gn-ui-notification>\n }\n</div>\n" }]
|
|
31913
31395
|
}] });
|
|
31914
31396
|
|
|
31397
|
+
marker('search.filters.spatialExtent.searchLocation');
|
|
31398
|
+
// in MB, null means no limit
|
|
31399
|
+
const SPATIAL_EXTENT_MAX_FILE_SIZE = new InjectionToken('spatialExtentMaxFileSize', { factory: () => null });
|
|
31915
31400
|
class FilterDropdownComponent {
|
|
31916
31401
|
constructor() {
|
|
31917
31402
|
this.searchFacade = inject(SearchFacade);
|
|
@@ -31919,7 +31404,7 @@ class FilterDropdownComponent {
|
|
|
31919
31404
|
this.fieldsService = inject(FieldsService);
|
|
31920
31405
|
this.notificationsService = inject(NotificationsService);
|
|
31921
31406
|
this.translateService = inject(TranslateService);
|
|
31922
|
-
this.spatialExtentMaxFileSize =
|
|
31407
|
+
this.spatialExtentMaxFileSize = inject(SPATIAL_EXTENT_MAX_FILE_SIZE);
|
|
31923
31408
|
this.selected$ = this.searchFacade.searchFilters$.pipe(switchMap((filters) => this.fieldsService.readFieldValuesFromFilters(filters)), map$1((fieldValues) => fieldValues[this.fieldName]), filter$1((selected) => !!selected), startWith$1([]), catchError(() => of([])));
|
|
31924
31409
|
this.selectedDateRange$ = this.selected$.pipe(map$1((selected) => (Array.isArray(selected) ? {} : selected)));
|
|
31925
31410
|
this.selectedBoundingBox$ = this.selected$.pipe(map$1((selected) => Array.isArray(selected) && selected.length > 0
|
|
@@ -31940,6 +31425,9 @@ class FilterDropdownComponent {
|
|
|
31940
31425
|
.subscribe((filters) => this.searchService.updateFilters(filters));
|
|
31941
31426
|
this.clearSpatialExtentErrorNotification();
|
|
31942
31427
|
}
|
|
31428
|
+
onLocationSelected({ bbox, label }) {
|
|
31429
|
+
this.spatialExtentDropdown.setLocationBbox(bbox, label);
|
|
31430
|
+
}
|
|
31943
31431
|
onSpatialExtentError(error) {
|
|
31944
31432
|
this.clearSpatialExtentErrorNotification();
|
|
31945
31433
|
this.spatialExtentErrorNotificationId =
|
|
@@ -31970,7 +31458,7 @@ class FilterDropdownComponent {
|
|
|
31970
31458
|
.subscribe((filters) => this.searchService.updateFilters(filters));
|
|
31971
31459
|
}
|
|
31972
31460
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: FilterDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
31973
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: FilterDropdownComponent, isStandalone: true, selector: "gn-ui-filter-dropdown", inputs: { fieldName: "fieldName", title: "title" }, ngImport: i0, template: "@if (fieldType === 'dateRange') {\n <gn-ui-date-range-dropdown\n [title]=\"title\"\n [dateRange]=\"(selectedDateRange$ | async) ?? {}\"\n (dateRangeChange)=\"onDateRangeChange($event)\"\n [attr.data-cy-field]=\"fieldName\"\n ></gn-ui-date-range-dropdown>\n} @else if (fieldType === 'spatialExtent') {\n <gn-ui-spatial-extent-dropdown\n [title]=\"title\"\n [initialBbox]=\"(selectedBoundingBox$ | async) ?? null\"\n [maxFileSizeMb]=\"spatialExtentMaxFileSize\"\n (bboxChange)=\"onBboxChange($event)\"\n (errorChange)=\"onSpatialExtentError($event)\"\n [attr.data-cy-field]=\"fieldName\"\n ></gn-ui-spatial-extent-dropdown>\n} @else {\n <gn-ui-dropdown-multiselect\n class=\"w-full\"\n [title]=\"title\"\n [maxRows]=\"6\"\n [choices]=\"(choices$ | async) || []\"\n [selected]=\"selected$ | async\"\n [allowSearch]=\"true\"\n (selectValues)=\"onSelectedValues($event)\"\n [attr.data-cy-field]=\"fieldName\"\n >\n </gn-ui-dropdown-multiselect>\n}\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DateRangeDropdownComponent, selector: "gn-ui-date-range-dropdown", inputs: ["title", "dateRange"], outputs: ["dateRangeChange"] }, { kind: "component", type: DropdownMultiselectComponent, selector: "gn-ui-dropdown-multiselect", inputs: ["title", "choices", "selected", "allowSearch", "maxRows", "searchInputValue"], outputs: ["selectValues"] }, { kind: "component", type: SpatialExtentDropdownComponent, selector: "gn-ui-spatial-extent-dropdown", inputs: ["title", "maxFileSizeMb", "initialBbox"], outputs: ["bboxChange", "errorChange"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
31461
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: FilterDropdownComponent, isStandalone: true, selector: "gn-ui-filter-dropdown", inputs: { fieldName: "fieldName", title: "title" }, viewQueries: [{ propertyName: "spatialExtentDropdown", first: true, predicate: SpatialExtentDropdownComponent, descendants: true }], ngImport: i0, template: "@if (fieldType === 'dateRange') {\n <gn-ui-date-range-dropdown\n [title]=\"title\"\n [dateRange]=\"(selectedDateRange$ | async) ?? {}\"\n (dateRangeChange)=\"onDateRangeChange($event)\"\n [attr.data-cy-field]=\"fieldName\"\n ></gn-ui-date-range-dropdown>\n} @else if (fieldType === 'spatialExtent') {\n <gn-ui-spatial-extent-dropdown\n [title]=\"title\"\n [initialBbox]=\"(selectedBoundingBox$ | async) ?? null\"\n [maxFileSizeMb]=\"spatialExtentMaxFileSize\"\n (bboxChange)=\"onBboxChange($event)\"\n (errorChange)=\"onSpatialExtentError($event)\"\n [attr.data-cy-field]=\"fieldName\"\n >\n <gn-ui-location-search\n [placeholder]=\"'search.filters.spatialExtent.searchLocation' | translate\"\n (bboxSelected)=\"onLocationSelected($event)\"\n data-cy=\"locationSearch\"\n ></gn-ui-location-search>\n </gn-ui-spatial-extent-dropdown>\n} @else {\n <gn-ui-dropdown-multiselect\n class=\"w-full\"\n [title]=\"title\"\n [maxRows]=\"6\"\n [choices]=\"(choices$ | async) || []\"\n [selected]=\"selected$ | async\"\n [allowSearch]=\"true\"\n (selectValues)=\"onSelectedValues($event)\"\n [attr.data-cy-field]=\"fieldName\"\n >\n </gn-ui-dropdown-multiselect>\n}\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DateRangeDropdownComponent, selector: "gn-ui-date-range-dropdown", inputs: ["title", "dateRange"], outputs: ["dateRangeChange"] }, { kind: "component", type: DropdownMultiselectComponent, selector: "gn-ui-dropdown-multiselect", inputs: ["title", "choices", "selected", "allowSearch", "maxRows", "searchInputValue"], outputs: ["selectValues"] }, { kind: "component", type: SpatialExtentDropdownComponent, selector: "gn-ui-spatial-extent-dropdown", inputs: ["title", "maxFileSizeMb", "initialBbox"], outputs: ["bboxChange", "errorChange"] }, { kind: "component", type: LocationSearchComponent, selector: "gn-ui-location-search", inputs: ["placeholder"], outputs: ["resultSelected", "bboxSelected"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
31974
31462
|
}
|
|
31975
31463
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: FilterDropdownComponent, decorators: [{
|
|
31976
31464
|
type: Component,
|
|
@@ -31979,11 +31467,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
31979
31467
|
DateRangeDropdownComponent,
|
|
31980
31468
|
DropdownMultiselectComponent,
|
|
31981
31469
|
SpatialExtentDropdownComponent,
|
|
31982
|
-
|
|
31470
|
+
LocationSearchComponent,
|
|
31471
|
+
TranslatePipe,
|
|
31472
|
+
], template: "@if (fieldType === 'dateRange') {\n <gn-ui-date-range-dropdown\n [title]=\"title\"\n [dateRange]=\"(selectedDateRange$ | async) ?? {}\"\n (dateRangeChange)=\"onDateRangeChange($event)\"\n [attr.data-cy-field]=\"fieldName\"\n ></gn-ui-date-range-dropdown>\n} @else if (fieldType === 'spatialExtent') {\n <gn-ui-spatial-extent-dropdown\n [title]=\"title\"\n [initialBbox]=\"(selectedBoundingBox$ | async) ?? null\"\n [maxFileSizeMb]=\"spatialExtentMaxFileSize\"\n (bboxChange)=\"onBboxChange($event)\"\n (errorChange)=\"onSpatialExtentError($event)\"\n [attr.data-cy-field]=\"fieldName\"\n >\n <gn-ui-location-search\n [placeholder]=\"'search.filters.spatialExtent.searchLocation' | translate\"\n (bboxSelected)=\"onLocationSelected($event)\"\n data-cy=\"locationSearch\"\n ></gn-ui-location-search>\n </gn-ui-spatial-extent-dropdown>\n} @else {\n <gn-ui-dropdown-multiselect\n class=\"w-full\"\n [title]=\"title\"\n [maxRows]=\"6\"\n [choices]=\"(choices$ | async) || []\"\n [selected]=\"selected$ | async\"\n [allowSearch]=\"true\"\n (selectValues)=\"onSelectedValues($event)\"\n [attr.data-cy-field]=\"fieldName\"\n >\n </gn-ui-dropdown-multiselect>\n}\n" }]
|
|
31983
31473
|
}], propDecorators: { fieldName: [{
|
|
31984
31474
|
type: Input
|
|
31985
31475
|
}], title: [{
|
|
31986
31476
|
type: Input
|
|
31477
|
+
}], spatialExtentDropdown: [{
|
|
31478
|
+
type: ViewChild,
|
|
31479
|
+
args: [SpatialExtentDropdownComponent]
|
|
31987
31480
|
}] } });
|
|
31988
31481
|
|
|
31989
31482
|
class FuzzySearchComponent {
|
|
@@ -32600,6 +32093,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
32600
32093
|
marker('search.filters.summaryLabel.user');
|
|
32601
32094
|
marker('search.filters.summaryLabel.changeDate');
|
|
32602
32095
|
marker('search.filters.summaryLabel.resourceCreationRevisionDate');
|
|
32096
|
+
marker('search.filters.summaryLabel.temporalExtent');
|
|
32603
32097
|
const OPEN_BOUND = '…';
|
|
32604
32098
|
class SearchFiltersSummaryItemComponent {
|
|
32605
32099
|
constructor() {
|
|
@@ -34163,7 +33657,7 @@ class DataService {
|
|
|
34163
33657
|
}));
|
|
34164
33658
|
}
|
|
34165
33659
|
async getDownloadLinksFromOgcApiFeatures(ogcApiLink) {
|
|
34166
|
-
const collectionInfo = await this.getDownloadUrlsFromOgcApi(ogcApiLink.url.href);
|
|
33660
|
+
const collectionInfo = await this.getDownloadUrlsFromOgcApi(ogcApiLink.url.href, ogcApiLink.name);
|
|
34167
33661
|
return Object.keys(collectionInfo.bulkDownloadLinks).map((mimeType) => {
|
|
34168
33662
|
const urlWithoutLimit = new URL(collectionInfo.bulkDownloadLinks[mimeType]);
|
|
34169
33663
|
urlWithoutLimit.searchParams.delete('limit');
|
|
@@ -34176,27 +33670,31 @@ class DataService {
|
|
|
34176
33670
|
};
|
|
34177
33671
|
});
|
|
34178
33672
|
}
|
|
34179
|
-
async
|
|
33673
|
+
async getTargetCollectionId(endpoint, collectionId) {
|
|
33674
|
+
const collections = await endpoint.featureCollections;
|
|
33675
|
+
return collections.length === 1 && !collectionId
|
|
33676
|
+
? collections[0]
|
|
33677
|
+
: collectionId;
|
|
33678
|
+
}
|
|
33679
|
+
async getDownloadUrlsFromOgcApi(url, collectionId) {
|
|
34180
33680
|
const endpoint = new OgcApiEndpoint(url);
|
|
34181
|
-
|
|
34182
|
-
.
|
|
34183
|
-
return endpoint.getCollectionInfo(
|
|
34184
|
-
}
|
|
34185
|
-
|
|
34186
|
-
throw new Error(
|
|
34187
|
-
}
|
|
33681
|
+
try {
|
|
33682
|
+
const id = await this.getTargetCollectionId(endpoint, collectionId);
|
|
33683
|
+
return await endpoint.getCollectionInfo(id);
|
|
33684
|
+
}
|
|
33685
|
+
catch {
|
|
33686
|
+
throw new Error('ogc.unreachable.unknown');
|
|
33687
|
+
}
|
|
34188
33688
|
}
|
|
34189
|
-
async getItemsFromOgcApi(url, limit) {
|
|
33689
|
+
async getItemsFromOgcApi(url, collectionId, limit) {
|
|
34190
33690
|
const endpoint = new OgcApiEndpoint(url);
|
|
34191
|
-
|
|
34192
|
-
.
|
|
34193
|
-
return
|
|
34194
|
-
|
|
34195
|
-
|
|
34196
|
-
|
|
34197
|
-
|
|
34198
|
-
throw new Error(`ogc.unreachable.unknown`);
|
|
34199
|
-
});
|
|
33691
|
+
try {
|
|
33692
|
+
const id = await this.getTargetCollectionId(endpoint, collectionId);
|
|
33693
|
+
return await endpoint.getCollectionItems(id, limit);
|
|
33694
|
+
}
|
|
33695
|
+
catch {
|
|
33696
|
+
throw new Error('ogc.unreachable.unknown');
|
|
33697
|
+
}
|
|
34200
33698
|
}
|
|
34201
33699
|
async getItemsFromStacApi(url, options) {
|
|
34202
33700
|
return await StacEndpoint.getItemsFromUrl(url, options)
|
|
@@ -34284,7 +33782,7 @@ class DataService {
|
|
|
34284
33782
|
}
|
|
34285
33783
|
else if (link.type === 'service' &&
|
|
34286
33784
|
link.accessServiceProtocol === 'ogcFeatures') {
|
|
34287
|
-
return from(this.getDownloadUrlsFromOgcApi(link.url.href)).pipe(switchMap$1((collectionInfo) => {
|
|
33785
|
+
return from(this.getDownloadUrlsFromOgcApi(link.url.href, link.name)).pipe(switchMap$1((collectionInfo) => {
|
|
34288
33786
|
const isMimeTypeJson = (mimeType) => {
|
|
34289
33787
|
return mimeType.toLowerCase().indexOf('json') > -1;
|
|
34290
33788
|
};
|
|
@@ -35228,7 +34726,7 @@ class MdViewFacade {
|
|
|
35228
34726
|
if (this.linkClassifier.hasUsage(link, LinkUsage.GEODATA)) {
|
|
35229
34727
|
if (link.type === 'service' &&
|
|
35230
34728
|
link.accessServiceProtocol === 'ogcFeatures') {
|
|
35231
|
-
return from(this.dataService.getItemsFromOgcApi(link.url.href, 1)).pipe(map$1((collectionRecords) => {
|
|
34729
|
+
return from(this.dataService.getItemsFromOgcApi(link.url.href, link.name, 1)).pipe(map$1((collectionRecords) => {
|
|
35232
34730
|
return collectionRecords &&
|
|
35233
34731
|
collectionRecords[0] &&
|
|
35234
34732
|
collectionRecords[0].geometry
|
|
@@ -35311,7 +34809,7 @@ class MdViewEffects {
|
|
|
35311
34809
|
}
|
|
35312
34810
|
return loadFullMetadataSuccess({ full: record });
|
|
35313
34811
|
}), catchError((error) => of(loadFullMetadataFailure({ otherError: error.message })))));
|
|
35314
|
-
this.loadFeatureCatalog$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadataSuccess), filter$1(({ full }) => full !== undefined), switchMap$1(({ full }) => this.recordsRepository.
|
|
34812
|
+
this.loadFeatureCatalog$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadataSuccess), filter$1(({ full }) => full !== undefined), switchMap$1(({ full }) => this.recordsRepository.queryLinkedFeatureCatalog(full)), map$1((featureCatalog) => loadFeatureCatalogSuccess({
|
|
35315
34813
|
datasetCatalog: featureCatalog,
|
|
35316
34814
|
})), catchError((error) => of(loadFeatureCatalogFailure({
|
|
35317
34815
|
error: error.message,
|
|
@@ -40945,6 +40443,638 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
40945
40443
|
args: ['gnUiSearchRouterContainer']
|
|
40946
40444
|
}] } });
|
|
40947
40445
|
|
|
40446
|
+
const flatten = (base, obj, keepLevel = false) => Object.keys(obj).reduce((prev, curr) => {
|
|
40447
|
+
const path = base ? `${base}.${curr}` : curr;
|
|
40448
|
+
const val = obj[curr];
|
|
40449
|
+
if (keepLevel) {
|
|
40450
|
+
return { ...prev, [path]: flatten('', val) };
|
|
40451
|
+
}
|
|
40452
|
+
else if (typeof val === 'object' && !Array.isArray(val)) {
|
|
40453
|
+
return {
|
|
40454
|
+
...prev,
|
|
40455
|
+
...flatten(path, val),
|
|
40456
|
+
};
|
|
40457
|
+
}
|
|
40458
|
+
else {
|
|
40459
|
+
return { ...prev, [path]: val };
|
|
40460
|
+
}
|
|
40461
|
+
}, {});
|
|
40462
|
+
const checkKeys = (input, mandatory, optional) => {
|
|
40463
|
+
const keys = Object.keys(input);
|
|
40464
|
+
const missing = mandatory.filter((key) => keys.indexOf(key) === -1);
|
|
40465
|
+
const unrecognized = keys.filter((key) => mandatory.indexOf(key) === -1 && optional.indexOf(key) === -1);
|
|
40466
|
+
return {
|
|
40467
|
+
missing,
|
|
40468
|
+
unrecognized,
|
|
40469
|
+
};
|
|
40470
|
+
};
|
|
40471
|
+
/**
|
|
40472
|
+
* Only keeps recognized keys, flatten nested values (to allow having "." in keys),
|
|
40473
|
+
* pushes warnings and errors to the given arrays; returns null in case of error
|
|
40474
|
+
*/
|
|
40475
|
+
function parseConfigSection(fullConfigObj, sectionName, mandatoryKeys, optionalKeys, outWarnings, outErrors) {
|
|
40476
|
+
if (typeof fullConfigObj[sectionName] !== 'object') {
|
|
40477
|
+
if (mandatoryKeys.length === 0)
|
|
40478
|
+
return null;
|
|
40479
|
+
outErrors.push(`The [${sectionName}] mandatory section is missing.`);
|
|
40480
|
+
return null;
|
|
40481
|
+
}
|
|
40482
|
+
const sectionConf = fullConfigObj[sectionName];
|
|
40483
|
+
const keysCheck = checkKeys(sectionConf, mandatoryKeys, optionalKeys);
|
|
40484
|
+
if (keysCheck.missing.length) {
|
|
40485
|
+
// note: this is not thrown to allow merging several Errors down the line
|
|
40486
|
+
outErrors.push(`In the [${sectionName}] section: ${keysCheck.missing.join(', ')}`);
|
|
40487
|
+
return null;
|
|
40488
|
+
}
|
|
40489
|
+
else if (keysCheck.unrecognized.length) {
|
|
40490
|
+
outWarnings.push(`In the [${sectionName}] section: ${keysCheck.unrecognized.join(', ')}`);
|
|
40491
|
+
keysCheck.unrecognized.forEach((key) => delete sectionConf[key]);
|
|
40492
|
+
}
|
|
40493
|
+
return sectionConf;
|
|
40494
|
+
}
|
|
40495
|
+
/**
|
|
40496
|
+
* Same as parseConfigSection but keeps all keys, recognized or not
|
|
40497
|
+
* Also the first level is the language code (e.g. 'en')
|
|
40498
|
+
* This is optional
|
|
40499
|
+
*/
|
|
40500
|
+
function parseTranslationsConfigSection(fullConfigObj, sectionName) {
|
|
40501
|
+
if (typeof fullConfigObj[sectionName] !== 'object') {
|
|
40502
|
+
return {};
|
|
40503
|
+
}
|
|
40504
|
+
return flatten('', fullConfigObj[sectionName], true);
|
|
40505
|
+
}
|
|
40506
|
+
/**
|
|
40507
|
+
* Same as parseConfigSection but handles an array of configs; this is
|
|
40508
|
+
* considered optional; returns null in case of error in at least one of
|
|
40509
|
+
* the sections
|
|
40510
|
+
*/
|
|
40511
|
+
function parseMultiConfigSection(fullConfigObj, sectionName, mandatoryKeys, optionalKeys, outWarnings, outErrors) {
|
|
40512
|
+
const sections = fullConfigObj[sectionName];
|
|
40513
|
+
if (!sections) {
|
|
40514
|
+
return [];
|
|
40515
|
+
}
|
|
40516
|
+
if (!Array.isArray(sections)) {
|
|
40517
|
+
outErrors.push(`Expected [[${sectionName}]] to be an array of sections.`);
|
|
40518
|
+
return null;
|
|
40519
|
+
}
|
|
40520
|
+
const result = sections.map((section) => parseConfigSection({ [sectionName]: section }, sectionName, mandatoryKeys, optionalKeys, outWarnings, outErrors));
|
|
40521
|
+
if (result.some((r) => r === null)) {
|
|
40522
|
+
return null;
|
|
40523
|
+
}
|
|
40524
|
+
return result;
|
|
40525
|
+
}
|
|
40526
|
+
function checkMetadataLanguage(parsedConfigSection, outWarnings) {
|
|
40527
|
+
const lang2 = toLang2(parsedConfigSection.metadata_language.toLowerCase());
|
|
40528
|
+
if (lang2?.length !== 2) {
|
|
40529
|
+
outWarnings.push(`In the [global] section: metadata_language = "${parsedConfigSection.metadata_language}" is not a recognized ISO 639 language code`);
|
|
40530
|
+
}
|
|
40531
|
+
return parsedConfigSection;
|
|
40532
|
+
}
|
|
40533
|
+
function checkNewRecordDefaultLanguage(parsedConfigSection, outWarnings) {
|
|
40534
|
+
const lang2 = toLang2(parsedConfigSection.new_record_default_language.toLowerCase());
|
|
40535
|
+
if (!(lang2 in LANG_2_TO_3_MAPPER)) {
|
|
40536
|
+
outWarnings.push(`In the [editing] section: new_record_default_language = "${parsedConfigSection.new_record_default_language}" is not a recognized ISO 639 language code`);
|
|
40537
|
+
return {
|
|
40538
|
+
...parsedConfigSection,
|
|
40539
|
+
new_record_default_language: undefined,
|
|
40540
|
+
};
|
|
40541
|
+
}
|
|
40542
|
+
return {
|
|
40543
|
+
...parsedConfigSection,
|
|
40544
|
+
new_record_default_language: lang2,
|
|
40545
|
+
};
|
|
40546
|
+
}
|
|
40547
|
+
function checkNewRecordStandard(parsedConfigSection, outWarnings) {
|
|
40548
|
+
const standard = parsedConfigSection.new_record_standard;
|
|
40549
|
+
const normalizedStandard = typeof standard === 'string' ? standard.trim().toLowerCase() : null;
|
|
40550
|
+
if (normalizedStandard === 'iso19139' ||
|
|
40551
|
+
normalizedStandard === 'iso19115-3') {
|
|
40552
|
+
return {
|
|
40553
|
+
...parsedConfigSection,
|
|
40554
|
+
new_record_standard: normalizedStandard,
|
|
40555
|
+
};
|
|
40556
|
+
}
|
|
40557
|
+
outWarnings.push(`In the [editing] section: new_record_standard = "${standard}" is not a supported metadata standard`);
|
|
40558
|
+
return {
|
|
40559
|
+
...parsedConfigSection,
|
|
40560
|
+
new_record_standard: undefined,
|
|
40561
|
+
};
|
|
40562
|
+
}
|
|
40563
|
+
|
|
40564
|
+
/**
|
|
40565
|
+
* This loader extends the default one based on JSON files but also loads custom translations
|
|
40566
|
+
* defined in the app configuration
|
|
40567
|
+
* Implements a fallback on default lang if translated labels are empty
|
|
40568
|
+
*/
|
|
40569
|
+
class FileWithOverridesTranslateLoader extends FileTranslateLoader {
|
|
40570
|
+
getTranslation(lang) {
|
|
40571
|
+
const baseLang = lang.substring(0, 2); // removing the right part of e.g. en_EN
|
|
40572
|
+
return super.getTranslation(baseLang).pipe(map$1((translations) => ({
|
|
40573
|
+
...translations,
|
|
40574
|
+
...getCustomTranslations(baseLang),
|
|
40575
|
+
})));
|
|
40576
|
+
}
|
|
40577
|
+
}
|
|
40578
|
+
|
|
40579
|
+
const MISSING_CONFIG_ERROR = `Application configuration was not initialized correctly.
|
|
40580
|
+
This error might show up in case of an invalid/malformed configuration file.
|
|
40581
|
+
|
|
40582
|
+
Note: make sure that you have called \`loadAppConfig\` from '../../../../../libs/util/app-config/src' before starting the Angular application.`;
|
|
40583
|
+
let globalConfig = null;
|
|
40584
|
+
function getGlobalConfig() {
|
|
40585
|
+
if (globalConfig === null)
|
|
40586
|
+
throw new Error(MISSING_CONFIG_ERROR);
|
|
40587
|
+
return globalConfig;
|
|
40588
|
+
}
|
|
40589
|
+
let themeConfig = null;
|
|
40590
|
+
function getThemeConfig() {
|
|
40591
|
+
if (themeConfig === null)
|
|
40592
|
+
throw new Error(MISSING_CONFIG_ERROR);
|
|
40593
|
+
return themeConfig;
|
|
40594
|
+
}
|
|
40595
|
+
let mapConfig = null;
|
|
40596
|
+
function getOptionalMapConfig() {
|
|
40597
|
+
return mapConfig;
|
|
40598
|
+
}
|
|
40599
|
+
let searchConfig = null;
|
|
40600
|
+
function getOptionalSearchConfig() {
|
|
40601
|
+
return searchConfig;
|
|
40602
|
+
}
|
|
40603
|
+
let editorConfig = null;
|
|
40604
|
+
function getOptionalEditorConfig() {
|
|
40605
|
+
return editorConfig;
|
|
40606
|
+
}
|
|
40607
|
+
let metadataQualityConfig = null;
|
|
40608
|
+
function getMetadataQualityConfig() {
|
|
40609
|
+
return (metadataQualityConfig ||
|
|
40610
|
+
{
|
|
40611
|
+
ENABLED: false,
|
|
40612
|
+
});
|
|
40613
|
+
}
|
|
40614
|
+
let customTranslations = null;
|
|
40615
|
+
function getCustomTranslations(langCode) {
|
|
40616
|
+
if (customTranslations === null)
|
|
40617
|
+
throw new Error(MISSING_CONFIG_ERROR);
|
|
40618
|
+
return langCode in customTranslations ? customTranslations[langCode] : {};
|
|
40619
|
+
}
|
|
40620
|
+
let appConfigLoaded = false;
|
|
40621
|
+
function loadAppConfig(configUrl = 'assets/configuration/default.toml') {
|
|
40622
|
+
console.log(`[geonetwork-ui] Loading application configuration from ${configUrl}`);
|
|
40623
|
+
return fetch(configUrl)
|
|
40624
|
+
.then((resp) => {
|
|
40625
|
+
if (!resp.ok)
|
|
40626
|
+
throw new Error('Configuration file could not be loaded');
|
|
40627
|
+
return resp.text();
|
|
40628
|
+
})
|
|
40629
|
+
.then((conf) => {
|
|
40630
|
+
let parsed;
|
|
40631
|
+
try {
|
|
40632
|
+
parsed = TOML.parse(conf, { joiner: '\n', bigint: false });
|
|
40633
|
+
}
|
|
40634
|
+
catch (e) {
|
|
40635
|
+
throw new Error(`An error occurred when parsing the configuration file: ${e.message}`);
|
|
40636
|
+
}
|
|
40637
|
+
const errors = [];
|
|
40638
|
+
const warnings = [];
|
|
40639
|
+
let parsedGlobalSection = parseConfigSection(parsed, 'global', ['geonetwork4_api_url'], [
|
|
40640
|
+
'datahub_url',
|
|
40641
|
+
'edit_url_template',
|
|
40642
|
+
'proxy_path',
|
|
40643
|
+
'metadata_language',
|
|
40644
|
+
'login_url',
|
|
40645
|
+
'logout_url',
|
|
40646
|
+
'settings_url',
|
|
40647
|
+
'web_component_embedder_url',
|
|
40648
|
+
'languages',
|
|
40649
|
+
'contact_email',
|
|
40650
|
+
'reuse_form_url',
|
|
40651
|
+
], warnings, errors);
|
|
40652
|
+
if (parsedGlobalSection?.metadata_language) {
|
|
40653
|
+
parsedGlobalSection = checkMetadataLanguage(parsedGlobalSection, warnings);
|
|
40654
|
+
}
|
|
40655
|
+
globalConfig =
|
|
40656
|
+
parsedGlobalSection === null
|
|
40657
|
+
? null
|
|
40658
|
+
: {
|
|
40659
|
+
GN4_API_URL: parsedGlobalSection.geonetwork4_api_url,
|
|
40660
|
+
DATAHUB_URL: parsedGlobalSection.datahub_url,
|
|
40661
|
+
EDIT_URL_TEMPLATE: parsedGlobalSection.edit_url_template,
|
|
40662
|
+
PROXY_PATH: parsedGlobalSection.proxy_path,
|
|
40663
|
+
METADATA_LANGUAGE: parsedGlobalSection.metadata_language
|
|
40664
|
+
? parsedGlobalSection.metadata_language.toLowerCase()
|
|
40665
|
+
: undefined,
|
|
40666
|
+
LOGIN_URL: parsedGlobalSection.login_url,
|
|
40667
|
+
LOGOUT_URL: parsedGlobalSection.logout_url,
|
|
40668
|
+
SETTINGS_URL: parsedGlobalSection.settings_url,
|
|
40669
|
+
WEB_COMPONENT_EMBEDDER_URL: parsedGlobalSection.web_component_embedder_url,
|
|
40670
|
+
LANGUAGES: parsedGlobalSection.languages,
|
|
40671
|
+
CONTACT_EMAIL: parsedGlobalSection.contact_email,
|
|
40672
|
+
REUSE_FORM_URL: parsedGlobalSection.reuse_form_url,
|
|
40673
|
+
};
|
|
40674
|
+
const parsedLayersSections = parseMultiConfigSection(parsed, 'map_layer', ['type'], ['name', 'url', 'data', 'styleUrl', 'accessToken'], warnings, errors);
|
|
40675
|
+
const parsedMapSection = parseConfigSection(parsed, 'map', [], [
|
|
40676
|
+
'max_zoom',
|
|
40677
|
+
'do_not_tile_wms',
|
|
40678
|
+
'max_extent',
|
|
40679
|
+
'max_feature_count',
|
|
40680
|
+
'baselayer',
|
|
40681
|
+
'do_not_use_default_basemap',
|
|
40682
|
+
'external_viewer_url_template',
|
|
40683
|
+
'external_viewer_open_new_tab',
|
|
40684
|
+
], warnings, errors);
|
|
40685
|
+
mapConfig =
|
|
40686
|
+
parsedMapSection === null || parsedLayersSections === null
|
|
40687
|
+
? null
|
|
40688
|
+
: {
|
|
40689
|
+
MAX_ZOOM: parsedMapSection.max_zoom,
|
|
40690
|
+
DO_NOT_TILE_WMS: parsedMapSection.do_not_tile_wms,
|
|
40691
|
+
MAX_EXTENT: parsedMapSection.max_extent,
|
|
40692
|
+
MAX_FEATURE_COUNT: parsedMapSection.max_feature_count,
|
|
40693
|
+
EXTERNAL_VIEWER_URL_TEMPLATE: parsedMapSection.external_viewer_url_template,
|
|
40694
|
+
EXTERNAL_VIEWER_OPEN_NEW_TAB: parsedMapSection.external_viewer_open_new_tab,
|
|
40695
|
+
DO_NOT_USE_DEFAULT_BASEMAP: !!parsedMapSection.do_not_use_default_basemap,
|
|
40696
|
+
MAP_LAYERS: parsedLayersSections.map((map_layer) => ({
|
|
40697
|
+
TYPE: map_layer.type,
|
|
40698
|
+
URL: map_layer.url,
|
|
40699
|
+
NAME: map_layer.name,
|
|
40700
|
+
DATA: map_layer.data,
|
|
40701
|
+
STYLE_URL: map_layer.styleUrl,
|
|
40702
|
+
ACCESS_TOKEN: map_layer.accessToken,
|
|
40703
|
+
})),
|
|
40704
|
+
};
|
|
40705
|
+
const parsedThemeSection = parseConfigSection(parsed, 'theme', ['primary_color', 'secondary_color', 'main_color', 'background_color'], [
|
|
40706
|
+
'header_foreground_color',
|
|
40707
|
+
'main_font',
|
|
40708
|
+
'title_font',
|
|
40709
|
+
'fonts_stylesheet_url',
|
|
40710
|
+
'thumbnail_placeholder',
|
|
40711
|
+
'header_background',
|
|
40712
|
+
'favicon',
|
|
40713
|
+
], warnings, errors);
|
|
40714
|
+
themeConfig =
|
|
40715
|
+
parsedThemeSection === null
|
|
40716
|
+
? null
|
|
40717
|
+
: {
|
|
40718
|
+
PRIMARY_COLOR: parsedThemeSection.primary_color,
|
|
40719
|
+
SECONDARY_COLOR: parsedThemeSection.secondary_color,
|
|
40720
|
+
MAIN_COLOR: parsedThemeSection.main_color,
|
|
40721
|
+
BACKGROUND_COLOR: parsedThemeSection.background_color,
|
|
40722
|
+
HEADER_FOREGROUND_COLOR: parsedThemeSection.header_foreground_color,
|
|
40723
|
+
THUMBNAIL_PLACEHOLDER: parsedThemeSection.thumbnail_placeholder,
|
|
40724
|
+
HEADER_BACKGROUND: parsedThemeSection.header_background,
|
|
40725
|
+
TITLE_FONT: parsedThemeSection.title_font,
|
|
40726
|
+
MAIN_FONT: parsedThemeSection.main_font,
|
|
40727
|
+
FONTS_STYLESHEET_URL: parsedThemeSection.fonts_stylesheet_url,
|
|
40728
|
+
FAVICON: parsedThemeSection.favicon,
|
|
40729
|
+
};
|
|
40730
|
+
const parsedSearchSection = parseConfigSection(parsed, 'search', [], [
|
|
40731
|
+
'record_kind_quick_filter',
|
|
40732
|
+
'filter_geometry_data',
|
|
40733
|
+
'filter_geometry_url',
|
|
40734
|
+
'do_not_use_default_search_preset',
|
|
40735
|
+
'search_preset',
|
|
40736
|
+
'advanced_filters',
|
|
40737
|
+
'limit',
|
|
40738
|
+
'spatial_extent_max_file_size',
|
|
40739
|
+
'geocoding_provider',
|
|
40740
|
+
'geocoding_provider_options',
|
|
40741
|
+
'geocoding_provider_labels',
|
|
40742
|
+
], warnings, errors);
|
|
40743
|
+
const parsedSearchParams = parseMultiConfigSection(parsed, 'search_preset', ['name'], ['sort', 'filters'], warnings, errors);
|
|
40744
|
+
const parsedCustomFilters = parseMultiConfigSection(parsed, 'custom_filter', ['name', 'base_filter'], ['exclude_values', 'include_values', 'label_key'], warnings, errors);
|
|
40745
|
+
const parsedGeocodingProviderLabels = parsedSearchSection?.geocoding_provider_labels;
|
|
40746
|
+
searchConfig =
|
|
40747
|
+
parsedSearchSection === null
|
|
40748
|
+
? null
|
|
40749
|
+
: {
|
|
40750
|
+
RECORD_KIND_QUICK_FILTER: parsedSearchSection.record_kind_quick_filter,
|
|
40751
|
+
FILTER_GEOMETRY_DATA: parsedSearchSection.filter_geometry_data,
|
|
40752
|
+
FILTER_GEOMETRY_URL: parsedSearchSection.filter_geometry_url,
|
|
40753
|
+
DO_NOT_USE_DEFAULT_SEARCH_PRESET: !!parsedSearchSection.do_not_use_default_search_preset,
|
|
40754
|
+
SEARCH_PRESET: parsedSearchParams.map((param) => ({
|
|
40755
|
+
sort: param.sort,
|
|
40756
|
+
name: param.name,
|
|
40757
|
+
filters: param.filters,
|
|
40758
|
+
})),
|
|
40759
|
+
ADVANCED_FILTERS: parsedSearchSection.advanced_filters,
|
|
40760
|
+
CUSTOM_FILTERS: (parsedCustomFilters ?? []).map((customFilter) => ({
|
|
40761
|
+
name: customFilter.name,
|
|
40762
|
+
baseFilter: customFilter.base_filter,
|
|
40763
|
+
excludeValues: customFilter.exclude_values,
|
|
40764
|
+
includeValues: customFilter.include_values,
|
|
40765
|
+
labelKey: customFilter.label_key,
|
|
40766
|
+
})),
|
|
40767
|
+
LIMIT: parsedSearchSection.limit,
|
|
40768
|
+
SPATIAL_EXTENT_MAX_FILE_SIZE: parsedSearchSection.spatial_extent_max_file_size,
|
|
40769
|
+
GEOCODING_PROVIDER: parsedSearchSection.geocoding_provider,
|
|
40770
|
+
GEOCODING_PROVIDER_OPTIONS: parsedSearchSection.geocoding_provider_options,
|
|
40771
|
+
GEOCODING_PROVIDER_LABELS: parsedGeocodingProviderLabels
|
|
40772
|
+
? {
|
|
40773
|
+
MAIN: parsedGeocodingProviderLabels.main,
|
|
40774
|
+
SECONDARY: parsedGeocodingProviderLabels.secondary,
|
|
40775
|
+
TERTIARY: parsedGeocodingProviderLabels.tertiary,
|
|
40776
|
+
}
|
|
40777
|
+
: undefined,
|
|
40778
|
+
};
|
|
40779
|
+
const parsedMetadataQualitySection = parseConfigSection(parsed, 'metadata-quality', [], ['enabled'], warnings, errors);
|
|
40780
|
+
metadataQualityConfig =
|
|
40781
|
+
parsedMetadataQualitySection === null
|
|
40782
|
+
? null
|
|
40783
|
+
: {
|
|
40784
|
+
ENABLED: parsedMetadataQualitySection.enabled,
|
|
40785
|
+
SORTABLE: parsedMetadataQualitySection.sortable,
|
|
40786
|
+
};
|
|
40787
|
+
let parsedEditingSection = parseConfigSection(parsed, 'editing', [], ['new_record_default_language', 'new_record_standard'], warnings, errors);
|
|
40788
|
+
if (parsedEditingSection !== null &&
|
|
40789
|
+
parsedEditingSection.new_record_default_language !== undefined) {
|
|
40790
|
+
parsedEditingSection = checkNewRecordDefaultLanguage(parsedEditingSection, warnings);
|
|
40791
|
+
}
|
|
40792
|
+
if (parsedEditingSection !== null &&
|
|
40793
|
+
parsedEditingSection.new_record_standard !== undefined) {
|
|
40794
|
+
parsedEditingSection = checkNewRecordStandard(parsedEditingSection, warnings);
|
|
40795
|
+
}
|
|
40796
|
+
editorConfig =
|
|
40797
|
+
parsedEditingSection === null
|
|
40798
|
+
? null
|
|
40799
|
+
: {
|
|
40800
|
+
NEW_RECORD_DEFAULT_LANGUAGE: parsedEditingSection.new_record_default_language,
|
|
40801
|
+
NEW_RECORD_STANDARD: parsedEditingSection.new_record_standard,
|
|
40802
|
+
};
|
|
40803
|
+
customTranslations = parseTranslationsConfigSection(parsed, 'translations');
|
|
40804
|
+
if (errors.length) {
|
|
40805
|
+
throw new Error(`One or more mandatory settings were missing from the configuration file.
|
|
40806
|
+
${errors.join('\n')}`);
|
|
40807
|
+
}
|
|
40808
|
+
else if (warnings.length) {
|
|
40809
|
+
console.warn(`One or more unexpected settings were encountered in the configuration file.
|
|
40810
|
+
${warnings.join('\n')}`);
|
|
40811
|
+
}
|
|
40812
|
+
appConfigLoaded = true;
|
|
40813
|
+
});
|
|
40814
|
+
}
|
|
40815
|
+
function isConfigLoaded() {
|
|
40816
|
+
return appConfigLoaded;
|
|
40817
|
+
}
|
|
40818
|
+
function _reset() {
|
|
40819
|
+
globalConfig = null;
|
|
40820
|
+
themeConfig = null;
|
|
40821
|
+
editorConfig = null;
|
|
40822
|
+
customTranslations = null;
|
|
40823
|
+
}
|
|
40824
|
+
const TRANSLATE_WITH_OVERRIDES_CONFIG = {
|
|
40825
|
+
compiler: {
|
|
40826
|
+
provide: TranslateCompiler,
|
|
40827
|
+
useClass: TranslateMessageFormatCompiler,
|
|
40828
|
+
},
|
|
40829
|
+
loader: [
|
|
40830
|
+
{
|
|
40831
|
+
provide: TRANSLATE_HTTP_LOADER_CONFIG,
|
|
40832
|
+
useValue: {
|
|
40833
|
+
prefix: './assets/i18n/',
|
|
40834
|
+
suffix: '.json',
|
|
40835
|
+
},
|
|
40836
|
+
},
|
|
40837
|
+
{
|
|
40838
|
+
provide: TranslateLoader,
|
|
40839
|
+
useClass: FileWithOverridesTranslateLoader,
|
|
40840
|
+
deps: [HttpClient, TRANSLATE_HTTP_LOADER_CONFIG],
|
|
40841
|
+
},
|
|
40842
|
+
],
|
|
40843
|
+
};
|
|
40844
|
+
|
|
40845
|
+
const okAppConfigFixture = () => `
|
|
40846
|
+
[global]
|
|
40847
|
+
geonetwork4_api_url = "/geonetwork/srv/api"
|
|
40848
|
+
proxy_path = "/proxy/?url="
|
|
40849
|
+
metadata_language = "fre"
|
|
40850
|
+
login_url = "/cas/login?service="
|
|
40851
|
+
logout_url = "/geonetwork/signout"
|
|
40852
|
+
settings_url = "/geonetwork/settings"
|
|
40853
|
+
web_component_embedder_url = "/datahub/wc-embedder.html"
|
|
40854
|
+
|
|
40855
|
+
[map]
|
|
40856
|
+
max_zoom = 10
|
|
40857
|
+
max_extent = [-418263.418776, 5251529.591305, 961272.067714, 6706890.609855]
|
|
40858
|
+
do_not_use_default_basemap = false
|
|
40859
|
+
external_viewer_url_template = 'https://example.com/myviewer?'
|
|
40860
|
+
external_viewer_open_new_tab = true
|
|
40861
|
+
[[map_layer]]
|
|
40862
|
+
type = "wms"
|
|
40863
|
+
url = "https://www.geo2france.fr/geoserver/cr_hdf/ows"
|
|
40864
|
+
name = "masque_hdf_ign_carto_latin1"
|
|
40865
|
+
[[map_layer]]
|
|
40866
|
+
type = "wfs"
|
|
40867
|
+
url = "https://www.geo2france.fr/geoserver/cr_hdf/ows"
|
|
40868
|
+
name = "masque_hdf_ign_carto_latin1"
|
|
40869
|
+
|
|
40870
|
+
[theme]
|
|
40871
|
+
primary_color = "#093564"
|
|
40872
|
+
secondary_color = "#c2e9dc"
|
|
40873
|
+
main_color = "#212029" # All-purpose text color
|
|
40874
|
+
background_color = "#fdfbff"
|
|
40875
|
+
thumbnail_placeholder = 'assets/img/placeholder.svg'
|
|
40876
|
+
header_background = 'teal'
|
|
40877
|
+
header_foreground_color = "#872e2e"
|
|
40878
|
+
main_font = 'sans-serif'
|
|
40879
|
+
title_font = 'serif'
|
|
40880
|
+
fonts_stylesheet_url = "https://fonts.googleapis.com/css2?family=Open+Sans"
|
|
40881
|
+
|
|
40882
|
+
[search]
|
|
40883
|
+
record_kind_quick_filter = false
|
|
40884
|
+
filter_geometry_url = 'https://my.domain.org/geom.json'
|
|
40885
|
+
do_not_use_default_search_preset = false
|
|
40886
|
+
geocoding_provider = "geoplateforme"
|
|
40887
|
+
geocoding_provider_options.index = "poi"
|
|
40888
|
+
geocoding_provider_options.category = "administratif"
|
|
40889
|
+
geocoding_provider_options.limit = 5
|
|
40890
|
+
geocoding_provider_labels.main = '/properties/name/0'
|
|
40891
|
+
geocoding_provider_labels.secondary = '/properties/citycode/0'
|
|
40892
|
+
geocoding_provider_labels.tertiary = '/properties/category/1'
|
|
40893
|
+
advanced_filters = ['publicationYear', 'documentStandard', 'inspireKeyword', 'topic', 'license', 'myOrg:firstCustomFilter', 'myOrg:secondCustomFilter']
|
|
40894
|
+
|
|
40895
|
+
[[custom_filter]]
|
|
40896
|
+
name = 'myOrg:firstCustomFilter'
|
|
40897
|
+
base_filter = 'keyword'
|
|
40898
|
+
exclude_values = ['my keyword 1', 'my keyword 2']
|
|
40899
|
+
label_key = 'myOrg.firstCustomFilter'
|
|
40900
|
+
|
|
40901
|
+
[[custom_filter]]
|
|
40902
|
+
name = 'myOrg:secondCustomFilter'
|
|
40903
|
+
base_filter = 'keyword'
|
|
40904
|
+
include_values = ['my keyword 3', 'my keyword 4']
|
|
40905
|
+
label_key = 'myOrg.secondCustomFilter'
|
|
40906
|
+
|
|
40907
|
+
[[search_preset]]
|
|
40908
|
+
sort = "-createDate"
|
|
40909
|
+
name = 'filterByOrgs'
|
|
40910
|
+
filters.q = 'Carto'
|
|
40911
|
+
filters.organisation = ['Org1', 'Org2']
|
|
40912
|
+
filters.format = ['ESRI Shapefile']
|
|
40913
|
+
filters.topic = ['boundaries']
|
|
40914
|
+
filters.publicationYear = ['2023', '2022']
|
|
40915
|
+
filters.spatial = ['yes']
|
|
40916
|
+
|
|
40917
|
+
[translations.en]
|
|
40918
|
+
"my.first.key" = 'First label.'
|
|
40919
|
+
"my.second.key" = """
|
|
40920
|
+
Second label,
|
|
40921
|
+
on two lines."""
|
|
40922
|
+
|
|
40923
|
+
[translations.de]
|
|
40924
|
+
my.first.key = 'Erste Etikett.'
|
|
40925
|
+
|
|
40926
|
+
[translations.fr]
|
|
40927
|
+
my.sample.text = "Un bon exemple de texte."
|
|
40928
|
+
"my.quoted.text" = 'du texte entre guillements.'
|
|
40929
|
+
`;
|
|
40930
|
+
const appConfigWithTranslationFixture = () => okAppConfigFixture();
|
|
40931
|
+
const minimalAppConfigFixture = () => `
|
|
40932
|
+
[global]
|
|
40933
|
+
geonetwork4_api_url = "/geonetwork/srv/api"
|
|
40934
|
+
proxy_path = "/proxy/?url="
|
|
40935
|
+
|
|
40936
|
+
[theme]
|
|
40937
|
+
primary_color = "#093564"
|
|
40938
|
+
secondary_color = "#c2e9dc"
|
|
40939
|
+
main_color = "#212029" # All-purpose text color
|
|
40940
|
+
background_color = "#fdfbff"
|
|
40941
|
+
`;
|
|
40942
|
+
const customFilterMissingMandatoryConfigFixture = () => `
|
|
40943
|
+
[global]
|
|
40944
|
+
geonetwork4_api_url = "/geonetwork/srv/api"
|
|
40945
|
+
|
|
40946
|
+
[theme]
|
|
40947
|
+
primary_color = "#093564"
|
|
40948
|
+
secondary_color = "#c2e9dc"
|
|
40949
|
+
main_color = "#212029" # All-purpose text color
|
|
40950
|
+
background_color = "#fdfbff"
|
|
40951
|
+
|
|
40952
|
+
[search]
|
|
40953
|
+
advanced_filters = ['myOrg:firstCustomFilter']
|
|
40954
|
+
|
|
40955
|
+
[[custom_filter]]
|
|
40956
|
+
name = 'myOrg:firstCustomFilter'
|
|
40957
|
+
`;
|
|
40958
|
+
const mapConfigFixture = () => ({
|
|
40959
|
+
MAX_ZOOM: 10,
|
|
40960
|
+
MAX_EXTENT: [-418263.418776, 5251529.591305, 961272.067714, 6706890.609855],
|
|
40961
|
+
DO_NOT_USE_DEFAULT_BASEMAP: false,
|
|
40962
|
+
DO_NOT_TILE_WMS: false,
|
|
40963
|
+
EXTERNAL_VIEWER_URL_TEMPLATE: 'https://example.com/myviewer/#/?actions=[{"type":"CATALOG:ADD_LAYERS_FROM_CATALOGS","layers":["${layer_name}"],"sources":[{"url":"${service_url}","type":"${service_type}"}]}]',
|
|
40964
|
+
EXTERNAL_VIEWER_OPEN_NEW_TAB: true,
|
|
40965
|
+
MAP_LAYERS: [
|
|
40966
|
+
{
|
|
40967
|
+
TYPE: 'xyz',
|
|
40968
|
+
URL: 'https://some-basemap-server',
|
|
40969
|
+
},
|
|
40970
|
+
{
|
|
40971
|
+
TYPE: 'wms',
|
|
40972
|
+
URL: 'https://some-wms-server',
|
|
40973
|
+
NAME: 'some_layername',
|
|
40974
|
+
},
|
|
40975
|
+
{
|
|
40976
|
+
TYPE: 'wfs',
|
|
40977
|
+
URL: 'https://some-wfs-server',
|
|
40978
|
+
NAME: 'some_layername',
|
|
40979
|
+
},
|
|
40980
|
+
],
|
|
40981
|
+
});
|
|
40982
|
+
const malformedConfigFixture = () => `
|
|
40983
|
+
{
|
|
40984
|
+
"I thought": "we were still doing json"
|
|
40985
|
+
}
|
|
40986
|
+
`;
|
|
40987
|
+
const missingMandatoryConfigFixture = () => `
|
|
40988
|
+
[theme]
|
|
40989
|
+
primary_color = "#093564"
|
|
40990
|
+
secondary_color = "#c2e9dc"
|
|
40991
|
+
background_color = "#fdfbff"
|
|
40992
|
+
main_font = 'sans-serif'
|
|
40993
|
+
`;
|
|
40994
|
+
const wrongLanguageCodeConfigFixture = () => `
|
|
40995
|
+
[global]
|
|
40996
|
+
geonetwork4_api_url = "/geonetwork/srv/api"
|
|
40997
|
+
proxy_path = "/proxy/?url="
|
|
40998
|
+
metadata_language = "abc"
|
|
40999
|
+
|
|
41000
|
+
[map]
|
|
41001
|
+
|
|
41002
|
+
[theme]
|
|
41003
|
+
primary_color = "#093564"
|
|
41004
|
+
secondary_color = "#c2e9dc"
|
|
41005
|
+
main_color = "#212029" # All-purpose text color
|
|
41006
|
+
background_color = "#fdfbff"
|
|
41007
|
+
`;
|
|
41008
|
+
const unrecognizedKeysConfigFixture = () => `
|
|
41009
|
+
[global]
|
|
41010
|
+
geonetwork4_api_url = "/geonetwork/srv/api"
|
|
41011
|
+
proxy_path = "/proxy/?url="
|
|
41012
|
+
metadata_language = "fre"
|
|
41013
|
+
another_path = '/whatever'
|
|
41014
|
+
|
|
41015
|
+
[map]
|
|
41016
|
+
max_zoom = 10
|
|
41017
|
+
max_extent = [-418263.418776, 5251529.591305, 961272.067714, 6706890.609855]
|
|
41018
|
+
do_not_use_default_basemap = false
|
|
41019
|
+
external_viewer_url_template = 'https://example.com/myviewer?'
|
|
41020
|
+
external_viewer_open_new_tab = true
|
|
41021
|
+
another_zoom = 15
|
|
41022
|
+
[[map_layer]]
|
|
41023
|
+
type = "wms"
|
|
41024
|
+
url = "https://www.geo2france.fr/geoserver/cr_hdf/ows"
|
|
41025
|
+
name = "masque_hdf_ign_carto_latin1"
|
|
41026
|
+
[[map_layer]]
|
|
41027
|
+
type = "wfs"
|
|
41028
|
+
url = "https://www.geo2france.fr/geoserver/cr_hdf/ows"
|
|
41029
|
+
name = "masque_hdf_ign_carto_latin1"
|
|
41030
|
+
another_layer = "wrong layer definition"
|
|
41031
|
+
|
|
41032
|
+
[theme]
|
|
41033
|
+
primary_color = "#093564"
|
|
41034
|
+
secondary_color = "#c2e9dc"
|
|
41035
|
+
main_color = "#212029" # All-purpose text color
|
|
41036
|
+
background_color = "#fdfbff"
|
|
41037
|
+
thumbnail_placeholder = 'assets/img/placeholder.svg'
|
|
41038
|
+
header_background = 'teal'
|
|
41039
|
+
header_foreground_color = "#872e2e"
|
|
41040
|
+
main_font = 'sans-serif'
|
|
41041
|
+
title_font = 'serif'
|
|
41042
|
+
another_color = 'red'
|
|
41043
|
+
`;
|
|
41044
|
+
|
|
41045
|
+
function getMapContextLayerFromConfig(config) {
|
|
41046
|
+
switch (config.TYPE) {
|
|
41047
|
+
case 'wms':
|
|
41048
|
+
return {
|
|
41049
|
+
type: 'wms',
|
|
41050
|
+
url: config.URL,
|
|
41051
|
+
name: config.NAME,
|
|
41052
|
+
};
|
|
41053
|
+
case 'wfs':
|
|
41054
|
+
return {
|
|
41055
|
+
type: 'wfs',
|
|
41056
|
+
url: config.URL,
|
|
41057
|
+
featureType: config.NAME,
|
|
41058
|
+
};
|
|
41059
|
+
case 'xyz':
|
|
41060
|
+
return {
|
|
41061
|
+
type: config.TYPE,
|
|
41062
|
+
url: config.URL,
|
|
41063
|
+
};
|
|
41064
|
+
case 'geojson':
|
|
41065
|
+
return {
|
|
41066
|
+
type: config.TYPE,
|
|
41067
|
+
...(config.DATA ? { data: config.DATA } : { url: config.URL }),
|
|
41068
|
+
};
|
|
41069
|
+
case 'maplibre-style':
|
|
41070
|
+
return {
|
|
41071
|
+
type: config.TYPE,
|
|
41072
|
+
styleUrl: config.STYLE_URL,
|
|
41073
|
+
accessToken: config.ACCESS_TOKEN,
|
|
41074
|
+
};
|
|
41075
|
+
}
|
|
41076
|
+
}
|
|
41077
|
+
|
|
40948
41078
|
const CHART_TYPE_VALUES = [
|
|
40949
41079
|
'bar',
|
|
40950
41080
|
'bar-horizontal',
|
|
@@ -40960,5 +41090,5 @@ const CHART_TYPE_VALUES = [
|
|
|
40960
41090
|
* Generated bundle index. Do not edit.
|
|
40961
41091
|
*/
|
|
40962
41092
|
|
|
40963
|
-
export { ADD_RESULTS, ADD_SEARCH, AVAILABLE_LICENSES, AbstractAction, AbstractSearchField, ActionMenuComponent, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, ApplicationBannerComponent, AuthService, AutocompleteComponent, AutofocusDirective, AvailableServicesField, AvatarComponent, AvatarServiceInterface, BASEMAP_LAYERS, BadgeComponent, BaseConverter, BaseFileReader, BaseReader, BlockListComponent, BoundingBoxSearchField, ButtonComponent, CHART_TYPE_VALUES, CLEAR_ERROR, CLEAR_RESULTS, CarouselComponent, CatalogTitleComponent, CellPopinComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ClearError, ClearResults, ColorScaleComponent, ConfirmationDialogComponent, ContactDetailsComponent, ContactDetailsFormComponent, ContactPillComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_BASEMAP_LAYER, DEFAULT_CONFIGURATION, DEFAULT_GEOCODING_PROVIDER, DEFAULT_GN4_LOGIN_URL, DEFAULT_GN4_LOGOUT_URL, DEFAULT_GN4_SETTINGS_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RECORD_CONVERTER, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DEFAULT_SPATIAL_EXTENT_STYLE, DISABLE_AUTH, DISABLE_DRAFT, DO_NOT_USE_DEFAULT_BASEMAP, DataService, DataTableComponent, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangeDropdownComponent, DateRangeInputsComponent, DateRangePickerComponent, DateRangeSearchField, DateService, DcatApConverter, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EXTERNAL_VIEWER_OPEN_NEW_TAB, EXTERNAL_VIEWER_URL_TEMPLATE, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalLinkCardComponent, ExternalViewerButtonComponent, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FILTER_SUMMARY_IGNORE_LIST, FORMATS, FacetBlockComponent, FacetItemComponent, FacetListComponent, FacetsContainerComponent, FavoriteStarComponent, FavoritesService, FeatureCatalogListComponent, FeatureDetailComponent, FeatureEditorModule, FeatureMapModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldFocusDirective, FieldsService, FigureComponent, FigureContainerComponent, FileInputComponent, FileTranslateLoader, FilesDropDirective, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldDateComponent, FormFieldFileComponent, FormFieldKeywordsComponent, FormFieldLicenseComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentsComponent, FormFieldTopicsComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GEOCODING_PROVIDER, GEONETWORK_UI_TAG_NAME, GEONETWORK_UI_VERSION, GeoDataBadgeComponent, GeoTableViewComponent, GeocodingService, GeojsonReader, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GnUiHumanizeDateDirective, GpfApiDlComponent, GravatarService, I18nInterceptor, ISO_TOPICS, ImageFallbackDirective, ImageInputComponent, ImageOverlayPreviewComponent, ImportRecordComponent, InlineFilterComponent, InteractiveTableColumnComponent, InteractiveTableComponent, InternalLinkCardComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, KeywordBadgeComponent, KindBadgeComponent, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LOGIN_URL, LOGOUT_URL, LONLAT_CRS_CODES, LanguageSwitcherComponent, LayersPanelComponent, LicenseSearchField, LinkClassifierService, LinkUsage, LoadingMaskComponent, LocationSearchComponent, LogService, MAP_FEATURE_KEY, MAP_VIEW_CONSTRAINTS, MAX_UPLOAD_SIZE_MB, METADATA_LANGUAGE, MapContainerComponent, MapFacade, MapLegendComponent, MapStateContainerComponent, MapStyleService, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataDoiComponent, MetadataInfoComponent, MetadataLinkType, MetadataMapperContext, MetadataQualityComponent, MetadataQualityItemComponent, MetadataQualityPanelComponent, ModalDialogComponent, MultilingualPanelComponent, MultilingualSearchField, MyOrgService, NAMESPACES, NOT_APPLICABLE_CONSTRAINT, NOT_KNOWN_CONSTRAINT, NotificationComponent, NotificationsContainerComponent, NotificationsService, OPEN_DATA_LICENSE, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OnlineResourceCardComponent, OnlineServiceResourceInputComponent, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OrganizationsServiceInterface, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PaginationDotsComponent, PatchResultsAggregations, PlatformServiceInterface, PopoverComponent, PopupAlertComponent, PossibleResourceTypes, PossibleResourceTypesDefinition, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_DATASET_URL_TOKEN, RECORD_REUSE_URL_TOKEN, RECORD_SERVICE_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, REUSE_LIGHT_CONFIGURATION, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, ROUTER_ROUTE_REUSE, ROUTER_ROUTE_SEARCH, ROUTER_ROUTE_SERVICE, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordKindField, RecordMetaComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordStatusValues, RecordsMetricsComponent, RecordsRepositoryInterface, RecordsService, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResourceCreationRevisionDateSearchField, ResourceTypeLegacyField, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsHitsSearchKindComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, ReusePresentationForms, RoleLabels, RoleValues, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SETTINGS_URL, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SPATIAL_SCOPES, SearchEffects, SearchFacade, SearchFeatureCatalogComponent, SearchFiltersSummaryComponent, SearchFiltersSummaryItemComponent, SearchInputComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, ServiceCapabilitiesComponent, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortByEnum, SortableListComponent, SourceLabelComponent, SourcesService, SpatialExtentComponent, SpatialExtentDropdownComponent, SpinningLoaderComponent, StacItemsResultGridComponent, StacViewComponent, StarToggleComponent, StickyHeaderComponent, SupportedTypes, SwitchToggleComponent, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEBUG_CONFIG, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslatedSearchField, TruncatedTextComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UpdateConfigAggregations, UpdateFilters, UrlInputComponent, UserFeedbackItemComponent, UserPreviewComponent, UserSearchField, VECTOR_STYLE_DEFAULT, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, XmlParseError, _reset, allChildrenElement, appConfigWithTranslationFixture, appendChildTree, appendChildren, assertValidXml, associationTypeValues, bboxToPolygon, blockModelFixture, bytesToMegabytes, canEditRecord, checkFileFormat, clearSelectedFeatures, createChild, createDocument, createElement, createFuzzyFilter, createNestedChild, createNestedElement, createSpatialExtentLayer, currentPage, defaultMapStyleFixture, defaultMapStyleHlFixture, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, emptyBlockModelFixture, findChildElement, findChildOrCreate, findChildrenElement, findConverterForDocument, findNestedChildOrCreate, findNestedElement, findNestedElements, findParent, firstChildElement, formatDate, formatUserInfo, getAddressLines, getAllKeysValidator, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryBoundingBox, getGeometryFromGeoJSON, getGlobalConfig, getIndividualDisplayName, getIsMobile, getJsonDataItemsProxy, getKeywordHierarchyPath, getLayers, getLinkId, getLinkLabel, getLinkPriority, getMapContext, getMapContextLayerFromConfig, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getNamespace, getOptionalEditorConfig, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getQualityValidators, getResourceType, getReusePresentationForm, getReuseType, getRootElement, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSelectedFeatures, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, handleScrollOnNavigation, hasRecordChangedSinceDraft, hasRecordChangedSinceDraftSuccess, initSearch, initialEditorState, initialMapState, initialState, isBoundingBox, isBoundingBoxWithinWorldExtent, isConfigLoaded, isDateRange, isFileExtensionValid, isFormatInQueryParam, isPublished, itemModelFixture, kindToCodeListValue, loadAppConfig, malformedConfigFixture, mapConfigFixture, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, matchesNoApplicableConstraint, matchesNoKnownConstraint, megabytesToBytes, mimeTypeToFormat, minimalAppConfigFixture, missingMandatoryConfigFixture, mouseWheelZoomCondition, noDuplicateFileName, okAppConfigFixture, openDataset, openRecord, organizationsServiceFactory, parse, parseXmlString, placeholder, prioritizePageScroll, propagateToDocumentOnly, provideGn4, provideI18n, provideLocalizedDateAdapter, provideRepositoryUrl, readAttribute, readDataset, readDatasetHeaders, readFileAsText, readText, reducer$2 as reducer, reducerSearch, removeAllChildren, removeChildren, removeChildrenByName, removeSearchParams, removeWhitespace, renameElements, saveRecord, saveRecordFailure, saveRecordSuccess, selectCanEditRecord, selectCurrentPage, selectEditorConfig, selectEditorState, selectFallback, selectFallbackFields, selectField, selectHasRecordChanged, selectIsPublished, selectRecord, selectRecordChangedSinceSave, selectRecordSaveError, selectRecordSaving, selectRecordSections, selectRecordSource, selectTranslatedField, selectTranslatedValue, setContext, setCurrentPage, setEditorConfiguration, setFieldVisibility, setFocusedField, setSelectedFeatures, setTextContent, sortByFromString, sortByToString, sortByToStrings, spatialExtentToGeometry, spatialExtentsToFeatureCollection, stripHtml, stripNamespace, toDate, toIndividual, toLang2, toLang3, totalPages, undoRecordDraft, unrecognizedKeysConfigFixture, updateFrequencyCodeValues, updateLanguages, updateRecordField, updateRecordLanguages, wmsLayerFlatten, writeAttribute, wrongLanguageCodeConfigFixture, xmlToString };
|
|
41093
|
+
export { ADD_RESULTS, ADD_SEARCH, AVAILABLE_LICENSES, AbstractAction, AbstractSearchField, ActionMenuComponent, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, ApplicationBannerComponent, AuthService, AutocompleteComponent, AutofocusDirective, AvailableServicesField, AvatarComponent, AvatarServiceInterface, BASEMAP_LAYERS, BadgeComponent, BaseConverter, BaseFileReader, BaseReader, BlockListComponent, BoundingBoxSearchField, ButtonComponent, CHART_TYPE_VALUES, CLEAR_ERROR, CLEAR_RESULTS, CUSTOM_FIELDS, CarouselComponent, CatalogTitleComponent, CellPopinComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ClearError, ClearResults, ColorScaleComponent, ConfirmationDialogComponent, ContactDetailsComponent, ContactDetailsFormComponent, ContactPillComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_BASEMAP_LAYER, DEFAULT_CONFIGURATION, DEFAULT_GEOCODING_PROVIDER, DEFAULT_GN4_LOGIN_URL, DEFAULT_GN4_LOGOUT_URL, DEFAULT_GN4_SETTINGS_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RECORD_CONVERTER, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DEFAULT_SPATIAL_EXTENT_STYLE, DISABLE_AUTH, DISABLE_DRAFT, DO_NOT_USE_DEFAULT_BASEMAP, DataService, DataTableComponent, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangeDropdownComponent, DateRangeInputsComponent, DateRangePickerComponent, DateRangeSearchField, DateService, DcatApConverter, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EXTERNAL_VIEWER_OPEN_NEW_TAB, EXTERNAL_VIEWER_URL_TEMPLATE, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalLinkCardComponent, ExternalViewerButtonComponent, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FILTER_SUMMARY_IGNORE_LIST, FORMATS, FacetBlockComponent, FacetItemComponent, FacetListComponent, FacetsContainerComponent, FavoriteStarComponent, FavoritesService, FeatureCatalogListComponent, FeatureDetailComponent, FeatureEditorModule, FeatureMapModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldFocusDirective, FieldsService, FigureComponent, FigureContainerComponent, FileInputComponent, FileTranslateLoader, FilesDropDirective, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldDateComponent, FormFieldFileComponent, FormFieldKeywordsComponent, FormFieldLicenseComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentsComponent, FormFieldTopicsComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GEOCODING_PROVIDER, GEOCODING_PROVIDER_LABELS, GEONETWORK_UI_TAG_NAME, GEONETWORK_UI_VERSION, GeoDataBadgeComponent, GeoTableViewComponent, GeocodingService, GeojsonReader, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GnUiHumanizeDateDirective, GpfApiDlComponent, GravatarService, I18nInterceptor, ISO_TOPICS, ImageFallbackDirective, ImageInputComponent, ImageOverlayPreviewComponent, ImportRecordComponent, InlineFilterComponent, InteractiveTableColumnComponent, InteractiveTableComponent, InternalLinkCardComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, KeywordBadgeComponent, KindBadgeComponent, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LOGIN_URL, LOGOUT_URL, LONLAT_CRS_CODES, LanguageSwitcherComponent, LayersPanelComponent, LicenseSearchField, LinkClassifierService, LinkUsage, LoadingMaskComponent, LocationSearchComponent, LogService, MAP_FEATURE_KEY, MAP_VIEW_CONSTRAINTS, MAX_UPLOAD_SIZE_MB, METADATA_LANGUAGE, MapContainerComponent, MapFacade, MapLegendComponent, MapStateContainerComponent, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataDoiComponent, MetadataInfoComponent, MetadataLinkType, MetadataMapperContext, MetadataQualityComponent, MetadataQualityItemComponent, MetadataQualityPanelComponent, ModalDialogComponent, MultilingualPanelComponent, MultilingualSearchField, MyOrgService, NAMESPACES, NOT_APPLICABLE_CONSTRAINT, NOT_KNOWN_CONSTRAINT, NotificationComponent, NotificationsContainerComponent, NotificationsService, OPEN_DATA_LICENSE, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OnlineResourceCardComponent, OnlineServiceResourceInputComponent, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OrganizationsServiceInterface, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PaginationDotsComponent, PatchResultsAggregations, PlatformServiceInterface, PopoverComponent, PopupAlertComponent, PossibleResourceTypes, PossibleResourceTypesDefinition, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_DATASET_URL_TOKEN, RECORD_REUSE_URL_TOKEN, RECORD_SERVICE_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, REUSE_LIGHT_CONFIGURATION, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, ROUTER_ROUTE_REUSE, ROUTER_ROUTE_SEARCH, ROUTER_ROUTE_SERVICE, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordKindField, RecordMetaComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordStatusValues, RecordsMetricsComponent, RecordsRepositoryInterface, RecordsService, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResourceCreationRevisionDateSearchField, ResourceTypeLegacyField, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsHitsSearchKindComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, ReusePresentationForms, RoleLabels, RoleValues, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SETTINGS_URL, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SPATIAL_EXTENT_MAX_FILE_SIZE, SPATIAL_SCOPES, SearchEffects, SearchFacade, SearchFeatureCatalogComponent, SearchFiltersSummaryComponent, SearchFiltersSummaryItemComponent, SearchInputComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, ServiceCapabilitiesComponent, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortByEnum, SortableListComponent, SourceLabelComponent, SourcesService, SpatialExtentComponent, SpatialExtentDropdownComponent, SpinningLoaderComponent, StacItemsResultGridComponent, StacViewComponent, StarToggleComponent, StickyHeaderComponent, SupportedTypes, SwitchToggleComponent, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEBUG_CONFIG, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslatedSearchField, TruncatedTextComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UpdateConfigAggregations, UpdateFilters, UrlInputComponent, UserFeedbackItemComponent, UserPreviewComponent, UserSearchField, VECTOR_STYLE_DEFAULT, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, XmlParseError, _reset, allChildrenElement, appConfigWithTranslationFixture, appendChildTree, appendChildren, assertValidXml, associationTypeValues, bboxToPolygon, blockModelFixture, bytesToMegabytes, canEditRecord, checkFileFormat, clearSelectedFeatures, createChild, createDocument, createElement, createFuzzyFilter, createNestedChild, createNestedElement, createSpatialExtentLayer, currentPage, customFilterMissingMandatoryConfigFixture, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, emptyBlockModelFixture, findChildElement, findChildOrCreate, findChildrenElement, findConverterForDocument, findNestedChildOrCreate, findNestedElement, findNestedElements, findParent, firstChildElement, formatDate, formatUserInfo, getAddressLines, getAllKeysValidator, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryBoundingBox, getGeometryFromGeoJSON, getGlobalConfig, getIndividualDisplayName, getIsMobile, getJsonDataItemsProxy, getKeywordHierarchyPath, getLayers, getLinkId, getLinkLabel, getLinkPriority, getMapContext, getMapContextLayerFromConfig, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getNamespace, getOptionalEditorConfig, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getQualityValidators, getResourceType, getReusePresentationForm, getReuseType, getRootElement, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSelectedFeatures, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, handleScrollOnNavigation, hasRecordChangedSinceDraft, hasRecordChangedSinceDraftSuccess, initSearch, initialEditorState, initialMapState, initialState, isBoundingBox, isBoundingBoxWithinWorldExtent, isConfigLoaded, isDateRange, isFileExtensionValid, isFormatInQueryParam, isPublished, itemModelFixture, kindToCodeListValue, loadAppConfig, malformedConfigFixture, mapConfigFixture, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, matchesNoApplicableConstraint, matchesNoKnownConstraint, megabytesToBytes, mimeTypeToFormat, minimalAppConfigFixture, missingMandatoryConfigFixture, mouseWheelZoomCondition, noDuplicateFileName, okAppConfigFixture, openDataset, openRecord, organizationsServiceFactory, parse, parseXmlString, placeholder, prioritizePageScroll, propagateToDocumentOnly, provideGn4, provideI18n, provideLocalizedDateAdapter, provideRepositoryUrl, readAttribute, readDataset, readDatasetHeaders, readFileAsText, readText, reducer$2 as reducer, reducerSearch, removeAllChildren, removeChildren, removeChildrenByName, removeSearchParams, removeWhitespace, renameElements, saveRecord, saveRecordFailure, saveRecordSuccess, selectCanEditRecord, selectCurrentPage, selectEditorConfig, selectEditorState, selectFallback, selectFallbackFields, selectField, selectHasRecordChanged, selectIsPublished, selectRecord, selectRecordChangedSinceSave, selectRecordSaveError, selectRecordSaving, selectRecordSections, selectRecordSource, selectTranslatedField, selectTranslatedValue, setContext, setCurrentPage, setEditorConfiguration, setFieldVisibility, setFocusedField, setSelectedFeatures, setTextContent, sortByFromString, sortByToString, sortByToStrings, spatialExtentToGeometry, spatialExtentsToFeatureCollection, stripHtml, stripNamespace, toDate, toIndividual, toLang2, toLang3, totalPages, undoRecordDraft, unrecognizedKeysConfigFixture, updateFrequencyCodeValues, updateLanguages, updateRecordField, updateRecordLanguages, wmsLayerFlatten, writeAttribute, wrongLanguageCodeConfigFixture, xmlToString };
|
|
40964
41094
|
//# sourceMappingURL=geonetwork-ui.mjs.map
|