geonetwork-ui 2.11.0-dev.1cf4ab0c6 → 2.11.0-dev.448254758
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 +1138 -1249
- package/fesm2022/geonetwork-ui.mjs.map +1 -1
- package/index.d.ts +79 -67
- package/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +40 -9
- package/src/libs/common/domain/src/lib/model/search/filter.model.ts +8 -1
- package/src/libs/feature/map/src/index.ts +0 -2
- package/src/libs/feature/map/src/lib/feature-map.module.ts +1 -8
- package/src/libs/feature/notify-reuse/src/lib/notify-reuse-form/notify-reuse-form.component.ts +8 -3
- package/src/libs/feature/search/src/index.ts +2 -0
- package/src/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.ts +8 -3
- package/src/libs/feature/{map/src/lib → search/src/lib/geocoding}/geocoding.service.ts +16 -7
- package/src/libs/feature/search/src/lib/location-search/location-search.component.html +8 -0
- package/src/libs/feature/search/src/lib/location-search/location-search.component.ts +40 -0
- package/src/libs/feature/search/src/lib/state/reducer.ts +1 -4
- package/src/libs/feature/search/src/lib/utils/service/fields.ts +25 -7
- package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +10 -1
- package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.ts +8 -0
- package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +7 -4
- package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.ts +12 -9
- package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.model.ts +2 -2
- package/src/libs/ui/inputs/src/lib/spatial-extent-dropdown/spatial-extent-dropdown.component.html +2 -2
- package/src/libs/ui/inputs/src/lib/spatial-extent-dropdown/spatial-extent-dropdown.component.ts +8 -2
- package/src/libs/ui/layout/src/lib/block-list/block-list.component.css +1 -0
- package/src/libs/util/app-config/src/lib/app-config.ts +20 -0
- package/src/libs/util/app-config/src/lib/fixtures.ts +16 -1
- package/src/libs/util/app-config/src/lib/model.ts +14 -1
- package/src/libs/util/shared/src/lib/utils/geojson.ts +16 -0
- package/translations/de.json +2 -2
- package/translations/en.json +4 -4
- package/translations/es.json +2 -2
- package/translations/fr.json +5 -5
- package/translations/it.json +2 -2
- package/translations/nl.json +2 -2
- package/translations/pt.json +2 -2
- package/translations/sk.json +2 -2
- package/src/libs/feature/map/src/lib/geocoding/geocoding.component.css +0 -0
- package/src/libs/feature/map/src/lib/geocoding/geocoding.component.html +0 -41
- package/src/libs/feature/map/src/lib/geocoding/geocoding.component.ts +0 -112
- 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
|
@@ -6,7 +6,7 @@ import GeoJSON from 'ol/format/GeoJSON.js';
|
|
|
6
6
|
import { parse as parse$1 } from 'ol/xml.js';
|
|
7
7
|
import { format } from 'date-fns/format';
|
|
8
8
|
import { Namespace, Literal, lit, parse as parse$2, sym, BlankNode, graph } from 'rdflib';
|
|
9
|
-
import { lastValueFrom, fromEvent, startWith, map as map$2, shareReplay, filter, pairwise, of, switchMap, Subject, forkJoin, combineLatest, from, exhaustMap, throwError, takeLast, firstValueFrom, merge, BehaviorSubject, timer, ReplaySubject, Subscription, first, distinctUntilChanged as distinctUntilChanged$1, animationFrameScheduler, debounceTime as debounceTime$1, Observable, buffer, tap as tap$2, combineLatestWith, take as take$1, catchError as catchError$1,
|
|
9
|
+
import { lastValueFrom, fromEvent, startWith, map as map$2, shareReplay, filter, pairwise, of, switchMap, Subject, forkJoin, combineLatest, from, exhaustMap, throwError, takeLast, firstValueFrom, merge, BehaviorSubject, timer, ReplaySubject, Subscription, first, distinctUntilChanged as distinctUntilChanged$1, animationFrameScheduler, debounceTime as debounceTime$1, Observable, buffer, tap as tap$2, combineLatestWith, take as take$1, catchError as catchError$1, EMPTY, mergeMap as mergeMap$1, withLatestFrom as withLatestFrom$1, takeUntil } from 'rxjs';
|
|
10
10
|
import * as i0 from '@angular/core';
|
|
11
11
|
import { InjectionToken, inject, Injectable, NgModule, Injector, provideAppInitializer, makeEnvironmentProviders, ElementRef, afterNextRender, booleanAttribute, Input, Directive, HostListener, Renderer2, DestroyRef, EventEmitter, Output, ViewChild, ChangeDetectionStrategy, Component, ViewEncapsulation, ChangeDetectorRef, HostBinding, ViewContainerRef, TemplateRef, ViewChildren, ContentChild, input, output, signal, viewChild, computed, ContentChildren, NgZone, ComponentFactoryResolver, viewChildren } from '@angular/core';
|
|
12
12
|
import { HttpClient, HttpHeaders, HttpParams, HTTP_INTERCEPTORS, provideHttpClient, withInterceptorsFromDi, HttpEventType } from '@angular/common/http';
|
|
@@ -26,7 +26,6 @@ import { getLength } from 'ol/sphere.js';
|
|
|
26
26
|
import { LineString } from 'ol/geom.js';
|
|
27
27
|
import * as i1 from '@ngrx/store';
|
|
28
28
|
import { createAction, props, createReducer, on, createFeatureSelector, createSelector, Store, select, StoreModule } from '@ngrx/store';
|
|
29
|
-
import { queryDataGouvFr, queryGeonames, queryGeoadmin } from '@geospatial-sdk/geocoding';
|
|
30
29
|
import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
|
|
31
30
|
import { FeaturesClickEventType, FeaturesHoverEventType, MapClickEventType, MapExtentChangeEventType, SourceLoadErrorType, computeMapContextDiff, createViewFromLayer } from '@geospatial-sdk/core';
|
|
32
31
|
import { createMapFromContext, applyContextDiffToMap, listen } from '@geospatial-sdk/openlayers';
|
|
@@ -37,11 +36,8 @@ import { createLegendFromLayer } from '@geospatial-sdk/legend';
|
|
|
37
36
|
import { mouseOnly, noModifierKeys, primaryAction, platformModifierKeyOnly } from 'ol/events/condition.js';
|
|
38
37
|
import { defaults, DragPan, MouseWheelZoom } from 'ol/interaction.js';
|
|
39
38
|
import { extend } from 'ol/extent.js';
|
|
40
|
-
import * as TOML from '@ltd/j-toml';
|
|
41
|
-
import { Style, Stroke, Fill, Circle } from 'ol/style.js';
|
|
42
|
-
import CircleStyle from 'ol/style/Circle.js';
|
|
43
39
|
import EmblaCarousel from 'embla-carousel';
|
|
44
|
-
import { iconoirNavArrowLeft, iconoirNavArrowRight, iconoirLongArrowDownLeft, iconoirSearch, iconoirCalendar, iconoirArrowUp, iconoirLink, iconoirFramePlusIn, iconoirCloudUpload, iconoirTrash, iconoirSquareDashed,
|
|
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';
|
|
45
41
|
import { MatButtonModule } from '@angular/material/button';
|
|
46
42
|
import * as i1$7 from '@angular/cdk/overlay';
|
|
47
43
|
import { ScrollStrategyOptions, OverlayModule, CdkConnectedOverlay, ScrollDispatcher, Overlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
|
|
@@ -74,6 +70,7 @@ import { MatTabsModule } from '@angular/material/tabs';
|
|
|
74
70
|
import * as i2$2 from '@ngrx/effects';
|
|
75
71
|
import { Actions, createEffect, ofType, EffectsModule } from '@ngrx/effects';
|
|
76
72
|
import { valid as valid$1 } from 'geojson-validation';
|
|
73
|
+
import { queryGeoplateforme, queryGeonames, queryGeoadmin } from '@geospatial-sdk/geocoding';
|
|
77
74
|
import { TemplatePortal } from '@angular/cdk/portal';
|
|
78
75
|
import { parse as parse$3 } from 'marked';
|
|
79
76
|
import * as i2$3 from '@angular/cdk/scrolling';
|
|
@@ -101,6 +98,7 @@ import { TextFieldModule } from '@angular/cdk/text-field';
|
|
|
101
98
|
import * as i2$5 from '@ngrx/router-store';
|
|
102
99
|
import { getRouterSelectors, routerReducer, StoreRouterConnectingModule, FullRouterStateSerializer } from '@ngrx/router-store';
|
|
103
100
|
import { navigation } from '@ngrx/router-store/data-persistence';
|
|
101
|
+
import * as TOML from '@ltd/j-toml';
|
|
104
102
|
|
|
105
103
|
class MetadataMapperContext {
|
|
106
104
|
}
|
|
@@ -19596,6 +19594,19 @@ function isBoundingBox(value) {
|
|
|
19596
19594
|
value.length === 4 &&
|
|
19597
19595
|
value.every((item) => typeof item === 'number'));
|
|
19598
19596
|
}
|
|
19597
|
+
/**
|
|
19598
|
+
* Checks that a bounding box's coordinates stay within the valid
|
|
19599
|
+
* longitude (-180/180) and latitude (-90/90) ranges.
|
|
19600
|
+
*/
|
|
19601
|
+
function isBoundingBoxWithinWorldExtent(bbox) {
|
|
19602
|
+
const [minX, minY, maxX, maxY] = bbox;
|
|
19603
|
+
return (minX >= -180 &&
|
|
19604
|
+
maxX <= 180 &&
|
|
19605
|
+
minY >= -90 &&
|
|
19606
|
+
maxY <= 90 &&
|
|
19607
|
+
minX <= maxX &&
|
|
19608
|
+
minY <= maxY);
|
|
19609
|
+
}
|
|
19599
19610
|
function getGeometryBoundingBox(geometry) {
|
|
19600
19611
|
// use the bounding box if specified in the GeoJSON object
|
|
19601
19612
|
if (geometry.bbox) {
|
|
@@ -20439,7 +20450,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
20439
20450
|
}] } });
|
|
20440
20451
|
|
|
20441
20452
|
var name = "geonetwork-ui";
|
|
20442
|
-
var version = "2.11.0-dev.
|
|
20453
|
+
var version = "2.11.0-dev.448254758";
|
|
20443
20454
|
var engines = {
|
|
20444
20455
|
node: ">=24"
|
|
20445
20456
|
};
|
|
@@ -20869,6 +20880,42 @@ class ElasticsearchService {
|
|
|
20869
20880
|
}
|
|
20870
20881
|
return Object.values(filters).find(isBoundingBox);
|
|
20871
20882
|
}
|
|
20883
|
+
// if a field registered min/max runtime fields, its dates form an interval
|
|
20884
|
+
// the record matches if that interval intersects the filter range
|
|
20885
|
+
buildDateRangeQuery(searchField, dateRange) {
|
|
20886
|
+
const minField = `${searchField}Min`;
|
|
20887
|
+
const maxField = `${searchField}Max`;
|
|
20888
|
+
if (minField in this.runtimeFields && maxField in this.runtimeFields) {
|
|
20889
|
+
const filter = [
|
|
20890
|
+
dateRange.start && {
|
|
20891
|
+
range: {
|
|
20892
|
+
[maxField]: {
|
|
20893
|
+
gte: formatDate(dateRange.start),
|
|
20894
|
+
format: 'yyyy-MM-dd',
|
|
20895
|
+
},
|
|
20896
|
+
},
|
|
20897
|
+
},
|
|
20898
|
+
dateRange.end && {
|
|
20899
|
+
range: {
|
|
20900
|
+
[minField]: {
|
|
20901
|
+
lte: formatDate(dateRange.end),
|
|
20902
|
+
format: 'yyyy-MM-dd',
|
|
20903
|
+
},
|
|
20904
|
+
},
|
|
20905
|
+
},
|
|
20906
|
+
].filter(Boolean);
|
|
20907
|
+
return { bool: { filter } };
|
|
20908
|
+
}
|
|
20909
|
+
return {
|
|
20910
|
+
range: {
|
|
20911
|
+
[searchField]: {
|
|
20912
|
+
...(dateRange.start && { gte: formatDate(dateRange.start) }),
|
|
20913
|
+
...(dateRange.end && { lte: formatDate(dateRange.end) }),
|
|
20914
|
+
format: 'yyyy-MM-dd',
|
|
20915
|
+
},
|
|
20916
|
+
},
|
|
20917
|
+
};
|
|
20918
|
+
}
|
|
20872
20919
|
filtersToQuery(filters, spatialFilterExtent = this.findSpatialFilterExtent(filters)) {
|
|
20873
20920
|
const addQuote = (key) => (/^\/.+\/$/.test(key) ? key : `"${key}"`);
|
|
20874
20921
|
const makeQuery = (filter) => {
|
|
@@ -20905,15 +20952,7 @@ class ElasticsearchService {
|
|
|
20905
20952
|
query: queryString,
|
|
20906
20953
|
},
|
|
20907
20954
|
},
|
|
20908
|
-
...queryRanges.map(([searchField, dateRange]) => (
|
|
20909
|
-
range: {
|
|
20910
|
-
[searchField]: {
|
|
20911
|
-
...(dateRange.start && { gte: formatDate(dateRange.start) }),
|
|
20912
|
-
...(dateRange.end && { lte: formatDate(dateRange.end) }),
|
|
20913
|
-
format: 'yyyy-MM-dd',
|
|
20914
|
-
},
|
|
20915
|
-
},
|
|
20916
|
-
})),
|
|
20955
|
+
...queryRanges.map(([searchField, dateRange]) => this.buildDateRangeQuery(searchField, dateRange)),
|
|
20917
20956
|
spatialFilterExtent && {
|
|
20918
20957
|
geo_shape: {
|
|
20919
20958
|
geom: {
|
|
@@ -22587,48 +22626,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
22587
22626
|
type: Injectable
|
|
22588
22627
|
}] });
|
|
22589
22628
|
|
|
22590
|
-
const GEOCODING_PROVIDER = new InjectionToken('geocoding-provider');
|
|
22591
|
-
class GeocodingService {
|
|
22592
|
-
constructor() {
|
|
22593
|
-
this.provider = inject(GEOCODING_PROVIDER);
|
|
22594
|
-
}
|
|
22595
|
-
query(text) {
|
|
22596
|
-
let queryObservable;
|
|
22597
|
-
switch (this.provider[0]) {
|
|
22598
|
-
case 'geoadmin':
|
|
22599
|
-
queryObservable = from(queryGeoadmin(text, this.provider[1]));
|
|
22600
|
-
break;
|
|
22601
|
-
case 'geonames':
|
|
22602
|
-
queryObservable = from(queryGeonames(text, this.provider[1]));
|
|
22603
|
-
break;
|
|
22604
|
-
case 'data-gouv-fr':
|
|
22605
|
-
queryObservable = from(queryDataGouvFr(text, this.provider[1]));
|
|
22606
|
-
break;
|
|
22607
|
-
default:
|
|
22608
|
-
return throwError(() => new Error(`Unsupported geocoding provider: ${this.provider[0]}`));
|
|
22609
|
-
}
|
|
22610
|
-
return queryObservable.pipe(catchError((error) => throwError(error)));
|
|
22611
|
-
}
|
|
22612
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: GeocodingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
22613
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: GeocodingService, providedIn: 'root' }); }
|
|
22614
|
-
}
|
|
22615
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: GeocodingService, decorators: [{
|
|
22616
|
-
type: Injectable,
|
|
22617
|
-
args: [{
|
|
22618
|
-
providedIn: 'root',
|
|
22619
|
-
}]
|
|
22620
|
-
}] });
|
|
22621
|
-
|
|
22622
22629
|
class FeatureMapModule {
|
|
22623
22630
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: FeatureMapModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
22624
22631
|
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.19", ngImport: i0, type: FeatureMapModule, imports: [i1.StoreFeatureModule] }); }
|
|
22625
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: FeatureMapModule, providers: [
|
|
22626
|
-
MapFacade,
|
|
22627
|
-
{
|
|
22628
|
-
provide: GEOCODING_PROVIDER,
|
|
22629
|
-
useValue: ['geonames', { maxRows: 5 }],
|
|
22630
|
-
},
|
|
22631
|
-
], imports: [StoreModule.forFeature(MAP_FEATURE_KEY, mapReducer)] }); }
|
|
22632
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: FeatureMapModule, providers: [MapFacade], imports: [StoreModule.forFeature(MAP_FEATURE_KEY, mapReducer)] }); }
|
|
22632
22633
|
}
|
|
22633
22634
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: FeatureMapModule, decorators: [{
|
|
22634
22635
|
type: NgModule,
|
|
@@ -22636,13 +22637,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
22636
22637
|
imports: [
|
|
22637
22638
|
StoreModule.forFeature(MAP_FEATURE_KEY, mapReducer),
|
|
22638
22639
|
],
|
|
22639
|
-
providers: [
|
|
22640
|
-
MapFacade,
|
|
22641
|
-
{
|
|
22642
|
-
provide: GEOCODING_PROVIDER,
|
|
22643
|
-
useValue: ['geonames', { maxRows: 5 }],
|
|
22644
|
-
},
|
|
22645
|
-
],
|
|
22640
|
+
providers: [MapFacade],
|
|
22646
22641
|
}]
|
|
22647
22642
|
}] });
|
|
22648
22643
|
|
|
@@ -23085,1117 +23080,409 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
23085
23080
|
}]
|
|
23086
23081
|
}] });
|
|
23087
23082
|
|
|
23088
|
-
|
|
23089
|
-
|
|
23090
|
-
|
|
23091
|
-
|
|
23092
|
-
|
|
23083
|
+
class AnchorLinkDirective {
|
|
23084
|
+
constructor() {
|
|
23085
|
+
this.changeDetector = inject(ChangeDetectorRef);
|
|
23086
|
+
this.disabled = false;
|
|
23087
|
+
this.observer = new MutationObserver(() => {
|
|
23088
|
+
this.refreshDisabledState();
|
|
23089
|
+
});
|
|
23090
|
+
this.inView = false;
|
|
23091
|
+
this.initialized = false;
|
|
23093
23092
|
}
|
|
23094
|
-
|
|
23095
|
-
|
|
23096
|
-
|
|
23097
|
-
|
|
23098
|
-
|
|
23093
|
+
get elementClass() {
|
|
23094
|
+
if (this.disabled) {
|
|
23095
|
+
return this.disabledClass;
|
|
23096
|
+
}
|
|
23097
|
+
if (this.inView) {
|
|
23098
|
+
return `${this.inViewClass} ${this.enabledClass}`;
|
|
23099
|
+
}
|
|
23100
|
+
else {
|
|
23101
|
+
return `${this.outOfViewClass} ${this.enabledClass}`;
|
|
23102
|
+
}
|
|
23099
23103
|
}
|
|
23100
|
-
|
|
23101
|
-
|
|
23104
|
+
ngOnInit() {
|
|
23105
|
+
this.observer.observe(document.body, {
|
|
23106
|
+
childList: true,
|
|
23107
|
+
subtree: true,
|
|
23108
|
+
});
|
|
23109
|
+
this.refreshDisabledState();
|
|
23102
23110
|
}
|
|
23103
|
-
|
|
23104
|
-
|
|
23105
|
-
|
|
23106
|
-
|
|
23107
|
-
|
|
23108
|
-
|
|
23109
|
-
|
|
23110
|
-
|
|
23111
|
-
};
|
|
23112
|
-
};
|
|
23113
|
-
/**
|
|
23114
|
-
* Only keeps recognized keys, flatten nested values (to allow having "." in keys),
|
|
23115
|
-
* pushes warnings and errors to the given arrays; returns null in case of error
|
|
23116
|
-
*/
|
|
23117
|
-
function parseConfigSection(fullConfigObj, sectionName, mandatoryKeys, optionalKeys, outWarnings, outErrors) {
|
|
23118
|
-
if (typeof fullConfigObj[sectionName] !== 'object') {
|
|
23119
|
-
if (mandatoryKeys.length === 0)
|
|
23120
|
-
return null;
|
|
23121
|
-
outErrors.push(`The [${sectionName}] mandatory section is missing.`);
|
|
23122
|
-
return null;
|
|
23111
|
+
ngAfterViewChecked() {
|
|
23112
|
+
if (!this.initialized && !this.disabled) {
|
|
23113
|
+
const target = document.getElementById(this.targetId);
|
|
23114
|
+
if (target) {
|
|
23115
|
+
this.initializeIntersectionObserver(target);
|
|
23116
|
+
this.initialized = true;
|
|
23117
|
+
}
|
|
23118
|
+
}
|
|
23123
23119
|
}
|
|
23124
|
-
|
|
23125
|
-
|
|
23126
|
-
|
|
23127
|
-
|
|
23128
|
-
|
|
23129
|
-
|
|
23120
|
+
initializeIntersectionObserver(target) {
|
|
23121
|
+
this.intersectionObserver = new IntersectionObserver((entries) => {
|
|
23122
|
+
entries.forEach((entry) => {
|
|
23123
|
+
this.inView = entry.isIntersecting;
|
|
23124
|
+
this.changeDetector.detectChanges();
|
|
23125
|
+
});
|
|
23126
|
+
}, {
|
|
23127
|
+
root: null,
|
|
23128
|
+
rootMargin: '-30% 0% -60% 0%',
|
|
23129
|
+
});
|
|
23130
|
+
this.intersectionObserver.observe(target);
|
|
23130
23131
|
}
|
|
23131
|
-
|
|
23132
|
-
|
|
23133
|
-
|
|
23132
|
+
ngOnDestroy() {
|
|
23133
|
+
this.observer.disconnect();
|
|
23134
|
+
if (this.intersectionObserver) {
|
|
23135
|
+
this.intersectionObserver.disconnect();
|
|
23136
|
+
}
|
|
23134
23137
|
}
|
|
23135
|
-
|
|
23138
|
+
refreshDisabledState() {
|
|
23139
|
+
const targetNotPresent = !document.getElementById(this.targetId);
|
|
23140
|
+
if (targetNotPresent !== this.disabled) {
|
|
23141
|
+
this.disabled = targetNotPresent;
|
|
23142
|
+
this.changeDetector.detectChanges();
|
|
23143
|
+
}
|
|
23144
|
+
}
|
|
23145
|
+
scrollToTarget() {
|
|
23146
|
+
const target = document.getElementById(this.targetId);
|
|
23147
|
+
if (!target)
|
|
23148
|
+
return;
|
|
23149
|
+
target.scrollIntoView({
|
|
23150
|
+
behavior: 'smooth',
|
|
23151
|
+
block: 'start',
|
|
23152
|
+
});
|
|
23153
|
+
}
|
|
23154
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: AnchorLinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
23155
|
+
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 }); }
|
|
23136
23156
|
}
|
|
23137
|
-
|
|
23138
|
-
|
|
23139
|
-
|
|
23140
|
-
|
|
23141
|
-
|
|
23142
|
-
|
|
23143
|
-
|
|
23144
|
-
|
|
23157
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: AnchorLinkDirective, decorators: [{
|
|
23158
|
+
type: Directive,
|
|
23159
|
+
args: [{
|
|
23160
|
+
selector: '[gnUiAnchorLink]',
|
|
23161
|
+
standalone: true,
|
|
23162
|
+
}]
|
|
23163
|
+
}], propDecorators: { targetId: [{
|
|
23164
|
+
type: Input,
|
|
23165
|
+
args: ['gnUiAnchorLink']
|
|
23166
|
+
}], disabledClass: [{
|
|
23167
|
+
type: Input,
|
|
23168
|
+
args: ['gnUiAnchorLinkDisabledClass']
|
|
23169
|
+
}], enabledClass: [{
|
|
23170
|
+
type: Input,
|
|
23171
|
+
args: ['gnUiAnchorLinkEnabledClass']
|
|
23172
|
+
}], inViewClass: [{
|
|
23173
|
+
type: Input,
|
|
23174
|
+
args: ['gnUiAnchorLinkInViewClass']
|
|
23175
|
+
}], outOfViewClass: [{
|
|
23176
|
+
type: Input,
|
|
23177
|
+
args: ['gnUiAnchorLinkOutOfViewClass']
|
|
23178
|
+
}], elementClass: [{
|
|
23179
|
+
type: HostBinding,
|
|
23180
|
+
args: ['class']
|
|
23181
|
+
}], scrollToTarget: [{
|
|
23182
|
+
type: HostListener,
|
|
23183
|
+
args: ['click']
|
|
23184
|
+
}] } });
|
|
23185
|
+
|
|
23186
|
+
class PaginationDotsComponent {
|
|
23187
|
+
constructor() {
|
|
23188
|
+
this.containerClass = '';
|
|
23145
23189
|
}
|
|
23146
|
-
|
|
23190
|
+
// 1-based
|
|
23191
|
+
get steps() {
|
|
23192
|
+
return Array.from({ length: this.listComponent.pagesCount }, (_, i) => i + 1);
|
|
23193
|
+
}
|
|
23194
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PaginationDotsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23195
|
+
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: [
|
|
23196
|
+
provideIcons({
|
|
23197
|
+
iconoirNavArrowRight,
|
|
23198
|
+
iconoirNavArrowLeft,
|
|
23199
|
+
}),
|
|
23200
|
+
] }); }
|
|
23147
23201
|
}
|
|
23148
|
-
|
|
23149
|
-
|
|
23150
|
-
|
|
23151
|
-
|
|
23152
|
-
|
|
23153
|
-
|
|
23154
|
-
|
|
23155
|
-
|
|
23156
|
-
|
|
23202
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PaginationDotsComponent, decorators: [{
|
|
23203
|
+
type: Component,
|
|
23204
|
+
args: [{ selector: 'gn-ui-pagination-dots', standalone: true, imports: [CommonModule], viewProviders: [
|
|
23205
|
+
provideIcons({
|
|
23206
|
+
iconoirNavArrowRight,
|
|
23207
|
+
iconoirNavArrowLeft,
|
|
23208
|
+
}),
|
|
23209
|
+
], 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"] }]
|
|
23210
|
+
}], propDecorators: { listComponent: [{
|
|
23211
|
+
type: Input
|
|
23212
|
+
}], containerClass: [{
|
|
23213
|
+
type: Input
|
|
23214
|
+
}] } });
|
|
23215
|
+
|
|
23216
|
+
class CarouselComponent {
|
|
23217
|
+
constructor() {
|
|
23218
|
+
this.changeDetector = inject(ChangeDetectorRef);
|
|
23219
|
+
this.containerClass = '';
|
|
23220
|
+
this.stepsContainerClass = 'w-full bottom-0 top-auto';
|
|
23221
|
+
this.currentStepChange = new EventEmitter();
|
|
23222
|
+
this.steps = [];
|
|
23223
|
+
this.currentStep = 0;
|
|
23224
|
+
this.refreshSteps = () => {
|
|
23225
|
+
this.steps = this.emblaApi.scrollSnapList();
|
|
23226
|
+
this.currentStep = this.emblaApi.selectedScrollSnap();
|
|
23227
|
+
this.currentStepChange.emit(this.currentStep);
|
|
23228
|
+
this.changeDetector.detectChanges();
|
|
23229
|
+
};
|
|
23157
23230
|
}
|
|
23158
|
-
|
|
23159
|
-
|
|
23160
|
-
return
|
|
23231
|
+
// Paginable API
|
|
23232
|
+
get isFirstPage() {
|
|
23233
|
+
return this.currentStep === 0;
|
|
23161
23234
|
}
|
|
23162
|
-
|
|
23163
|
-
|
|
23164
|
-
return null;
|
|
23235
|
+
get isLastPage() {
|
|
23236
|
+
return this.currentStep === this.steps.length - 1;
|
|
23165
23237
|
}
|
|
23166
|
-
|
|
23167
|
-
|
|
23168
|
-
function checkMetadataLanguage(parsedConfigSection, outWarnings) {
|
|
23169
|
-
const lang2 = toLang2(parsedConfigSection.metadata_language.toLowerCase());
|
|
23170
|
-
if (lang2?.length !== 2) {
|
|
23171
|
-
outWarnings.push(`In the [global] section: metadata_language = "${parsedConfigSection.metadata_language}" is not a recognized ISO 639 language code`);
|
|
23238
|
+
get currentPage() {
|
|
23239
|
+
return this.currentStep + 1; // this is 1-based
|
|
23172
23240
|
}
|
|
23173
|
-
|
|
23174
|
-
|
|
23175
|
-
function checkNewRecordDefaultLanguage(parsedConfigSection, outWarnings) {
|
|
23176
|
-
const lang2 = toLang2(parsedConfigSection.new_record_default_language.toLowerCase());
|
|
23177
|
-
if (!(lang2 in LANG_2_TO_3_MAPPER)) {
|
|
23178
|
-
outWarnings.push(`In the [editing] section: new_record_default_language = "${parsedConfigSection.new_record_default_language}" is not a recognized ISO 639 language code`);
|
|
23179
|
-
return {
|
|
23180
|
-
...parsedConfigSection,
|
|
23181
|
-
new_record_default_language: undefined,
|
|
23182
|
-
};
|
|
23241
|
+
get pagesCount() {
|
|
23242
|
+
return this.steps.length;
|
|
23183
23243
|
}
|
|
23184
|
-
|
|
23185
|
-
|
|
23186
|
-
new_record_default_language: lang2,
|
|
23187
|
-
};
|
|
23188
|
-
}
|
|
23189
|
-
function checkNewRecordStandard(parsedConfigSection, outWarnings) {
|
|
23190
|
-
const standard = parsedConfigSection.new_record_standard;
|
|
23191
|
-
const normalizedStandard = typeof standard === 'string' ? standard.trim().toLowerCase() : null;
|
|
23192
|
-
if (normalizedStandard === 'iso19139' ||
|
|
23193
|
-
normalizedStandard === 'iso19115-3') {
|
|
23194
|
-
return {
|
|
23195
|
-
...parsedConfigSection,
|
|
23196
|
-
new_record_standard: normalizedStandard,
|
|
23197
|
-
};
|
|
23244
|
+
goToPage(stepIndex) {
|
|
23245
|
+
this.emblaApi.scrollTo(stepIndex - 1); // this is 0-based
|
|
23198
23246
|
}
|
|
23199
|
-
|
|
23200
|
-
|
|
23201
|
-
|
|
23202
|
-
|
|
23203
|
-
}
|
|
23247
|
+
goToPrevPage() {
|
|
23248
|
+
if (this.isFirstPage)
|
|
23249
|
+
return;
|
|
23250
|
+
this.emblaApi.scrollPrev();
|
|
23251
|
+
}
|
|
23252
|
+
goToNextPage() {
|
|
23253
|
+
if (this.isLastPage)
|
|
23254
|
+
return;
|
|
23255
|
+
this.emblaApi.scrollNext();
|
|
23256
|
+
}
|
|
23257
|
+
ngAfterViewInit() {
|
|
23258
|
+
this.emblaApi = EmblaCarousel(this.carouselOverflowContainer.nativeElement, {
|
|
23259
|
+
duration: 15,
|
|
23260
|
+
});
|
|
23261
|
+
this.emblaApi
|
|
23262
|
+
.on('init', this.refreshSteps)
|
|
23263
|
+
.on('reInit', this.refreshSteps)
|
|
23264
|
+
.on('select', this.refreshSteps);
|
|
23265
|
+
}
|
|
23266
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: CarouselComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23267
|
+
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 }); }
|
|
23204
23268
|
}
|
|
23269
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: CarouselComponent, decorators: [{
|
|
23270
|
+
type: Component,
|
|
23271
|
+
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"] }]
|
|
23272
|
+
}], propDecorators: { carouselOverflowContainer: [{
|
|
23273
|
+
type: ViewChild,
|
|
23274
|
+
args: ['carouselOverflowContainer']
|
|
23275
|
+
}], containerClass: [{
|
|
23276
|
+
type: Input
|
|
23277
|
+
}], stepsContainerClass: [{
|
|
23278
|
+
type: Input
|
|
23279
|
+
}], currentStepChange: [{
|
|
23280
|
+
type: Output
|
|
23281
|
+
}] } });
|
|
23205
23282
|
|
|
23206
|
-
|
|
23207
|
-
|
|
23208
|
-
|
|
23209
|
-
|
|
23210
|
-
|
|
23211
|
-
|
|
23212
|
-
|
|
23213
|
-
|
|
23214
|
-
|
|
23215
|
-
|
|
23216
|
-
|
|
23217
|
-
|
|
23283
|
+
class ProgressBarComponent {
|
|
23284
|
+
constructor() {
|
|
23285
|
+
this.value = 0;
|
|
23286
|
+
this.type = 'default';
|
|
23287
|
+
}
|
|
23288
|
+
get progress() {
|
|
23289
|
+
return this.value > 0 ? (this.value < 100 ? this.value : 100) : 0;
|
|
23290
|
+
}
|
|
23291
|
+
get color() {
|
|
23292
|
+
switch (this.type) {
|
|
23293
|
+
case 'default':
|
|
23294
|
+
return {
|
|
23295
|
+
outerBar: 'bg-gray-200',
|
|
23296
|
+
innerBar: 'bg-gray-100',
|
|
23297
|
+
text: 'text-gray-900',
|
|
23298
|
+
};
|
|
23299
|
+
case 'primary':
|
|
23300
|
+
return {
|
|
23301
|
+
outerBar: 'bg-primary',
|
|
23302
|
+
innerBar: 'bg-primary-lighter',
|
|
23303
|
+
text: 'text-white',
|
|
23304
|
+
};
|
|
23305
|
+
case 'secondary':
|
|
23306
|
+
return {
|
|
23307
|
+
outerBar: 'bg-secondary',
|
|
23308
|
+
innerBar: 'bg-secondary-lighter',
|
|
23309
|
+
text: 'text-white',
|
|
23310
|
+
};
|
|
23311
|
+
case 'light':
|
|
23312
|
+
return {
|
|
23313
|
+
outerBar: 'bg-primary-white',
|
|
23314
|
+
innerBar: 'bg-primary',
|
|
23315
|
+
text: 'text-main',
|
|
23316
|
+
};
|
|
23317
|
+
}
|
|
23218
23318
|
}
|
|
23319
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23320
|
+
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"] }); }
|
|
23219
23321
|
}
|
|
23322
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ProgressBarComponent, decorators: [{
|
|
23323
|
+
type: Component,
|
|
23324
|
+
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"] }]
|
|
23325
|
+
}], propDecorators: { value: [{
|
|
23326
|
+
type: Input
|
|
23327
|
+
}], type: [{
|
|
23328
|
+
type: Input
|
|
23329
|
+
}] } });
|
|
23220
23330
|
|
|
23221
|
-
|
|
23222
|
-
|
|
23223
|
-
|
|
23224
|
-
|
|
23225
|
-
|
|
23226
|
-
|
|
23227
|
-
|
|
23228
|
-
|
|
23229
|
-
|
|
23230
|
-
}
|
|
23231
|
-
|
|
23232
|
-
|
|
23233
|
-
|
|
23234
|
-
|
|
23235
|
-
|
|
23236
|
-
}
|
|
23237
|
-
|
|
23238
|
-
|
|
23239
|
-
|
|
23240
|
-
}
|
|
23241
|
-
|
|
23242
|
-
|
|
23243
|
-
|
|
23244
|
-
|
|
23245
|
-
|
|
23246
|
-
function getOptionalEditorConfig() {
|
|
23247
|
-
return editorConfig;
|
|
23248
|
-
}
|
|
23249
|
-
let metadataQualityConfig = null;
|
|
23250
|
-
function getMetadataQualityConfig() {
|
|
23251
|
-
return (metadataQualityConfig ||
|
|
23252
|
-
{
|
|
23253
|
-
ENABLED: false,
|
|
23331
|
+
class PopoverComponent {
|
|
23332
|
+
constructor() {
|
|
23333
|
+
this.viewContainerRef = inject(ViewContainerRef);
|
|
23334
|
+
this.renderer = inject(Renderer2);
|
|
23335
|
+
}
|
|
23336
|
+
getContent() {
|
|
23337
|
+
if (this.content instanceof TemplateRef) {
|
|
23338
|
+
if (this.view) {
|
|
23339
|
+
this.view.destroy();
|
|
23340
|
+
}
|
|
23341
|
+
this.view = this.viewContainerRef.createEmbeddedView(this.content);
|
|
23342
|
+
this.view.detectChanges();
|
|
23343
|
+
const wrapper = this.renderer.createElement('div'); // Create a wrapper div
|
|
23344
|
+
this.view.rootNodes.forEach((node) => {
|
|
23345
|
+
this.renderer.appendChild(wrapper, node); // Append each root node to the wrapper
|
|
23346
|
+
});
|
|
23347
|
+
return wrapper;
|
|
23348
|
+
}
|
|
23349
|
+
return this.content;
|
|
23350
|
+
}
|
|
23351
|
+
ngAfterViewInit() {
|
|
23352
|
+
this.tippyInstance = tippy(this.popoverContent.nativeElement, {
|
|
23353
|
+
content: this.getContent(),
|
|
23354
|
+
allowHTML: true,
|
|
23355
|
+
theme: this.theme,
|
|
23254
23356
|
});
|
|
23255
|
-
}
|
|
23256
|
-
|
|
23257
|
-
|
|
23258
|
-
|
|
23259
|
-
|
|
23260
|
-
|
|
23261
|
-
}
|
|
23262
|
-
let appConfigLoaded = false;
|
|
23263
|
-
function loadAppConfig(configUrl = 'assets/configuration/default.toml') {
|
|
23264
|
-
console.log(`[geonetwork-ui] Loading application configuration from ${configUrl}`);
|
|
23265
|
-
return fetch(configUrl)
|
|
23266
|
-
.then((resp) => {
|
|
23267
|
-
if (!resp.ok)
|
|
23268
|
-
throw new Error('Configuration file could not be loaded');
|
|
23269
|
-
return resp.text();
|
|
23270
|
-
})
|
|
23271
|
-
.then((conf) => {
|
|
23272
|
-
let parsed;
|
|
23273
|
-
try {
|
|
23274
|
-
parsed = TOML.parse(conf, { joiner: '\n', bigint: false });
|
|
23357
|
+
}
|
|
23358
|
+
ngOnChanges(changes) {
|
|
23359
|
+
if (changes['theme']) {
|
|
23360
|
+
this.theme = changes['theme'].currentValue;
|
|
23361
|
+
if (this.tippyInstance) {
|
|
23362
|
+
this.tippyInstance.setProps({ theme: this.theme });
|
|
23363
|
+
}
|
|
23275
23364
|
}
|
|
23276
|
-
|
|
23277
|
-
|
|
23365
|
+
if (changes['content']) {
|
|
23366
|
+
this.content = changes['content'].currentValue;
|
|
23367
|
+
if (this.tippyInstance) {
|
|
23368
|
+
this.tippyInstance.setContent(this.getContent());
|
|
23369
|
+
}
|
|
23278
23370
|
}
|
|
23279
|
-
|
|
23280
|
-
|
|
23281
|
-
|
|
23282
|
-
|
|
23283
|
-
'edit_url_template',
|
|
23284
|
-
'proxy_path',
|
|
23285
|
-
'metadata_language',
|
|
23286
|
-
'login_url',
|
|
23287
|
-
'logout_url',
|
|
23288
|
-
'settings_url',
|
|
23289
|
-
'web_component_embedder_url',
|
|
23290
|
-
'languages',
|
|
23291
|
-
'contact_email',
|
|
23292
|
-
'reuse_form_url',
|
|
23293
|
-
], warnings, errors);
|
|
23294
|
-
if (parsedGlobalSection?.metadata_language) {
|
|
23295
|
-
parsedGlobalSection = checkMetadataLanguage(parsedGlobalSection, warnings);
|
|
23371
|
+
}
|
|
23372
|
+
ngOnDestroy() {
|
|
23373
|
+
if (this.tippyInstance) {
|
|
23374
|
+
this.tippyInstance.destroy();
|
|
23296
23375
|
}
|
|
23297
|
-
|
|
23298
|
-
|
|
23299
|
-
? null
|
|
23300
|
-
: {
|
|
23301
|
-
GN4_API_URL: parsedGlobalSection.geonetwork4_api_url,
|
|
23302
|
-
DATAHUB_URL: parsedGlobalSection.datahub_url,
|
|
23303
|
-
EDIT_URL_TEMPLATE: parsedGlobalSection.edit_url_template,
|
|
23304
|
-
PROXY_PATH: parsedGlobalSection.proxy_path,
|
|
23305
|
-
METADATA_LANGUAGE: parsedGlobalSection.metadata_language
|
|
23306
|
-
? parsedGlobalSection.metadata_language.toLowerCase()
|
|
23307
|
-
: undefined,
|
|
23308
|
-
LOGIN_URL: parsedGlobalSection.login_url,
|
|
23309
|
-
LOGOUT_URL: parsedGlobalSection.logout_url,
|
|
23310
|
-
SETTINGS_URL: parsedGlobalSection.settings_url,
|
|
23311
|
-
WEB_COMPONENT_EMBEDDER_URL: parsedGlobalSection.web_component_embedder_url,
|
|
23312
|
-
LANGUAGES: parsedGlobalSection.languages,
|
|
23313
|
-
CONTACT_EMAIL: parsedGlobalSection.contact_email,
|
|
23314
|
-
REUSE_FORM_URL: parsedGlobalSection.reuse_form_url,
|
|
23315
|
-
};
|
|
23316
|
-
const parsedLayersSections = parseMultiConfigSection(parsed, 'map_layer', ['type'], ['name', 'url', 'data', 'styleUrl', 'accessToken'], warnings, errors);
|
|
23317
|
-
const parsedMapSection = parseConfigSection(parsed, 'map', [], [
|
|
23318
|
-
'max_zoom',
|
|
23319
|
-
'do_not_tile_wms',
|
|
23320
|
-
'max_extent',
|
|
23321
|
-
'max_feature_count',
|
|
23322
|
-
'baselayer',
|
|
23323
|
-
'do_not_use_default_basemap',
|
|
23324
|
-
'external_viewer_url_template',
|
|
23325
|
-
'external_viewer_open_new_tab',
|
|
23326
|
-
], warnings, errors);
|
|
23327
|
-
mapConfig =
|
|
23328
|
-
parsedMapSection === null || parsedLayersSections === null
|
|
23329
|
-
? null
|
|
23330
|
-
: {
|
|
23331
|
-
MAX_ZOOM: parsedMapSection.max_zoom,
|
|
23332
|
-
DO_NOT_TILE_WMS: parsedMapSection.do_not_tile_wms,
|
|
23333
|
-
MAX_EXTENT: parsedMapSection.max_extent,
|
|
23334
|
-
MAX_FEATURE_COUNT: parsedMapSection.max_feature_count,
|
|
23335
|
-
EXTERNAL_VIEWER_URL_TEMPLATE: parsedMapSection.external_viewer_url_template,
|
|
23336
|
-
EXTERNAL_VIEWER_OPEN_NEW_TAB: parsedMapSection.external_viewer_open_new_tab,
|
|
23337
|
-
DO_NOT_USE_DEFAULT_BASEMAP: !!parsedMapSection.do_not_use_default_basemap,
|
|
23338
|
-
MAP_LAYERS: parsedLayersSections.map((map_layer) => ({
|
|
23339
|
-
TYPE: map_layer.type,
|
|
23340
|
-
URL: map_layer.url,
|
|
23341
|
-
NAME: map_layer.name,
|
|
23342
|
-
DATA: map_layer.data,
|
|
23343
|
-
STYLE_URL: map_layer.styleUrl,
|
|
23344
|
-
ACCESS_TOKEN: map_layer.accessToken,
|
|
23345
|
-
})),
|
|
23346
|
-
};
|
|
23347
|
-
const parsedThemeSection = parseConfigSection(parsed, 'theme', ['primary_color', 'secondary_color', 'main_color', 'background_color'], [
|
|
23348
|
-
'header_foreground_color',
|
|
23349
|
-
'main_font',
|
|
23350
|
-
'title_font',
|
|
23351
|
-
'fonts_stylesheet_url',
|
|
23352
|
-
'thumbnail_placeholder',
|
|
23353
|
-
'header_background',
|
|
23354
|
-
'favicon',
|
|
23355
|
-
], warnings, errors);
|
|
23356
|
-
themeConfig =
|
|
23357
|
-
parsedThemeSection === null
|
|
23358
|
-
? null
|
|
23359
|
-
: {
|
|
23360
|
-
PRIMARY_COLOR: parsedThemeSection.primary_color,
|
|
23361
|
-
SECONDARY_COLOR: parsedThemeSection.secondary_color,
|
|
23362
|
-
MAIN_COLOR: parsedThemeSection.main_color,
|
|
23363
|
-
BACKGROUND_COLOR: parsedThemeSection.background_color,
|
|
23364
|
-
HEADER_FOREGROUND_COLOR: parsedThemeSection.header_foreground_color,
|
|
23365
|
-
THUMBNAIL_PLACEHOLDER: parsedThemeSection.thumbnail_placeholder,
|
|
23366
|
-
HEADER_BACKGROUND: parsedThemeSection.header_background,
|
|
23367
|
-
TITLE_FONT: parsedThemeSection.title_font,
|
|
23368
|
-
MAIN_FONT: parsedThemeSection.main_font,
|
|
23369
|
-
FONTS_STYLESHEET_URL: parsedThemeSection.fonts_stylesheet_url,
|
|
23370
|
-
FAVICON: parsedThemeSection.favicon,
|
|
23371
|
-
};
|
|
23372
|
-
const parsedSearchSection = parseConfigSection(parsed, 'search', [], [
|
|
23373
|
-
'record_kind_quick_filter',
|
|
23374
|
-
'filter_geometry_data',
|
|
23375
|
-
'filter_geometry_url',
|
|
23376
|
-
'do_not_use_default_search_preset',
|
|
23377
|
-
'search_preset',
|
|
23378
|
-
'advanced_filters',
|
|
23379
|
-
'limit',
|
|
23380
|
-
'spatial_extent_max_file_size',
|
|
23381
|
-
], warnings, errors);
|
|
23382
|
-
const parsedSearchParams = parseMultiConfigSection(parsed, 'search_preset', ['name'], ['sort', 'filters'], warnings, errors);
|
|
23383
|
-
searchConfig =
|
|
23384
|
-
parsedSearchSection === null
|
|
23385
|
-
? null
|
|
23386
|
-
: {
|
|
23387
|
-
RECORD_KIND_QUICK_FILTER: parsedSearchSection.record_kind_quick_filter,
|
|
23388
|
-
FILTER_GEOMETRY_DATA: parsedSearchSection.filter_geometry_data,
|
|
23389
|
-
FILTER_GEOMETRY_URL: parsedSearchSection.filter_geometry_url,
|
|
23390
|
-
DO_NOT_USE_DEFAULT_SEARCH_PRESET: !!parsedSearchSection.do_not_use_default_search_preset,
|
|
23391
|
-
SEARCH_PRESET: parsedSearchParams.map((param) => ({
|
|
23392
|
-
sort: param.sort,
|
|
23393
|
-
name: param.name,
|
|
23394
|
-
filters: param.filters,
|
|
23395
|
-
})),
|
|
23396
|
-
ADVANCED_FILTERS: parsedSearchSection.advanced_filters,
|
|
23397
|
-
LIMIT: parsedSearchSection.limit,
|
|
23398
|
-
SPATIAL_EXTENT_MAX_FILE_SIZE: parsedSearchSection.spatial_extent_max_file_size,
|
|
23399
|
-
};
|
|
23400
|
-
const parsedMetadataQualitySection = parseConfigSection(parsed, 'metadata-quality', [], ['enabled'], warnings, errors);
|
|
23401
|
-
metadataQualityConfig =
|
|
23402
|
-
parsedMetadataQualitySection === null
|
|
23403
|
-
? null
|
|
23404
|
-
: {
|
|
23405
|
-
ENABLED: parsedMetadataQualitySection.enabled,
|
|
23406
|
-
SORTABLE: parsedMetadataQualitySection.sortable,
|
|
23407
|
-
};
|
|
23408
|
-
let parsedEditingSection = parseConfigSection(parsed, 'editing', [], ['new_record_default_language', 'new_record_standard'], warnings, errors);
|
|
23409
|
-
if (parsedEditingSection !== null &&
|
|
23410
|
-
parsedEditingSection.new_record_default_language !== undefined) {
|
|
23411
|
-
parsedEditingSection = checkNewRecordDefaultLanguage(parsedEditingSection, warnings);
|
|
23412
|
-
}
|
|
23413
|
-
if (parsedEditingSection !== null &&
|
|
23414
|
-
parsedEditingSection.new_record_standard !== undefined) {
|
|
23415
|
-
parsedEditingSection = checkNewRecordStandard(parsedEditingSection, warnings);
|
|
23416
|
-
}
|
|
23417
|
-
editorConfig =
|
|
23418
|
-
parsedEditingSection === null
|
|
23419
|
-
? null
|
|
23420
|
-
: {
|
|
23421
|
-
NEW_RECORD_DEFAULT_LANGUAGE: parsedEditingSection.new_record_default_language,
|
|
23422
|
-
NEW_RECORD_STANDARD: parsedEditingSection.new_record_standard,
|
|
23423
|
-
};
|
|
23424
|
-
customTranslations = parseTranslationsConfigSection(parsed, 'translations');
|
|
23425
|
-
if (errors.length) {
|
|
23426
|
-
throw new Error(`One or more mandatory settings were missing from the configuration file.
|
|
23427
|
-
${errors.join('\n')}`);
|
|
23428
|
-
}
|
|
23429
|
-
else if (warnings.length) {
|
|
23430
|
-
console.warn(`One or more unexpected settings were encountered in the configuration file.
|
|
23431
|
-
${warnings.join('\n')}`);
|
|
23376
|
+
if (this.view) {
|
|
23377
|
+
this.view.destroy();
|
|
23432
23378
|
}
|
|
23433
|
-
|
|
23434
|
-
});
|
|
23435
|
-
}
|
|
23436
|
-
function isConfigLoaded() {
|
|
23437
|
-
return appConfigLoaded;
|
|
23438
|
-
}
|
|
23439
|
-
function _reset() {
|
|
23440
|
-
globalConfig = null;
|
|
23441
|
-
themeConfig = null;
|
|
23442
|
-
editorConfig = null;
|
|
23443
|
-
customTranslations = null;
|
|
23379
|
+
}
|
|
23380
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23381
|
+
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: [""] }); }
|
|
23444
23382
|
}
|
|
23445
|
-
|
|
23446
|
-
|
|
23447
|
-
|
|
23448
|
-
|
|
23449
|
-
|
|
23450
|
-
|
|
23451
|
-
|
|
23452
|
-
|
|
23453
|
-
|
|
23454
|
-
|
|
23455
|
-
|
|
23456
|
-
},
|
|
23457
|
-
},
|
|
23458
|
-
{
|
|
23459
|
-
provide: TranslateLoader,
|
|
23460
|
-
useClass: FileWithOverridesTranslateLoader,
|
|
23461
|
-
deps: [HttpClient, TRANSLATE_HTTP_LOADER_CONFIG],
|
|
23462
|
-
},
|
|
23463
|
-
],
|
|
23464
|
-
};
|
|
23465
|
-
|
|
23466
|
-
const okAppConfigFixture = () => `
|
|
23467
|
-
[global]
|
|
23468
|
-
geonetwork4_api_url = "/geonetwork/srv/api"
|
|
23469
|
-
proxy_path = "/proxy/?url="
|
|
23470
|
-
metadata_language = "fre"
|
|
23471
|
-
login_url = "/cas/login?service="
|
|
23472
|
-
logout_url = "/geonetwork/signout"
|
|
23473
|
-
settings_url = "/geonetwork/settings"
|
|
23474
|
-
web_component_embedder_url = "/datahub/wc-embedder.html"
|
|
23475
|
-
|
|
23476
|
-
[map]
|
|
23477
|
-
max_zoom = 10
|
|
23478
|
-
max_extent = [-418263.418776, 5251529.591305, 961272.067714, 6706890.609855]
|
|
23479
|
-
do_not_use_default_basemap = false
|
|
23480
|
-
external_viewer_url_template = 'https://example.com/myviewer?'
|
|
23481
|
-
external_viewer_open_new_tab = true
|
|
23482
|
-
[[map_layer]]
|
|
23483
|
-
type = "wms"
|
|
23484
|
-
url = "https://www.geo2france.fr/geoserver/cr_hdf/ows"
|
|
23485
|
-
name = "masque_hdf_ign_carto_latin1"
|
|
23486
|
-
[[map_layer]]
|
|
23487
|
-
type = "wfs"
|
|
23488
|
-
url = "https://www.geo2france.fr/geoserver/cr_hdf/ows"
|
|
23489
|
-
name = "masque_hdf_ign_carto_latin1"
|
|
23490
|
-
|
|
23491
|
-
[theme]
|
|
23492
|
-
primary_color = "#093564"
|
|
23493
|
-
secondary_color = "#c2e9dc"
|
|
23494
|
-
main_color = "#212029" # All-purpose text color
|
|
23495
|
-
background_color = "#fdfbff"
|
|
23496
|
-
thumbnail_placeholder = 'assets/img/placeholder.svg'
|
|
23497
|
-
header_background = 'teal'
|
|
23498
|
-
header_foreground_color = "#872e2e"
|
|
23499
|
-
main_font = 'sans-serif'
|
|
23500
|
-
title_font = 'serif'
|
|
23501
|
-
fonts_stylesheet_url = "https://fonts.googleapis.com/css2?family=Open+Sans"
|
|
23502
|
-
|
|
23503
|
-
[search]
|
|
23504
|
-
record_kind_quick_filter = false
|
|
23505
|
-
filter_geometry_url = 'https://my.domain.org/geom.json'
|
|
23506
|
-
do_not_use_default_search_preset = false
|
|
23507
|
-
advanced_filters = ['publicationYear', 'documentStandard', 'inspireKeyword', 'topic', 'license']
|
|
23508
|
-
|
|
23509
|
-
[[search_preset]]
|
|
23510
|
-
sort = "-createDate"
|
|
23511
|
-
name = 'filterByOrgs'
|
|
23512
|
-
filters.q = 'Carto'
|
|
23513
|
-
filters.organisation = ['Org1', 'Org2']
|
|
23514
|
-
filters.format = ['ESRI Shapefile']
|
|
23515
|
-
filters.topic = ['boundaries']
|
|
23516
|
-
filters.publicationYear = ['2023', '2022']
|
|
23517
|
-
filters.spatial = ['yes']
|
|
23518
|
-
|
|
23519
|
-
[translations.en]
|
|
23520
|
-
"my.first.key" = 'First label.'
|
|
23521
|
-
"my.second.key" = """
|
|
23522
|
-
Second label,
|
|
23523
|
-
on two lines."""
|
|
23524
|
-
|
|
23525
|
-
[translations.de]
|
|
23526
|
-
my.first.key = 'Erste Etikett.'
|
|
23527
|
-
|
|
23528
|
-
[translations.fr]
|
|
23529
|
-
my.sample.text = "Un bon exemple de texte."
|
|
23530
|
-
"my.quoted.text" = 'du texte entre guillements.'
|
|
23531
|
-
`;
|
|
23532
|
-
const appConfigWithTranslationFixture = () => okAppConfigFixture();
|
|
23533
|
-
const minimalAppConfigFixture = () => `
|
|
23534
|
-
[global]
|
|
23535
|
-
geonetwork4_api_url = "/geonetwork/srv/api"
|
|
23536
|
-
proxy_path = "/proxy/?url="
|
|
23383
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PopoverComponent, decorators: [{
|
|
23384
|
+
type: Component,
|
|
23385
|
+
args: [{ selector: 'gn-ui-popover', standalone: true, imports: [], template: "<span #popoverContent>\n <ng-content></ng-content>\n</span>\n" }]
|
|
23386
|
+
}], propDecorators: { popoverContent: [{
|
|
23387
|
+
type: ViewChild,
|
|
23388
|
+
args: ['popoverContent', { static: false }]
|
|
23389
|
+
}], content: [{
|
|
23390
|
+
type: Input
|
|
23391
|
+
}], theme: [{
|
|
23392
|
+
type: Input
|
|
23393
|
+
}] } });
|
|
23537
23394
|
|
|
23538
|
-
|
|
23539
|
-
|
|
23540
|
-
|
|
23541
|
-
main_color = "#212029" # All-purpose text color
|
|
23542
|
-
background_color = "#fdfbff"
|
|
23543
|
-
`;
|
|
23544
|
-
const mapConfigFixture = () => ({
|
|
23545
|
-
MAX_ZOOM: 10,
|
|
23546
|
-
MAX_EXTENT: [-418263.418776, 5251529.591305, 961272.067714, 6706890.609855],
|
|
23547
|
-
DO_NOT_USE_DEFAULT_BASEMAP: false,
|
|
23548
|
-
DO_NOT_TILE_WMS: false,
|
|
23549
|
-
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}"}]}]',
|
|
23550
|
-
EXTERNAL_VIEWER_OPEN_NEW_TAB: true,
|
|
23551
|
-
MAP_LAYERS: [
|
|
23552
|
-
{
|
|
23553
|
-
TYPE: 'xyz',
|
|
23554
|
-
URL: 'https://some-basemap-server',
|
|
23555
|
-
},
|
|
23556
|
-
{
|
|
23557
|
-
TYPE: 'wms',
|
|
23558
|
-
URL: 'https://some-wms-server',
|
|
23559
|
-
NAME: 'some_layername',
|
|
23560
|
-
},
|
|
23561
|
-
{
|
|
23562
|
-
TYPE: 'wfs',
|
|
23563
|
-
URL: 'https://some-wfs-server',
|
|
23564
|
-
NAME: 'some_layername',
|
|
23565
|
-
},
|
|
23566
|
-
],
|
|
23567
|
-
});
|
|
23568
|
-
const malformedConfigFixture = () => `
|
|
23569
|
-
{
|
|
23570
|
-
"I thought": "we were still doing json"
|
|
23395
|
+
class LoadingMaskComponent {
|
|
23396
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: LoadingMaskComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23397
|
+
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 }); }
|
|
23571
23398
|
}
|
|
23572
|
-
|
|
23573
|
-
|
|
23574
|
-
[
|
|
23575
|
-
|
|
23576
|
-
|
|
23577
|
-
|
|
23578
|
-
main_font = 'sans-serif'
|
|
23579
|
-
`;
|
|
23580
|
-
const wrongLanguageCodeConfigFixture = () => `
|
|
23581
|
-
[global]
|
|
23582
|
-
geonetwork4_api_url = "/geonetwork/srv/api"
|
|
23583
|
-
proxy_path = "/proxy/?url="
|
|
23584
|
-
metadata_language = "abc"
|
|
23585
|
-
|
|
23586
|
-
[map]
|
|
23587
|
-
|
|
23588
|
-
[theme]
|
|
23589
|
-
primary_color = "#093564"
|
|
23590
|
-
secondary_color = "#c2e9dc"
|
|
23591
|
-
main_color = "#212029" # All-purpose text color
|
|
23592
|
-
background_color = "#fdfbff"
|
|
23593
|
-
`;
|
|
23594
|
-
const unrecognizedKeysConfigFixture = () => `
|
|
23595
|
-
[global]
|
|
23596
|
-
geonetwork4_api_url = "/geonetwork/srv/api"
|
|
23597
|
-
proxy_path = "/proxy/?url="
|
|
23598
|
-
metadata_language = "fre"
|
|
23599
|
-
another_path = '/whatever'
|
|
23600
|
-
|
|
23601
|
-
[map]
|
|
23602
|
-
max_zoom = 10
|
|
23603
|
-
max_extent = [-418263.418776, 5251529.591305, 961272.067714, 6706890.609855]
|
|
23604
|
-
do_not_use_default_basemap = false
|
|
23605
|
-
external_viewer_url_template = 'https://example.com/myviewer?'
|
|
23606
|
-
external_viewer_open_new_tab = true
|
|
23607
|
-
another_zoom = 15
|
|
23608
|
-
[[map_layer]]
|
|
23609
|
-
type = "wms"
|
|
23610
|
-
url = "https://www.geo2france.fr/geoserver/cr_hdf/ows"
|
|
23611
|
-
name = "masque_hdf_ign_carto_latin1"
|
|
23612
|
-
[[map_layer]]
|
|
23613
|
-
type = "wfs"
|
|
23614
|
-
url = "https://www.geo2france.fr/geoserver/cr_hdf/ows"
|
|
23615
|
-
name = "masque_hdf_ign_carto_latin1"
|
|
23616
|
-
another_layer = "wrong layer definition"
|
|
23617
|
-
|
|
23618
|
-
[theme]
|
|
23619
|
-
primary_color = "#093564"
|
|
23620
|
-
secondary_color = "#c2e9dc"
|
|
23621
|
-
main_color = "#212029" # All-purpose text color
|
|
23622
|
-
background_color = "#fdfbff"
|
|
23623
|
-
thumbnail_placeholder = 'assets/img/placeholder.svg'
|
|
23624
|
-
header_background = 'teal'
|
|
23625
|
-
header_foreground_color = "#872e2e"
|
|
23626
|
-
main_font = 'sans-serif'
|
|
23627
|
-
title_font = 'serif'
|
|
23628
|
-
another_color = 'red'
|
|
23629
|
-
`;
|
|
23399
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: LoadingMaskComponent, decorators: [{
|
|
23400
|
+
type: Component,
|
|
23401
|
+
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"] }]
|
|
23402
|
+
}], propDecorators: { message: [{
|
|
23403
|
+
type: Input
|
|
23404
|
+
}] } });
|
|
23630
23405
|
|
|
23631
|
-
|
|
23632
|
-
|
|
23633
|
-
|
|
23634
|
-
return {
|
|
23635
|
-
type: 'wms',
|
|
23636
|
-
url: config.URL,
|
|
23637
|
-
name: config.NAME,
|
|
23638
|
-
};
|
|
23639
|
-
case 'wfs':
|
|
23640
|
-
return {
|
|
23641
|
-
type: 'wfs',
|
|
23642
|
-
url: config.URL,
|
|
23643
|
-
featureType: config.NAME,
|
|
23644
|
-
};
|
|
23645
|
-
case 'xyz':
|
|
23646
|
-
return {
|
|
23647
|
-
type: config.TYPE,
|
|
23648
|
-
url: config.URL,
|
|
23649
|
-
};
|
|
23650
|
-
case 'geojson':
|
|
23651
|
-
return {
|
|
23652
|
-
type: config.TYPE,
|
|
23653
|
-
...(config.DATA ? { data: config.DATA } : { url: config.URL }),
|
|
23654
|
-
};
|
|
23655
|
-
case 'maplibre-style':
|
|
23656
|
-
return {
|
|
23657
|
-
type: config.TYPE,
|
|
23658
|
-
styleUrl: config.STYLE_URL,
|
|
23659
|
-
accessToken: config.ACCESS_TOKEN,
|
|
23660
|
-
};
|
|
23661
|
-
}
|
|
23406
|
+
class ColorScaleComponent {
|
|
23407
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ColorScaleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23408
|
+
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: [""] }); }
|
|
23662
23409
|
}
|
|
23410
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ColorScaleComponent, decorators: [{
|
|
23411
|
+
type: Component,
|
|
23412
|
+
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" }]
|
|
23413
|
+
}] });
|
|
23663
23414
|
|
|
23664
|
-
class
|
|
23415
|
+
class PopupAlertComponent {
|
|
23665
23416
|
constructor() {
|
|
23666
|
-
this.
|
|
23667
|
-
|
|
23668
|
-
|
|
23669
|
-
|
|
23670
|
-
|
|
23671
|
-
color: isConfigLoaded() ? getThemeConfig().SECONDARY_COLOR : 'red',
|
|
23672
|
-
isFocused: true,
|
|
23673
|
-
})),
|
|
23674
|
-
};
|
|
23417
|
+
this.changeDetector = inject(ChangeDetectorRef);
|
|
23418
|
+
this.type = 'info';
|
|
23419
|
+
this.position = 'top';
|
|
23420
|
+
this.expanded = false;
|
|
23421
|
+
this.timeout = null;
|
|
23675
23422
|
}
|
|
23676
|
-
|
|
23677
|
-
const
|
|
23678
|
-
|
|
23679
|
-
return {
|
|
23680
|
-
polygon: new Style({
|
|
23681
|
-
fill: new Fill({
|
|
23682
|
-
color: this.computeTransparentFillColor(color),
|
|
23683
|
-
}),
|
|
23684
|
-
stroke: new Stroke({
|
|
23685
|
-
color: 'white',
|
|
23686
|
-
width: 2,
|
|
23687
|
-
}),
|
|
23688
|
-
zIndex,
|
|
23689
|
-
}),
|
|
23690
|
-
point: new Style({
|
|
23691
|
-
image: new CircleStyle({
|
|
23692
|
-
fill: new Fill({
|
|
23693
|
-
color,
|
|
23694
|
-
}),
|
|
23695
|
-
stroke: new Stroke({
|
|
23696
|
-
color: 'white',
|
|
23697
|
-
width: isFocused ? 3 : 2,
|
|
23698
|
-
}),
|
|
23699
|
-
radius: isFocused ? 8 : 7,
|
|
23700
|
-
}),
|
|
23701
|
-
zIndex,
|
|
23702
|
-
}),
|
|
23703
|
-
line: [
|
|
23704
|
-
new Style({
|
|
23705
|
-
stroke: new Stroke({
|
|
23706
|
-
color: 'white',
|
|
23707
|
-
width: isFocused ? 8 : 6,
|
|
23708
|
-
}),
|
|
23709
|
-
zIndex,
|
|
23710
|
-
}),
|
|
23711
|
-
new Style({
|
|
23712
|
-
stroke: new Stroke({
|
|
23713
|
-
color,
|
|
23714
|
-
width: isFocused ? 3 : 2,
|
|
23715
|
-
}),
|
|
23716
|
-
zIndex,
|
|
23717
|
-
}),
|
|
23718
|
-
],
|
|
23719
|
-
};
|
|
23423
|
+
get showDuration() {
|
|
23424
|
+
const chars = this.content.nativeElement.innerHTML.length;
|
|
23425
|
+
return Math.max(3000, chars * 20);
|
|
23720
23426
|
}
|
|
23721
|
-
|
|
23722
|
-
|
|
23723
|
-
|
|
23724
|
-
|
|
23725
|
-
|
|
23726
|
-
|
|
23727
|
-
|
|
23728
|
-
return styleByGeometryType.line;
|
|
23729
|
-
case 'Point':
|
|
23730
|
-
case 'MultiPoint':
|
|
23731
|
-
return styleByGeometryType.point;
|
|
23732
|
-
case 'Circle':
|
|
23733
|
-
case 'Polygon':
|
|
23734
|
-
case 'MultiPolygon':
|
|
23735
|
-
return styleByGeometryType.polygon;
|
|
23736
|
-
default:
|
|
23737
|
-
return styleByGeometryType.point;
|
|
23738
|
-
}
|
|
23739
|
-
};
|
|
23427
|
+
ngOnInit() {
|
|
23428
|
+
this.expandAndClose();
|
|
23429
|
+
}
|
|
23430
|
+
expand() {
|
|
23431
|
+
this.expanded = true;
|
|
23432
|
+
this.changeDetector.detectChanges();
|
|
23433
|
+
clearTimeout(this.timeout);
|
|
23740
23434
|
}
|
|
23741
|
-
|
|
23742
|
-
|
|
23435
|
+
expandAndClose() {
|
|
23436
|
+
this.expanded = true;
|
|
23437
|
+
this.changeDetector.detectChanges();
|
|
23438
|
+
clearTimeout(this.timeout);
|
|
23439
|
+
this.timeout = setTimeout(() => {
|
|
23440
|
+
this.expanded = false;
|
|
23441
|
+
this.changeDetector.detectChanges();
|
|
23442
|
+
}, this.showDuration);
|
|
23743
23443
|
}
|
|
23744
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type:
|
|
23745
|
-
static { this.ɵ
|
|
23444
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PopupAlertComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23445
|
+
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: [
|
|
23446
|
+
provideIcons({ matErrorOutlineOutline }),
|
|
23447
|
+
provideNgIconsConfig({
|
|
23448
|
+
size: '1.5em',
|
|
23449
|
+
}),
|
|
23450
|
+
], 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 }); }
|
|
23746
23451
|
}
|
|
23747
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type:
|
|
23748
|
-
type:
|
|
23749
|
-
args: [{
|
|
23750
|
-
|
|
23751
|
-
|
|
23752
|
-
|
|
23452
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PopupAlertComponent, decorators: [{
|
|
23453
|
+
type: Component,
|
|
23454
|
+
args: [{ selector: 'gn-ui-popup-alert', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIconComponent], providers: [
|
|
23455
|
+
provideIcons({ matErrorOutlineOutline }),
|
|
23456
|
+
provideNgIconsConfig({
|
|
23457
|
+
size: '1.5em',
|
|
23458
|
+
}),
|
|
23459
|
+
], 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"] }]
|
|
23460
|
+
}], propDecorators: { icon: [{
|
|
23461
|
+
type: Input
|
|
23462
|
+
}], type: [{
|
|
23463
|
+
type: Input
|
|
23464
|
+
}], position: [{
|
|
23465
|
+
type: Input
|
|
23466
|
+
}], content: [{
|
|
23467
|
+
type: ViewChild,
|
|
23468
|
+
args: ['content']
|
|
23469
|
+
}] } });
|
|
23753
23470
|
|
|
23754
|
-
|
|
23755
|
-
|
|
23756
|
-
|
|
23757
|
-
|
|
23758
|
-
|
|
23759
|
-
|
|
23760
|
-
|
|
23761
|
-
})
|
|
23762
|
-
stroke: new Stroke({
|
|
23763
|
-
color: colorStroke,
|
|
23764
|
-
width: 2,
|
|
23765
|
-
}),
|
|
23766
|
-
radius: 5,
|
|
23767
|
-
}),
|
|
23768
|
-
fill: new Fill({
|
|
23769
|
-
color: 'rgba(0,0,255,0.25)',
|
|
23770
|
-
}),
|
|
23771
|
-
stroke: new Stroke({
|
|
23772
|
-
color: colorStroke,
|
|
23773
|
-
width: 2,
|
|
23774
|
-
}),
|
|
23775
|
-
});
|
|
23776
|
-
const defaultMapStyleHlFixture = () => new Style({
|
|
23777
|
-
image: new Circle({
|
|
23778
|
-
fill: new Fill({
|
|
23779
|
-
color: colorSecondary,
|
|
23780
|
-
}),
|
|
23781
|
-
stroke: new Stroke({
|
|
23782
|
-
color: colorStroke,
|
|
23783
|
-
width: 3,
|
|
23784
|
-
}),
|
|
23785
|
-
radius: 6,
|
|
23786
|
-
}),
|
|
23787
|
-
fill: new Fill({
|
|
23788
|
-
color: 'rgba(255,0,0,0.25)',
|
|
23789
|
-
}),
|
|
23790
|
-
stroke: new Stroke({
|
|
23791
|
-
color: colorSecondary,
|
|
23792
|
-
width: 3,
|
|
23793
|
-
}),
|
|
23794
|
-
});
|
|
23471
|
+
class SpinningLoaderComponent {
|
|
23472
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: SpinningLoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23473
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: SpinningLoaderComponent, isStandalone: true, selector: "gn-ui-spinning-loader", ngImport: i0, template: "<span>\n <svg\n class=\"animate-spin\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n class=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"4\"\n ></circle>\n <path\n class=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n</span>\n", styles: [""] }); }
|
|
23474
|
+
}
|
|
23475
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: SpinningLoaderComponent, decorators: [{
|
|
23476
|
+
type: Component,
|
|
23477
|
+
args: [{ selector: 'gn-ui-spinning-loader', standalone: true, template: "<span>\n <svg\n class=\"animate-spin\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n class=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"4\"\n ></circle>\n <path\n class=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n</span>\n" }]
|
|
23478
|
+
}] });
|
|
23795
23479
|
|
|
23796
|
-
class
|
|
23480
|
+
class ButtonComponent {
|
|
23797
23481
|
constructor() {
|
|
23798
|
-
this.
|
|
23482
|
+
this.btnClass = 'gn-ui-btn-default';
|
|
23799
23483
|
this.disabled = false;
|
|
23800
|
-
this.
|
|
23801
|
-
|
|
23802
|
-
});
|
|
23803
|
-
this.inView = false;
|
|
23804
|
-
this.initialized = false;
|
|
23805
|
-
}
|
|
23806
|
-
get elementClass() {
|
|
23807
|
-
if (this.disabled) {
|
|
23808
|
-
return this.disabledClass;
|
|
23809
|
-
}
|
|
23810
|
-
if (this.inView) {
|
|
23811
|
-
return `${this.inViewClass} ${this.enabledClass}`;
|
|
23812
|
-
}
|
|
23813
|
-
else {
|
|
23814
|
-
return `${this.outOfViewClass} ${this.enabledClass}`;
|
|
23815
|
-
}
|
|
23816
|
-
}
|
|
23817
|
-
ngOnInit() {
|
|
23818
|
-
this.observer.observe(document.body, {
|
|
23819
|
-
childList: true,
|
|
23820
|
-
subtree: true,
|
|
23821
|
-
});
|
|
23822
|
-
this.refreshDisabledState();
|
|
23823
|
-
}
|
|
23824
|
-
ngAfterViewChecked() {
|
|
23825
|
-
if (!this.initialized && !this.disabled) {
|
|
23826
|
-
const target = document.getElementById(this.targetId);
|
|
23827
|
-
if (target) {
|
|
23828
|
-
this.initializeIntersectionObserver(target);
|
|
23829
|
-
this.initialized = true;
|
|
23830
|
-
}
|
|
23831
|
-
}
|
|
23832
|
-
}
|
|
23833
|
-
initializeIntersectionObserver(target) {
|
|
23834
|
-
this.intersectionObserver = new IntersectionObserver((entries) => {
|
|
23835
|
-
entries.forEach((entry) => {
|
|
23836
|
-
this.inView = entry.isIntersecting;
|
|
23837
|
-
this.changeDetector.detectChanges();
|
|
23838
|
-
});
|
|
23839
|
-
}, {
|
|
23840
|
-
root: null,
|
|
23841
|
-
rootMargin: '-30% 0% -60% 0%',
|
|
23842
|
-
});
|
|
23843
|
-
this.intersectionObserver.observe(target);
|
|
23844
|
-
}
|
|
23845
|
-
ngOnDestroy() {
|
|
23846
|
-
this.observer.disconnect();
|
|
23847
|
-
if (this.intersectionObserver) {
|
|
23848
|
-
this.intersectionObserver.disconnect();
|
|
23849
|
-
}
|
|
23850
|
-
}
|
|
23851
|
-
refreshDisabledState() {
|
|
23852
|
-
const targetNotPresent = !document.getElementById(this.targetId);
|
|
23853
|
-
if (targetNotPresent !== this.disabled) {
|
|
23854
|
-
this.disabled = targetNotPresent;
|
|
23855
|
-
this.changeDetector.detectChanges();
|
|
23856
|
-
}
|
|
23857
|
-
}
|
|
23858
|
-
scrollToTarget() {
|
|
23859
|
-
const target = document.getElementById(this.targetId);
|
|
23860
|
-
if (!target)
|
|
23861
|
-
return;
|
|
23862
|
-
target.scrollIntoView({
|
|
23863
|
-
behavior: 'smooth',
|
|
23864
|
-
block: 'start',
|
|
23865
|
-
});
|
|
23866
|
-
}
|
|
23867
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: AnchorLinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
23868
|
-
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 }); }
|
|
23869
|
-
}
|
|
23870
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: AnchorLinkDirective, decorators: [{
|
|
23871
|
-
type: Directive,
|
|
23872
|
-
args: [{
|
|
23873
|
-
selector: '[gnUiAnchorLink]',
|
|
23874
|
-
standalone: true,
|
|
23875
|
-
}]
|
|
23876
|
-
}], propDecorators: { targetId: [{
|
|
23877
|
-
type: Input,
|
|
23878
|
-
args: ['gnUiAnchorLink']
|
|
23879
|
-
}], disabledClass: [{
|
|
23880
|
-
type: Input,
|
|
23881
|
-
args: ['gnUiAnchorLinkDisabledClass']
|
|
23882
|
-
}], enabledClass: [{
|
|
23883
|
-
type: Input,
|
|
23884
|
-
args: ['gnUiAnchorLinkEnabledClass']
|
|
23885
|
-
}], inViewClass: [{
|
|
23886
|
-
type: Input,
|
|
23887
|
-
args: ['gnUiAnchorLinkInViewClass']
|
|
23888
|
-
}], outOfViewClass: [{
|
|
23889
|
-
type: Input,
|
|
23890
|
-
args: ['gnUiAnchorLinkOutOfViewClass']
|
|
23891
|
-
}], elementClass: [{
|
|
23892
|
-
type: HostBinding,
|
|
23893
|
-
args: ['class']
|
|
23894
|
-
}], scrollToTarget: [{
|
|
23895
|
-
type: HostListener,
|
|
23896
|
-
args: ['click']
|
|
23897
|
-
}] } });
|
|
23898
|
-
|
|
23899
|
-
class PaginationDotsComponent {
|
|
23900
|
-
constructor() {
|
|
23901
|
-
this.containerClass = '';
|
|
23902
|
-
}
|
|
23903
|
-
// 1-based
|
|
23904
|
-
get steps() {
|
|
23905
|
-
return Array.from({ length: this.listComponent.pagesCount }, (_, i) => i + 1);
|
|
23906
|
-
}
|
|
23907
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PaginationDotsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23908
|
-
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: [
|
|
23909
|
-
provideIcons({
|
|
23910
|
-
iconoirNavArrowRight,
|
|
23911
|
-
iconoirNavArrowLeft,
|
|
23912
|
-
}),
|
|
23913
|
-
] }); }
|
|
23914
|
-
}
|
|
23915
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PaginationDotsComponent, decorators: [{
|
|
23916
|
-
type: Component,
|
|
23917
|
-
args: [{ selector: 'gn-ui-pagination-dots', standalone: true, imports: [CommonModule], viewProviders: [
|
|
23918
|
-
provideIcons({
|
|
23919
|
-
iconoirNavArrowRight,
|
|
23920
|
-
iconoirNavArrowLeft,
|
|
23921
|
-
}),
|
|
23922
|
-
], 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"] }]
|
|
23923
|
-
}], propDecorators: { listComponent: [{
|
|
23924
|
-
type: Input
|
|
23925
|
-
}], containerClass: [{
|
|
23926
|
-
type: Input
|
|
23927
|
-
}] } });
|
|
23928
|
-
|
|
23929
|
-
class CarouselComponent {
|
|
23930
|
-
constructor() {
|
|
23931
|
-
this.changeDetector = inject(ChangeDetectorRef);
|
|
23932
|
-
this.containerClass = '';
|
|
23933
|
-
this.stepsContainerClass = 'w-full bottom-0 top-auto';
|
|
23934
|
-
this.currentStepChange = new EventEmitter();
|
|
23935
|
-
this.steps = [];
|
|
23936
|
-
this.currentStep = 0;
|
|
23937
|
-
this.refreshSteps = () => {
|
|
23938
|
-
this.steps = this.emblaApi.scrollSnapList();
|
|
23939
|
-
this.currentStep = this.emblaApi.selectedScrollSnap();
|
|
23940
|
-
this.currentStepChange.emit(this.currentStep);
|
|
23941
|
-
this.changeDetector.detectChanges();
|
|
23942
|
-
};
|
|
23943
|
-
}
|
|
23944
|
-
// Paginable API
|
|
23945
|
-
get isFirstPage() {
|
|
23946
|
-
return this.currentStep === 0;
|
|
23947
|
-
}
|
|
23948
|
-
get isLastPage() {
|
|
23949
|
-
return this.currentStep === this.steps.length - 1;
|
|
23950
|
-
}
|
|
23951
|
-
get currentPage() {
|
|
23952
|
-
return this.currentStep + 1; // this is 1-based
|
|
23953
|
-
}
|
|
23954
|
-
get pagesCount() {
|
|
23955
|
-
return this.steps.length;
|
|
23956
|
-
}
|
|
23957
|
-
goToPage(stepIndex) {
|
|
23958
|
-
this.emblaApi.scrollTo(stepIndex - 1); // this is 0-based
|
|
23959
|
-
}
|
|
23960
|
-
goToPrevPage() {
|
|
23961
|
-
if (this.isFirstPage)
|
|
23962
|
-
return;
|
|
23963
|
-
this.emblaApi.scrollPrev();
|
|
23964
|
-
}
|
|
23965
|
-
goToNextPage() {
|
|
23966
|
-
if (this.isLastPage)
|
|
23967
|
-
return;
|
|
23968
|
-
this.emblaApi.scrollNext();
|
|
23969
|
-
}
|
|
23970
|
-
ngAfterViewInit() {
|
|
23971
|
-
this.emblaApi = EmblaCarousel(this.carouselOverflowContainer.nativeElement, {
|
|
23972
|
-
duration: 15,
|
|
23973
|
-
});
|
|
23974
|
-
this.emblaApi
|
|
23975
|
-
.on('init', this.refreshSteps)
|
|
23976
|
-
.on('reInit', this.refreshSteps)
|
|
23977
|
-
.on('select', this.refreshSteps);
|
|
23978
|
-
}
|
|
23979
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: CarouselComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
23980
|
-
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 }); }
|
|
23981
|
-
}
|
|
23982
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: CarouselComponent, decorators: [{
|
|
23983
|
-
type: Component,
|
|
23984
|
-
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"] }]
|
|
23985
|
-
}], propDecorators: { carouselOverflowContainer: [{
|
|
23986
|
-
type: ViewChild,
|
|
23987
|
-
args: ['carouselOverflowContainer']
|
|
23988
|
-
}], containerClass: [{
|
|
23989
|
-
type: Input
|
|
23990
|
-
}], stepsContainerClass: [{
|
|
23991
|
-
type: Input
|
|
23992
|
-
}], currentStepChange: [{
|
|
23993
|
-
type: Output
|
|
23994
|
-
}] } });
|
|
23995
|
-
|
|
23996
|
-
class ProgressBarComponent {
|
|
23997
|
-
constructor() {
|
|
23998
|
-
this.value = 0;
|
|
23999
|
-
this.type = 'default';
|
|
24000
|
-
}
|
|
24001
|
-
get progress() {
|
|
24002
|
-
return this.value > 0 ? (this.value < 100 ? this.value : 100) : 0;
|
|
24003
|
-
}
|
|
24004
|
-
get color() {
|
|
24005
|
-
switch (this.type) {
|
|
24006
|
-
case 'default':
|
|
24007
|
-
return {
|
|
24008
|
-
outerBar: 'bg-gray-200',
|
|
24009
|
-
innerBar: 'bg-gray-100',
|
|
24010
|
-
text: 'text-gray-900',
|
|
24011
|
-
};
|
|
24012
|
-
case 'primary':
|
|
24013
|
-
return {
|
|
24014
|
-
outerBar: 'bg-primary',
|
|
24015
|
-
innerBar: 'bg-primary-lighter',
|
|
24016
|
-
text: 'text-white',
|
|
24017
|
-
};
|
|
24018
|
-
case 'secondary':
|
|
24019
|
-
return {
|
|
24020
|
-
outerBar: 'bg-secondary',
|
|
24021
|
-
innerBar: 'bg-secondary-lighter',
|
|
24022
|
-
text: 'text-white',
|
|
24023
|
-
};
|
|
24024
|
-
case 'light':
|
|
24025
|
-
return {
|
|
24026
|
-
outerBar: 'bg-primary-white',
|
|
24027
|
-
innerBar: 'bg-primary',
|
|
24028
|
-
text: 'text-main',
|
|
24029
|
-
};
|
|
24030
|
-
}
|
|
24031
|
-
}
|
|
24032
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ProgressBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
24033
|
-
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"] }); }
|
|
24034
|
-
}
|
|
24035
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ProgressBarComponent, decorators: [{
|
|
24036
|
-
type: Component,
|
|
24037
|
-
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"] }]
|
|
24038
|
-
}], propDecorators: { value: [{
|
|
24039
|
-
type: Input
|
|
24040
|
-
}], type: [{
|
|
24041
|
-
type: Input
|
|
24042
|
-
}] } });
|
|
24043
|
-
|
|
24044
|
-
class PopoverComponent {
|
|
24045
|
-
constructor() {
|
|
24046
|
-
this.viewContainerRef = inject(ViewContainerRef);
|
|
24047
|
-
this.renderer = inject(Renderer2);
|
|
24048
|
-
}
|
|
24049
|
-
getContent() {
|
|
24050
|
-
if (this.content instanceof TemplateRef) {
|
|
24051
|
-
if (this.view) {
|
|
24052
|
-
this.view.destroy();
|
|
24053
|
-
}
|
|
24054
|
-
this.view = this.viewContainerRef.createEmbeddedView(this.content);
|
|
24055
|
-
this.view.detectChanges();
|
|
24056
|
-
const wrapper = this.renderer.createElement('div'); // Create a wrapper div
|
|
24057
|
-
this.view.rootNodes.forEach((node) => {
|
|
24058
|
-
this.renderer.appendChild(wrapper, node); // Append each root node to the wrapper
|
|
24059
|
-
});
|
|
24060
|
-
return wrapper;
|
|
24061
|
-
}
|
|
24062
|
-
return this.content;
|
|
24063
|
-
}
|
|
24064
|
-
ngAfterViewInit() {
|
|
24065
|
-
this.tippyInstance = tippy(this.popoverContent.nativeElement, {
|
|
24066
|
-
content: this.getContent(),
|
|
24067
|
-
allowHTML: true,
|
|
24068
|
-
theme: this.theme,
|
|
24069
|
-
});
|
|
24070
|
-
}
|
|
24071
|
-
ngOnChanges(changes) {
|
|
24072
|
-
if (changes['theme']) {
|
|
24073
|
-
this.theme = changes['theme'].currentValue;
|
|
24074
|
-
if (this.tippyInstance) {
|
|
24075
|
-
this.tippyInstance.setProps({ theme: this.theme });
|
|
24076
|
-
}
|
|
24077
|
-
}
|
|
24078
|
-
if (changes['content']) {
|
|
24079
|
-
this.content = changes['content'].currentValue;
|
|
24080
|
-
if (this.tippyInstance) {
|
|
24081
|
-
this.tippyInstance.setContent(this.getContent());
|
|
24082
|
-
}
|
|
24083
|
-
}
|
|
24084
|
-
}
|
|
24085
|
-
ngOnDestroy() {
|
|
24086
|
-
if (this.tippyInstance) {
|
|
24087
|
-
this.tippyInstance.destroy();
|
|
24088
|
-
}
|
|
24089
|
-
if (this.view) {
|
|
24090
|
-
this.view.destroy();
|
|
24091
|
-
}
|
|
24092
|
-
}
|
|
24093
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
24094
|
-
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: [""] }); }
|
|
24095
|
-
}
|
|
24096
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PopoverComponent, decorators: [{
|
|
24097
|
-
type: Component,
|
|
24098
|
-
args: [{ selector: 'gn-ui-popover', standalone: true, imports: [], template: "<span #popoverContent>\n <ng-content></ng-content>\n</span>\n" }]
|
|
24099
|
-
}], propDecorators: { popoverContent: [{
|
|
24100
|
-
type: ViewChild,
|
|
24101
|
-
args: ['popoverContent', { static: false }]
|
|
24102
|
-
}], content: [{
|
|
24103
|
-
type: Input
|
|
24104
|
-
}], theme: [{
|
|
24105
|
-
type: Input
|
|
24106
|
-
}] } });
|
|
24107
|
-
|
|
24108
|
-
class LoadingMaskComponent {
|
|
24109
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: LoadingMaskComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
24110
|
-
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 }); }
|
|
24111
|
-
}
|
|
24112
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: LoadingMaskComponent, decorators: [{
|
|
24113
|
-
type: Component,
|
|
24114
|
-
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"] }]
|
|
24115
|
-
}], propDecorators: { message: [{
|
|
24116
|
-
type: Input
|
|
24117
|
-
}] } });
|
|
24118
|
-
|
|
24119
|
-
class ColorScaleComponent {
|
|
24120
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ColorScaleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
24121
|
-
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: [""] }); }
|
|
24122
|
-
}
|
|
24123
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: ColorScaleComponent, decorators: [{
|
|
24124
|
-
type: Component,
|
|
24125
|
-
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" }]
|
|
24126
|
-
}] });
|
|
24127
|
-
|
|
24128
|
-
class PopupAlertComponent {
|
|
24129
|
-
constructor() {
|
|
24130
|
-
this.changeDetector = inject(ChangeDetectorRef);
|
|
24131
|
-
this.type = 'info';
|
|
24132
|
-
this.position = 'top';
|
|
24133
|
-
this.expanded = false;
|
|
24134
|
-
this.timeout = null;
|
|
24135
|
-
}
|
|
24136
|
-
get showDuration() {
|
|
24137
|
-
const chars = this.content.nativeElement.innerHTML.length;
|
|
24138
|
-
return Math.max(3000, chars * 20);
|
|
24139
|
-
}
|
|
24140
|
-
ngOnInit() {
|
|
24141
|
-
this.expandAndClose();
|
|
24142
|
-
}
|
|
24143
|
-
expand() {
|
|
24144
|
-
this.expanded = true;
|
|
24145
|
-
this.changeDetector.detectChanges();
|
|
24146
|
-
clearTimeout(this.timeout);
|
|
24147
|
-
}
|
|
24148
|
-
expandAndClose() {
|
|
24149
|
-
this.expanded = true;
|
|
24150
|
-
this.changeDetector.detectChanges();
|
|
24151
|
-
clearTimeout(this.timeout);
|
|
24152
|
-
this.timeout = setTimeout(() => {
|
|
24153
|
-
this.expanded = false;
|
|
24154
|
-
this.changeDetector.detectChanges();
|
|
24155
|
-
}, this.showDuration);
|
|
24156
|
-
}
|
|
24157
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PopupAlertComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
24158
|
-
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: [
|
|
24159
|
-
provideIcons({ matErrorOutlineOutline }),
|
|
24160
|
-
provideNgIconsConfig({
|
|
24161
|
-
size: '1.5em',
|
|
24162
|
-
}),
|
|
24163
|
-
], 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 }); }
|
|
24164
|
-
}
|
|
24165
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: PopupAlertComponent, decorators: [{
|
|
24166
|
-
type: Component,
|
|
24167
|
-
args: [{ selector: 'gn-ui-popup-alert', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIconComponent], providers: [
|
|
24168
|
-
provideIcons({ matErrorOutlineOutline }),
|
|
24169
|
-
provideNgIconsConfig({
|
|
24170
|
-
size: '1.5em',
|
|
24171
|
-
}),
|
|
24172
|
-
], 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"] }]
|
|
24173
|
-
}], propDecorators: { icon: [{
|
|
24174
|
-
type: Input
|
|
24175
|
-
}], type: [{
|
|
24176
|
-
type: Input
|
|
24177
|
-
}], position: [{
|
|
24178
|
-
type: Input
|
|
24179
|
-
}], content: [{
|
|
24180
|
-
type: ViewChild,
|
|
24181
|
-
args: ['content']
|
|
24182
|
-
}] } });
|
|
24183
|
-
|
|
24184
|
-
class SpinningLoaderComponent {
|
|
24185
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: SpinningLoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
24186
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: SpinningLoaderComponent, isStandalone: true, selector: "gn-ui-spinning-loader", ngImport: i0, template: "<span>\n <svg\n class=\"animate-spin\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n class=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"4\"\n ></circle>\n <path\n class=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n</span>\n", styles: [""] }); }
|
|
24187
|
-
}
|
|
24188
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: SpinningLoaderComponent, decorators: [{
|
|
24189
|
-
type: Component,
|
|
24190
|
-
args: [{ selector: 'gn-ui-spinning-loader', standalone: true, template: "<span>\n <svg\n class=\"animate-spin\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n class=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n stroke-width=\"4\"\n ></circle>\n <path\n class=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n ></path>\n </svg>\n</span>\n" }]
|
|
24191
|
-
}] });
|
|
24192
|
-
|
|
24193
|
-
class ButtonComponent {
|
|
24194
|
-
constructor() {
|
|
24195
|
-
this.btnClass = 'gn-ui-btn-default';
|
|
24196
|
-
this.disabled = false;
|
|
24197
|
-
this.extraClass = '';
|
|
24198
|
-
this.buttonClick = new EventEmitter();
|
|
23484
|
+
this.extraClass = '';
|
|
23485
|
+
this.buttonClick = new EventEmitter();
|
|
24199
23486
|
}
|
|
24200
23487
|
set type(value) {
|
|
24201
23488
|
// btn-classes are written in full to be picked up by tailwind
|
|
@@ -24453,7 +23740,7 @@ class AutocompleteComponent {
|
|
|
24453
23740
|
this.enterBtnPosition = event.target['value'].length * 8 + 80;
|
|
24454
23741
|
}
|
|
24455
23742
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: AutocompleteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
24456
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: AutocompleteComponent, isStandalone: true, selector: "gn-ui-autocomplete", inputs: { placeholder: "placeholder", enterButton: "enterButton", action: "action", value: "value", clearOnSelection: "clearOnSelection", preventCompleteOnSelection: "preventCompleteOnSelection", autoFocus: "autoFocus", minCharacterCount: "minCharacterCount", allowSubmit: "allowSubmit", forceTrackPosition: "forceTrackPosition", displayWithFn: "displayWithFn" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted", inputCleared: "inputCleared", isSearchActive: "isSearchActive" }, providers: [
|
|
23743
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: AutocompleteComponent, isStandalone: true, selector: "gn-ui-autocomplete", inputs: { placeholder: "placeholder", enterButton: "enterButton", action: "action", value: "value", clearOnSelection: "clearOnSelection", preventCompleteOnSelection: "preventCompleteOnSelection", autoFocus: "autoFocus", minCharacterCount: "minCharacterCount", allowSubmit: "allowSubmit", forceTrackPosition: "forceTrackPosition", displayWithTemplate: "displayWithTemplate", displayWithFn: "displayWithFn" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted", inputCleared: "inputCleared", isSearchActive: "isSearchActive" }, providers: [
|
|
24457
23744
|
provideIcons({
|
|
24458
23745
|
iconoirSearch,
|
|
24459
23746
|
matClose,
|
|
@@ -24462,7 +23749,7 @@ class AutocompleteComponent {
|
|
|
24462
23749
|
provideNgIconsConfig({
|
|
24463
23750
|
size: '1.75rem',
|
|
24464
23751
|
}),
|
|
24465
|
-
], 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 search\"></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 {{ displayWithFnInternal(suggestion) }}\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}ng-icon.search{margin-top:.6rem;margin-left:.6rem}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.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 }); }
|
|
23752
|
+
], 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 search\"></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}ng-icon.search{margin-top:.6rem;margin-left:.6rem}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 }); }
|
|
24466
23753
|
}
|
|
24467
23754
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: AutocompleteComponent, decorators: [{
|
|
24468
23755
|
type: Component,
|
|
@@ -24483,7 +23770,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
24483
23770
|
provideNgIconsConfig({
|
|
24484
23771
|
size: '1.75rem',
|
|
24485
23772
|
}),
|
|
24486
|
-
], 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 search\"></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 {{ displayWithFnInternal(suggestion) }}\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}ng-icon.search{margin-top:.6rem;margin-left:.6rem}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"] }]
|
|
23773
|
+
], 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 search\"></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}ng-icon.search{margin-top:.6rem;margin-left:.6rem}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"] }]
|
|
24487
23774
|
}], propDecorators: { placeholder: [{
|
|
24488
23775
|
type: Input
|
|
24489
23776
|
}], enterButton: [{
|
|
@@ -24521,6 +23808,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
24521
23808
|
}], inputRef: [{
|
|
24522
23809
|
type: ViewChild,
|
|
24523
23810
|
args: ['searchInput']
|
|
23811
|
+
}], displayWithTemplate: [{
|
|
23812
|
+
type: Input
|
|
24524
23813
|
}], displayWithFn: [{
|
|
24525
23814
|
type: Input
|
|
24526
23815
|
}] } });
|
|
@@ -25005,7 +24294,7 @@ class DropdownMultiselectComponent {
|
|
|
25005
24294
|
}
|
|
25006
24295
|
setFocus() {
|
|
25007
24296
|
setTimeout(() => {
|
|
25008
|
-
this.searchFieldInput
|
|
24297
|
+
this.searchFieldInput?.nativeElement.focus();
|
|
25009
24298
|
}, 0);
|
|
25010
24299
|
}
|
|
25011
24300
|
openOverlay() {
|
|
@@ -25111,7 +24400,10 @@ class DropdownMultiselectComponent {
|
|
|
25111
24400
|
matExpandMore,
|
|
25112
24401
|
matExpandLess,
|
|
25113
24402
|
}),
|
|
25114
|
-
|
|
24403
|
+
provideNgIconsConfig({
|
|
24404
|
+
size: '1.5rem',
|
|
24405
|
+
}),
|
|
24406
|
+
], viewQueries: [{ propertyName: "overlayOrigin", first: true, predicate: ["overlayOrigin"], descendants: true }, { propertyName: "overlay", first: true, predicate: CdkConnectedOverlay, descendants: true }, { propertyName: "overlayContainer", first: true, predicate: ["overlayContainer"], descendants: true, read: ElementRef }, { propertyName: "searchFieldInput", first: true, predicate: ["searchFieldInput"], descendants: true }, { propertyName: "checkboxes", predicate: ["checkBox"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"bg-background w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\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 (hasSelectedChoices) {\n <div\n class=\"gn-ui-multiselect-counter shrink-0 rounded-full font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n }\n </div>\n <button\n class=\"h-6 w-6 flex items-center justify-center\"\n data-test=\"dropdown-clear\"\n >\n @if (hasSelectedChoices && !overlayOpen) {\n <ng-icon\n class=\"shrink-0 opacity-40 hover:opacity-80 transition-colors clear-btn\"\n (click)=\"clearSelection($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-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.min-width]=\"overlayMinWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row gap-1 flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n @for (selected of selectedChoices; track selected) {\n <button\n type=\"button\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <ng-icon\n name=\"matClose\"\n class=\"!h-[12px] !w-[11px] text-[12px]\"\n ></ng-icon>\n </div>\n </button>\n }\n\n @if (allowSearch) {\n <div class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n @if (!!searchInputValue) {\n <button\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <ng-icon class=\"!h-[10px] !w-[12px] text-[12px]\" name=\"matClose\">\n </ng-icon>\n </button>\n }\n </div>\n }\n </div>\n\n @for (choice of filteredChoicesByText; track choice) {\n <label\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\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: "ngmodule", type: FormsModule }, { 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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
25115
24407
|
}
|
|
25116
24408
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: DropdownMultiselectComponent, decorators: [{
|
|
25117
24409
|
type: Component,
|
|
@@ -25121,7 +24413,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
25121
24413
|
matExpandMore,
|
|
25122
24414
|
matExpandLess,
|
|
25123
24415
|
}),
|
|
25124
|
-
|
|
24416
|
+
provideNgIconsConfig({
|
|
24417
|
+
size: '1.5rem',
|
|
24418
|
+
}),
|
|
24419
|
+
], standalone: true, template: "<gn-ui-button\n type=\"outline\"\n extraClass=\"bg-background w-full !p-[8px] !pl-[16px]\"\n [title]=\"title\"\n [attr.aria-owns]=\"id\"\n (buttonClick)=\"openOverlay()\"\n (keydown)=\"handleTriggerKeydown($event)\"\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 (hasSelectedChoices) {\n <div\n class=\"gn-ui-multiselect-counter shrink-0 rounded-full font-bold text-[12px] w-5 h-5 flex items-center justify-center mr-1 selected-count\"\n >\n {{ selected.length }}\n </div>\n }\n </div>\n <button\n class=\"h-6 w-6 flex items-center justify-center\"\n data-test=\"dropdown-clear\"\n >\n @if (hasSelectedChoices && !overlayOpen) {\n <ng-icon\n class=\"shrink-0 opacity-40 hover:opacity-80 transition-colors clear-btn\"\n (click)=\"clearSelection($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-300 rounded shadow-lg py-2 w-full overflow-x-hidden overflow-y-auto overlay-container\"\n [style.max-height]=\"overlayMaxHeight\"\n [style.min-width]=\"overlayMinWidth\"\n role=\"listbox\"\n tabindex=\"-1\"\n [attr.id]=\"id\"\n [attr.aria-multiselectable]=\"true\"\n [attr.aria-label]=\"title\"\n (keydown)=\"handleOverlayKeydown($event)\"\n #overlayContainer\n >\n <div\n class=\"border border-gray-300 rounded mb-2 mx-2 min-h-[44px] flex flex-row gap-1 flex-wrap p-2 focus-within:rounded focus-within:border-2 focus-within:border-primary\"\n >\n @for (selected of selectedChoices; track selected) {\n <button\n type=\"button\"\n [title]=\"selected.label\"\n class=\"max-w-full bg-main text-white rounded pr-[7px] flex gap-1 items-center opacity-70 hover:opacity-100 focus:opacity-100 transition-opacity\"\n (click)=\"select(selected, false)\"\n >\n <div class=\"text-sm truncate leading-[26px] px-2\">\n {{ selected.label }}\n </div>\n <div\n class=\"flex items-center justify-center rounded-full bg-white text-main h-[13px] w-[13px] pt-px -mt-px shrink-0\"\n >\n <ng-icon\n name=\"matClose\"\n class=\"!h-[12px] !w-[11px] text-[12px]\"\n ></ng-icon>\n </div>\n </button>\n }\n\n @if (allowSearch) {\n <div class=\"w-[50%] relative grow shrink\">\n <input\n #searchFieldInput\n class=\"w-full px-2 truncate text-[14px] h-full overlaySearchInput focus:outline-none\"\n [(ngModel)]=\"searchInputValue\"\n [placeholder]=\"'multiselect.filter.placeholder' | translate\"\n />\n @if (!!searchInputValue) {\n <button\n class=\"absolute top-1/2 -translate-y-1/2 right-0 px-[7px] leading-tight clear-search-input mr-2\"\n (click)=\"clearSearchInputValue($event)\"\n >\n <ng-icon class=\"!h-[10px] !w-[12px] text-[12px]\" name=\"matClose\">\n </ng-icon>\n </button>\n }\n </div>\n }\n </div>\n\n @for (choice of filteredChoicesByText; track choice) {\n <label\n [title]=\"choice.label\"\n class=\"flex px-5 py-1 w-full text-gray-900 cursor-pointer hover:text-primary-darkest hover:bg-gray-50 focus-within:text-primary-darkest focus-within:bg-gray-50 transition-colors\"\n >\n <input\n class=\"w-[18px] h-[18px] align-text-top shrink-0\"\n type=\"checkbox\"\n #checkBox\n [checked]=\"isSelected(choice)\"\n (change)=\"select(choice, checkBox.checked)\"\n />\n <span class=\"ml-[8px] text-[14px] truncate\">\n {{ choice.label }}\n </span>\n </label>\n }\n </div>\n</ng-template>\n" }]
|
|
25125
24420
|
}], propDecorators: { title: [{
|
|
25126
24421
|
type: Input
|
|
25127
24422
|
}], choices: [{
|
|
@@ -26036,6 +25331,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
26036
25331
|
marker('search.filters.spatialExtent.import');
|
|
26037
25332
|
marker('search.filters.spatialExtent.helpText');
|
|
26038
25333
|
marker('search.filters.spatialExtent.error.title');
|
|
25334
|
+
marker('search.filters.spatialExtent.error.outOfBounds');
|
|
26039
25335
|
const LABEL_FROM_FILE = marker('search.filters.spatialExtent.bboxFromFile');
|
|
26040
25336
|
const LABEL_FROM_FILE_DELETE = marker('search.filters.spatialExtent.bboxFromFileDelete');
|
|
26041
25337
|
const LABEL_INITIAL = marker('search.filters.spatialExtent.bboxInitial');
|
|
@@ -26116,6 +25412,10 @@ class SpatialExtentDropdownComponent {
|
|
|
26116
25412
|
return;
|
|
26117
25413
|
}
|
|
26118
25414
|
const bbox = getGeometryBoundingBox(geometry);
|
|
25415
|
+
if (!isBoundingBoxWithinWorldExtent(bbox)) {
|
|
25416
|
+
this.setError(marker('search.filters.spatialExtent.error.outOfBounds'));
|
|
25417
|
+
return;
|
|
25418
|
+
}
|
|
26119
25419
|
this.bbox = bbox;
|
|
26120
25420
|
this.fileName = file.name;
|
|
26121
25421
|
this.bboxChange.emit(bbox);
|
|
@@ -26153,14 +25453,14 @@ class SpatialExtentDropdownComponent {
|
|
|
26153
25453
|
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: SpatialExtentDropdownComponent, isStandalone: true, selector: "gn-ui-spatial-extent-dropdown", inputs: { title: "title", maxFileSizeMb: "maxFileSizeMb", initialBbox: "initialBbox" }, outputs: { bboxChange: "bboxChange", errorChange: "errorChange" }, providers: [
|
|
26154
25454
|
provideIcons({
|
|
26155
25455
|
iconoirCheckCircle,
|
|
26156
|
-
iconoirImport,
|
|
26157
25456
|
iconoirSquareDashed,
|
|
26158
25457
|
iconoirTrash,
|
|
25458
|
+
iconoirUpload,
|
|
26159
25459
|
matClose,
|
|
26160
25460
|
matExpandLess,
|
|
26161
25461
|
matExpandMore,
|
|
26162
25462
|
}),
|
|
26163
|
-
], 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-[
|
|
25463
|
+
], 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 }); }
|
|
26164
25464
|
}
|
|
26165
25465
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: SpatialExtentDropdownComponent, decorators: [{
|
|
26166
25466
|
type: Component,
|
|
@@ -26173,14 +25473,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
26173
25473
|
], providers: [
|
|
26174
25474
|
provideIcons({
|
|
26175
25475
|
iconoirCheckCircle,
|
|
26176
|
-
iconoirImport,
|
|
26177
25476
|
iconoirSquareDashed,
|
|
26178
25477
|
iconoirTrash,
|
|
25478
|
+
iconoirUpload,
|
|
26179
25479
|
matClose,
|
|
26180
25480
|
matExpandLess,
|
|
26181
25481
|
matExpandMore,
|
|
26182
25482
|
}),
|
|
26183
|
-
], 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-[
|
|
25483
|
+
], 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" }]
|
|
26184
25484
|
}], propDecorators: { title: [{
|
|
26185
25485
|
type: Input
|
|
26186
25486
|
}], maxFileSizeMb: [{
|
|
@@ -26706,11 +26006,11 @@ class BlockListComponent {
|
|
|
26706
26006
|
this.goToPage(this.currentPage + 1);
|
|
26707
26007
|
}
|
|
26708
26008
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: BlockListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
26709
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: BlockListComponent, isStandalone: true, selector: "gn-ui-block-list", inputs: { containerClass: "containerClass", paginationContainerClass: "paginationContainerClass" }, outputs: { listChanges: "listChanges" }, host: { listeners: { "window:resize": "onResize()" } }, queries: [{ propertyName: "blocks", predicate: ["block"], read: ElementRef }], viewQueries: [{ propertyName: "blockContainer", first: true, predicate: ["blockContainer"], descendants: true }], ngImport: i0, template: "<div\n class=\"grid gap-4 w-full sm:grid-cols-2\"\n #blockContainer\n [ngClass]=\"[containerClass, 'size-' + subComponentSize]\"\n>\n <ng-content></ng-content>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + paginationContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host .block-list-container ::ng-deep>*{flex-shrink:0}:host{position:relative}@media screen and (min-width: 769px){.size-L{grid-template-columns:repeat(1,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-M{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-S{grid-template-columns:repeat(3,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-XS{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}}\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 }); }
|
|
26009
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: BlockListComponent, isStandalone: true, selector: "gn-ui-block-list", inputs: { containerClass: "containerClass", paginationContainerClass: "paginationContainerClass" }, outputs: { listChanges: "listChanges" }, host: { listeners: { "window:resize": "onResize()" } }, queries: [{ propertyName: "blocks", predicate: ["block"], read: ElementRef }], viewQueries: [{ propertyName: "blockContainer", first: true, predicate: ["blockContainer"], descendants: true }], ngImport: i0, template: "<div\n class=\"grid gap-4 w-full sm:grid-cols-2\"\n #blockContainer\n [ngClass]=\"[containerClass, 'size-' + subComponentSize]\"\n>\n <ng-content></ng-content>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + paginationContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host .block-list-container ::ng-deep>*{flex-shrink:0}:host{display:block;position:relative}@media screen and (min-width: 769px){.size-L{grid-template-columns:repeat(1,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-M{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-S{grid-template-columns:repeat(3,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-XS{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}}\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 }); }
|
|
26710
26010
|
}
|
|
26711
26011
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: BlockListComponent, decorators: [{
|
|
26712
26012
|
type: Component,
|
|
26713
|
-
args: [{ selector: 'gn-ui-block-list', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, PaginationDotsComponent], template: "<div\n class=\"grid gap-4 w-full sm:grid-cols-2\"\n #blockContainer\n [ngClass]=\"[containerClass, 'size-' + subComponentSize]\"\n>\n <ng-content></ng-content>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + paginationContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host .block-list-container ::ng-deep>*{flex-shrink:0}:host{position:relative}@media screen and (min-width: 769px){.size-L{grid-template-columns:repeat(1,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-M{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-S{grid-template-columns:repeat(3,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-XS{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}}\n"] }]
|
|
26013
|
+
args: [{ selector: 'gn-ui-block-list', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, PaginationDotsComponent], template: "<div\n class=\"grid gap-4 w-full sm:grid-cols-2\"\n #blockContainer\n [ngClass]=\"[containerClass, 'size-' + subComponentSize]\"\n>\n <ng-content></ng-content>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + paginationContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host .block-list-container ::ng-deep>*{flex-shrink:0}:host{display:block;position:relative}@media screen and (min-width: 769px){.size-L{grid-template-columns:repeat(1,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-M{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-S{grid-template-columns:repeat(3,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-XS{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}}\n"] }]
|
|
26714
26014
|
}], propDecorators: { containerClass: [{
|
|
26715
26015
|
type: Input
|
|
26716
26016
|
}], paginationContainerClass: [{
|
|
@@ -27449,9 +26749,7 @@ const initSearch = () => {
|
|
|
27449
26749
|
},
|
|
27450
26750
|
params: {
|
|
27451
26751
|
filters: {},
|
|
27452
|
-
pageSize:
|
|
27453
|
-
? getOptionalSearchConfig().LIMIT
|
|
27454
|
-
: DEFAULT_PAGE_SIZE,
|
|
26752
|
+
pageSize: DEFAULT_PAGE_SIZE,
|
|
27455
26753
|
currentPage: 0,
|
|
27456
26754
|
favoritesOnly: false,
|
|
27457
26755
|
useSpatialFilter: true,
|
|
@@ -27900,6 +27198,70 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
27900
27198
|
}]
|
|
27901
27199
|
}] });
|
|
27902
27200
|
|
|
27201
|
+
const DEFAULT_GEOCODING_PROVIDER = [
|
|
27202
|
+
'geonames',
|
|
27203
|
+
{ maxRows: 5 },
|
|
27204
|
+
];
|
|
27205
|
+
const GEOCODING_PROVIDER = new InjectionToken('geocoding-provider', {
|
|
27206
|
+
providedIn: 'root',
|
|
27207
|
+
factory: () => DEFAULT_GEOCODING_PROVIDER,
|
|
27208
|
+
});
|
|
27209
|
+
class GeocodingService {
|
|
27210
|
+
constructor() {
|
|
27211
|
+
this.provider = inject(GEOCODING_PROVIDER);
|
|
27212
|
+
}
|
|
27213
|
+
query(text) {
|
|
27214
|
+
let queryObservable;
|
|
27215
|
+
switch (this.provider[0]) {
|
|
27216
|
+
case 'geoadmin':
|
|
27217
|
+
queryObservable = from(queryGeoadmin(text, this.provider[1]));
|
|
27218
|
+
break;
|
|
27219
|
+
case 'geonames':
|
|
27220
|
+
queryObservable = from(queryGeonames(text, this.provider[1]));
|
|
27221
|
+
break;
|
|
27222
|
+
case 'geoplateforme':
|
|
27223
|
+
queryObservable = from(queryGeoplateforme(text, this.provider[1]));
|
|
27224
|
+
break;
|
|
27225
|
+
default:
|
|
27226
|
+
return throwError(() => new Error(`Unsupported geocoding provider: ${this.provider[0]}`));
|
|
27227
|
+
}
|
|
27228
|
+
return queryObservable.pipe(catchError((error) => throwError(error)));
|
|
27229
|
+
}
|
|
27230
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: GeocodingService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
27231
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: GeocodingService, providedIn: 'root' }); }
|
|
27232
|
+
}
|
|
27233
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: GeocodingService, decorators: [{
|
|
27234
|
+
type: Injectable,
|
|
27235
|
+
args: [{
|
|
27236
|
+
providedIn: 'root',
|
|
27237
|
+
}]
|
|
27238
|
+
}] });
|
|
27239
|
+
|
|
27240
|
+
class LocationSearchComponent {
|
|
27241
|
+
constructor() {
|
|
27242
|
+
this.geocodingService = inject(GeocodingService);
|
|
27243
|
+
this.placeholder = '';
|
|
27244
|
+
this.resultSelected = new EventEmitter();
|
|
27245
|
+
this.displayWithFn = (item) => item.label;
|
|
27246
|
+
this.searchAction = (text) => this.geocodingService.query(text);
|
|
27247
|
+
}
|
|
27248
|
+
handleItemSelected(item) {
|
|
27249
|
+
this.resultSelected.emit(item);
|
|
27250
|
+
}
|
|
27251
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: LocationSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
27252
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: LocationSearchComponent, isStandalone: true, selector: "gn-ui-location-search", inputs: { placeholder: "placeholder", displayWithTemplate: "displayWithTemplate" }, outputs: { resultSelected: "resultSelected" }, ngImport: i0, template: "<gn-ui-autocomplete\n [action]=\"searchAction\"\n [displayWithFn]=\"displayWithFn\"\n [placeholder]=\"placeholder\"\n [displayWithTemplate]=\"displayWithTemplate\"\n (itemSelected)=\"handleItemSelected($event)\"\n>\n</gn-ui-autocomplete>\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 }); }
|
|
27253
|
+
}
|
|
27254
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: LocationSearchComponent, decorators: [{
|
|
27255
|
+
type: Component,
|
|
27256
|
+
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]=\"displayWithTemplate\"\n (itemSelected)=\"handleItemSelected($event)\"\n>\n</gn-ui-autocomplete>\n" }]
|
|
27257
|
+
}], propDecorators: { placeholder: [{
|
|
27258
|
+
type: Input
|
|
27259
|
+
}], displayWithTemplate: [{
|
|
27260
|
+
type: Input
|
|
27261
|
+
}], resultSelected: [{
|
|
27262
|
+
type: Output
|
|
27263
|
+
}] } });
|
|
27264
|
+
|
|
27903
27265
|
// expects the replacement key ${uuid}
|
|
27904
27266
|
const RECORD_DATASET_URL_TOKEN = new InjectionToken('record-dataset-url-token');
|
|
27905
27267
|
const RECORD_SERVICE_URL_TOKEN = new InjectionToken('record-service-url-token');
|
|
@@ -28368,15 +27730,26 @@ class DateRangeSearchField extends SimpleSearchField {
|
|
|
28368
27730
|
return 'dateRange';
|
|
28369
27731
|
}
|
|
28370
27732
|
}
|
|
27733
|
+
// treats a resource's creation/revision dates as an interval (its min and max), so a record matches
|
|
27734
|
+
// when that interval intersects the filter range, not just when a single date falls inside it
|
|
28371
27735
|
class ResourceCreationRevisionDateSearchField extends DateRangeSearchField {
|
|
28372
27736
|
constructor(injector, order = 'desc') {
|
|
28373
27737
|
super('resourceCreationRevisionDate', injector, order);
|
|
28374
|
-
|
|
28375
|
-
|
|
28376
|
-
|
|
28377
|
-
|
|
28378
|
-
|
|
28379
|
-
|
|
27738
|
+
const dateSourceFields = [
|
|
27739
|
+
'creationDateForResource',
|
|
27740
|
+
'revisionDateForResource',
|
|
27741
|
+
];
|
|
27742
|
+
const collectSortedDates = dateSourceFields
|
|
27743
|
+
.map((field) => `if (doc.containsKey('${field}')) {
|
|
27744
|
+
for (def date : doc['${field}']) { dates.add(date.millis); }
|
|
27745
|
+
}`)
|
|
27746
|
+
.join('\n');
|
|
27747
|
+
this.esService.registerRuntimeField('resourceCreationRevisionDateMin', `def dates = [];
|
|
27748
|
+
${collectSortedDates}
|
|
27749
|
+
if (dates.length > 0) { dates.sort(null); emit(dates[0]); }`, 'date');
|
|
27750
|
+
this.esService.registerRuntimeField('resourceCreationRevisionDateMax', `def dates = [];
|
|
27751
|
+
${collectSortedDates}
|
|
27752
|
+
if (dates.length > 0) { dates.sort(null); emit(dates[dates.length - 1]); }`, 'date');
|
|
28380
27753
|
}
|
|
28381
27754
|
}
|
|
28382
27755
|
class BoundingBoxSearchField extends SimpleSearchField {
|
|
@@ -31820,6 +31193,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
31820
31193
|
], 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" }]
|
|
31821
31194
|
}] });
|
|
31822
31195
|
|
|
31196
|
+
// in MB, null means no limit
|
|
31197
|
+
const SPATIAL_EXTENT_MAX_FILE_SIZE = new InjectionToken('spatialExtentMaxFileSize', { factory: () => null });
|
|
31823
31198
|
class FilterDropdownComponent {
|
|
31824
31199
|
constructor() {
|
|
31825
31200
|
this.searchFacade = inject(SearchFacade);
|
|
@@ -31827,7 +31202,7 @@ class FilterDropdownComponent {
|
|
|
31827
31202
|
this.fieldsService = inject(FieldsService);
|
|
31828
31203
|
this.notificationsService = inject(NotificationsService);
|
|
31829
31204
|
this.translateService = inject(TranslateService);
|
|
31830
|
-
this.spatialExtentMaxFileSize =
|
|
31205
|
+
this.spatialExtentMaxFileSize = inject(SPATIAL_EXTENT_MAX_FILE_SIZE);
|
|
31831
31206
|
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([])));
|
|
31832
31207
|
this.selectedDateRange$ = this.selected$.pipe(map$1((selected) => (Array.isArray(selected) ? {} : selected)));
|
|
31833
31208
|
this.selectedBoundingBox$ = this.selected$.pipe(map$1((selected) => Array.isArray(selected) && selected.length > 0
|
|
@@ -31948,7 +31323,7 @@ class FuzzySearchComponent {
|
|
|
31948
31323
|
this.isSearchActive.emit(event);
|
|
31949
31324
|
}
|
|
31950
31325
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: FuzzySearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
31951
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: FuzzySearchComponent, isStandalone: true, selector: "gn-ui-fuzzy-search", inputs: { autoFocus: "autoFocus", forceTrackPosition: "forceTrackPosition", enterButton: "enterButton", placeholder: "placeholder" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted", isSearchActive: "isSearchActive" }, viewQueries: [{ propertyName: "autocomplete", first: true, predicate: AutocompleteComponent, descendants: true }], ngImport: i0, template: "<gn-ui-autocomplete\n [placeholder]=\"placeholder ?? ('search.field.any.placeholder' | translate)\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n (inputSubmitted)=\"handleInputSubmission($event)\"\n (inputCleared)=\"handleInputCleared()\"\n (isSearchActive)=\"handleSearchActive($event)\"\n [value]=\"searchInputValue$ | async\"\n [preventCompleteOnSelection]=\"true\"\n [autoFocus]=\"autoFocus\"\n [allowSubmit]=\"true\"\n [forceTrackPosition]=\"forceTrackPosition\"\n [enterButton]=\"enterButton\"\n></gn-ui-autocomplete>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: ["placeholder", "enterButton", "action", "value", "clearOnSelection", "preventCompleteOnSelection", "autoFocus", "minCharacterCount", "allowSubmit", "forceTrackPosition", "displayWithFn"], outputs: ["itemSelected", "inputSubmitted", "inputCleared", "isSearchActive"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
31326
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.19", type: FuzzySearchComponent, isStandalone: true, selector: "gn-ui-fuzzy-search", inputs: { autoFocus: "autoFocus", forceTrackPosition: "forceTrackPosition", enterButton: "enterButton", placeholder: "placeholder" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted", isSearchActive: "isSearchActive" }, viewQueries: [{ propertyName: "autocomplete", first: true, predicate: AutocompleteComponent, descendants: true }], ngImport: i0, template: "<gn-ui-autocomplete\n [placeholder]=\"placeholder ?? ('search.field.any.placeholder' | translate)\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n (inputSubmitted)=\"handleInputSubmission($event)\"\n (inputCleared)=\"handleInputCleared()\"\n (isSearchActive)=\"handleSearchActive($event)\"\n [value]=\"searchInputValue$ | async\"\n [preventCompleteOnSelection]=\"true\"\n [autoFocus]=\"autoFocus\"\n [allowSubmit]=\"true\"\n [forceTrackPosition]=\"forceTrackPosition\"\n [enterButton]=\"enterButton\"\n></gn-ui-autocomplete>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { 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"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
31952
31327
|
}
|
|
31953
31328
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: FuzzySearchComponent, decorators: [{
|
|
31954
31329
|
type: Component,
|
|
@@ -32889,95 +32264,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
32889
32264
|
], template: "<div\n class=\"bg-white rounded shadow shadow-lg relative h-full w-[400px] overflow-hidden\"\n>\n <div class=\"p-3 border-b border-gray-300 flex items-center\">\n <ng-icon class=\"mr-2\" name=\"matLayersOutline\"></ng-icon>\n <span translate>map.layers.list</span>\n </div>\n <div class=\"flex flex-col px-4 divide-y divide-y-gray-50\">\n @for (layer of layers$ | async; track layer; let index = $index) {\n <div class=\"flex flex-row py-3\">\n <ng-icon class=\"-ml-2 mr-2 shrink-0\" name=\"matChevronRight\"></ng-icon>\n <span class=\"mr-2 grow\">{{ layer.label }}</span>\n <a\n href\n class=\"underline text-sm text-red-700 hover:text-red-900\"\n (click)=\"deleteLayer(index); $event.preventDefault()\"\n >\n delete\n </a>\n </div>\n }\n </div>\n <gn-ui-expandable-panel-button [titleTemplate]=\"addLayerTitle\">\n <mat-tab-group animationDuration=\"200ms\" class=\"h-full\">\n <mat-tab [label]=\"'map.add.layer.catalog' | translate\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-catalog></gn-ui-add-layer-from-catalog>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wms' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-wms></gn-ui-add-layer-from-wms>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.wfs' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-wfs></gn-ui-add-layer-from-wfs>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.ogc.api' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-ogc-api\n [ogcUrl]=\"ogcUrl\"\n (layerAdded)=\"addLayer($event)\"\n ></gn-ui-add-layer-from-ogc-api>\n </div>\n </mat-tab>\n <mat-tab [label]=\"'map.add.layer.file' | translate\" bodyClass=\"h-full\">\n <div class=\"p-3\">\n <gn-ui-add-layer-from-file></gn-ui-add-layer-from-file>\n </div>\n </mat-tab>\n </mat-tab-group>\n </gn-ui-expandable-panel-button>\n</div>\n\n<ng-template #addLayerTitle>\n <ng-icon class=\"mr-4\" name=\"matAddCircleOutlineOutline\"> </ng-icon>\n <span translate>map.add.layer</span>\n</ng-template>\n" }]
|
|
32890
32265
|
}] });
|
|
32891
32266
|
|
|
32892
|
-
class GeocodingComponent {
|
|
32893
|
-
constructor() {
|
|
32894
|
-
this.mapFacade = inject(MapFacade);
|
|
32895
|
-
this.geocodingService = inject(GeocodingService);
|
|
32896
|
-
this.searchText = '';
|
|
32897
|
-
this.results = [];
|
|
32898
|
-
this.searchTextChanged = new Subject();
|
|
32899
|
-
this.destroy$ = new Subject();
|
|
32900
|
-
this.errorMessage = null;
|
|
32901
|
-
this.searchTextChanged
|
|
32902
|
-
.pipe(debounceTime(300), switchMap$1((searchText) => {
|
|
32903
|
-
return from(this.geocodingService.query(searchText)).pipe(catchError$1((error) => {
|
|
32904
|
-
this.errorMessage =
|
|
32905
|
-
'An error occurred while searching. Please try again.';
|
|
32906
|
-
console.error(error);
|
|
32907
|
-
return [];
|
|
32908
|
-
}));
|
|
32909
|
-
}), takeUntil(this.destroy$))
|
|
32910
|
-
.subscribe((results) => {
|
|
32911
|
-
this.results = results;
|
|
32912
|
-
});
|
|
32913
|
-
}
|
|
32914
|
-
ngOnDestroy() {
|
|
32915
|
-
this.destroy$.next();
|
|
32916
|
-
this.destroy$.complete();
|
|
32917
|
-
}
|
|
32918
|
-
onSearchChange(searchText) {
|
|
32919
|
-
if (!searchText) {
|
|
32920
|
-
this.clearSearch();
|
|
32921
|
-
return;
|
|
32922
|
-
}
|
|
32923
|
-
else {
|
|
32924
|
-
this.searchTextChanged.next(searchText);
|
|
32925
|
-
}
|
|
32926
|
-
}
|
|
32927
|
-
clearSearch() {
|
|
32928
|
-
this.searchText = '';
|
|
32929
|
-
this.results = [];
|
|
32930
|
-
this.errorMessage = null;
|
|
32931
|
-
}
|
|
32932
|
-
async zoomToLocation(result) {
|
|
32933
|
-
const geometry = result.geom;
|
|
32934
|
-
if (geometry.type === 'Point') {
|
|
32935
|
-
await this.zoomToPoint(geometry.coordinates);
|
|
32936
|
-
}
|
|
32937
|
-
else if (geometry.type === 'Polygon') {
|
|
32938
|
-
await this.zoomToPolygon(geometry.coordinates);
|
|
32939
|
-
}
|
|
32940
|
-
else {
|
|
32941
|
-
console.error(`Unsupported geometry type: ${geometry.type}`);
|
|
32942
|
-
}
|
|
32943
|
-
}
|
|
32944
|
-
async zoomToPoint(pointCoords) {
|
|
32945
|
-
const context = await firstValueFrom(this.mapFacade.context$);
|
|
32946
|
-
const view = {
|
|
32947
|
-
center: pointCoords,
|
|
32948
|
-
zoom: 10,
|
|
32949
|
-
};
|
|
32950
|
-
this.mapFacade.applyContext({
|
|
32951
|
-
...context,
|
|
32952
|
-
view,
|
|
32953
|
-
});
|
|
32954
|
-
}
|
|
32955
|
-
async zoomToPolygon(polygonCoords) {
|
|
32956
|
-
const context = await firstValueFrom(this.mapFacade.context$);
|
|
32957
|
-
const view = {
|
|
32958
|
-
geometry: {
|
|
32959
|
-
type: 'Polygon',
|
|
32960
|
-
coordinates: polygonCoords,
|
|
32961
|
-
},
|
|
32962
|
-
};
|
|
32963
|
-
this.mapFacade.applyContext({
|
|
32964
|
-
...context,
|
|
32965
|
-
view,
|
|
32966
|
-
});
|
|
32967
|
-
}
|
|
32968
|
-
onEnterPress() {
|
|
32969
|
-
if (this.results && this.results.length > 0) {
|
|
32970
|
-
this.zoomToLocation(this.results[0]);
|
|
32971
|
-
}
|
|
32972
|
-
}
|
|
32973
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: GeocodingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
32974
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: GeocodingComponent, isStandalone: true, selector: "gn-ui-geocoding", ngImport: i0, template: "<gn-ui-search-input\n [(value)]=\"searchText\"\n (valueChange)=\"onSearchChange($event)\"\n (keyup.enter)=\"onEnterPress()\"\n [placeholder]=\"'map.geocoding.placeholder' | translate\"\n>\n</gn-ui-search-input>\n@if (results && results.length) {\n <ul\n class=\"bg-gray-50 border border-gray-200 w-full mt-2 shadow-sm rounded-lg\"\n >\n @for (result of results; track result) {\n <li\n (click)=\"zoomToLocation(result)\"\n class=\"flex items-center pl-8 pr-4 py-2 border-b border-gray-200 relative cursor-pointer hover:bg-blue-100 hover:text-gray-800 transition duration-300 ease-in-out\"\n >\n <svg\n class=\"stroke-current text-blue-500 absolute w-5 h-5 left-3 top-3\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\"\n />\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n <span class=\"font-sans font-semibold ml-4\">{{ result.label }}</span>\n </li>\n }\n </ul>\n}\n", styles: [""], dependencies: [{ kind: "component", type: SearchInputComponent, selector: "gn-ui-search-input", inputs: ["value", "placeholder"], outputs: ["valueChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
|
|
32975
|
-
}
|
|
32976
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: GeocodingComponent, decorators: [{
|
|
32977
|
-
type: Component,
|
|
32978
|
-
args: [{ selector: 'gn-ui-geocoding', standalone: true, imports: [SearchInputComponent, TranslatePipe], template: "<gn-ui-search-input\n [(value)]=\"searchText\"\n (valueChange)=\"onSearchChange($event)\"\n (keyup.enter)=\"onEnterPress()\"\n [placeholder]=\"'map.geocoding.placeholder' | translate\"\n>\n</gn-ui-search-input>\n@if (results && results.length) {\n <ul\n class=\"bg-gray-50 border border-gray-200 w-full mt-2 shadow-sm rounded-lg\"\n >\n @for (result of results; track result) {\n <li\n (click)=\"zoomToLocation(result)\"\n class=\"flex items-center pl-8 pr-4 py-2 border-b border-gray-200 relative cursor-pointer hover:bg-blue-100 hover:text-gray-800 transition duration-300 ease-in-out\"\n >\n <svg\n class=\"stroke-current text-blue-500 absolute w-5 h-5 left-3 top-3\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z\"\n />\n <path\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n stroke-width=\"2\"\n d=\"M15 11a3 3 0 11-6 0 3 3 0 016 0z\"\n />\n </svg>\n <span class=\"font-sans font-semibold ml-4\">{{ result.label }}</span>\n </li>\n }\n </ul>\n}\n" }]
|
|
32979
|
-
}], ctorParameters: () => [] });
|
|
32980
|
-
|
|
32981
32267
|
/*
|
|
32982
32268
|
Metadata actions
|
|
32983
32269
|
*/
|
|
@@ -38022,7 +37308,7 @@ class GenericKeywordsComponent {
|
|
|
38022
37308
|
this.deletedKeyword.emit(keyword);
|
|
38023
37309
|
}
|
|
38024
37310
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: GenericKeywordsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
38025
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: GenericKeywordsComponent, isStandalone: true, selector: "gn-ui-generic-keywords", inputs: { keywords: "keywords", keywordTypes: "keywordTypes", placeholder: "placeholder", allowSubmit: "allowSubmit" }, outputs: { changedKeywords: "changedKeywords", addedKeyword: "addedKeyword", deletedKeyword: "deletedKeyword" }, ngImport: i0, template: "<div class=\"flex flex-col gap-4\">\n <gn-ui-autocomplete\n [placeholder]=\"placeholder\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n [preventCompleteOnSelection]=\"false\"\n [minCharacterCount]=\"1\"\n [allowSubmit]=\"false\"\n [clearOnSelection]=\"true\"\n ></gn-ui-autocomplete>\n <div class=\"flex gap-2 flex-wrap\">\n @for (keyword of keywords; track keyword) {\n <gn-ui-keyword-badge\n [keyword]=\"keyword\"\n [editable]=\"true\"\n (keywordRemove)=\"removeKeyword($event)\"\n ></gn-ui-keyword-badge>\n }\n </div>\n</div>\n", dependencies: [{ kind: "component", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: ["placeholder", "enterButton", "action", "value", "clearOnSelection", "preventCompleteOnSelection", "autoFocus", "minCharacterCount", "allowSubmit", "forceTrackPosition", "displayWithFn"], outputs: ["itemSelected", "inputSubmitted", "inputCleared", "isSearchActive"] }, { kind: "component", type: KeywordBadgeComponent, selector: "gn-ui-keyword-badge", inputs: ["keyword", "editable"], outputs: ["keywordClick", "keywordRemove"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
37311
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: GenericKeywordsComponent, isStandalone: true, selector: "gn-ui-generic-keywords", inputs: { keywords: "keywords", keywordTypes: "keywordTypes", placeholder: "placeholder", allowSubmit: "allowSubmit" }, outputs: { changedKeywords: "changedKeywords", addedKeyword: "addedKeyword", deletedKeyword: "deletedKeyword" }, ngImport: i0, template: "<div class=\"flex flex-col gap-4\">\n <gn-ui-autocomplete\n [placeholder]=\"placeholder\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n [preventCompleteOnSelection]=\"false\"\n [minCharacterCount]=\"1\"\n [allowSubmit]=\"false\"\n [clearOnSelection]=\"true\"\n ></gn-ui-autocomplete>\n <div class=\"flex gap-2 flex-wrap\">\n @for (keyword of keywords; track keyword) {\n <gn-ui-keyword-badge\n [keyword]=\"keyword\"\n [editable]=\"true\"\n (keywordRemove)=\"removeKeyword($event)\"\n ></gn-ui-keyword-badge>\n }\n </div>\n</div>\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"] }, { kind: "component", type: KeywordBadgeComponent, selector: "gn-ui-keyword-badge", inputs: ["keyword", "editable"], outputs: ["keywordClick", "keywordRemove"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
38026
37312
|
}
|
|
38027
37313
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: GenericKeywordsComponent, decorators: [{
|
|
38028
37314
|
type: Component,
|
|
@@ -38614,7 +37900,7 @@ class FormFieldContactsForResourceComponent {
|
|
|
38614
37900
|
provideNgIconsConfig({
|
|
38615
37901
|
size: '1.5rem',
|
|
38616
37902
|
}),
|
|
38617
|
-
], usesOnChanges: true, ngImport: i0, template: "<div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-row flex-wrap gap-2\" data-test=\"rolesToPick\">\n @for (role of rolesToPick; track role) {\n <gn-ui-button type=\"gray\" (buttonClick)=\"addRoleToDisplay(role)\">\n <ng-icon name=\"iconoirPlus\" class=\"text-primary\"></ng-icon>\n \n <span translate>{{ roleToLabel(role) }}</span>\n </gn-ui-button>\n }\n </div>\n @if (value.length === 0) {\n <div\n class=\"p-4 border border-primary bg-primary-lightest rounded-lg\"\n translate\n >\n editor.record.form.field.contactsForResource.noContact\n </div>\n }\n @if (roleSectionsToDisplay && roleSectionsToDisplay.length > 0) {\n <div class=\"mt-8\" data-test=\"displayedRoles\">\n @for (\n role of roleSectionsToDisplay;\n track role;\n let index = $index;\n let isLast = $last\n ) {\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row justify-between\">\n <span class=\"font-bold text-base\" translate>{{\n roleToLabel(role)\n }}</span>\n </div>\n @if (role !== 'unspecified' && role !== 'other') {\n <gn-ui-autocomplete\n [placeholder]=\"\n 'editor.record.form.field.contactsForResource.placeholder'\n | translate\n \"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"addContact($event, role)\"\n [displayWithFn]=\"displayWithFn\"\n [minCharacterCount]=\"1\"\n [clearOnSelection]=\"true\"\n [allowSubmit]=\"false\"\n >\n </gn-ui-autocomplete>\n }\n @if (contactsForRessourceByRole.get(role); as contacts) {\n <gn-ui-sortable-list\n [items]=\"contacts\"\n (itemsOrderChange)=\"handleContactsChanged($event, role)\"\n [elementTemplate]=\"contactTemplate\"\n ></gn-ui-sortable-list>\n <ng-template #contactTemplate let-contact>\n <gn-ui-contact-card [contact]=\"contact\"></gn-ui-contact-card>\n </ng-template>\n }\n @if (!isLast) {\n <hr class=\"border-t-[#D6D3D1] mt-4 mb-6\" />\n }\n </div>\n }\n </div>\n }\n</div>\n", styles: [":host{--gn-ui-button-padding: 8px 8px;--gn-ui-button-rounded: 8px}\n"], dependencies: [{ kind: "component", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: ["placeholder", "enterButton", "action", "value", "clearOnSelection", "preventCompleteOnSelection", "autoFocus", "minCharacterCount", "allowSubmit", "forceTrackPosition", "displayWithFn"], outputs: ["itemSelected", "inputSubmitted", "inputCleared", "isSearchActive"] }, { kind: "component", type: ContactCardComponent, selector: "gn-ui-contact-card", inputs: ["contact"] }, { kind: "component", type: SortableListComponent, selector: "gn-ui-sortable-list", inputs: ["elementTemplate", "items"], outputs: ["itemsOrderChange"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
37903
|
+
], usesOnChanges: true, ngImport: i0, template: "<div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-row flex-wrap gap-2\" data-test=\"rolesToPick\">\n @for (role of rolesToPick; track role) {\n <gn-ui-button type=\"gray\" (buttonClick)=\"addRoleToDisplay(role)\">\n <ng-icon name=\"iconoirPlus\" class=\"text-primary\"></ng-icon>\n \n <span translate>{{ roleToLabel(role) }}</span>\n </gn-ui-button>\n }\n </div>\n @if (value.length === 0) {\n <div\n class=\"p-4 border border-primary bg-primary-lightest rounded-lg\"\n translate\n >\n editor.record.form.field.contactsForResource.noContact\n </div>\n }\n @if (roleSectionsToDisplay && roleSectionsToDisplay.length > 0) {\n <div class=\"mt-8\" data-test=\"displayedRoles\">\n @for (\n role of roleSectionsToDisplay;\n track role;\n let index = $index;\n let isLast = $last\n ) {\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row justify-between\">\n <span class=\"font-bold text-base\" translate>{{\n roleToLabel(role)\n }}</span>\n </div>\n @if (role !== 'unspecified' && role !== 'other') {\n <gn-ui-autocomplete\n [placeholder]=\"\n 'editor.record.form.field.contactsForResource.placeholder'\n | translate\n \"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"addContact($event, role)\"\n [displayWithFn]=\"displayWithFn\"\n [minCharacterCount]=\"1\"\n [clearOnSelection]=\"true\"\n [allowSubmit]=\"false\"\n >\n </gn-ui-autocomplete>\n }\n @if (contactsForRessourceByRole.get(role); as contacts) {\n <gn-ui-sortable-list\n [items]=\"contacts\"\n (itemsOrderChange)=\"handleContactsChanged($event, role)\"\n [elementTemplate]=\"contactTemplate\"\n ></gn-ui-sortable-list>\n <ng-template #contactTemplate let-contact>\n <gn-ui-contact-card [contact]=\"contact\"></gn-ui-contact-card>\n </ng-template>\n }\n @if (!isLast) {\n <hr class=\"border-t-[#D6D3D1] mt-4 mb-6\" />\n }\n </div>\n }\n </div>\n }\n</div>\n", styles: [":host{--gn-ui-button-padding: 8px 8px;--gn-ui-button-rounded: 8px}\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"] }, { kind: "component", type: ContactCardComponent, selector: "gn-ui-contact-card", inputs: ["contact"] }, { kind: "component", type: SortableListComponent, selector: "gn-ui-sortable-list", inputs: ["elementTemplate", "items"], outputs: ["itemsOrderChange"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
38618
37904
|
}
|
|
38619
37905
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: FormFieldContactsForResourceComponent, decorators: [{
|
|
38620
37906
|
type: Component,
|
|
@@ -38714,7 +38000,7 @@ class FormFieldContactsComponent {
|
|
|
38714
38000
|
this.subscription.unsubscribe();
|
|
38715
38001
|
}
|
|
38716
38002
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: FormFieldContactsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
38717
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: FormFieldContactsComponent, isStandalone: true, selector: "gn-ui-form-field-contacts", inputs: { value: "value", modelSpecifier: "modelSpecifier" }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"flex flex-col gap-3\">\n <gn-ui-autocomplete\n [placeholder]=\"'editor.record.form.field.contacts.placeholder' | translate\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"addContact($event)\"\n [displayWithFn]=\"displayWithFn\"\n [minCharacterCount]=\"1\"\n [clearOnSelection]=\"true\"\n >\n </gn-ui-autocomplete>\n\n @if (contacts.length > 0) {\n <gn-ui-sortable-list\n [items]=\"contacts\"\n (itemsOrderChange)=\"handleContactsChanged($event)\"\n [elementTemplate]=\"contactTemplate\"\n ></gn-ui-sortable-list>\n <ng-template #contactTemplate let-contact let-index=\"index\">\n @if (modelSpecifier === 'contact:editableDetails') {\n <gn-ui-contact-details-form\n [contact]=\"contact\"\n (contactChange)=\"handleContactChanged($event, index)\"\n ></gn-ui-contact-details-form>\n } @else {\n <gn-ui-contact-card [contact]=\"contact\"></gn-ui-contact-card>\n }\n </ng-template>\n } @else {\n <div\n class=\"p-4 text-sm border border-primary bg-primary-lightest rounded-lg\"\n translate\n >\n editor.record.form.field.contacts.noContact\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: ["placeholder", "enterButton", "action", "value", "clearOnSelection", "preventCompleteOnSelection", "autoFocus", "minCharacterCount", "allowSubmit", "forceTrackPosition", "displayWithFn"], outputs: ["itemSelected", "inputSubmitted", "inputCleared", "isSearchActive"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ContactCardComponent, selector: "gn-ui-contact-card", inputs: ["contact"] }, { kind: "component", type: ContactDetailsFormComponent, selector: "gn-ui-contact-details-form", inputs: ["contact"], outputs: ["contactChange"] }, { kind: "component", type: SortableListComponent, selector: "gn-ui-sortable-list", inputs: ["elementTemplate", "items"], outputs: ["itemsOrderChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
38003
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.19", type: FormFieldContactsComponent, isStandalone: true, selector: "gn-ui-form-field-contacts", inputs: { value: "value", modelSpecifier: "modelSpecifier" }, outputs: { valueChange: "valueChange" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"flex flex-col gap-3\">\n <gn-ui-autocomplete\n [placeholder]=\"'editor.record.form.field.contacts.placeholder' | translate\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"addContact($event)\"\n [displayWithFn]=\"displayWithFn\"\n [minCharacterCount]=\"1\"\n [clearOnSelection]=\"true\"\n >\n </gn-ui-autocomplete>\n\n @if (contacts.length > 0) {\n <gn-ui-sortable-list\n [items]=\"contacts\"\n (itemsOrderChange)=\"handleContactsChanged($event)\"\n [elementTemplate]=\"contactTemplate\"\n ></gn-ui-sortable-list>\n <ng-template #contactTemplate let-contact let-index=\"index\">\n @if (modelSpecifier === 'contact:editableDetails') {\n <gn-ui-contact-details-form\n [contact]=\"contact\"\n (contactChange)=\"handleContactChanged($event, index)\"\n ></gn-ui-contact-details-form>\n } @else {\n <gn-ui-contact-card [contact]=\"contact\"></gn-ui-contact-card>\n }\n </ng-template>\n } @else {\n <div\n class=\"p-4 text-sm border border-primary bg-primary-lightest rounded-lg\"\n translate\n >\n editor.record.form.field.contacts.noContact\n </div>\n }\n</div>\n", styles: [""], 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"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ContactCardComponent, selector: "gn-ui-contact-card", inputs: ["contact"] }, { kind: "component", type: ContactDetailsFormComponent, selector: "gn-ui-contact-details-form", inputs: ["contact"], outputs: ["contactChange"] }, { kind: "component", type: SortableListComponent, selector: "gn-ui-sortable-list", inputs: ["elementTemplate", "items"], outputs: ["itemsOrderChange"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
38718
38004
|
}
|
|
38719
38005
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: FormFieldContactsComponent, decorators: [{
|
|
38720
38006
|
type: Component,
|
|
@@ -39067,7 +38353,7 @@ class OnlineServiceResourceInputComponent {
|
|
|
39067
38353
|
provideNgIconsConfig({
|
|
39068
38354
|
size: '1.5em',
|
|
39069
38355
|
}),
|
|
39070
|
-
], ngImport: i0, template: "<div class=\"flex flex-row justify-between\">\n <h3 class=\"text-[16px] font-bold text-main mb-[12px]\" translate>\n editor.record.form.field.onlineResource.edit.protocol\n </h3>\n @if (protocolHint) {\n <ng-icon\n name=\"matHelpOutline\"\n size=\"16\"\n class=\"m-2\"\n [matTooltip]=\"protocolHint\"\n matTooltipPosition=\"above\"\n ></ng-icon>\n }\n</div>\n<div class=\"flex flex-row items-center gap-4 h-[48px]\">\n <mat-radio-group\n aria-labelledby=\"example-radio-group-label\"\n class=\"flex flex-row gap-[8px]\"\n [(ngModel)]=\"_service.accessServiceProtocol\"\n [disabled]=\"disabled\"\n (change)=\"resetAllFormFields()\"\n >\n @for (protocolOption of availableProtocolOptions; track protocolOption) {\n <mat-radio-button [value]=\"protocolOption.value\">\n {{ protocolOption.label | translate }}\n </mat-radio-button>\n }\n </mat-radio-group>\n</div>\n\n<div class=\"flex flex-col gap-4\">\n <gn-ui-url-input\n class=\"w-full\"\n (uploadClick)=\"handleUploadClick($event)\"\n (valueChange)=\"handleUrlValueChange($event)\"\n [disabled]=\"disabled\"\n [value]=\"_service.url?.toString()\"\n [showValidateButton]=\"activeLayerSuggestion\"\n [resetUrlOnChange]=\"resetUrlOnChange\"\n >\n @if (activeLayerSuggestion) {\n <ng-content>\n <ng-icon name=\"iconoirRefresh\"></ng-icon>\n </ng-content>\n }\n </gn-ui-url-input>\n\n @if (loading) {\n <div class=\"flex justify-center w-full py-4\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n }\n @if (errorMessage) {\n <p class=\"text-sm text-red-500 pl-4\" translate>\n editor.record.form.field.onlineResource.edit.identifier.error\n </p>\n }\n\n @if (\n !activeLayerSuggestion ||\n (_service.url && errorMessage) ||\n (modifyMode && (layers$ | async).length === 0)\n ) {\n <gn-ui-text-input\n class=\"grow border-b border-gray-300 pb-4\"\n [(value)]=\"_service.identifierInService\"\n [placeholder]=\"getIdentifierPlaceholder() | translate\"\n data-cy=\"identifier-in-service\"\n [disabled]=\"disabled\"\n ></gn-ui-text-input>\n }\n @if (activeLayerSuggestion && (layers$ | async)?.length > 0) {\n <gn-ui-autocomplete\n class=\"border-b border-gray-300 pb-4\"\n [placeholder]=\"\n 'editor.record.form.field.onlineResource.edit.identifier.select.label'\n | translate\n \"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleSelectValue($event)\"\n [displayWithFn]=\"displayWithFn\"\n [minCharacterCount]=\"0\"\n [clearOnSelection]=\"false\"\n >\n </gn-ui-autocomplete>\n }\n @if (\n !modifyMode &&\n ((activeLayerSuggestion && (layers$ | async)) ||\n !activeLayerSuggestion ||\n (_service.url && errorMessage))\n ) {\n <gn-ui-button\n (buttonClick)=\"submit()\"\n [disabled]=\"disabled || !_service.identifierInService\"\n type=\"primary\"\n >\n <span class=\"text-white font-bold\" translate>\n editor.record.form.field.onlineResource.edit.identifier.submit</span\n >\n </gn-ui-button>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: ["placeholder", "enterButton", "action", "value", "clearOnSelection", "preventCompleteOnSelection", "autoFocus", "minCharacterCount", "allowSubmit", "forceTrackPosition", "displayWithFn"], outputs: ["itemSelected", "inputSubmitted", "inputCleared", "isSearchActive"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1$5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i3$1.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i3$1.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "placeholder", "required", "disabled", "type"], outputs: ["valueChange"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: UrlInputComponent, selector: "gn-ui-url-input", inputs: ["value", "extraClass", "placeholder", "disabled", "showValidateButton", "resetUrlOnChange"], outputs: ["valueChange", "uploadClick"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
38356
|
+
], ngImport: i0, template: "<div class=\"flex flex-row justify-between\">\n <h3 class=\"text-[16px] font-bold text-main mb-[12px]\" translate>\n editor.record.form.field.onlineResource.edit.protocol\n </h3>\n @if (protocolHint) {\n <ng-icon\n name=\"matHelpOutline\"\n size=\"16\"\n class=\"m-2\"\n [matTooltip]=\"protocolHint\"\n matTooltipPosition=\"above\"\n ></ng-icon>\n }\n</div>\n<div class=\"flex flex-row items-center gap-4 h-[48px]\">\n <mat-radio-group\n aria-labelledby=\"example-radio-group-label\"\n class=\"flex flex-row gap-[8px]\"\n [(ngModel)]=\"_service.accessServiceProtocol\"\n [disabled]=\"disabled\"\n (change)=\"resetAllFormFields()\"\n >\n @for (protocolOption of availableProtocolOptions; track protocolOption) {\n <mat-radio-button [value]=\"protocolOption.value\">\n {{ protocolOption.label | translate }}\n </mat-radio-button>\n }\n </mat-radio-group>\n</div>\n\n<div class=\"flex flex-col gap-4\">\n <gn-ui-url-input\n class=\"w-full\"\n (uploadClick)=\"handleUploadClick($event)\"\n (valueChange)=\"handleUrlValueChange($event)\"\n [disabled]=\"disabled\"\n [value]=\"_service.url?.toString()\"\n [showValidateButton]=\"activeLayerSuggestion\"\n [resetUrlOnChange]=\"resetUrlOnChange\"\n >\n @if (activeLayerSuggestion) {\n <ng-content>\n <ng-icon name=\"iconoirRefresh\"></ng-icon>\n </ng-content>\n }\n </gn-ui-url-input>\n\n @if (loading) {\n <div class=\"flex justify-center w-full py-4\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n }\n @if (errorMessage) {\n <p class=\"text-sm text-red-500 pl-4\" translate>\n editor.record.form.field.onlineResource.edit.identifier.error\n </p>\n }\n\n @if (\n !activeLayerSuggestion ||\n (_service.url && errorMessage) ||\n (modifyMode && (layers$ | async).length === 0)\n ) {\n <gn-ui-text-input\n class=\"grow border-b border-gray-300 pb-4\"\n [(value)]=\"_service.identifierInService\"\n [placeholder]=\"getIdentifierPlaceholder() | translate\"\n data-cy=\"identifier-in-service\"\n [disabled]=\"disabled\"\n ></gn-ui-text-input>\n }\n @if (activeLayerSuggestion && (layers$ | async)?.length > 0) {\n <gn-ui-autocomplete\n class=\"border-b border-gray-300 pb-4\"\n [placeholder]=\"\n 'editor.record.form.field.onlineResource.edit.identifier.select.label'\n | translate\n \"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleSelectValue($event)\"\n [displayWithFn]=\"displayWithFn\"\n [minCharacterCount]=\"0\"\n [clearOnSelection]=\"false\"\n >\n </gn-ui-autocomplete>\n }\n @if (\n !modifyMode &&\n ((activeLayerSuggestion && (layers$ | async)) ||\n !activeLayerSuggestion ||\n (_service.url && errorMessage))\n ) {\n <gn-ui-button\n (buttonClick)=\"submit()\"\n [disabled]=\"disabled || !_service.identifierInService\"\n type=\"primary\"\n >\n <span class=\"text-white font-bold\" translate>\n editor.record.form.field.onlineResource.edit.identifier.submit</span\n >\n </gn-ui-button>\n }\n</div>\n", styles: [""], 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"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1$5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatRadioModule }, { kind: "directive", type: i3$1.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i3$1.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color", "disabledInteractive"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "placeholder", "required", "disabled", "type"], outputs: ["valueChange"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: UrlInputComponent, selector: "gn-ui-url-input", inputs: ["value", "extraClass", "placeholder", "disabled", "showValidateButton", "resetUrlOnChange"], outputs: ["valueChange", "uploadClick"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
39071
38357
|
}
|
|
39072
38358
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImport: i0, type: OnlineServiceResourceInputComponent, decorators: [{
|
|
39073
38359
|
type: Component,
|
|
@@ -40942,6 +40228,609 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.19", ngImpo
|
|
|
40942
40228
|
args: ['gnUiSearchRouterContainer']
|
|
40943
40229
|
}] } });
|
|
40944
40230
|
|
|
40231
|
+
const flatten = (base, obj, keepLevel = false) => Object.keys(obj).reduce((prev, curr) => {
|
|
40232
|
+
const path = base ? `${base}.${curr}` : curr;
|
|
40233
|
+
const val = obj[curr];
|
|
40234
|
+
if (keepLevel) {
|
|
40235
|
+
return { ...prev, [path]: flatten('', val) };
|
|
40236
|
+
}
|
|
40237
|
+
else if (typeof val === 'object' && !Array.isArray(val)) {
|
|
40238
|
+
return {
|
|
40239
|
+
...prev,
|
|
40240
|
+
...flatten(path, val),
|
|
40241
|
+
};
|
|
40242
|
+
}
|
|
40243
|
+
else {
|
|
40244
|
+
return { ...prev, [path]: val };
|
|
40245
|
+
}
|
|
40246
|
+
}, {});
|
|
40247
|
+
const checkKeys = (input, mandatory, optional) => {
|
|
40248
|
+
const keys = Object.keys(input);
|
|
40249
|
+
const missing = mandatory.filter((key) => keys.indexOf(key) === -1);
|
|
40250
|
+
const unrecognized = keys.filter((key) => mandatory.indexOf(key) === -1 && optional.indexOf(key) === -1);
|
|
40251
|
+
return {
|
|
40252
|
+
missing,
|
|
40253
|
+
unrecognized,
|
|
40254
|
+
};
|
|
40255
|
+
};
|
|
40256
|
+
/**
|
|
40257
|
+
* Only keeps recognized keys, flatten nested values (to allow having "." in keys),
|
|
40258
|
+
* pushes warnings and errors to the given arrays; returns null in case of error
|
|
40259
|
+
*/
|
|
40260
|
+
function parseConfigSection(fullConfigObj, sectionName, mandatoryKeys, optionalKeys, outWarnings, outErrors) {
|
|
40261
|
+
if (typeof fullConfigObj[sectionName] !== 'object') {
|
|
40262
|
+
if (mandatoryKeys.length === 0)
|
|
40263
|
+
return null;
|
|
40264
|
+
outErrors.push(`The [${sectionName}] mandatory section is missing.`);
|
|
40265
|
+
return null;
|
|
40266
|
+
}
|
|
40267
|
+
const sectionConf = fullConfigObj[sectionName];
|
|
40268
|
+
const keysCheck = checkKeys(sectionConf, mandatoryKeys, optionalKeys);
|
|
40269
|
+
if (keysCheck.missing.length) {
|
|
40270
|
+
// note: this is not thrown to allow merging several Errors down the line
|
|
40271
|
+
outErrors.push(`In the [${sectionName}] section: ${keysCheck.missing.join(', ')}`);
|
|
40272
|
+
return null;
|
|
40273
|
+
}
|
|
40274
|
+
else if (keysCheck.unrecognized.length) {
|
|
40275
|
+
outWarnings.push(`In the [${sectionName}] section: ${keysCheck.unrecognized.join(', ')}`);
|
|
40276
|
+
keysCheck.unrecognized.forEach((key) => delete sectionConf[key]);
|
|
40277
|
+
}
|
|
40278
|
+
return sectionConf;
|
|
40279
|
+
}
|
|
40280
|
+
/**
|
|
40281
|
+
* Same as parseConfigSection but keeps all keys, recognized or not
|
|
40282
|
+
* Also the first level is the language code (e.g. 'en')
|
|
40283
|
+
* This is optional
|
|
40284
|
+
*/
|
|
40285
|
+
function parseTranslationsConfigSection(fullConfigObj, sectionName) {
|
|
40286
|
+
if (typeof fullConfigObj[sectionName] !== 'object') {
|
|
40287
|
+
return {};
|
|
40288
|
+
}
|
|
40289
|
+
return flatten('', fullConfigObj[sectionName], true);
|
|
40290
|
+
}
|
|
40291
|
+
/**
|
|
40292
|
+
* Same as parseConfigSection but handles an array of configs; this is
|
|
40293
|
+
* considered optional; returns null in case of error in at least one of
|
|
40294
|
+
* the sections
|
|
40295
|
+
*/
|
|
40296
|
+
function parseMultiConfigSection(fullConfigObj, sectionName, mandatoryKeys, optionalKeys, outWarnings, outErrors) {
|
|
40297
|
+
const sections = fullConfigObj[sectionName];
|
|
40298
|
+
if (!sections) {
|
|
40299
|
+
return [];
|
|
40300
|
+
}
|
|
40301
|
+
if (!Array.isArray(sections)) {
|
|
40302
|
+
outErrors.push(`Expected [[${sectionName}]] to be an array of sections.`);
|
|
40303
|
+
return null;
|
|
40304
|
+
}
|
|
40305
|
+
const result = sections.map((section) => parseConfigSection({ [sectionName]: section }, sectionName, mandatoryKeys, optionalKeys, outWarnings, outErrors));
|
|
40306
|
+
if (result.some((r) => r === null)) {
|
|
40307
|
+
return null;
|
|
40308
|
+
}
|
|
40309
|
+
return result;
|
|
40310
|
+
}
|
|
40311
|
+
function checkMetadataLanguage(parsedConfigSection, outWarnings) {
|
|
40312
|
+
const lang2 = toLang2(parsedConfigSection.metadata_language.toLowerCase());
|
|
40313
|
+
if (lang2?.length !== 2) {
|
|
40314
|
+
outWarnings.push(`In the [global] section: metadata_language = "${parsedConfigSection.metadata_language}" is not a recognized ISO 639 language code`);
|
|
40315
|
+
}
|
|
40316
|
+
return parsedConfigSection;
|
|
40317
|
+
}
|
|
40318
|
+
function checkNewRecordDefaultLanguage(parsedConfigSection, outWarnings) {
|
|
40319
|
+
const lang2 = toLang2(parsedConfigSection.new_record_default_language.toLowerCase());
|
|
40320
|
+
if (!(lang2 in LANG_2_TO_3_MAPPER)) {
|
|
40321
|
+
outWarnings.push(`In the [editing] section: new_record_default_language = "${parsedConfigSection.new_record_default_language}" is not a recognized ISO 639 language code`);
|
|
40322
|
+
return {
|
|
40323
|
+
...parsedConfigSection,
|
|
40324
|
+
new_record_default_language: undefined,
|
|
40325
|
+
};
|
|
40326
|
+
}
|
|
40327
|
+
return {
|
|
40328
|
+
...parsedConfigSection,
|
|
40329
|
+
new_record_default_language: lang2,
|
|
40330
|
+
};
|
|
40331
|
+
}
|
|
40332
|
+
function checkNewRecordStandard(parsedConfigSection, outWarnings) {
|
|
40333
|
+
const standard = parsedConfigSection.new_record_standard;
|
|
40334
|
+
const normalizedStandard = typeof standard === 'string' ? standard.trim().toLowerCase() : null;
|
|
40335
|
+
if (normalizedStandard === 'iso19139' ||
|
|
40336
|
+
normalizedStandard === 'iso19115-3') {
|
|
40337
|
+
return {
|
|
40338
|
+
...parsedConfigSection,
|
|
40339
|
+
new_record_standard: normalizedStandard,
|
|
40340
|
+
};
|
|
40341
|
+
}
|
|
40342
|
+
outWarnings.push(`In the [editing] section: new_record_standard = "${standard}" is not a supported metadata standard`);
|
|
40343
|
+
return {
|
|
40344
|
+
...parsedConfigSection,
|
|
40345
|
+
new_record_standard: undefined,
|
|
40346
|
+
};
|
|
40347
|
+
}
|
|
40348
|
+
|
|
40349
|
+
/**
|
|
40350
|
+
* This loader extends the default one based on JSON files but also loads custom translations
|
|
40351
|
+
* defined in the app configuration
|
|
40352
|
+
* Implements a fallback on default lang if translated labels are empty
|
|
40353
|
+
*/
|
|
40354
|
+
class FileWithOverridesTranslateLoader extends FileTranslateLoader {
|
|
40355
|
+
getTranslation(lang) {
|
|
40356
|
+
const baseLang = lang.substring(0, 2); // removing the right part of e.g. en_EN
|
|
40357
|
+
return super.getTranslation(baseLang).pipe(map$1((translations) => ({
|
|
40358
|
+
...translations,
|
|
40359
|
+
...getCustomTranslations(baseLang),
|
|
40360
|
+
})));
|
|
40361
|
+
}
|
|
40362
|
+
}
|
|
40363
|
+
|
|
40364
|
+
const MISSING_CONFIG_ERROR = `Application configuration was not initialized correctly.
|
|
40365
|
+
This error might show up in case of an invalid/malformed configuration file.
|
|
40366
|
+
|
|
40367
|
+
Note: make sure that you have called \`loadAppConfig\` from '../../../../../libs/util/app-config/src' before starting the Angular application.`;
|
|
40368
|
+
let globalConfig = null;
|
|
40369
|
+
function getGlobalConfig() {
|
|
40370
|
+
if (globalConfig === null)
|
|
40371
|
+
throw new Error(MISSING_CONFIG_ERROR);
|
|
40372
|
+
return globalConfig;
|
|
40373
|
+
}
|
|
40374
|
+
let themeConfig = null;
|
|
40375
|
+
function getThemeConfig() {
|
|
40376
|
+
if (themeConfig === null)
|
|
40377
|
+
throw new Error(MISSING_CONFIG_ERROR);
|
|
40378
|
+
return themeConfig;
|
|
40379
|
+
}
|
|
40380
|
+
let mapConfig = null;
|
|
40381
|
+
function getOptionalMapConfig() {
|
|
40382
|
+
return mapConfig;
|
|
40383
|
+
}
|
|
40384
|
+
let searchConfig = null;
|
|
40385
|
+
function getOptionalSearchConfig() {
|
|
40386
|
+
return searchConfig;
|
|
40387
|
+
}
|
|
40388
|
+
let editorConfig = null;
|
|
40389
|
+
function getOptionalEditorConfig() {
|
|
40390
|
+
return editorConfig;
|
|
40391
|
+
}
|
|
40392
|
+
let metadataQualityConfig = null;
|
|
40393
|
+
function getMetadataQualityConfig() {
|
|
40394
|
+
return (metadataQualityConfig ||
|
|
40395
|
+
{
|
|
40396
|
+
ENABLED: false,
|
|
40397
|
+
});
|
|
40398
|
+
}
|
|
40399
|
+
let customTranslations = null;
|
|
40400
|
+
function getCustomTranslations(langCode) {
|
|
40401
|
+
if (customTranslations === null)
|
|
40402
|
+
throw new Error(MISSING_CONFIG_ERROR);
|
|
40403
|
+
return langCode in customTranslations ? customTranslations[langCode] : {};
|
|
40404
|
+
}
|
|
40405
|
+
let appConfigLoaded = false;
|
|
40406
|
+
function loadAppConfig(configUrl = 'assets/configuration/default.toml') {
|
|
40407
|
+
console.log(`[geonetwork-ui] Loading application configuration from ${configUrl}`);
|
|
40408
|
+
return fetch(configUrl)
|
|
40409
|
+
.then((resp) => {
|
|
40410
|
+
if (!resp.ok)
|
|
40411
|
+
throw new Error('Configuration file could not be loaded');
|
|
40412
|
+
return resp.text();
|
|
40413
|
+
})
|
|
40414
|
+
.then((conf) => {
|
|
40415
|
+
let parsed;
|
|
40416
|
+
try {
|
|
40417
|
+
parsed = TOML.parse(conf, { joiner: '\n', bigint: false });
|
|
40418
|
+
}
|
|
40419
|
+
catch (e) {
|
|
40420
|
+
throw new Error(`An error occurred when parsing the configuration file: ${e.message}`);
|
|
40421
|
+
}
|
|
40422
|
+
const errors = [];
|
|
40423
|
+
const warnings = [];
|
|
40424
|
+
let parsedGlobalSection = parseConfigSection(parsed, 'global', ['geonetwork4_api_url'], [
|
|
40425
|
+
'datahub_url',
|
|
40426
|
+
'edit_url_template',
|
|
40427
|
+
'proxy_path',
|
|
40428
|
+
'metadata_language',
|
|
40429
|
+
'login_url',
|
|
40430
|
+
'logout_url',
|
|
40431
|
+
'settings_url',
|
|
40432
|
+
'web_component_embedder_url',
|
|
40433
|
+
'languages',
|
|
40434
|
+
'contact_email',
|
|
40435
|
+
'reuse_form_url',
|
|
40436
|
+
], warnings, errors);
|
|
40437
|
+
if (parsedGlobalSection?.metadata_language) {
|
|
40438
|
+
parsedGlobalSection = checkMetadataLanguage(parsedGlobalSection, warnings);
|
|
40439
|
+
}
|
|
40440
|
+
globalConfig =
|
|
40441
|
+
parsedGlobalSection === null
|
|
40442
|
+
? null
|
|
40443
|
+
: {
|
|
40444
|
+
GN4_API_URL: parsedGlobalSection.geonetwork4_api_url,
|
|
40445
|
+
DATAHUB_URL: parsedGlobalSection.datahub_url,
|
|
40446
|
+
EDIT_URL_TEMPLATE: parsedGlobalSection.edit_url_template,
|
|
40447
|
+
PROXY_PATH: parsedGlobalSection.proxy_path,
|
|
40448
|
+
METADATA_LANGUAGE: parsedGlobalSection.metadata_language
|
|
40449
|
+
? parsedGlobalSection.metadata_language.toLowerCase()
|
|
40450
|
+
: undefined,
|
|
40451
|
+
LOGIN_URL: parsedGlobalSection.login_url,
|
|
40452
|
+
LOGOUT_URL: parsedGlobalSection.logout_url,
|
|
40453
|
+
SETTINGS_URL: parsedGlobalSection.settings_url,
|
|
40454
|
+
WEB_COMPONENT_EMBEDDER_URL: parsedGlobalSection.web_component_embedder_url,
|
|
40455
|
+
LANGUAGES: parsedGlobalSection.languages,
|
|
40456
|
+
CONTACT_EMAIL: parsedGlobalSection.contact_email,
|
|
40457
|
+
REUSE_FORM_URL: parsedGlobalSection.reuse_form_url,
|
|
40458
|
+
};
|
|
40459
|
+
const parsedLayersSections = parseMultiConfigSection(parsed, 'map_layer', ['type'], ['name', 'url', 'data', 'styleUrl', 'accessToken'], warnings, errors);
|
|
40460
|
+
const parsedMapSection = parseConfigSection(parsed, 'map', [], [
|
|
40461
|
+
'max_zoom',
|
|
40462
|
+
'do_not_tile_wms',
|
|
40463
|
+
'max_extent',
|
|
40464
|
+
'max_feature_count',
|
|
40465
|
+
'baselayer',
|
|
40466
|
+
'do_not_use_default_basemap',
|
|
40467
|
+
'external_viewer_url_template',
|
|
40468
|
+
'external_viewer_open_new_tab',
|
|
40469
|
+
], warnings, errors);
|
|
40470
|
+
mapConfig =
|
|
40471
|
+
parsedMapSection === null || parsedLayersSections === null
|
|
40472
|
+
? null
|
|
40473
|
+
: {
|
|
40474
|
+
MAX_ZOOM: parsedMapSection.max_zoom,
|
|
40475
|
+
DO_NOT_TILE_WMS: parsedMapSection.do_not_tile_wms,
|
|
40476
|
+
MAX_EXTENT: parsedMapSection.max_extent,
|
|
40477
|
+
MAX_FEATURE_COUNT: parsedMapSection.max_feature_count,
|
|
40478
|
+
EXTERNAL_VIEWER_URL_TEMPLATE: parsedMapSection.external_viewer_url_template,
|
|
40479
|
+
EXTERNAL_VIEWER_OPEN_NEW_TAB: parsedMapSection.external_viewer_open_new_tab,
|
|
40480
|
+
DO_NOT_USE_DEFAULT_BASEMAP: !!parsedMapSection.do_not_use_default_basemap,
|
|
40481
|
+
MAP_LAYERS: parsedLayersSections.map((map_layer) => ({
|
|
40482
|
+
TYPE: map_layer.type,
|
|
40483
|
+
URL: map_layer.url,
|
|
40484
|
+
NAME: map_layer.name,
|
|
40485
|
+
DATA: map_layer.data,
|
|
40486
|
+
STYLE_URL: map_layer.styleUrl,
|
|
40487
|
+
ACCESS_TOKEN: map_layer.accessToken,
|
|
40488
|
+
})),
|
|
40489
|
+
};
|
|
40490
|
+
const parsedThemeSection = parseConfigSection(parsed, 'theme', ['primary_color', 'secondary_color', 'main_color', 'background_color'], [
|
|
40491
|
+
'header_foreground_color',
|
|
40492
|
+
'main_font',
|
|
40493
|
+
'title_font',
|
|
40494
|
+
'fonts_stylesheet_url',
|
|
40495
|
+
'thumbnail_placeholder',
|
|
40496
|
+
'header_background',
|
|
40497
|
+
'favicon',
|
|
40498
|
+
], warnings, errors);
|
|
40499
|
+
themeConfig =
|
|
40500
|
+
parsedThemeSection === null
|
|
40501
|
+
? null
|
|
40502
|
+
: {
|
|
40503
|
+
PRIMARY_COLOR: parsedThemeSection.primary_color,
|
|
40504
|
+
SECONDARY_COLOR: parsedThemeSection.secondary_color,
|
|
40505
|
+
MAIN_COLOR: parsedThemeSection.main_color,
|
|
40506
|
+
BACKGROUND_COLOR: parsedThemeSection.background_color,
|
|
40507
|
+
HEADER_FOREGROUND_COLOR: parsedThemeSection.header_foreground_color,
|
|
40508
|
+
THUMBNAIL_PLACEHOLDER: parsedThemeSection.thumbnail_placeholder,
|
|
40509
|
+
HEADER_BACKGROUND: parsedThemeSection.header_background,
|
|
40510
|
+
TITLE_FONT: parsedThemeSection.title_font,
|
|
40511
|
+
MAIN_FONT: parsedThemeSection.main_font,
|
|
40512
|
+
FONTS_STYLESHEET_URL: parsedThemeSection.fonts_stylesheet_url,
|
|
40513
|
+
FAVICON: parsedThemeSection.favicon,
|
|
40514
|
+
};
|
|
40515
|
+
const parsedSearchSection = parseConfigSection(parsed, 'search', [], [
|
|
40516
|
+
'record_kind_quick_filter',
|
|
40517
|
+
'filter_geometry_data',
|
|
40518
|
+
'filter_geometry_url',
|
|
40519
|
+
'do_not_use_default_search_preset',
|
|
40520
|
+
'search_preset',
|
|
40521
|
+
'advanced_filters',
|
|
40522
|
+
'limit',
|
|
40523
|
+
'spatial_extent_max_file_size',
|
|
40524
|
+
'geocoding_provider',
|
|
40525
|
+
'geocoding_provider_options',
|
|
40526
|
+
], warnings, errors);
|
|
40527
|
+
const parsedSearchParams = parseMultiConfigSection(parsed, 'search_preset', ['name'], ['sort', 'filters'], warnings, errors);
|
|
40528
|
+
const parsedCustomFilters = parseMultiConfigSection(parsed, 'custom_filter', ['name', 'base_filter'], ['exclude_values', 'include_values', 'label_key'], warnings, errors);
|
|
40529
|
+
searchConfig =
|
|
40530
|
+
parsedSearchSection === null
|
|
40531
|
+
? null
|
|
40532
|
+
: {
|
|
40533
|
+
RECORD_KIND_QUICK_FILTER: parsedSearchSection.record_kind_quick_filter,
|
|
40534
|
+
FILTER_GEOMETRY_DATA: parsedSearchSection.filter_geometry_data,
|
|
40535
|
+
FILTER_GEOMETRY_URL: parsedSearchSection.filter_geometry_url,
|
|
40536
|
+
DO_NOT_USE_DEFAULT_SEARCH_PRESET: !!parsedSearchSection.do_not_use_default_search_preset,
|
|
40537
|
+
SEARCH_PRESET: parsedSearchParams.map((param) => ({
|
|
40538
|
+
sort: param.sort,
|
|
40539
|
+
name: param.name,
|
|
40540
|
+
filters: param.filters,
|
|
40541
|
+
})),
|
|
40542
|
+
ADVANCED_FILTERS: parsedSearchSection.advanced_filters,
|
|
40543
|
+
CUSTOM_FILTERS: parsedCustomFilters.map((customFilter) => ({
|
|
40544
|
+
name: customFilter.name,
|
|
40545
|
+
baseFilter: customFilter.base_filter,
|
|
40546
|
+
excludeValues: customFilter.exclude_values,
|
|
40547
|
+
includeValues: customFilter.include_values,
|
|
40548
|
+
labelKey: customFilter.label_key,
|
|
40549
|
+
})),
|
|
40550
|
+
LIMIT: parsedSearchSection.limit,
|
|
40551
|
+
SPATIAL_EXTENT_MAX_FILE_SIZE: parsedSearchSection.spatial_extent_max_file_size,
|
|
40552
|
+
GEOCODING_PROVIDER: parsedSearchSection.geocoding_provider,
|
|
40553
|
+
GEOCODING_PROVIDER_OPTIONS: parsedSearchSection.geocoding_provider_options,
|
|
40554
|
+
};
|
|
40555
|
+
const parsedMetadataQualitySection = parseConfigSection(parsed, 'metadata-quality', [], ['enabled'], warnings, errors);
|
|
40556
|
+
metadataQualityConfig =
|
|
40557
|
+
parsedMetadataQualitySection === null
|
|
40558
|
+
? null
|
|
40559
|
+
: {
|
|
40560
|
+
ENABLED: parsedMetadataQualitySection.enabled,
|
|
40561
|
+
SORTABLE: parsedMetadataQualitySection.sortable,
|
|
40562
|
+
};
|
|
40563
|
+
let parsedEditingSection = parseConfigSection(parsed, 'editing', [], ['new_record_default_language', 'new_record_standard'], warnings, errors);
|
|
40564
|
+
if (parsedEditingSection !== null &&
|
|
40565
|
+
parsedEditingSection.new_record_default_language !== undefined) {
|
|
40566
|
+
parsedEditingSection = checkNewRecordDefaultLanguage(parsedEditingSection, warnings);
|
|
40567
|
+
}
|
|
40568
|
+
if (parsedEditingSection !== null &&
|
|
40569
|
+
parsedEditingSection.new_record_standard !== undefined) {
|
|
40570
|
+
parsedEditingSection = checkNewRecordStandard(parsedEditingSection, warnings);
|
|
40571
|
+
}
|
|
40572
|
+
editorConfig =
|
|
40573
|
+
parsedEditingSection === null
|
|
40574
|
+
? null
|
|
40575
|
+
: {
|
|
40576
|
+
NEW_RECORD_DEFAULT_LANGUAGE: parsedEditingSection.new_record_default_language,
|
|
40577
|
+
NEW_RECORD_STANDARD: parsedEditingSection.new_record_standard,
|
|
40578
|
+
};
|
|
40579
|
+
customTranslations = parseTranslationsConfigSection(parsed, 'translations');
|
|
40580
|
+
if (errors.length) {
|
|
40581
|
+
throw new Error(`One or more mandatory settings were missing from the configuration file.
|
|
40582
|
+
${errors.join('\n')}`);
|
|
40583
|
+
}
|
|
40584
|
+
else if (warnings.length) {
|
|
40585
|
+
console.warn(`One or more unexpected settings were encountered in the configuration file.
|
|
40586
|
+
${warnings.join('\n')}`);
|
|
40587
|
+
}
|
|
40588
|
+
appConfigLoaded = true;
|
|
40589
|
+
});
|
|
40590
|
+
}
|
|
40591
|
+
function isConfigLoaded() {
|
|
40592
|
+
return appConfigLoaded;
|
|
40593
|
+
}
|
|
40594
|
+
function _reset() {
|
|
40595
|
+
globalConfig = null;
|
|
40596
|
+
themeConfig = null;
|
|
40597
|
+
editorConfig = null;
|
|
40598
|
+
customTranslations = null;
|
|
40599
|
+
}
|
|
40600
|
+
const TRANSLATE_WITH_OVERRIDES_CONFIG = {
|
|
40601
|
+
compiler: {
|
|
40602
|
+
provide: TranslateCompiler,
|
|
40603
|
+
useClass: TranslateMessageFormatCompiler,
|
|
40604
|
+
},
|
|
40605
|
+
loader: [
|
|
40606
|
+
{
|
|
40607
|
+
provide: TRANSLATE_HTTP_LOADER_CONFIG,
|
|
40608
|
+
useValue: {
|
|
40609
|
+
prefix: './assets/i18n/',
|
|
40610
|
+
suffix: '.json',
|
|
40611
|
+
},
|
|
40612
|
+
},
|
|
40613
|
+
{
|
|
40614
|
+
provide: TranslateLoader,
|
|
40615
|
+
useClass: FileWithOverridesTranslateLoader,
|
|
40616
|
+
deps: [HttpClient, TRANSLATE_HTTP_LOADER_CONFIG],
|
|
40617
|
+
},
|
|
40618
|
+
],
|
|
40619
|
+
};
|
|
40620
|
+
|
|
40621
|
+
const okAppConfigFixture = () => `
|
|
40622
|
+
[global]
|
|
40623
|
+
geonetwork4_api_url = "/geonetwork/srv/api"
|
|
40624
|
+
proxy_path = "/proxy/?url="
|
|
40625
|
+
metadata_language = "fre"
|
|
40626
|
+
login_url = "/cas/login?service="
|
|
40627
|
+
logout_url = "/geonetwork/signout"
|
|
40628
|
+
settings_url = "/geonetwork/settings"
|
|
40629
|
+
web_component_embedder_url = "/datahub/wc-embedder.html"
|
|
40630
|
+
|
|
40631
|
+
[map]
|
|
40632
|
+
max_zoom = 10
|
|
40633
|
+
max_extent = [-418263.418776, 5251529.591305, 961272.067714, 6706890.609855]
|
|
40634
|
+
do_not_use_default_basemap = false
|
|
40635
|
+
external_viewer_url_template = 'https://example.com/myviewer?'
|
|
40636
|
+
external_viewer_open_new_tab = true
|
|
40637
|
+
[[map_layer]]
|
|
40638
|
+
type = "wms"
|
|
40639
|
+
url = "https://www.geo2france.fr/geoserver/cr_hdf/ows"
|
|
40640
|
+
name = "masque_hdf_ign_carto_latin1"
|
|
40641
|
+
[[map_layer]]
|
|
40642
|
+
type = "wfs"
|
|
40643
|
+
url = "https://www.geo2france.fr/geoserver/cr_hdf/ows"
|
|
40644
|
+
name = "masque_hdf_ign_carto_latin1"
|
|
40645
|
+
|
|
40646
|
+
[theme]
|
|
40647
|
+
primary_color = "#093564"
|
|
40648
|
+
secondary_color = "#c2e9dc"
|
|
40649
|
+
main_color = "#212029" # All-purpose text color
|
|
40650
|
+
background_color = "#fdfbff"
|
|
40651
|
+
thumbnail_placeholder = 'assets/img/placeholder.svg'
|
|
40652
|
+
header_background = 'teal'
|
|
40653
|
+
header_foreground_color = "#872e2e"
|
|
40654
|
+
main_font = 'sans-serif'
|
|
40655
|
+
title_font = 'serif'
|
|
40656
|
+
fonts_stylesheet_url = "https://fonts.googleapis.com/css2?family=Open+Sans"
|
|
40657
|
+
|
|
40658
|
+
[search]
|
|
40659
|
+
record_kind_quick_filter = false
|
|
40660
|
+
filter_geometry_url = 'https://my.domain.org/geom.json'
|
|
40661
|
+
do_not_use_default_search_preset = false
|
|
40662
|
+
geocoding_provider = "geoplateforme"
|
|
40663
|
+
geocoding_provider_options.category = "administratif"
|
|
40664
|
+
geocoding_provider_options.limit = 5
|
|
40665
|
+
advanced_filters = ['publicationYear', 'documentStandard', 'inspireKeyword', 'topic', 'license', 'myOrg:firstCustomFilter', 'myOrg:secondCustomFilter']
|
|
40666
|
+
|
|
40667
|
+
[[custom_filter]]
|
|
40668
|
+
name = 'myOrg:firstCustomFilter'
|
|
40669
|
+
base_filter = 'keyword'
|
|
40670
|
+
exclude_values = ['my keyword 1', 'my keyword 2']
|
|
40671
|
+
label_key = 'myOrg.firstCustomFilter'
|
|
40672
|
+
|
|
40673
|
+
[[custom_filter]]
|
|
40674
|
+
name = 'myOrg:secondCustomFilter'
|
|
40675
|
+
base_filter = 'keyword'
|
|
40676
|
+
include_values = ['my keyword 3', 'my keyword 4']
|
|
40677
|
+
label_key = 'myOrg.secondCustomFilter'
|
|
40678
|
+
|
|
40679
|
+
[[search_preset]]
|
|
40680
|
+
sort = "-createDate"
|
|
40681
|
+
name = 'filterByOrgs'
|
|
40682
|
+
filters.q = 'Carto'
|
|
40683
|
+
filters.organisation = ['Org1', 'Org2']
|
|
40684
|
+
filters.format = ['ESRI Shapefile']
|
|
40685
|
+
filters.topic = ['boundaries']
|
|
40686
|
+
filters.publicationYear = ['2023', '2022']
|
|
40687
|
+
filters.spatial = ['yes']
|
|
40688
|
+
|
|
40689
|
+
[translations.en]
|
|
40690
|
+
"my.first.key" = 'First label.'
|
|
40691
|
+
"my.second.key" = """
|
|
40692
|
+
Second label,
|
|
40693
|
+
on two lines."""
|
|
40694
|
+
|
|
40695
|
+
[translations.de]
|
|
40696
|
+
my.first.key = 'Erste Etikett.'
|
|
40697
|
+
|
|
40698
|
+
[translations.fr]
|
|
40699
|
+
my.sample.text = "Un bon exemple de texte."
|
|
40700
|
+
"my.quoted.text" = 'du texte entre guillements.'
|
|
40701
|
+
`;
|
|
40702
|
+
const appConfigWithTranslationFixture = () => okAppConfigFixture();
|
|
40703
|
+
const minimalAppConfigFixture = () => `
|
|
40704
|
+
[global]
|
|
40705
|
+
geonetwork4_api_url = "/geonetwork/srv/api"
|
|
40706
|
+
proxy_path = "/proxy/?url="
|
|
40707
|
+
|
|
40708
|
+
[theme]
|
|
40709
|
+
primary_color = "#093564"
|
|
40710
|
+
secondary_color = "#c2e9dc"
|
|
40711
|
+
main_color = "#212029" # All-purpose text color
|
|
40712
|
+
background_color = "#fdfbff"
|
|
40713
|
+
`;
|
|
40714
|
+
const mapConfigFixture = () => ({
|
|
40715
|
+
MAX_ZOOM: 10,
|
|
40716
|
+
MAX_EXTENT: [-418263.418776, 5251529.591305, 961272.067714, 6706890.609855],
|
|
40717
|
+
DO_NOT_USE_DEFAULT_BASEMAP: false,
|
|
40718
|
+
DO_NOT_TILE_WMS: false,
|
|
40719
|
+
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}"}]}]',
|
|
40720
|
+
EXTERNAL_VIEWER_OPEN_NEW_TAB: true,
|
|
40721
|
+
MAP_LAYERS: [
|
|
40722
|
+
{
|
|
40723
|
+
TYPE: 'xyz',
|
|
40724
|
+
URL: 'https://some-basemap-server',
|
|
40725
|
+
},
|
|
40726
|
+
{
|
|
40727
|
+
TYPE: 'wms',
|
|
40728
|
+
URL: 'https://some-wms-server',
|
|
40729
|
+
NAME: 'some_layername',
|
|
40730
|
+
},
|
|
40731
|
+
{
|
|
40732
|
+
TYPE: 'wfs',
|
|
40733
|
+
URL: 'https://some-wfs-server',
|
|
40734
|
+
NAME: 'some_layername',
|
|
40735
|
+
},
|
|
40736
|
+
],
|
|
40737
|
+
});
|
|
40738
|
+
const malformedConfigFixture = () => `
|
|
40739
|
+
{
|
|
40740
|
+
"I thought": "we were still doing json"
|
|
40741
|
+
}
|
|
40742
|
+
`;
|
|
40743
|
+
const missingMandatoryConfigFixture = () => `
|
|
40744
|
+
[theme]
|
|
40745
|
+
primary_color = "#093564"
|
|
40746
|
+
secondary_color = "#c2e9dc"
|
|
40747
|
+
background_color = "#fdfbff"
|
|
40748
|
+
main_font = 'sans-serif'
|
|
40749
|
+
`;
|
|
40750
|
+
const wrongLanguageCodeConfigFixture = () => `
|
|
40751
|
+
[global]
|
|
40752
|
+
geonetwork4_api_url = "/geonetwork/srv/api"
|
|
40753
|
+
proxy_path = "/proxy/?url="
|
|
40754
|
+
metadata_language = "abc"
|
|
40755
|
+
|
|
40756
|
+
[map]
|
|
40757
|
+
|
|
40758
|
+
[theme]
|
|
40759
|
+
primary_color = "#093564"
|
|
40760
|
+
secondary_color = "#c2e9dc"
|
|
40761
|
+
main_color = "#212029" # All-purpose text color
|
|
40762
|
+
background_color = "#fdfbff"
|
|
40763
|
+
`;
|
|
40764
|
+
const unrecognizedKeysConfigFixture = () => `
|
|
40765
|
+
[global]
|
|
40766
|
+
geonetwork4_api_url = "/geonetwork/srv/api"
|
|
40767
|
+
proxy_path = "/proxy/?url="
|
|
40768
|
+
metadata_language = "fre"
|
|
40769
|
+
another_path = '/whatever'
|
|
40770
|
+
|
|
40771
|
+
[map]
|
|
40772
|
+
max_zoom = 10
|
|
40773
|
+
max_extent = [-418263.418776, 5251529.591305, 961272.067714, 6706890.609855]
|
|
40774
|
+
do_not_use_default_basemap = false
|
|
40775
|
+
external_viewer_url_template = 'https://example.com/myviewer?'
|
|
40776
|
+
external_viewer_open_new_tab = true
|
|
40777
|
+
another_zoom = 15
|
|
40778
|
+
[[map_layer]]
|
|
40779
|
+
type = "wms"
|
|
40780
|
+
url = "https://www.geo2france.fr/geoserver/cr_hdf/ows"
|
|
40781
|
+
name = "masque_hdf_ign_carto_latin1"
|
|
40782
|
+
[[map_layer]]
|
|
40783
|
+
type = "wfs"
|
|
40784
|
+
url = "https://www.geo2france.fr/geoserver/cr_hdf/ows"
|
|
40785
|
+
name = "masque_hdf_ign_carto_latin1"
|
|
40786
|
+
another_layer = "wrong layer definition"
|
|
40787
|
+
|
|
40788
|
+
[theme]
|
|
40789
|
+
primary_color = "#093564"
|
|
40790
|
+
secondary_color = "#c2e9dc"
|
|
40791
|
+
main_color = "#212029" # All-purpose text color
|
|
40792
|
+
background_color = "#fdfbff"
|
|
40793
|
+
thumbnail_placeholder = 'assets/img/placeholder.svg'
|
|
40794
|
+
header_background = 'teal'
|
|
40795
|
+
header_foreground_color = "#872e2e"
|
|
40796
|
+
main_font = 'sans-serif'
|
|
40797
|
+
title_font = 'serif'
|
|
40798
|
+
another_color = 'red'
|
|
40799
|
+
`;
|
|
40800
|
+
|
|
40801
|
+
function getMapContextLayerFromConfig(config) {
|
|
40802
|
+
switch (config.TYPE) {
|
|
40803
|
+
case 'wms':
|
|
40804
|
+
return {
|
|
40805
|
+
type: 'wms',
|
|
40806
|
+
url: config.URL,
|
|
40807
|
+
name: config.NAME,
|
|
40808
|
+
};
|
|
40809
|
+
case 'wfs':
|
|
40810
|
+
return {
|
|
40811
|
+
type: 'wfs',
|
|
40812
|
+
url: config.URL,
|
|
40813
|
+
featureType: config.NAME,
|
|
40814
|
+
};
|
|
40815
|
+
case 'xyz':
|
|
40816
|
+
return {
|
|
40817
|
+
type: config.TYPE,
|
|
40818
|
+
url: config.URL,
|
|
40819
|
+
};
|
|
40820
|
+
case 'geojson':
|
|
40821
|
+
return {
|
|
40822
|
+
type: config.TYPE,
|
|
40823
|
+
...(config.DATA ? { data: config.DATA } : { url: config.URL }),
|
|
40824
|
+
};
|
|
40825
|
+
case 'maplibre-style':
|
|
40826
|
+
return {
|
|
40827
|
+
type: config.TYPE,
|
|
40828
|
+
styleUrl: config.STYLE_URL,
|
|
40829
|
+
accessToken: config.ACCESS_TOKEN,
|
|
40830
|
+
};
|
|
40831
|
+
}
|
|
40832
|
+
}
|
|
40833
|
+
|
|
40945
40834
|
const CHART_TYPE_VALUES = [
|
|
40946
40835
|
'bar',
|
|
40947
40836
|
'bar-horizontal',
|
|
@@ -40957,5 +40846,5 @@ const CHART_TYPE_VALUES = [
|
|
|
40957
40846
|
* Generated bundle index. Do not edit.
|
|
40958
40847
|
*/
|
|
40959
40848
|
|
|
40960
|
-
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_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, GEONETWORK_UI_TAG_NAME, GEONETWORK_UI_VERSION, GeoDataBadgeComponent, GeoTableViewComponent, GeocodingComponent, 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, 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, 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 };
|
|
40849
|
+
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, 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, 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 };
|
|
40961
40850
|
//# sourceMappingURL=geonetwork-ui.mjs.map
|