geonetwork-ui 2.9.0-dev.2757b04b7 → 2.9.0-dev.5b71064ef
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 +510 -481
- package/fesm2022/geonetwork-ui.mjs.map +1 -1
- package/index.d.ts +237 -157
- package/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +5 -1
- package/src/libs/feature/dataviz/src/lib/service/data.service.ts +13 -6
- package/src/libs/feature/editor/src/index.ts +8 -7
- package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +6 -1
- package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +5 -1
- package/src/libs/feature/editor/src/lib/+state/editor.reducer.ts +4 -0
- package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +9 -3
- package/src/libs/feature/search/src/lib/utils/service/fields.ts +5 -5
- package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +10 -7
- package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.ts +7 -5
- package/translations/de.json +2 -1
- package/translations/en.json +5 -4
- package/translations/es.json +1 -0
- package/translations/fr.json +5 -4
- package/translations/it.json +5 -4
- package/translations/nl.json +1 -0
- package/translations/pt.json +1 -0
- package/translations/sk.json +1 -0
|
@@ -13,7 +13,7 @@ import * as i4 from '@ngx-translate/core';
|
|
|
13
13
|
import { TranslateLoader, TranslateCompiler, TranslateDefaultParser, TranslateParser, TranslateService, provideTranslateService, TranslateDirective, TranslatePipe, TranslateModule } from '@ngx-translate/core';
|
|
14
14
|
import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler';
|
|
15
15
|
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
|
|
16
|
-
import { map as map$1, shareReplay as shareReplay$1, catchError, tap as tap$1, filter as filter$1, startWith as startWith$1, withLatestFrom, switchMap as switchMap$1, take, mergeMap, delay,
|
|
16
|
+
import { map as map$1, shareReplay as shareReplay$1, catchError, tap as tap$1, filter as filter$1, startWith as startWith$1, withLatestFrom, switchMap as switchMap$1, take, mergeMap, delay, debounceTime, distinctUntilChanged, finalize, throttleTime, first as first$1, pairwise as pairwise$1, share, defaultIfEmpty, toArray } from 'rxjs/operators';
|
|
17
17
|
import { of, map as map$2, lastValueFrom, fromEvent, startWith, shareReplay, filter, pairwise, switchMap, Subject, combineLatest, from, exhaustMap, throwError, forkJoin, 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, takeUntil, EMPTY, mergeMap as mergeMap$1, withLatestFrom as withLatestFrom$1 } from 'rxjs';
|
|
18
18
|
import { lt, valid, coerce, satisfies, ltr } from 'semver';
|
|
19
19
|
import chroma from 'chroma-js';
|
|
@@ -41,7 +41,7 @@ import * as TOML from '@ltd/j-toml';
|
|
|
41
41
|
import { Style, Stroke, Fill, Circle } from 'ol/style.js';
|
|
42
42
|
import CircleStyle from 'ol/style/Circle.js';
|
|
43
43
|
import EmblaCarousel from 'embla-carousel';
|
|
44
|
-
import { iconoirNavArrowLeft, iconoirNavArrowRight, iconoirLongArrowDownLeft, iconoirSearch, iconoirCalendar, iconoirArrowUp, iconoirLink, iconoirFramePlusIn, iconoirCloudUpload, iconoirReduce, iconoirNavArrowUp, iconoirNavArrowDown, iconoirExpand, iconoirSettings, iconoirDownload, iconoirPlus, iconoirBin, iconoirMediaImageXmark, iconoirMediaImage, iconoirAppWindow, iconoirCode, iconoirDatabase, iconoirAppleWallet, iconoirBank, iconoirList, iconoirTranslate, iconoirLock, iconoirUser, iconoirArrowLeft, iconoirLightBulbOn, iconoirImport,
|
|
44
|
+
import { iconoirNavArrowLeft, iconoirNavArrowRight, iconoirLongArrowDownLeft, iconoirSearch, iconoirCalendar, iconoirArrowUp, iconoirLink, iconoirFramePlusIn, iconoirCloudUpload, 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, iconoirCheckCircle, iconoirAttachment, iconoirRefresh } from '@ng-icons/iconoir';
|
|
45
45
|
import { MatButtonModule } from '@angular/material/button';
|
|
46
46
|
import * as i1$8 from '@angular/cdk/overlay';
|
|
47
47
|
import { OverlayContainer, ScrollStrategyOptions, OverlayModule, CdkConnectedOverlay, ScrollDispatcher, Overlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
|
|
@@ -18975,6 +18975,7 @@ var de = {
|
|
|
18975
18975
|
"multiselect.filter.placeholder": "Suche",
|
|
18976
18976
|
"nav.back": "Zurück",
|
|
18977
18977
|
"navbar.mobile.menuTitle": "Schnellzugriff",
|
|
18978
|
+
"ogc.geojson.notsupported": "Dieser OGC API-Dienst unterstützt das GeoJSON-Format nicht.",
|
|
18978
18979
|
"ogc.unreachable.unknown": "Der Dienst konnte nicht erreicht werden",
|
|
18979
18980
|
"organisation.filter.placeholder": "Ergebnisse filtern",
|
|
18980
18981
|
"organisation.sort.sortBy": "Sortieren nach:",
|
|
@@ -19060,7 +19061,7 @@ var de = {
|
|
|
19060
19061
|
"record.metadata.download": "Herunterladen",
|
|
19061
19062
|
"record.metadata.feature.catalog": "Attributkatalog",
|
|
19062
19063
|
"record.metadata.formats": "Formate",
|
|
19063
|
-
"record.metadata.isGeographical": "
|
|
19064
|
+
"record.metadata.isGeographical": "geographischer Datensatz",
|
|
19064
19065
|
"record.metadata.keywords": "Stichworte",
|
|
19065
19066
|
"record.metadata.languages": "Sprachen",
|
|
19066
19067
|
"record.metadata.link.postgis.table": "Tabelle:",
|
|
@@ -19645,6 +19646,7 @@ var en = {
|
|
|
19645
19646
|
"multiselect.filter.placeholder": "Search",
|
|
19646
19647
|
"nav.back": "Back",
|
|
19647
19648
|
"navbar.mobile.menuTitle": "Quick access",
|
|
19649
|
+
"ogc.geojson.notsupported": "This OGC API does not support the GeoJSON format",
|
|
19648
19650
|
"ogc.unreachable.unknown": "The service could not be reached",
|
|
19649
19651
|
"organisation.filter.placeholder": "Filter results",
|
|
19650
19652
|
"organisation.sort.sortBy": "Sort by:",
|
|
@@ -19672,9 +19674,9 @@ var en = {
|
|
|
19672
19674
|
"record.feature.catalog.number.total.attribute": "Total amount of objects",
|
|
19673
19675
|
"record.feature.catalog.number.total.object": "Total amount of attributes",
|
|
19674
19676
|
"record.feature.limit": "Preview disabled due to too many elements",
|
|
19675
|
-
"record.kind.dataset": "
|
|
19676
|
-
"record.kind.reuse": "
|
|
19677
|
-
"record.kind.service": "
|
|
19677
|
+
"record.kind.dataset": "dataset",
|
|
19678
|
+
"record.kind.reuse": "reuse",
|
|
19679
|
+
"record.kind.service": "service",
|
|
19678
19680
|
"record.metadata.about": "Description",
|
|
19679
19681
|
"record.metadata.api": "API",
|
|
19680
19682
|
"record.metadata.api.accessServiceProtocol.GPFDL": "GPFDL",
|
|
@@ -19730,7 +19732,7 @@ var en = {
|
|
|
19730
19732
|
"record.metadata.download": "Downloads",
|
|
19731
19733
|
"record.metadata.feature.catalog": "Feature catalog",
|
|
19732
19734
|
"record.metadata.formats": "Formats",
|
|
19733
|
-
"record.metadata.isGeographical": "
|
|
19735
|
+
"record.metadata.isGeographical": "geographic dataset",
|
|
19734
19736
|
"record.metadata.keywords": "Keywords",
|
|
19735
19737
|
"record.metadata.languages": "Languages",
|
|
19736
19738
|
"record.metadata.link.postgis.table": "table :",
|
|
@@ -20316,6 +20318,7 @@ var es = {
|
|
|
20316
20318
|
"multiselect.filter.placeholder": "",
|
|
20317
20319
|
"nav.back": "",
|
|
20318
20320
|
"navbar.mobile.menuTitle": "Acceso rápido",
|
|
20321
|
+
"ogc.geojson.notsupported": "",
|
|
20319
20322
|
"ogc.unreachable.unknown": "",
|
|
20320
20323
|
"organisation.filter.placeholder": "",
|
|
20321
20324
|
"organisation.sort.sortBy": "",
|
|
@@ -20987,6 +20990,7 @@ var fr = {
|
|
|
20987
20990
|
"multiselect.filter.placeholder": "Rechercher",
|
|
20988
20991
|
"nav.back": "Retour",
|
|
20989
20992
|
"navbar.mobile.menuTitle": "Navigation rapide",
|
|
20993
|
+
"ogc.geojson.notsupported": "Le service OGC API ne supporte pas le format GeoJSON",
|
|
20990
20994
|
"ogc.unreachable.unknown": "Le service n'est pas accessible",
|
|
20991
20995
|
"organisation.filter.placeholder": "Filtrer les résultats",
|
|
20992
20996
|
"organisation.sort.sortBy": "Trier par :",
|
|
@@ -21014,9 +21018,9 @@ var fr = {
|
|
|
21014
21018
|
"record.feature.catalog.number.total.attribute": "Nombre total d'attributs",
|
|
21015
21019
|
"record.feature.catalog.number.total.object": "Nombre total d'objets",
|
|
21016
21020
|
"record.feature.limit": "L’aperçu a été désactivé en raison d’un trop grand nombre d'éléments",
|
|
21017
|
-
"record.kind.dataset": "
|
|
21018
|
-
"record.kind.reuse": "
|
|
21019
|
-
"record.kind.service": "
|
|
21021
|
+
"record.kind.dataset": "donnée",
|
|
21022
|
+
"record.kind.reuse": "réutilisation",
|
|
21023
|
+
"record.kind.service": "service",
|
|
21020
21024
|
"record.metadata.about": "A propos",
|
|
21021
21025
|
"record.metadata.api": "API",
|
|
21022
21026
|
"record.metadata.api.accessServiceProtocol.GPFDL": "",
|
|
@@ -21072,7 +21076,7 @@ var fr = {
|
|
|
21072
21076
|
"record.metadata.download": "Téléchargements",
|
|
21073
21077
|
"record.metadata.feature.catalog": "Catalogue d'attributs",
|
|
21074
21078
|
"record.metadata.formats": "Formats",
|
|
21075
|
-
"record.metadata.isGeographical": "
|
|
21079
|
+
"record.metadata.isGeographical": "donnée géographique",
|
|
21076
21080
|
"record.metadata.keywords": "Mots-clés",
|
|
21077
21081
|
"record.metadata.languages": "Langues",
|
|
21078
21082
|
"record.metadata.link.postgis.table": "table :",
|
|
@@ -21658,6 +21662,7 @@ var it = {
|
|
|
21658
21662
|
"multiselect.filter.placeholder": "Cerca",
|
|
21659
21663
|
"nav.back": "Indietro",
|
|
21660
21664
|
"navbar.mobile.menuTitle": "Accesso rapido",
|
|
21665
|
+
"ogc.geojson.notsupported": "Il servizio OGC API non supporta il formato GeoJSON.",
|
|
21661
21666
|
"ogc.unreachable.unknown": "Il servizio non è accessibile",
|
|
21662
21667
|
"organisation.filter.placeholder": "Filtra i risultati",
|
|
21663
21668
|
"organisation.sort.sortBy": "Ordina per:",
|
|
@@ -21685,9 +21690,9 @@ var it = {
|
|
|
21685
21690
|
"record.feature.catalog.number.total.attribute": "Quantità totale di oggetti",
|
|
21686
21691
|
"record.feature.catalog.number.total.object": "Quantità totale di attributi",
|
|
21687
21692
|
"record.feature.limit": "La visualizzazione è stata disabilitata a causa di troppi elementi ",
|
|
21688
|
-
"record.kind.dataset": "
|
|
21689
|
-
"record.kind.reuse": "
|
|
21690
|
-
"record.kind.service": "
|
|
21693
|
+
"record.kind.dataset": "dataset",
|
|
21694
|
+
"record.kind.reuse": "riutilizzato",
|
|
21695
|
+
"record.kind.service": "servizio",
|
|
21691
21696
|
"record.metadata.about": "Descrizione",
|
|
21692
21697
|
"record.metadata.api": "API",
|
|
21693
21698
|
"record.metadata.api.accessServiceProtocol.GPFDL": "",
|
|
@@ -21743,7 +21748,7 @@ var it = {
|
|
|
21743
21748
|
"record.metadata.download": "Download",
|
|
21744
21749
|
"record.metadata.feature.catalog": "Catalogo dei oggetti",
|
|
21745
21750
|
"record.metadata.formats": "Formati",
|
|
21746
|
-
"record.metadata.isGeographical": "
|
|
21751
|
+
"record.metadata.isGeographical": "dati geografici",
|
|
21747
21752
|
"record.metadata.keywords": "Parole chiave",
|
|
21748
21753
|
"record.metadata.languages": "Lingue",
|
|
21749
21754
|
"record.metadata.link.postgis.table": "",
|
|
@@ -22329,6 +22334,7 @@ var nl = {
|
|
|
22329
22334
|
"multiselect.filter.placeholder": "",
|
|
22330
22335
|
"nav.back": "",
|
|
22331
22336
|
"navbar.mobile.menuTitle": "",
|
|
22337
|
+
"ogc.geojson.notsupported": "",
|
|
22332
22338
|
"ogc.unreachable.unknown": "",
|
|
22333
22339
|
"organisation.filter.placeholder": "",
|
|
22334
22340
|
"organisation.sort.sortBy": "",
|
|
@@ -23000,6 +23006,7 @@ var pt = {
|
|
|
23000
23006
|
"multiselect.filter.placeholder": "",
|
|
23001
23007
|
"nav.back": "",
|
|
23002
23008
|
"navbar.mobile.menuTitle": "",
|
|
23009
|
+
"ogc.geojson.notsupported": "",
|
|
23003
23010
|
"ogc.unreachable.unknown": "",
|
|
23004
23011
|
"organisation.filter.placeholder": "",
|
|
23005
23012
|
"organisation.sort.sortBy": "",
|
|
@@ -23671,6 +23678,7 @@ var sk = {
|
|
|
23671
23678
|
"multiselect.filter.placeholder": "Hľadať",
|
|
23672
23679
|
"nav.back": "Späť",
|
|
23673
23680
|
"navbar.mobile.menuTitle": "",
|
|
23681
|
+
"ogc.geojson.notsupported": "",
|
|
23674
23682
|
"ogc.unreachable.unknown": "So službou sa nedalo spojiť",
|
|
23675
23683
|
"organisation.filter.placeholder": "Filtrovať výsledky",
|
|
23676
23684
|
"organisation.sort.sortBy": "Zoradiť podľa:",
|
|
@@ -25511,7 +25519,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
25511
25519
|
}] } });
|
|
25512
25520
|
|
|
25513
25521
|
var name = "geonetwork-ui";
|
|
25514
|
-
var version = "2.9.0-dev.
|
|
25522
|
+
var version = "2.9.0-dev.5b71064ef";
|
|
25515
25523
|
var engines = {
|
|
25516
25524
|
node: ">=20"
|
|
25517
25525
|
};
|
|
@@ -25925,14 +25933,18 @@ class ElasticsearchService {
|
|
|
25925
25933
|
})
|
|
25926
25934
|
.join(' OR ');
|
|
25927
25935
|
};
|
|
25928
|
-
|
|
25936
|
+
let queryString = typeof filters === 'string'
|
|
25929
25937
|
? filters
|
|
25930
25938
|
: Object.keys(filters)
|
|
25939
|
+
.filter((fieldname) => fieldname !== 'gn-ui-crossFieldFilter')
|
|
25931
25940
|
.filter((fieldname) => !isDateRange(filters[fieldname]))
|
|
25932
25941
|
.filter((fieldname) => filters[fieldname] &&
|
|
25933
25942
|
JSON.stringify(filters[fieldname]) !== '{}')
|
|
25934
25943
|
.map((fieldname) => `${fieldname}:(${makeQuery(filters[fieldname])})`)
|
|
25935
25944
|
.join(' AND ');
|
|
25945
|
+
if (filters['gn-ui-crossFieldFilter']) {
|
|
25946
|
+
queryString = `${queryString} AND (${filters['gn-ui-crossFieldFilter']})`;
|
|
25947
|
+
}
|
|
25936
25948
|
const queryRange = Object.entries(filters)
|
|
25937
25949
|
.filter(([, value]) => isDateRange(value))
|
|
25938
25950
|
.map(([searchField, dateRange]) => {
|
|
@@ -29192,9 +29204,8 @@ class AutocompleteComponent {
|
|
|
29192
29204
|
ngOnChanges(changes) {
|
|
29193
29205
|
const { value } = changes;
|
|
29194
29206
|
if (value) {
|
|
29195
|
-
const previousTextValue = this.displayWithFnInternal(value.previousValue);
|
|
29196
29207
|
const currentTextValue = this.displayWithFnInternal(value.currentValue);
|
|
29197
|
-
if (
|
|
29208
|
+
if (currentTextValue !== this.control.value) {
|
|
29198
29209
|
if (currentTextValue) {
|
|
29199
29210
|
this.searchActive = true;
|
|
29200
29211
|
this.isSearchActive.emit(true);
|
|
@@ -29208,13 +29219,15 @@ class AutocompleteComponent {
|
|
|
29208
29219
|
}
|
|
29209
29220
|
}
|
|
29210
29221
|
ngOnInit() {
|
|
29211
|
-
const newValue$ = merge(of(''), this.inputCleared.pipe(map$1(() => '')), this.control.valueChanges.pipe(filter$1((value) => typeof value === 'string'),
|
|
29222
|
+
const newValue$ = merge(of(''), this.inputCleared.pipe(map$1(() => '')), this.control.valueChanges.pipe(filter$1((value) => typeof value === 'string'), debounceTime(400), distinctUntilChanged()));
|
|
29212
29223
|
const externalValueChange$ = this.control.valueChanges.pipe(filter$1((value) => typeof value === 'object' && value.title), map$1((item) => item.title));
|
|
29213
29224
|
// this observable emits arrays of suggestions loaded using the given action
|
|
29214
29225
|
const suggestionsFromAction = merge(newValue$.pipe(filter$1((value) => value.length >= this.minCharacterCount)), externalValueChange$).pipe(tap$1(() => {
|
|
29215
29226
|
this.searching = true;
|
|
29216
29227
|
this.error = null;
|
|
29217
|
-
}), switchMap$1((value) => this.action(value)),
|
|
29228
|
+
}), switchMap$1((value) => this.action(value)), // this can trigger http requests
|
|
29229
|
+
shareReplay$1(1), // share the loaded suggestions to avoid multiple requests
|
|
29230
|
+
tap$1((suggestions) => {
|
|
29218
29231
|
// forcing the panel to open if there are suggestions
|
|
29219
29232
|
if (suggestions.length > 0 && !this.searchActive) {
|
|
29220
29233
|
this.triggerRef?.openPanel();
|
|
@@ -29275,6 +29288,7 @@ class AutocompleteComponent {
|
|
|
29275
29288
|
}
|
|
29276
29289
|
clear() {
|
|
29277
29290
|
this.inputRef.nativeElement.value = '';
|
|
29291
|
+
this.control.setValue('');
|
|
29278
29292
|
this.searchActive = false;
|
|
29279
29293
|
this.isSearchActive.emit(false);
|
|
29280
29294
|
this.inputCleared.emit();
|
|
@@ -32976,8 +32990,8 @@ class RecordKindField extends SimpleSearchField {
|
|
|
32976
32990
|
};
|
|
32977
32991
|
const presentationFormFilter = {};
|
|
32978
32992
|
if (values.includes('reuse') && !values.includes('dataset')) {
|
|
32979
|
-
|
|
32980
|
-
|
|
32993
|
+
filters['gn-ui-crossFieldFilter'] =
|
|
32994
|
+
`(resourceType:("dataset" OR "document") AND cl_presentationForm.key:("mapDigital" OR "mapHardcopy")) OR resourceType:("application" OR "interactiveMap" OR "map" OR "map/static" OR "map/interactive" OR "map-interactive" OR "map-static" OR "mapDigital" OR "mapHardcopy" OR "staticMap")`;
|
|
32981
32995
|
}
|
|
32982
32996
|
else if (values.includes('dataset') && !values.includes('reuse')) {
|
|
32983
32997
|
presentationFormFilter['mapDigital'] = false;
|
|
@@ -33070,7 +33084,12 @@ class FieldsService {
|
|
|
33070
33084
|
: [fieldValues[fieldName]];
|
|
33071
33085
|
return this.getFiltersForValues(fieldName, values);
|
|
33072
33086
|
});
|
|
33073
|
-
return forkJoin(filtersByField$).pipe(map$1((filters) =>
|
|
33087
|
+
return forkJoin(filtersByField$).pipe(map$1((filters) => {
|
|
33088
|
+
if (typeof filters === 'string') {
|
|
33089
|
+
return filters;
|
|
33090
|
+
}
|
|
33091
|
+
return filters.reduce((prev, curr) => ({ ...prev, ...curr }), {});
|
|
33092
|
+
}));
|
|
33074
33093
|
}
|
|
33075
33094
|
readFieldValuesFromFilters(filters) {
|
|
33076
33095
|
const fieldValues$ = this.supportedFields.map((fieldName) => this.getValuesForFilters(fieldName, filters).pipe(map$1((values) => ({ [fieldName]: values }))));
|
|
@@ -34013,7 +34032,7 @@ class MetadataContactComponent {
|
|
|
34013
34032
|
this.organizationClick.emit(this.shownOrganization);
|
|
34014
34033
|
}
|
|
34015
34034
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
34016
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: MetadataContactComponent, isStandalone: true, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div\n class=\"py-5 px-5 rounded bg-gray-100 text-black\"\n data-cy=\"metadata-organization\"\n>\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-base font-medium\" translate>record.metadata.contact</p>\n </div>\n @if (shownOrganization?.logoUrl?.href) {\n <div\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grid grid-cols-1 gap-1\">\n <div class=\"flex\">\n <div\n class=\"font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name-link\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n @if (shownOrganization?.website) {\n <div>\n <
|
|
34035
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: MetadataContactComponent, isStandalone: true, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div\n class=\"py-5 px-5 rounded bg-gray-100 text-black\"\n data-cy=\"metadata-organization\"\n>\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-base font-medium\" translate>record.metadata.contact</p>\n </div>\n @if (shownOrganization?.logoUrl?.href) {\n <div\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grid grid-cols-1 gap-1\">\n <div class=\"flex\">\n <div\n class=\"font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name-link\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n @if (shownOrganization?.website) {\n <div>\n <div class=\"flex items-center mt-1\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-sm cursor-pointer hover:underline transition-all ml-2\"\n >\n {{ shownOrganization.website }}\n </a>\n </div>\n </div>\n }\n </div>\n <div class=\"grid grid-cols-1 gap-5 py-3 overflow-hidden\">\n @if (contacts[0]?.phone) {\n <div>\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matCallOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n }\n @if (contacts[0]?.email) {\n <div>\n <div class=\"flex gap-2\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n @if (contacts.length) {\n <a\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"break-all text-sm hover:underline\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n }\n </div>\n </div>\n }\n @if (contacts[0]?.firstName || contacts[0]?.lastName) {\n <div>\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matPersonOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n }\n @if (contacts[0]?.address) {\n <div>\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matLocationOnOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n @for (addressPart of address; track addressPart) {\n <p class=\"text-sm\">\n {{ addressPart }}\n </p>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], viewProviders: [
|
|
34017
34036
|
provideIcons({
|
|
34018
34037
|
matOpenInNew,
|
|
34019
34038
|
matCallOutline,
|
|
@@ -34033,7 +34052,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
34033
34052
|
matPersonOutline,
|
|
34034
34053
|
matLocationOnOutline,
|
|
34035
34054
|
}),
|
|
34036
|
-
], template: "<div\n class=\"py-5 px-5 rounded bg-gray-100 text-black\"\n data-cy=\"metadata-organization\"\n>\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-base font-medium\" translate>record.metadata.contact</p>\n </div>\n @if (shownOrganization?.logoUrl?.href) {\n <div\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grid grid-cols-1 gap-1\">\n <div class=\"flex\">\n <div\n class=\"font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name-link\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n @if (shownOrganization?.website) {\n <div>\n <
|
|
34055
|
+
], template: "<div\n class=\"py-5 px-5 rounded bg-gray-100 text-black\"\n data-cy=\"metadata-organization\"\n>\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-base font-medium\" translate>record.metadata.contact</p>\n </div>\n @if (shownOrganization?.logoUrl?.href) {\n <div\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grid grid-cols-1 gap-1\">\n <div class=\"flex\">\n <div\n class=\"font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name-link\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n @if (shownOrganization?.website) {\n <div>\n <div class=\"flex items-center mt-1\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-sm cursor-pointer hover:underline transition-all ml-2\"\n >\n {{ shownOrganization.website }}\n </a>\n </div>\n </div>\n }\n </div>\n <div class=\"grid grid-cols-1 gap-5 py-3 overflow-hidden\">\n @if (contacts[0]?.phone) {\n <div>\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matCallOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n }\n @if (contacts[0]?.email) {\n <div>\n <div class=\"flex gap-2\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n @if (contacts.length) {\n <a\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"break-all text-sm hover:underline\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n }\n </div>\n </div>\n }\n @if (contacts[0]?.firstName || contacts[0]?.lastName) {\n <div>\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matPersonOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n }\n @if (contacts[0]?.address) {\n <div>\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matLocationOnOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n @for (addressPart of address; track addressPart) {\n <p class=\"text-sm\">\n {{ addressPart }}\n </p>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n</div>\n" }]
|
|
34037
34056
|
}], propDecorators: { metadata: [{
|
|
34038
34057
|
type: Input
|
|
34039
34058
|
}], organizationClick: [{
|
|
@@ -38225,6 +38244,7 @@ marker('dataset.error.forbidden');
|
|
|
38225
38244
|
marker('wfs.unreachable.unknown');
|
|
38226
38245
|
marker('wfs.featuretype.notfound');
|
|
38227
38246
|
marker('wfs.geojsongml.notsupported');
|
|
38247
|
+
marker('ogc.geojson.notsupported');
|
|
38228
38248
|
marker('ogc.unreachable.unknown');
|
|
38229
38249
|
marker('dataset.error.network');
|
|
38230
38250
|
marker('dataset.error.http');
|
|
@@ -38452,12 +38472,14 @@ class DataService {
|
|
|
38452
38472
|
else if (link.type === 'service' &&
|
|
38453
38473
|
link.accessServiceProtocol === 'ogcFeatures') {
|
|
38454
38474
|
return from(this.getDownloadUrlsFromOgcApi(link.url.href)).pipe(switchMap$1((collectionInfo) => {
|
|
38455
|
-
const
|
|
38456
|
-
|
|
38457
|
-
|
|
38458
|
-
|
|
38459
|
-
|
|
38475
|
+
const isMimeTypeJson = (mimeType) => {
|
|
38476
|
+
return mimeType.toLowerCase().indexOf('json') > -1;
|
|
38477
|
+
};
|
|
38478
|
+
const geojsonUrl = collectionInfo.bulkDownloadLinks[Object.keys(collectionInfo.bulkDownloadLinks).find((mimeType) => isMimeTypeJson(mimeType))];
|
|
38479
|
+
if (!geojsonUrl) {
|
|
38480
|
+
return throwError(() => 'ogc.geojson.notsupported');
|
|
38460
38481
|
}
|
|
38482
|
+
return openDataset(geojsonUrl, 'geojson', undefined, cacheActive);
|
|
38461
38483
|
}));
|
|
38462
38484
|
}
|
|
38463
38485
|
return throwError(() => 'protocol not supported');
|
|
@@ -41099,6 +41121,7 @@ const saveRecordSuccess = createAction('[Editor] Save record success');
|
|
|
41099
41121
|
const saveRecordFailure = createAction('[Editor] Save record failure', props());
|
|
41100
41122
|
const draftSaveSuccess = createAction('[Editor] Draft save success');
|
|
41101
41123
|
const undoRecordDraft = createAction('[Editor] Undo record draft');
|
|
41124
|
+
const setEditorConfiguration = createAction('[Editor] Set editor configuration', props());
|
|
41102
41125
|
const setCurrentPage = createAction('[Editor] Set current page', props());
|
|
41103
41126
|
const setFieldVisibility = createAction('[Editor] Set field visibility', props());
|
|
41104
41127
|
const hasRecordChangedSinceDraft = createAction('[Editor] Has Record Changed Since Draft', props());
|
|
@@ -41521,6 +41544,9 @@ const reducer = createReducer(initialEditorState, on(openRecord, (state, { recor
|
|
|
41521
41544
|
})), on(markRecordAsChanged, (state) => ({
|
|
41522
41545
|
...state,
|
|
41523
41546
|
changedSinceSave: true,
|
|
41547
|
+
})), on(setEditorConfiguration, (state, { configuration }) => ({
|
|
41548
|
+
...state,
|
|
41549
|
+
editorConfig: configuration,
|
|
41524
41550
|
})), on(setCurrentPage, (state, { page }) => ({
|
|
41525
41551
|
...state,
|
|
41526
41552
|
currentPage: page,
|
|
@@ -41623,6 +41649,9 @@ class EditorFacade {
|
|
|
41623
41649
|
updateRecordLanguages(defaultLanguage, otherLanguages) {
|
|
41624
41650
|
this.store.dispatch(updateRecordLanguages({ defaultLanguage, otherLanguages }));
|
|
41625
41651
|
}
|
|
41652
|
+
setConfiguration(configuration) {
|
|
41653
|
+
this.store.dispatch(setEditorConfiguration({ configuration }));
|
|
41654
|
+
}
|
|
41626
41655
|
setCurrentPage(page) {
|
|
41627
41656
|
this.store.dispatch(setCurrentPage({ page }));
|
|
41628
41657
|
}
|
|
@@ -41645,149 +41674,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
41645
41674
|
type: Injectable
|
|
41646
41675
|
}] });
|
|
41647
41676
|
|
|
41648
|
-
function evaluate(expression) {
|
|
41649
|
-
if (expression.match(/^\${.*}$/)) {
|
|
41650
|
-
return evaluate(expression.slice(2, -1));
|
|
41651
|
-
}
|
|
41652
|
-
const operator = expression.split('(')[0];
|
|
41653
|
-
switch (operator) {
|
|
41654
|
-
case 'dateNow':
|
|
41655
|
-
return () => new Date();
|
|
41656
|
-
default:
|
|
41657
|
-
throw new Error(`Unknown operator: ${operator}`);
|
|
41658
|
-
}
|
|
41659
|
-
}
|
|
41660
|
-
|
|
41661
|
-
class EditorService {
|
|
41662
|
-
constructor() {
|
|
41663
|
-
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
41664
|
-
}
|
|
41665
|
-
// returns the record as it was when saved, alongside its source
|
|
41666
|
-
saveRecord(record, recordSource, fieldsConfig) {
|
|
41667
|
-
const savedRecord = { ...record };
|
|
41668
|
-
const fields = fieldsConfig.pages.flatMap((page) => page.sections.flatMap((section) => section.fields));
|
|
41669
|
-
// run onSave processes
|
|
41670
|
-
for (const field of fields) {
|
|
41671
|
-
if (field.onSaveProcess && field.model) {
|
|
41672
|
-
const evaluator = evaluate(field.onSaveProcess);
|
|
41673
|
-
savedRecord[field.model] = evaluator({
|
|
41674
|
-
model: field.model,
|
|
41675
|
-
value: record[field.model],
|
|
41676
|
-
});
|
|
41677
|
-
}
|
|
41678
|
-
}
|
|
41679
|
-
let publishToAll = true;
|
|
41680
|
-
// if the record is new, generate a new unique identifier and pass publishToAll as false
|
|
41681
|
-
if (!record.uniqueIdentifier) {
|
|
41682
|
-
savedRecord.uniqueIdentifier = null;
|
|
41683
|
-
publishToAll = false;
|
|
41684
|
-
}
|
|
41685
|
-
return this.recordsRepository
|
|
41686
|
-
.saveRecord(savedRecord, recordSource, publishToAll)
|
|
41687
|
-
.pipe(switchMap((uniqueIdentifier) => this.recordsRepository.openRecordForEdition(uniqueIdentifier)), tap$1(() => {
|
|
41688
|
-
// if saving was successful, the original draft can be discarded
|
|
41689
|
-
this.recordsRepository.clearRecordDraft(record.uniqueIdentifier);
|
|
41690
|
-
}), map$1(([record, recordSource]) => [record, recordSource]));
|
|
41691
|
-
}
|
|
41692
|
-
// emits and completes once saving is done
|
|
41693
|
-
// note: onSave processes are not run for drafts
|
|
41694
|
-
saveRecordAsDraft(record, recordSource) {
|
|
41695
|
-
record.recordUpdated = new Date();
|
|
41696
|
-
return this.recordsRepository
|
|
41697
|
-
.saveRecordAsDraft(record, recordSource)
|
|
41698
|
-
.pipe(map$1(() => undefined));
|
|
41699
|
-
}
|
|
41700
|
-
undoRecordDraft(record) {
|
|
41701
|
-
this.recordsRepository.clearRecordDraft(record.uniqueIdentifier);
|
|
41702
|
-
return this.recordsRepository.openRecordForEdition(record.uniqueIdentifier);
|
|
41703
|
-
}
|
|
41704
|
-
hasRecordChangedSinceDraft(localRecord) {
|
|
41705
|
-
return this.recordsRepository.hasRecordChangedSinceDraft(localRecord);
|
|
41706
|
-
}
|
|
41707
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
41708
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, providedIn: 'root' }); }
|
|
41709
|
-
}
|
|
41710
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, decorators: [{
|
|
41711
|
-
type: Injectable,
|
|
41712
|
-
args: [{
|
|
41713
|
-
providedIn: 'root',
|
|
41714
|
-
}]
|
|
41715
|
-
}] });
|
|
41716
|
-
|
|
41717
|
-
class EditorEffects {
|
|
41718
|
-
constructor() {
|
|
41719
|
-
this.actions$ = inject(Actions);
|
|
41720
|
-
this.editorService = inject(EditorService);
|
|
41721
|
-
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
41722
|
-
this.plateformService = inject(PlatformServiceInterface);
|
|
41723
|
-
this.store = inject(Store);
|
|
41724
|
-
this.saveRecord$ = createEffect(() => this.actions$.pipe(ofType(saveRecord), withLatestFrom$1(this.store.select(selectRecord), this.store.select(selectRecordSource), this.store.select(selectEditorConfig)), switchMap$1(([, record, recordSource, fieldsConfig]) => this.editorService.saveRecord(record, recordSource, fieldsConfig).pipe(switchMap$1(([savedRecord, savedRecordSource]) => {
|
|
41725
|
-
const actions = [saveRecordSuccess()];
|
|
41726
|
-
if (!record?.uniqueIdentifier) {
|
|
41727
|
-
actions.push(openRecord({
|
|
41728
|
-
record: savedRecord,
|
|
41729
|
-
recordSource: savedRecordSource,
|
|
41730
|
-
}));
|
|
41731
|
-
}
|
|
41732
|
-
return of(...actions);
|
|
41733
|
-
}), catchError((error) => of(saveRecordFailure({
|
|
41734
|
-
error,
|
|
41735
|
-
})))))));
|
|
41736
|
-
this.cleanRecordAttachments$ = createEffect(() => this.actions$.pipe(ofType(saveRecordSuccess), withLatestFrom$1(this.store.select(selectRecord)), switchMap$1(([_, record]) => {
|
|
41737
|
-
if (record.uniqueIdentifier !== null) {
|
|
41738
|
-
this.plateformService.cleanRecordAttachments(record).subscribe({
|
|
41739
|
-
next: (_) => undefined,
|
|
41740
|
-
error: (err) => {
|
|
41741
|
-
console.error(err);
|
|
41742
|
-
},
|
|
41743
|
-
});
|
|
41744
|
-
}
|
|
41745
|
-
return EMPTY;
|
|
41746
|
-
}), catchError((error) => {
|
|
41747
|
-
console.error(error);
|
|
41748
|
-
return EMPTY;
|
|
41749
|
-
})), { dispatch: false });
|
|
41750
|
-
this.markAsChanged$ = createEffect(() => this.actions$.pipe(ofType(updateRecordField, updateRecordLanguages), map$1(() => markRecordAsChanged())));
|
|
41751
|
-
this.saveRecordDraft$ = createEffect(() => this.actions$.pipe(ofType(updateRecordField, updateRecordLanguages), debounceTime$1(1000), withLatestFrom$1(this.store.select(selectRecord), this.store.select(selectRecordSource)), switchMap$1(([, record, recordSource]) => this.editorService.saveRecordAsDraft(record, recordSource)), map$1(() => draftSaveSuccess())));
|
|
41752
|
-
this.undoRecordDraft$ = createEffect(() => this.actions$.pipe(ofType(undoRecordDraft), withLatestFrom$1(this.store.select(selectRecord)), switchMap$1(([, record]) => this.editorService.undoRecordDraft(record)), map$1(([record, recordSource]) => openRecord({
|
|
41753
|
-
record,
|
|
41754
|
-
recordSource,
|
|
41755
|
-
}))));
|
|
41756
|
-
this.checkHasChangesOnOpen$ = createEffect(() => this.actions$.pipe(ofType(openRecord), map$1(({ record }) => this.recordsRepository.recordHasDraft(record.uniqueIdentifier)), filter((hasDraft) => hasDraft), map$1(() => markRecordAsChanged())));
|
|
41757
|
-
this.hasRecordChangedSinceDraft$ = createEffect(() => this.actions$.pipe(ofType(hasRecordChangedSinceDraft), switchMap$1(({ record }) => this.editorService
|
|
41758
|
-
.hasRecordChangedSinceDraft(record)
|
|
41759
|
-
.pipe(map$1((changes) => hasRecordChangedSinceDraftSuccess({ changes }))))));
|
|
41760
|
-
this.checkIsRecordPublished$ = createEffect(() => this.actions$.pipe(ofType(openRecord), map$1(({ record }) => record.uniqueIdentifier), switchMap$1((uniqueIdentifier) => this.recordsRepository.getRecordPublicationStatus(uniqueIdentifier)), map$1((isPublished$1) => isPublished({
|
|
41761
|
-
isPublished: isPublished$1,
|
|
41762
|
-
}))));
|
|
41763
|
-
this.checkCanEditRecord$ = createEffect(() => this.actions$.pipe(ofType(openRecord), map$1(({ record }) => record.uniqueIdentifier), switchMap$1((uniqueIdentifier) => this.recordsRepository.canEditRecord(uniqueIdentifier)), map$1((canEditRecord$1) => canEditRecord({
|
|
41764
|
-
canEditRecord: canEditRecord$1,
|
|
41765
|
-
}))));
|
|
41766
|
-
}
|
|
41767
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
41768
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects }); }
|
|
41769
|
-
}
|
|
41770
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects, decorators: [{
|
|
41771
|
-
type: Injectable
|
|
41772
|
-
}] });
|
|
41773
|
-
|
|
41774
|
-
class FeatureEditorModule {
|
|
41775
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
41776
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, imports: [i1.StoreFeatureModule, i2$2.EffectsFeatureModule] }); }
|
|
41777
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, providers: [EditorFacade, provideHttpClient()], imports: [StoreModule.forFeature(EDITOR_FEATURE_KEY, editorReducer),
|
|
41778
|
-
EffectsModule.forFeature([EditorEffects])] }); }
|
|
41779
|
-
}
|
|
41780
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, decorators: [{
|
|
41781
|
-
type: NgModule,
|
|
41782
|
-
args: [{
|
|
41783
|
-
imports: [
|
|
41784
|
-
StoreModule.forFeature(EDITOR_FEATURE_KEY, editorReducer),
|
|
41785
|
-
EffectsModule.forFeature([EditorEffects]),
|
|
41786
|
-
],
|
|
41787
|
-
providers: [EditorFacade, provideHttpClient()],
|
|
41788
|
-
}]
|
|
41789
|
-
}] });
|
|
41790
|
-
|
|
41791
41677
|
class ImportRecordComponent {
|
|
41792
41678
|
constructor() {
|
|
41793
41679
|
this.router = inject(Router);
|
|
@@ -41883,6 +41769,328 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
41883
41769
|
type: Output
|
|
41884
41770
|
}] } });
|
|
41885
41771
|
|
|
41772
|
+
//forced translations that are not available in fields.config.ts
|
|
41773
|
+
marker('editor.record.form.field.keywords');
|
|
41774
|
+
marker('editor.record.form.field.topics');
|
|
41775
|
+
marker('editor.record.form.field.contacts');
|
|
41776
|
+
marker('editor.record.form.field.organisation');
|
|
41777
|
+
class MetadataQualityPanelComponent {
|
|
41778
|
+
constructor() {
|
|
41779
|
+
this.propsToValidate = getAllKeysValidator();
|
|
41780
|
+
this.propertiesByPage = [];
|
|
41781
|
+
}
|
|
41782
|
+
ngOnChanges() {
|
|
41783
|
+
if (this.editorConfig && this.record) {
|
|
41784
|
+
const fieldsByPage = this.editorConfig.pages.map((page) => page.sections.flatMap((section) => section.fields
|
|
41785
|
+
.filter((field) => this.propsToValidate.includes(field.model))
|
|
41786
|
+
.map((field) => field.model)));
|
|
41787
|
+
// FIXME: temporarily add topics and organisation to the first and third page
|
|
41788
|
+
// as long as they are not handled by the editor
|
|
41789
|
+
if (fieldsByPage.length > 0) {
|
|
41790
|
+
fieldsByPage[0].includes('topics') || fieldsByPage[0].push('topics');
|
|
41791
|
+
fieldsByPage[2].includes('organisation') ||
|
|
41792
|
+
fieldsByPage[2].push('organisation');
|
|
41793
|
+
}
|
|
41794
|
+
this.propertiesByPage = fieldsByPage
|
|
41795
|
+
.map((fields) => getQualityValidators(this.record, fields).map(({ name, validator }) => ({
|
|
41796
|
+
label: `editor.record.form.field.${name}`, // use same translations as in fields.config.ts
|
|
41797
|
+
value: validator(),
|
|
41798
|
+
})))
|
|
41799
|
+
.filter((arr) => arr.length > 0);
|
|
41800
|
+
}
|
|
41801
|
+
}
|
|
41802
|
+
getExtraClass(checked) {
|
|
41803
|
+
const baseClasses = 'flex flex-row justify-between rounded mb-1 h-[34px] w-full focus:ring-0 hover:border-none border-none hover:text-black text-black cursor-default';
|
|
41804
|
+
return checked
|
|
41805
|
+
? `${baseClasses} bg-neutral-100 hover:bg-neutral-100`
|
|
41806
|
+
: `${baseClasses} bg-transparent hover:bg-transparent`;
|
|
41807
|
+
}
|
|
41808
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MetadataQualityPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
41809
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: MetadataQualityPanelComponent, isStandalone: true, selector: "gn-ui-metadata-quality-panel", inputs: { editorConfig: "editorConfig", record: "record" }, providers: [
|
|
41810
|
+
provideIcons({
|
|
41811
|
+
iconoirSystemShut,
|
|
41812
|
+
iconoirBadgeCheck,
|
|
41813
|
+
}),
|
|
41814
|
+
provideNgIconsConfig({
|
|
41815
|
+
size: '1.25em',
|
|
41816
|
+
}),
|
|
41817
|
+
], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"flex flex-col h-full w-[302px] border-l border-gray-300 py-8 px-3 gap-3 overflow-auto\"\n style=\"background-color: #fafaf9\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.metadataQuality.title</span\n >\n </div>\n @for (properties of propertiesByPage; track properties; let i = $index) {\n <div class=\"flex flex-col gap-2\">\n @for (property of properties; track property) {\n <gn-ui-button\n [extraClass]=\"getExtraClass(property.value)\"\n type=\"outline\"\n attr.data-cy=\"md-quality-btn-{{ property.label }}\"\n >\n <span>{{ property.label | translate }}</span>\n <div class=\"flex flex-row gap-2 items-center\">\n @if (property.value) {\n <ng-icon class=\"text-primary\" name=\"iconoirBadgeCheck\"></ng-icon>\n } @else {\n <ng-icon\n class=\"text-neutral-300\"\n name=\"iconoirSystemShut\"\n ></ng-icon>\n }\n </div>\n </gn-ui-button>\n }\n @if (i !== propertiesByPage.length - 1) {\n <hr class=\"border-gray-300 w-11/12 mx-auto\" />\n }\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { 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: TranslatePipe, name: "translate" }] }); }
|
|
41818
|
+
}
|
|
41819
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MetadataQualityPanelComponent, decorators: [{
|
|
41820
|
+
type: Component,
|
|
41821
|
+
args: [{ selector: 'gn-ui-metadata-quality-panel', standalone: true, imports: [
|
|
41822
|
+
TranslateDirective,
|
|
41823
|
+
TranslatePipe,
|
|
41824
|
+
ButtonComponent,
|
|
41825
|
+
NgIconComponent,
|
|
41826
|
+
], providers: [
|
|
41827
|
+
provideIcons({
|
|
41828
|
+
iconoirSystemShut,
|
|
41829
|
+
iconoirBadgeCheck,
|
|
41830
|
+
}),
|
|
41831
|
+
provideNgIconsConfig({
|
|
41832
|
+
size: '1.25em',
|
|
41833
|
+
}),
|
|
41834
|
+
], template: "<div\n class=\"flex flex-col h-full w-[302px] border-l border-gray-300 py-8 px-3 gap-3 overflow-auto\"\n style=\"background-color: #fafaf9\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.metadataQuality.title</span\n >\n </div>\n @for (properties of propertiesByPage; track properties; let i = $index) {\n <div class=\"flex flex-col gap-2\">\n @for (property of properties; track property) {\n <gn-ui-button\n [extraClass]=\"getExtraClass(property.value)\"\n type=\"outline\"\n attr.data-cy=\"md-quality-btn-{{ property.label }}\"\n >\n <span>{{ property.label | translate }}</span>\n <div class=\"flex flex-row gap-2 items-center\">\n @if (property.value) {\n <ng-icon class=\"text-primary\" name=\"iconoirBadgeCheck\"></ng-icon>\n } @else {\n <ng-icon\n class=\"text-neutral-300\"\n name=\"iconoirSystemShut\"\n ></ng-icon>\n }\n </div>\n </gn-ui-button>\n }\n @if (i !== propertiesByPage.length - 1) {\n <hr class=\"border-gray-300 w-11/12 mx-auto\" />\n }\n </div>\n }\n</div>\n" }]
|
|
41835
|
+
}], propDecorators: { editorConfig: [{
|
|
41836
|
+
type: Input
|
|
41837
|
+
}], record: [{
|
|
41838
|
+
type: Input
|
|
41839
|
+
}] } });
|
|
41840
|
+
|
|
41841
|
+
const extraFlagMap = {
|
|
41842
|
+
ar: 'arab',
|
|
41843
|
+
en: 'gb',
|
|
41844
|
+
ko: 'kr',
|
|
41845
|
+
cs: 'cz',
|
|
41846
|
+
zh: 'cn',
|
|
41847
|
+
ca: 'es-ct',
|
|
41848
|
+
rm: 'ch',
|
|
41849
|
+
da: 'dk',
|
|
41850
|
+
sv: 'se',
|
|
41851
|
+
cy: 'gb-wls',
|
|
41852
|
+
hy: 'am',
|
|
41853
|
+
ka: 'ge',
|
|
41854
|
+
uk: 'ua',
|
|
41855
|
+
};
|
|
41856
|
+
class MultilingualPanelComponent {
|
|
41857
|
+
constructor() {
|
|
41858
|
+
this.facade = inject(EditorFacade);
|
|
41859
|
+
this.dialog = inject(MatDialog);
|
|
41860
|
+
this.translateService = inject(TranslateService);
|
|
41861
|
+
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
41862
|
+
this.overlay = inject(Overlay);
|
|
41863
|
+
this.viewContainerRef = inject(ViewContainerRef);
|
|
41864
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
41865
|
+
this.selectedLanguages = [];
|
|
41866
|
+
this.recordLanguages = [];
|
|
41867
|
+
this.formLanguage = '';
|
|
41868
|
+
this.isActionMenuOpen = false;
|
|
41869
|
+
this.subscription = new Subscription();
|
|
41870
|
+
this.supportedLanguages$ = this.recordsRepository
|
|
41871
|
+
.getApplicationLanguages()
|
|
41872
|
+
.pipe(map$2((languages) => this.sortLanguages(languages)));
|
|
41873
|
+
}
|
|
41874
|
+
set record(value) {
|
|
41875
|
+
this._record = value;
|
|
41876
|
+
this.isMultilingual = value.otherLanguages.length > 0;
|
|
41877
|
+
this.editTranslations = false;
|
|
41878
|
+
this.recordLanguages = [...value.otherLanguages, value.defaultLanguage];
|
|
41879
|
+
this.selectedLanguages = this.recordLanguages;
|
|
41880
|
+
this.formLanguage = value.defaultLanguage;
|
|
41881
|
+
}
|
|
41882
|
+
ngOnDestroy() {
|
|
41883
|
+
this.subscription.unsubscribe();
|
|
41884
|
+
}
|
|
41885
|
+
sortLanguages(languages) {
|
|
41886
|
+
return languages
|
|
41887
|
+
.map((lang) => {
|
|
41888
|
+
const label = this.translateService.instant('language.' + lang);
|
|
41889
|
+
const isTranslated = label !== 'language.' + lang;
|
|
41890
|
+
return {
|
|
41891
|
+
lang,
|
|
41892
|
+
label,
|
|
41893
|
+
isTranslated,
|
|
41894
|
+
};
|
|
41895
|
+
})
|
|
41896
|
+
.sort((a, b) => {
|
|
41897
|
+
if (a.isTranslated && !b.isTranslated)
|
|
41898
|
+
return -1;
|
|
41899
|
+
if (!a.isTranslated && b.isTranslated)
|
|
41900
|
+
return 1;
|
|
41901
|
+
return a.label.localeCompare(b.label);
|
|
41902
|
+
})
|
|
41903
|
+
.map((item) => item.lang);
|
|
41904
|
+
}
|
|
41905
|
+
toggleLanguageSelection() {
|
|
41906
|
+
this.editTranslations = !this.editTranslations;
|
|
41907
|
+
}
|
|
41908
|
+
getIconClass(lang) {
|
|
41909
|
+
return extraFlagMap[lang]
|
|
41910
|
+
? `fi fi-${extraFlagMap[lang]} w-4 h-3`
|
|
41911
|
+
: `fi fi-${lang} w-4 h-3`;
|
|
41912
|
+
}
|
|
41913
|
+
switchMultilingual() {
|
|
41914
|
+
if (this.isMultilingual && this.selectedLanguages.length > 1) {
|
|
41915
|
+
this.confirmDeleteAction();
|
|
41916
|
+
}
|
|
41917
|
+
else {
|
|
41918
|
+
this.isMultilingual = true;
|
|
41919
|
+
this.editTranslations = true;
|
|
41920
|
+
}
|
|
41921
|
+
}
|
|
41922
|
+
getExtraClass(lang) {
|
|
41923
|
+
const baseClass = 'h-[34px] w-full font-bold justify-start hover:bg-white';
|
|
41924
|
+
if (this.selectedLanguages.includes(lang)) {
|
|
41925
|
+
return `${baseClass} bg-white border border-black`;
|
|
41926
|
+
}
|
|
41927
|
+
return baseClass;
|
|
41928
|
+
}
|
|
41929
|
+
toggleLanguage(lang) {
|
|
41930
|
+
if (this.selectedLanguages.includes(lang)) {
|
|
41931
|
+
this.removeSelectedLanguage(lang);
|
|
41932
|
+
}
|
|
41933
|
+
else {
|
|
41934
|
+
this.selectedLanguages.push(lang);
|
|
41935
|
+
}
|
|
41936
|
+
}
|
|
41937
|
+
removeSelectedLanguage(lang) {
|
|
41938
|
+
this.selectedLanguages = this.selectedLanguages.filter((language) => language !== lang);
|
|
41939
|
+
}
|
|
41940
|
+
validateTranslations() {
|
|
41941
|
+
const equalLength = this.selectedLanguages.length === this.recordLanguages.length;
|
|
41942
|
+
if (this.selectedLanguages.length < this.recordLanguages.length ||
|
|
41943
|
+
(equalLength && this.selectedLanguages !== this.recordLanguages)) {
|
|
41944
|
+
this.confirmDeleteAction(this.selectedLanguages);
|
|
41945
|
+
}
|
|
41946
|
+
else {
|
|
41947
|
+
this.updateTranslations();
|
|
41948
|
+
}
|
|
41949
|
+
}
|
|
41950
|
+
updateTranslations() {
|
|
41951
|
+
const newLanguageSelection = this.selectedLanguages.filter((lang) => lang !== this.formLanguage);
|
|
41952
|
+
this.facade.updateRecordLanguages(this.formLanguage, newLanguageSelection);
|
|
41953
|
+
this.recordLanguages = newLanguageSelection;
|
|
41954
|
+
this.editTranslations = false;
|
|
41955
|
+
}
|
|
41956
|
+
switchFormLang(lang) {
|
|
41957
|
+
// TO IMPLEMENT FURTHER
|
|
41958
|
+
}
|
|
41959
|
+
switchDefaultLang(lang) {
|
|
41960
|
+
this.formLanguage = lang;
|
|
41961
|
+
this.facade.updateRecordLanguages(lang, this.selectedLanguages.filter((lang) => lang !== this.formLanguage));
|
|
41962
|
+
this.closeActionMenu();
|
|
41963
|
+
}
|
|
41964
|
+
confirmDeleteAction(lang) {
|
|
41965
|
+
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
41966
|
+
data: {
|
|
41967
|
+
title: this.translateService.instant('editor.record.multilingual.confirmation.title'),
|
|
41968
|
+
message: this.translateService.instant('editor.record.multilingual.confirmation.message'),
|
|
41969
|
+
confirmText: this.translateService.instant('editor.record.multilingual.confirmation.confirmText'),
|
|
41970
|
+
cancelText: this.translateService.instant('editor.record.multilingual.confirmation.cancelText'),
|
|
41971
|
+
focusCancel: true,
|
|
41972
|
+
},
|
|
41973
|
+
restoreFocus: true,
|
|
41974
|
+
});
|
|
41975
|
+
this.subscription.add(dialogRef.afterClosed().subscribe((confirmed) => {
|
|
41976
|
+
if (confirmed) {
|
|
41977
|
+
if (lang) {
|
|
41978
|
+
if (!Array.isArray(lang)) {
|
|
41979
|
+
this.removeSelectedLanguage(lang);
|
|
41980
|
+
this.closeActionMenu();
|
|
41981
|
+
}
|
|
41982
|
+
this.updateTranslations();
|
|
41983
|
+
}
|
|
41984
|
+
else {
|
|
41985
|
+
this.facade.updateRecordLanguages(this.formLanguage, []);
|
|
41986
|
+
this.isMultilingual = false;
|
|
41987
|
+
this.selectedLanguages = [];
|
|
41988
|
+
}
|
|
41989
|
+
}
|
|
41990
|
+
else {
|
|
41991
|
+
this.isMultilingual = true;
|
|
41992
|
+
this.selectedLanguages = this.recordLanguages;
|
|
41993
|
+
}
|
|
41994
|
+
this.editTranslations = false;
|
|
41995
|
+
}));
|
|
41996
|
+
}
|
|
41997
|
+
isFirstUnsupported(index) {
|
|
41998
|
+
const langs = this.sortLanguages(this.recordLanguages);
|
|
41999
|
+
return (langs[index].length === 3 &&
|
|
42000
|
+
langs.slice(0, index).every((lang) => lang.length !== 3));
|
|
42001
|
+
}
|
|
42002
|
+
isLangSupported(lang) {
|
|
42003
|
+
return lang.length === 2;
|
|
42004
|
+
}
|
|
42005
|
+
getToggleTitle(lang) {
|
|
42006
|
+
if (lang === this._record.defaultLanguage) {
|
|
42007
|
+
return this.translateService.instant('editor.record.form.multilingual.forbidden');
|
|
42008
|
+
}
|
|
42009
|
+
return '';
|
|
42010
|
+
}
|
|
42011
|
+
openActionMenu(item, template) {
|
|
42012
|
+
this.isActionMenuOpen = true;
|
|
42013
|
+
const index = this.sortLanguages(this.selectedLanguages).indexOf(item);
|
|
42014
|
+
const buttonElement = this.actionMenuButtons.toArray()[index];
|
|
42015
|
+
const positionStrategy = this.overlay
|
|
42016
|
+
.position()
|
|
42017
|
+
.flexibleConnectedTo(buttonElement)
|
|
42018
|
+
.withFlexibleDimensions(true)
|
|
42019
|
+
.withPush(true)
|
|
42020
|
+
.withPositions([
|
|
42021
|
+
{
|
|
42022
|
+
originX: 'end',
|
|
42023
|
+
originY: 'bottom',
|
|
42024
|
+
overlayX: 'end',
|
|
42025
|
+
overlayY: 'top',
|
|
42026
|
+
},
|
|
42027
|
+
{
|
|
42028
|
+
originX: 'end',
|
|
42029
|
+
originY: 'top',
|
|
42030
|
+
overlayX: 'end',
|
|
42031
|
+
overlayY: 'bottom',
|
|
42032
|
+
},
|
|
42033
|
+
]);
|
|
42034
|
+
this.overlayRef = this.overlay.create({
|
|
42035
|
+
hasBackdrop: true,
|
|
42036
|
+
backdropClass: 'cdk-overlay-transparent-backdrop',
|
|
42037
|
+
positionStrategy: positionStrategy,
|
|
42038
|
+
scrollStrategy: this.overlay.scrollStrategies.reposition(),
|
|
42039
|
+
});
|
|
42040
|
+
const portal = new TemplatePortal(template, this.viewContainerRef);
|
|
42041
|
+
this.overlayRef.attach(portal);
|
|
42042
|
+
this.subscription.add(this.overlayRef.backdropClick().subscribe(() => {
|
|
42043
|
+
this.closeActionMenu();
|
|
42044
|
+
}));
|
|
42045
|
+
}
|
|
42046
|
+
closeActionMenu() {
|
|
42047
|
+
if (this.overlayRef) {
|
|
42048
|
+
this.isActionMenuOpen = false;
|
|
42049
|
+
this.overlayRef.dispose();
|
|
42050
|
+
this.cdr.markForCheck();
|
|
42051
|
+
}
|
|
42052
|
+
}
|
|
42053
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MultilingualPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
42054
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: MultilingualPanelComponent, isStandalone: true, selector: "gn-ui-multilingual-panel", inputs: { record: "record" }, providers: [
|
|
42055
|
+
provideIcons({
|
|
42056
|
+
iconoirSettings,
|
|
42057
|
+
matMoreHorizOutline,
|
|
42058
|
+
iconoirCheckCircle,
|
|
42059
|
+
iconoirCircle,
|
|
42060
|
+
}),
|
|
42061
|
+
provideNgIconsConfig({
|
|
42062
|
+
size: '1.25em',
|
|
42063
|
+
}),
|
|
42064
|
+
], viewQueries: [{ propertyName: "actionMenuButtons", predicate: ["actionMenuButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n class=\"flex flex-col h-full w-[302px] border-l border-gray-300 py-8 px-3 gap-6 overflow-auto\"\n style=\"background-color: #fafaf9\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.multilingual.title</span\n >\n @if (isMultilingual) {\n <button\n [title]=\"'editor.record.form.multilingual.open' | translate\"\n (click)=\"toggleLanguageSelection()\"\n data-test=\"activateSelection\"\n >\n <ng-icon class=\"mt-1\" name=\"iconoirSettings\"></ng-icon>\n </button>\n }\n </div>\n @if (editTranslations || !isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n <gn-ui-check-toggle\n class=\"p-2\"\n [label]=\"'editor.record.form.multilingual.enable' | translate\"\n [color]=\"'primary'\"\n [(value)]=\"isMultilingual\"\n (toggled)=\"switchMultilingual($event)\"\n ></gn-ui-check-toggle>\n @if (isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n <div\n class=\"flex flex-row justify-between border-t border-gray-300 p-3\"\n >\n <span class=\"mt-2 text-sm text-gray-600\" translate\n >editor.record.form.multilingual.activate</span\n >\n <gn-ui-button\n extraClass=\"w-16 h-8 font-bold\"\n type=\"gray\"\n (buttonClick)=\"validateTranslations()\"\n data-test=\"validateSelection\"\n >{{ 'editor.record.form.multilingual.validate' | translate }}\n </gn-ui-button>\n </div>\n @if (supportedLanguages$ | async; as languages) {\n @for (lang of languages; track lang) {\n <div\n class=\"flex flex-col gap-2 w-full px-2\"\n data-test=\"langAvailable\"\n [attr.data-test-lang]=\"lang\"\n >\n <gn-ui-button\n [extraClass]=\"getExtraClass(lang)\"\n type=\"gray\"\n (buttonClick)=\"toggleLanguage(lang)\"\n [disabled]=\"lang === _record.defaultLanguage\"\n [title]=\"getToggleTitle(lang)\"\n >\n <span [class]=\"getIconClass(lang)\"></span>\n <span class=\"ml-2\">{{ 'language.' + lang | translate }}</span>\n </gn-ui-button>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n @if (!editTranslations && isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n @for (\n recordLang of sortLanguages(recordLanguages);\n track recordLang;\n let i = $index\n ) {\n <gn-ui-button\n extraClass=\"flex flex-row justify-between bg-white border border-white rounded mb-1 h-[34px] w-full\"\n [ngClass]=\"{\n 'mt-8': isFirstUnsupported(i),\n '': true,\n }\"\n (buttonClick)=\"switchFormLang(recordLang)\"\n type=\"outline\"\n data-test=\"langSwitch\"\n >\n <div class=\"flex flex-row gap-2 items-center\">\n @if (recordLang === formLanguage) {\n <ng-icon\n class=\"text-primary mt-1\"\n name=\"iconoirCheckCircle\"\n ></ng-icon>\n }\n @if (recordLang !== formLanguage) {\n <ng-icon\n class=\"text-gray-800 mt-1\"\n name=\"iconoirCircle\"\n ></ng-icon>\n }\n @if (recordLang.length === 2) {\n <span [class]=\"getIconClass(recordLang) + 'mt-1'\"></span>\n }\n <span [ngClass]=\"recordLang === formLanguage ? 'text-black' : ''\">{{\n isLangSupported(recordLang)\n ? ('language.' + recordLang | translate)\n : recordLang.toUpperCase()\n }}</span>\n </div>\n <div class=\"flex flex-row gap-2 items-center\">\n @if (recordLang === formLanguage) {\n <span class=\"text-xs text-base\" translate\n >editor.record.form.multilingual.default</span\n >\n }\n <button\n (click)=\"\n openActionMenu(recordLang, template); $event.stopPropagation()\n \"\n cdkOverlayOrigin\n #actionMenuButton\n >\n <ng-icon class=\"pb-5\" name=\"matMoreHorizOutline\"></ng-icon>\n </button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDelete]=\"recordLang !== _record.defaultLanguage\"\n page=\"record\"\n (delete)=\"confirmDeleteAction(recordLang)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (switch)=\"switchDefaultLang(recordLang)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </div>\n </gn-ui-button>\n }\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: CheckToggleComponent, selector: "gn-ui-check-toggle", inputs: ["title", "label", "value", "color"], outputs: ["toggled"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { 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: "component", type: ActionMenuComponent, selector: "gn-ui-action-menu", inputs: ["canDuplicate", "isDuplicating", "canDelete", "page"], outputs: ["duplicate", "delete", "closeActionMenu", "rollback", "switch"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
|
|
42065
|
+
}
|
|
42066
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MultilingualPanelComponent, decorators: [{
|
|
42067
|
+
type: Component,
|
|
42068
|
+
args: [{ selector: 'gn-ui-multilingual-panel', standalone: true, imports: [
|
|
42069
|
+
CommonModule,
|
|
42070
|
+
CheckToggleComponent,
|
|
42071
|
+
TranslateDirective,
|
|
42072
|
+
TranslatePipe,
|
|
42073
|
+
ButtonComponent,
|
|
42074
|
+
NgIconComponent,
|
|
42075
|
+
ActionMenuComponent,
|
|
42076
|
+
], providers: [
|
|
42077
|
+
provideIcons({
|
|
42078
|
+
iconoirSettings,
|
|
42079
|
+
matMoreHorizOutline,
|
|
42080
|
+
iconoirCheckCircle,
|
|
42081
|
+
iconoirCircle,
|
|
42082
|
+
}),
|
|
42083
|
+
provideNgIconsConfig({
|
|
42084
|
+
size: '1.25em',
|
|
42085
|
+
}),
|
|
42086
|
+
], template: "<div\n class=\"flex flex-col h-full w-[302px] border-l border-gray-300 py-8 px-3 gap-6 overflow-auto\"\n style=\"background-color: #fafaf9\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.multilingual.title</span\n >\n @if (isMultilingual) {\n <button\n [title]=\"'editor.record.form.multilingual.open' | translate\"\n (click)=\"toggleLanguageSelection()\"\n data-test=\"activateSelection\"\n >\n <ng-icon class=\"mt-1\" name=\"iconoirSettings\"></ng-icon>\n </button>\n }\n </div>\n @if (editTranslations || !isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n <gn-ui-check-toggle\n class=\"p-2\"\n [label]=\"'editor.record.form.multilingual.enable' | translate\"\n [color]=\"'primary'\"\n [(value)]=\"isMultilingual\"\n (toggled)=\"switchMultilingual($event)\"\n ></gn-ui-check-toggle>\n @if (isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n <div\n class=\"flex flex-row justify-between border-t border-gray-300 p-3\"\n >\n <span class=\"mt-2 text-sm text-gray-600\" translate\n >editor.record.form.multilingual.activate</span\n >\n <gn-ui-button\n extraClass=\"w-16 h-8 font-bold\"\n type=\"gray\"\n (buttonClick)=\"validateTranslations()\"\n data-test=\"validateSelection\"\n >{{ 'editor.record.form.multilingual.validate' | translate }}\n </gn-ui-button>\n </div>\n @if (supportedLanguages$ | async; as languages) {\n @for (lang of languages; track lang) {\n <div\n class=\"flex flex-col gap-2 w-full px-2\"\n data-test=\"langAvailable\"\n [attr.data-test-lang]=\"lang\"\n >\n <gn-ui-button\n [extraClass]=\"getExtraClass(lang)\"\n type=\"gray\"\n (buttonClick)=\"toggleLanguage(lang)\"\n [disabled]=\"lang === _record.defaultLanguage\"\n [title]=\"getToggleTitle(lang)\"\n >\n <span [class]=\"getIconClass(lang)\"></span>\n <span class=\"ml-2\">{{ 'language.' + lang | translate }}</span>\n </gn-ui-button>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n @if (!editTranslations && isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n @for (\n recordLang of sortLanguages(recordLanguages);\n track recordLang;\n let i = $index\n ) {\n <gn-ui-button\n extraClass=\"flex flex-row justify-between bg-white border border-white rounded mb-1 h-[34px] w-full\"\n [ngClass]=\"{\n 'mt-8': isFirstUnsupported(i),\n '': true,\n }\"\n (buttonClick)=\"switchFormLang(recordLang)\"\n type=\"outline\"\n data-test=\"langSwitch\"\n >\n <div class=\"flex flex-row gap-2 items-center\">\n @if (recordLang === formLanguage) {\n <ng-icon\n class=\"text-primary mt-1\"\n name=\"iconoirCheckCircle\"\n ></ng-icon>\n }\n @if (recordLang !== formLanguage) {\n <ng-icon\n class=\"text-gray-800 mt-1\"\n name=\"iconoirCircle\"\n ></ng-icon>\n }\n @if (recordLang.length === 2) {\n <span [class]=\"getIconClass(recordLang) + 'mt-1'\"></span>\n }\n <span [ngClass]=\"recordLang === formLanguage ? 'text-black' : ''\">{{\n isLangSupported(recordLang)\n ? ('language.' + recordLang | translate)\n : recordLang.toUpperCase()\n }}</span>\n </div>\n <div class=\"flex flex-row gap-2 items-center\">\n @if (recordLang === formLanguage) {\n <span class=\"text-xs text-base\" translate\n >editor.record.form.multilingual.default</span\n >\n }\n <button\n (click)=\"\n openActionMenu(recordLang, template); $event.stopPropagation()\n \"\n cdkOverlayOrigin\n #actionMenuButton\n >\n <ng-icon class=\"pb-5\" name=\"matMoreHorizOutline\"></ng-icon>\n </button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDelete]=\"recordLang !== _record.defaultLanguage\"\n page=\"record\"\n (delete)=\"confirmDeleteAction(recordLang)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (switch)=\"switchDefaultLang(recordLang)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </div>\n </gn-ui-button>\n }\n </div>\n }\n</div>\n" }]
|
|
42087
|
+
}], propDecorators: { record: [{
|
|
42088
|
+
type: Input
|
|
42089
|
+
}], actionMenuButtons: [{
|
|
42090
|
+
type: ViewChildren,
|
|
42091
|
+
args: ['actionMenuButton', { read: ElementRef }]
|
|
42092
|
+
}] } });
|
|
42093
|
+
|
|
41886
42094
|
class GenericKeywordsComponent {
|
|
41887
42095
|
constructor() {
|
|
41888
42096
|
this.platformService = inject(PlatformServiceInterface);
|
|
@@ -43761,327 +43969,148 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
43761
43969
|
args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, FormFieldComponent, TranslateDirective], template: "<div class=\"flex flex-col gap-6\">\n @for (\n section of facade.currentSections$ | async;\n track sectionTracker($index, section)\n ) {\n @if (!section.hidden) {\n <div class=\"flex flex-col gap-6 border p-8 rounded-[8px] shadow\">\n <div class=\"flex flex-col gap-2\">\n @if (section.labelKey) {\n <div class=\"text-2xl font-title text-black\" translate>\n {{ section.labelKey }}\n </div>\n }\n @if (section.descriptionKey) {\n <div class=\"text-gray-800 text-sm\" translate>\n {{ section.descriptionKey }}\n </div>\n }\n </div>\n <div class=\"grid auto-rows-auto grid-cols-2 gap-[32px]\">\n @for (\n field of section.fieldsWithValues;\n track fieldTracker($index, field)\n ) {\n @if (!field.config.hidden) {\n <gn-ui-form-field\n [ngClass]=\"\n field.config.gridColumnSpan === 1\n ? 'col-span-1'\n : 'col-span-2'\n \"\n [uniqueIdentifier]=\"recordUniqueIdentifier$ | async\"\n [model]=\"field.config.model!\"\n [modelSpecifier]=\"field.config.modelSpecifier!\"\n [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n [componentName]=\"field.config.componentName\"\n (valueChange)=\"\n handleFieldValueChange(field.config.model!, $event)\n \"\n ></gn-ui-form-field>\n }\n }\n </div>\n </div>\n }\n }\n</div>\n" }]
|
|
43762
43970
|
}] });
|
|
43763
43971
|
|
|
43764
|
-
|
|
43765
|
-
|
|
43766
|
-
|
|
43767
|
-
ko: 'kr',
|
|
43768
|
-
cs: 'cz',
|
|
43769
|
-
zh: 'cn',
|
|
43770
|
-
ca: 'es-ct',
|
|
43771
|
-
rm: 'ch',
|
|
43772
|
-
da: 'dk',
|
|
43773
|
-
sv: 'se',
|
|
43774
|
-
cy: 'gb-wls',
|
|
43775
|
-
hy: 'am',
|
|
43776
|
-
ka: 'ge',
|
|
43777
|
-
uk: 'ua',
|
|
43778
|
-
};
|
|
43779
|
-
class MultilingualPanelComponent {
|
|
43780
|
-
constructor() {
|
|
43781
|
-
this.facade = inject(EditorFacade);
|
|
43782
|
-
this.dialog = inject(MatDialog);
|
|
43783
|
-
this.translateService = inject(TranslateService);
|
|
43784
|
-
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
43785
|
-
this.overlay = inject(Overlay);
|
|
43786
|
-
this.viewContainerRef = inject(ViewContainerRef);
|
|
43787
|
-
this.cdr = inject(ChangeDetectorRef);
|
|
43788
|
-
this.selectedLanguages = [];
|
|
43789
|
-
this.recordLanguages = [];
|
|
43790
|
-
this.formLanguage = '';
|
|
43791
|
-
this.isActionMenuOpen = false;
|
|
43792
|
-
this.subscription = new Subscription();
|
|
43793
|
-
this.supportedLanguages$ = this.recordsRepository
|
|
43794
|
-
.getApplicationLanguages()
|
|
43795
|
-
.pipe(map$2((languages) => this.sortLanguages(languages)));
|
|
43796
|
-
}
|
|
43797
|
-
set record(value) {
|
|
43798
|
-
this._record = value;
|
|
43799
|
-
this.isMultilingual = value.otherLanguages.length > 0;
|
|
43800
|
-
this.editTranslations = false;
|
|
43801
|
-
this.recordLanguages = [...value.otherLanguages, value.defaultLanguage];
|
|
43802
|
-
this.selectedLanguages = this.recordLanguages;
|
|
43803
|
-
this.formLanguage = value.defaultLanguage;
|
|
43804
|
-
}
|
|
43805
|
-
ngOnDestroy() {
|
|
43806
|
-
this.subscription.unsubscribe();
|
|
43807
|
-
}
|
|
43808
|
-
sortLanguages(languages) {
|
|
43809
|
-
return languages
|
|
43810
|
-
.map((lang) => {
|
|
43811
|
-
const label = this.translateService.instant('language.' + lang);
|
|
43812
|
-
const isTranslated = label !== 'language.' + lang;
|
|
43813
|
-
return {
|
|
43814
|
-
lang,
|
|
43815
|
-
label,
|
|
43816
|
-
isTranslated,
|
|
43817
|
-
};
|
|
43818
|
-
})
|
|
43819
|
-
.sort((a, b) => {
|
|
43820
|
-
if (a.isTranslated && !b.isTranslated)
|
|
43821
|
-
return -1;
|
|
43822
|
-
if (!a.isTranslated && b.isTranslated)
|
|
43823
|
-
return 1;
|
|
43824
|
-
return a.label.localeCompare(b.label);
|
|
43825
|
-
})
|
|
43826
|
-
.map((item) => item.lang);
|
|
43827
|
-
}
|
|
43828
|
-
toggleLanguageSelection() {
|
|
43829
|
-
this.editTranslations = !this.editTranslations;
|
|
43830
|
-
}
|
|
43831
|
-
getIconClass(lang) {
|
|
43832
|
-
return extraFlagMap[lang]
|
|
43833
|
-
? `fi fi-${extraFlagMap[lang]} w-4 h-3`
|
|
43834
|
-
: `fi fi-${lang} w-4 h-3`;
|
|
43835
|
-
}
|
|
43836
|
-
switchMultilingual() {
|
|
43837
|
-
if (this.isMultilingual && this.selectedLanguages.length > 1) {
|
|
43838
|
-
this.confirmDeleteAction();
|
|
43839
|
-
}
|
|
43840
|
-
else {
|
|
43841
|
-
this.isMultilingual = true;
|
|
43842
|
-
this.editTranslations = true;
|
|
43843
|
-
}
|
|
43844
|
-
}
|
|
43845
|
-
getExtraClass(lang) {
|
|
43846
|
-
const baseClass = 'h-[34px] w-full font-bold justify-start hover:bg-white';
|
|
43847
|
-
if (this.selectedLanguages.includes(lang)) {
|
|
43848
|
-
return `${baseClass} bg-white border border-black`;
|
|
43849
|
-
}
|
|
43850
|
-
return baseClass;
|
|
43972
|
+
function evaluate(expression) {
|
|
43973
|
+
if (expression.match(/^\${.*}$/)) {
|
|
43974
|
+
return evaluate(expression.slice(2, -1));
|
|
43851
43975
|
}
|
|
43852
|
-
|
|
43853
|
-
|
|
43854
|
-
|
|
43855
|
-
|
|
43856
|
-
|
|
43857
|
-
|
|
43858
|
-
}
|
|
43976
|
+
const operator = expression.split('(')[0];
|
|
43977
|
+
switch (operator) {
|
|
43978
|
+
case 'dateNow':
|
|
43979
|
+
return () => new Date();
|
|
43980
|
+
default:
|
|
43981
|
+
throw new Error(`Unknown operator: ${operator}`);
|
|
43859
43982
|
}
|
|
43860
|
-
|
|
43861
|
-
|
|
43983
|
+
}
|
|
43984
|
+
|
|
43985
|
+
class EditorService {
|
|
43986
|
+
constructor() {
|
|
43987
|
+
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
43862
43988
|
}
|
|
43863
|
-
|
|
43864
|
-
|
|
43865
|
-
|
|
43866
|
-
|
|
43867
|
-
|
|
43989
|
+
// returns the record as it was when saved, alongside its source
|
|
43990
|
+
saveRecord(record, recordSource, fieldsConfig) {
|
|
43991
|
+
const savedRecord = { ...record };
|
|
43992
|
+
const fields = fieldsConfig.pages.flatMap((page) => page.sections.flatMap((section) => section.fields));
|
|
43993
|
+
// run onSave processes
|
|
43994
|
+
for (const field of fields) {
|
|
43995
|
+
if (field.onSaveProcess && field.model) {
|
|
43996
|
+
const evaluator = evaluate(field.onSaveProcess);
|
|
43997
|
+
savedRecord[field.model] = evaluator({
|
|
43998
|
+
model: field.model,
|
|
43999
|
+
value: record[field.model],
|
|
44000
|
+
});
|
|
44001
|
+
}
|
|
43868
44002
|
}
|
|
43869
|
-
|
|
43870
|
-
|
|
44003
|
+
let publishToAll = true;
|
|
44004
|
+
// if the record is new, generate a new unique identifier and pass publishToAll as false
|
|
44005
|
+
if (!record.uniqueIdentifier) {
|
|
44006
|
+
savedRecord.uniqueIdentifier = null;
|
|
44007
|
+
publishToAll = false;
|
|
43871
44008
|
}
|
|
44009
|
+
return this.recordsRepository
|
|
44010
|
+
.saveRecord(savedRecord, recordSource, publishToAll)
|
|
44011
|
+
.pipe(switchMap((uniqueIdentifier) => this.recordsRepository.openRecordForEdition(uniqueIdentifier)), tap$1(() => {
|
|
44012
|
+
// if saving was successful, the original draft can be discarded
|
|
44013
|
+
this.recordsRepository.clearRecordDraft(record.uniqueIdentifier);
|
|
44014
|
+
}), map$1(([record, recordSource]) => [record, recordSource]));
|
|
43872
44015
|
}
|
|
43873
|
-
|
|
43874
|
-
|
|
43875
|
-
|
|
43876
|
-
|
|
43877
|
-
this.
|
|
43878
|
-
|
|
43879
|
-
|
|
43880
|
-
// TO IMPLEMENT FURTHER
|
|
43881
|
-
}
|
|
43882
|
-
switchDefaultLang(lang) {
|
|
43883
|
-
this.formLanguage = lang;
|
|
43884
|
-
this.facade.updateRecordLanguages(lang, this.selectedLanguages.filter((lang) => lang !== this.formLanguage));
|
|
43885
|
-
this.closeActionMenu();
|
|
43886
|
-
}
|
|
43887
|
-
confirmDeleteAction(lang) {
|
|
43888
|
-
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
43889
|
-
data: {
|
|
43890
|
-
title: this.translateService.instant('editor.record.multilingual.confirmation.title'),
|
|
43891
|
-
message: this.translateService.instant('editor.record.multilingual.confirmation.message'),
|
|
43892
|
-
confirmText: this.translateService.instant('editor.record.multilingual.confirmation.confirmText'),
|
|
43893
|
-
cancelText: this.translateService.instant('editor.record.multilingual.confirmation.cancelText'),
|
|
43894
|
-
focusCancel: true,
|
|
43895
|
-
},
|
|
43896
|
-
restoreFocus: true,
|
|
43897
|
-
});
|
|
43898
|
-
this.subscription.add(dialogRef.afterClosed().subscribe((confirmed) => {
|
|
43899
|
-
if (confirmed) {
|
|
43900
|
-
if (lang) {
|
|
43901
|
-
if (!Array.isArray(lang)) {
|
|
43902
|
-
this.removeSelectedLanguage(lang);
|
|
43903
|
-
this.closeActionMenu();
|
|
43904
|
-
}
|
|
43905
|
-
this.updateTranslations();
|
|
43906
|
-
}
|
|
43907
|
-
else {
|
|
43908
|
-
this.facade.updateRecordLanguages(this.formLanguage, []);
|
|
43909
|
-
this.isMultilingual = false;
|
|
43910
|
-
this.selectedLanguages = [];
|
|
43911
|
-
}
|
|
43912
|
-
}
|
|
43913
|
-
else {
|
|
43914
|
-
this.isMultilingual = true;
|
|
43915
|
-
this.selectedLanguages = this.recordLanguages;
|
|
43916
|
-
}
|
|
43917
|
-
this.editTranslations = false;
|
|
43918
|
-
}));
|
|
43919
|
-
}
|
|
43920
|
-
isFirstUnsupported(index) {
|
|
43921
|
-
const langs = this.sortLanguages(this.recordLanguages);
|
|
43922
|
-
return (langs[index].length === 3 &&
|
|
43923
|
-
langs.slice(0, index).every((lang) => lang.length !== 3));
|
|
43924
|
-
}
|
|
43925
|
-
isLangSupported(lang) {
|
|
43926
|
-
return lang.length === 2;
|
|
43927
|
-
}
|
|
43928
|
-
getToggleTitle(lang) {
|
|
43929
|
-
if (lang === this._record.defaultLanguage) {
|
|
43930
|
-
return this.translateService.instant('editor.record.form.multilingual.forbidden');
|
|
43931
|
-
}
|
|
43932
|
-
return '';
|
|
44016
|
+
// emits and completes once saving is done
|
|
44017
|
+
// note: onSave processes are not run for drafts
|
|
44018
|
+
saveRecordAsDraft(record, recordSource) {
|
|
44019
|
+
record.recordUpdated = new Date();
|
|
44020
|
+
return this.recordsRepository
|
|
44021
|
+
.saveRecordAsDraft(record, recordSource)
|
|
44022
|
+
.pipe(map$1(() => undefined));
|
|
43933
44023
|
}
|
|
43934
|
-
|
|
43935
|
-
this.
|
|
43936
|
-
|
|
43937
|
-
const buttonElement = this.actionMenuButtons.toArray()[index];
|
|
43938
|
-
const positionStrategy = this.overlay
|
|
43939
|
-
.position()
|
|
43940
|
-
.flexibleConnectedTo(buttonElement)
|
|
43941
|
-
.withFlexibleDimensions(true)
|
|
43942
|
-
.withPush(true)
|
|
43943
|
-
.withPositions([
|
|
43944
|
-
{
|
|
43945
|
-
originX: 'end',
|
|
43946
|
-
originY: 'bottom',
|
|
43947
|
-
overlayX: 'end',
|
|
43948
|
-
overlayY: 'top',
|
|
43949
|
-
},
|
|
43950
|
-
{
|
|
43951
|
-
originX: 'end',
|
|
43952
|
-
originY: 'top',
|
|
43953
|
-
overlayX: 'end',
|
|
43954
|
-
overlayY: 'bottom',
|
|
43955
|
-
},
|
|
43956
|
-
]);
|
|
43957
|
-
this.overlayRef = this.overlay.create({
|
|
43958
|
-
hasBackdrop: true,
|
|
43959
|
-
backdropClass: 'cdk-overlay-transparent-backdrop',
|
|
43960
|
-
positionStrategy: positionStrategy,
|
|
43961
|
-
scrollStrategy: this.overlay.scrollStrategies.reposition(),
|
|
43962
|
-
});
|
|
43963
|
-
const portal = new TemplatePortal(template, this.viewContainerRef);
|
|
43964
|
-
this.overlayRef.attach(portal);
|
|
43965
|
-
this.subscription.add(this.overlayRef.backdropClick().subscribe(() => {
|
|
43966
|
-
this.closeActionMenu();
|
|
43967
|
-
}));
|
|
44024
|
+
undoRecordDraft(record) {
|
|
44025
|
+
this.recordsRepository.clearRecordDraft(record.uniqueIdentifier);
|
|
44026
|
+
return this.recordsRepository.openRecordForEdition(record.uniqueIdentifier);
|
|
43968
44027
|
}
|
|
43969
|
-
|
|
43970
|
-
|
|
43971
|
-
this.isActionMenuOpen = false;
|
|
43972
|
-
this.overlayRef.dispose();
|
|
43973
|
-
this.cdr.markForCheck();
|
|
43974
|
-
}
|
|
44028
|
+
hasRecordChangedSinceDraft(localRecord) {
|
|
44029
|
+
return this.recordsRepository.hasRecordChangedSinceDraft(localRecord);
|
|
43975
44030
|
}
|
|
43976
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type:
|
|
43977
|
-
static { this.ɵ
|
|
43978
|
-
provideIcons({
|
|
43979
|
-
iconoirSettings,
|
|
43980
|
-
matMoreHorizOutline,
|
|
43981
|
-
iconoirCheckCircle,
|
|
43982
|
-
iconoirCircle,
|
|
43983
|
-
}),
|
|
43984
|
-
provideNgIconsConfig({
|
|
43985
|
-
size: '1.25em',
|
|
43986
|
-
}),
|
|
43987
|
-
], viewQueries: [{ propertyName: "actionMenuButtons", predicate: ["actionMenuButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n class=\"flex flex-col h-full w-[302px] border-l border-gray-300 py-8 px-3 gap-6 overflow-auto\"\n style=\"background-color: #fafaf9\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.multilingual.title</span\n >\n @if (isMultilingual) {\n <button\n [title]=\"'editor.record.form.multilingual.open' | translate\"\n (click)=\"toggleLanguageSelection()\"\n data-test=\"activateSelection\"\n >\n <ng-icon class=\"mt-1\" name=\"iconoirSettings\"></ng-icon>\n </button>\n }\n </div>\n @if (editTranslations || !isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n <gn-ui-check-toggle\n class=\"p-2\"\n [label]=\"'editor.record.form.multilingual.enable' | translate\"\n [color]=\"'primary'\"\n [(value)]=\"isMultilingual\"\n (toggled)=\"switchMultilingual($event)\"\n ></gn-ui-check-toggle>\n @if (isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n <div\n class=\"flex flex-row justify-between border-t border-gray-300 p-3\"\n >\n <span class=\"mt-2 text-sm text-gray-600\" translate\n >editor.record.form.multilingual.activate</span\n >\n <gn-ui-button\n extraClass=\"w-16 h-8 font-bold\"\n type=\"gray\"\n (buttonClick)=\"validateTranslations()\"\n data-test=\"validateSelection\"\n >{{ 'editor.record.form.multilingual.validate' | translate }}\n </gn-ui-button>\n </div>\n @if (supportedLanguages$ | async; as languages) {\n @for (lang of languages; track lang) {\n <div\n class=\"flex flex-col gap-2 w-full px-2\"\n data-test=\"langAvailable\"\n [attr.data-test-lang]=\"lang\"\n >\n <gn-ui-button\n [extraClass]=\"getExtraClass(lang)\"\n type=\"gray\"\n (buttonClick)=\"toggleLanguage(lang)\"\n [disabled]=\"lang === _record.defaultLanguage\"\n [title]=\"getToggleTitle(lang)\"\n >\n <span [class]=\"getIconClass(lang)\"></span>\n <span class=\"ml-2\">{{ 'language.' + lang | translate }}</span>\n </gn-ui-button>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n @if (!editTranslations && isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n @for (\n recordLang of sortLanguages(recordLanguages);\n track recordLang;\n let i = $index\n ) {\n <gn-ui-button\n extraClass=\"flex flex-row justify-between bg-white border border-white rounded mb-1 h-[34px] w-full\"\n [ngClass]=\"{\n 'mt-8': isFirstUnsupported(i),\n '': true,\n }\"\n (buttonClick)=\"switchFormLang(recordLang)\"\n type=\"outline\"\n data-test=\"langSwitch\"\n >\n <div class=\"flex flex-row gap-2 items-center\">\n @if (recordLang === formLanguage) {\n <ng-icon\n class=\"text-primary mt-1\"\n name=\"iconoirCheckCircle\"\n ></ng-icon>\n }\n @if (recordLang !== formLanguage) {\n <ng-icon\n class=\"text-gray-800 mt-1\"\n name=\"iconoirCircle\"\n ></ng-icon>\n }\n @if (recordLang.length === 2) {\n <span [class]=\"getIconClass(recordLang) + 'mt-1'\"></span>\n }\n <span [ngClass]=\"recordLang === formLanguage ? 'text-black' : ''\">{{\n isLangSupported(recordLang)\n ? ('language.' + recordLang | translate)\n : recordLang.toUpperCase()\n }}</span>\n </div>\n <div class=\"flex flex-row gap-2 items-center\">\n @if (recordLang === formLanguage) {\n <span class=\"text-xs text-base\" translate\n >editor.record.form.multilingual.default</span\n >\n }\n <button\n (click)=\"\n openActionMenu(recordLang, template); $event.stopPropagation()\n \"\n cdkOverlayOrigin\n #actionMenuButton\n >\n <ng-icon class=\"pb-5\" name=\"matMoreHorizOutline\"></ng-icon>\n </button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDelete]=\"recordLang !== _record.defaultLanguage\"\n page=\"record\"\n (delete)=\"confirmDeleteAction(recordLang)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (switch)=\"switchDefaultLang(recordLang)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </div>\n </gn-ui-button>\n }\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: CheckToggleComponent, selector: "gn-ui-check-toggle", inputs: ["title", "label", "value", "color"], outputs: ["toggled"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { 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: "component", type: ActionMenuComponent, selector: "gn-ui-action-menu", inputs: ["canDuplicate", "isDuplicating", "canDelete", "page"], outputs: ["duplicate", "delete", "closeActionMenu", "rollback", "switch"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
|
|
44031
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
44032
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, providedIn: 'root' }); }
|
|
43988
44033
|
}
|
|
43989
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type:
|
|
43990
|
-
type:
|
|
43991
|
-
args: [{
|
|
43992
|
-
|
|
43993
|
-
|
|
43994
|
-
|
|
43995
|
-
TranslatePipe,
|
|
43996
|
-
ButtonComponent,
|
|
43997
|
-
NgIconComponent,
|
|
43998
|
-
ActionMenuComponent,
|
|
43999
|
-
], providers: [
|
|
44000
|
-
provideIcons({
|
|
44001
|
-
iconoirSettings,
|
|
44002
|
-
matMoreHorizOutline,
|
|
44003
|
-
iconoirCheckCircle,
|
|
44004
|
-
iconoirCircle,
|
|
44005
|
-
}),
|
|
44006
|
-
provideNgIconsConfig({
|
|
44007
|
-
size: '1.25em',
|
|
44008
|
-
}),
|
|
44009
|
-
], template: "<div\n class=\"flex flex-col h-full w-[302px] border-l border-gray-300 py-8 px-3 gap-6 overflow-auto\"\n style=\"background-color: #fafaf9\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.multilingual.title</span\n >\n @if (isMultilingual) {\n <button\n [title]=\"'editor.record.form.multilingual.open' | translate\"\n (click)=\"toggleLanguageSelection()\"\n data-test=\"activateSelection\"\n >\n <ng-icon class=\"mt-1\" name=\"iconoirSettings\"></ng-icon>\n </button>\n }\n </div>\n @if (editTranslations || !isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n <gn-ui-check-toggle\n class=\"p-2\"\n [label]=\"'editor.record.form.multilingual.enable' | translate\"\n [color]=\"'primary'\"\n [(value)]=\"isMultilingual\"\n (toggled)=\"switchMultilingual($event)\"\n ></gn-ui-check-toggle>\n @if (isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n <div\n class=\"flex flex-row justify-between border-t border-gray-300 p-3\"\n >\n <span class=\"mt-2 text-sm text-gray-600\" translate\n >editor.record.form.multilingual.activate</span\n >\n <gn-ui-button\n extraClass=\"w-16 h-8 font-bold\"\n type=\"gray\"\n (buttonClick)=\"validateTranslations()\"\n data-test=\"validateSelection\"\n >{{ 'editor.record.form.multilingual.validate' | translate }}\n </gn-ui-button>\n </div>\n @if (supportedLanguages$ | async; as languages) {\n @for (lang of languages; track lang) {\n <div\n class=\"flex flex-col gap-2 w-full px-2\"\n data-test=\"langAvailable\"\n [attr.data-test-lang]=\"lang\"\n >\n <gn-ui-button\n [extraClass]=\"getExtraClass(lang)\"\n type=\"gray\"\n (buttonClick)=\"toggleLanguage(lang)\"\n [disabled]=\"lang === _record.defaultLanguage\"\n [title]=\"getToggleTitle(lang)\"\n >\n <span [class]=\"getIconClass(lang)\"></span>\n <span class=\"ml-2\">{{ 'language.' + lang | translate }}</span>\n </gn-ui-button>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n @if (!editTranslations && isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n @for (\n recordLang of sortLanguages(recordLanguages);\n track recordLang;\n let i = $index\n ) {\n <gn-ui-button\n extraClass=\"flex flex-row justify-between bg-white border border-white rounded mb-1 h-[34px] w-full\"\n [ngClass]=\"{\n 'mt-8': isFirstUnsupported(i),\n '': true,\n }\"\n (buttonClick)=\"switchFormLang(recordLang)\"\n type=\"outline\"\n data-test=\"langSwitch\"\n >\n <div class=\"flex flex-row gap-2 items-center\">\n @if (recordLang === formLanguage) {\n <ng-icon\n class=\"text-primary mt-1\"\n name=\"iconoirCheckCircle\"\n ></ng-icon>\n }\n @if (recordLang !== formLanguage) {\n <ng-icon\n class=\"text-gray-800 mt-1\"\n name=\"iconoirCircle\"\n ></ng-icon>\n }\n @if (recordLang.length === 2) {\n <span [class]=\"getIconClass(recordLang) + 'mt-1'\"></span>\n }\n <span [ngClass]=\"recordLang === formLanguage ? 'text-black' : ''\">{{\n isLangSupported(recordLang)\n ? ('language.' + recordLang | translate)\n : recordLang.toUpperCase()\n }}</span>\n </div>\n <div class=\"flex flex-row gap-2 items-center\">\n @if (recordLang === formLanguage) {\n <span class=\"text-xs text-base\" translate\n >editor.record.form.multilingual.default</span\n >\n }\n <button\n (click)=\"\n openActionMenu(recordLang, template); $event.stopPropagation()\n \"\n cdkOverlayOrigin\n #actionMenuButton\n >\n <ng-icon class=\"pb-5\" name=\"matMoreHorizOutline\"></ng-icon>\n </button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDelete]=\"recordLang !== _record.defaultLanguage\"\n page=\"record\"\n (delete)=\"confirmDeleteAction(recordLang)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (switch)=\"switchDefaultLang(recordLang)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </div>\n </gn-ui-button>\n }\n </div>\n }\n</div>\n" }]
|
|
44010
|
-
}], propDecorators: { record: [{
|
|
44011
|
-
type: Input
|
|
44012
|
-
}], actionMenuButtons: [{
|
|
44013
|
-
type: ViewChildren,
|
|
44014
|
-
args: ['actionMenuButton', { read: ElementRef }]
|
|
44015
|
-
}] } });
|
|
44034
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, decorators: [{
|
|
44035
|
+
type: Injectable,
|
|
44036
|
+
args: [{
|
|
44037
|
+
providedIn: 'root',
|
|
44038
|
+
}]
|
|
44039
|
+
}] });
|
|
44016
44040
|
|
|
44017
|
-
|
|
44018
|
-
marker('editor.record.form.field.keywords');
|
|
44019
|
-
marker('editor.record.form.field.topics');
|
|
44020
|
-
marker('editor.record.form.field.contacts');
|
|
44021
|
-
marker('editor.record.form.field.organisation');
|
|
44022
|
-
class MetadataQualityPanelComponent {
|
|
44041
|
+
class EditorEffects {
|
|
44023
44042
|
constructor() {
|
|
44024
|
-
this.
|
|
44025
|
-
this.
|
|
44026
|
-
|
|
44027
|
-
|
|
44028
|
-
|
|
44029
|
-
|
|
44030
|
-
|
|
44031
|
-
|
|
44032
|
-
|
|
44033
|
-
|
|
44034
|
-
|
|
44035
|
-
|
|
44036
|
-
fieldsByPage[2].includes('organisation') ||
|
|
44037
|
-
fieldsByPage[2].push('organisation');
|
|
44043
|
+
this.actions$ = inject(Actions);
|
|
44044
|
+
this.editorService = inject(EditorService);
|
|
44045
|
+
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
44046
|
+
this.plateformService = inject(PlatformServiceInterface);
|
|
44047
|
+
this.store = inject(Store);
|
|
44048
|
+
this.saveRecord$ = createEffect(() => this.actions$.pipe(ofType(saveRecord), withLatestFrom$1(this.store.select(selectRecord), this.store.select(selectRecordSource), this.store.select(selectEditorConfig)), switchMap$1(([, record, recordSource, fieldsConfig]) => this.editorService.saveRecord(record, recordSource, fieldsConfig).pipe(switchMap$1(([savedRecord, savedRecordSource]) => {
|
|
44049
|
+
const actions = [saveRecordSuccess()];
|
|
44050
|
+
if (!record?.uniqueIdentifier) {
|
|
44051
|
+
actions.push(openRecord({
|
|
44052
|
+
record: savedRecord,
|
|
44053
|
+
recordSource: savedRecordSource,
|
|
44054
|
+
}));
|
|
44038
44055
|
}
|
|
44039
|
-
|
|
44040
|
-
|
|
44041
|
-
|
|
44042
|
-
|
|
44043
|
-
|
|
44044
|
-
|
|
44045
|
-
|
|
44046
|
-
|
|
44047
|
-
|
|
44048
|
-
|
|
44049
|
-
|
|
44050
|
-
|
|
44051
|
-
|
|
44056
|
+
return of(...actions);
|
|
44057
|
+
}), catchError((error) => of(saveRecordFailure({
|
|
44058
|
+
error,
|
|
44059
|
+
})))))));
|
|
44060
|
+
this.cleanRecordAttachments$ = createEffect(() => this.actions$.pipe(ofType(saveRecordSuccess), withLatestFrom$1(this.store.select(selectRecord)), switchMap$1(([_, record]) => {
|
|
44061
|
+
if (record.uniqueIdentifier !== null) {
|
|
44062
|
+
this.plateformService.cleanRecordAttachments(record).subscribe({
|
|
44063
|
+
next: (_) => undefined,
|
|
44064
|
+
error: (err) => {
|
|
44065
|
+
console.error(err);
|
|
44066
|
+
},
|
|
44067
|
+
});
|
|
44068
|
+
}
|
|
44069
|
+
return EMPTY;
|
|
44070
|
+
}), catchError((error) => {
|
|
44071
|
+
console.error(error);
|
|
44072
|
+
return EMPTY;
|
|
44073
|
+
})), { dispatch: false });
|
|
44074
|
+
this.markAsChanged$ = createEffect(() => this.actions$.pipe(ofType(updateRecordField, updateRecordLanguages), map$1(() => markRecordAsChanged())));
|
|
44075
|
+
this.saveRecordDraft$ = createEffect(() => this.actions$.pipe(ofType(updateRecordField, updateRecordLanguages), debounceTime$1(1000), withLatestFrom$1(this.store.select(selectRecord), this.store.select(selectRecordSource)), switchMap$1(([, record, recordSource]) => this.editorService.saveRecordAsDraft(record, recordSource)), map$1(() => draftSaveSuccess())));
|
|
44076
|
+
this.undoRecordDraft$ = createEffect(() => this.actions$.pipe(ofType(undoRecordDraft), withLatestFrom$1(this.store.select(selectRecord)), switchMap$1(([, record]) => this.editorService.undoRecordDraft(record)), map$1(([record, recordSource]) => openRecord({
|
|
44077
|
+
record,
|
|
44078
|
+
recordSource,
|
|
44079
|
+
}))));
|
|
44080
|
+
this.checkHasChangesOnOpen$ = createEffect(() => this.actions$.pipe(ofType(openRecord), map$1(({ record }) => this.recordsRepository.recordHasDraft(record.uniqueIdentifier)), filter((hasDraft) => hasDraft), map$1(() => markRecordAsChanged())));
|
|
44081
|
+
this.hasRecordChangedSinceDraft$ = createEffect(() => this.actions$.pipe(ofType(hasRecordChangedSinceDraft), switchMap$1(({ record }) => this.editorService
|
|
44082
|
+
.hasRecordChangedSinceDraft(record)
|
|
44083
|
+
.pipe(map$1((changes) => hasRecordChangedSinceDraftSuccess({ changes }))))));
|
|
44084
|
+
this.checkIsRecordPublished$ = createEffect(() => this.actions$.pipe(ofType(openRecord), map$1(({ record }) => record.uniqueIdentifier), switchMap$1((uniqueIdentifier) => this.recordsRepository.getRecordPublicationStatus(uniqueIdentifier)), map$1((isPublished$1) => isPublished({
|
|
44085
|
+
isPublished: isPublished$1,
|
|
44086
|
+
}))));
|
|
44087
|
+
this.checkCanEditRecord$ = createEffect(() => this.actions$.pipe(ofType(openRecord), map$1(({ record }) => record.uniqueIdentifier), switchMap$1((uniqueIdentifier) => this.recordsRepository.canEditRecord(uniqueIdentifier)), map$1((canEditRecord$1) => canEditRecord({
|
|
44088
|
+
canEditRecord: canEditRecord$1,
|
|
44089
|
+
}))));
|
|
44052
44090
|
}
|
|
44053
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type:
|
|
44054
|
-
static { this.ɵ
|
|
44055
|
-
provideIcons({
|
|
44056
|
-
iconoirSystemShut,
|
|
44057
|
-
iconoirBadgeCheck,
|
|
44058
|
-
}),
|
|
44059
|
-
provideNgIconsConfig({
|
|
44060
|
-
size: '1.25em',
|
|
44061
|
-
}),
|
|
44062
|
-
], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"flex flex-col h-full w-[302px] border-l border-gray-300 py-8 px-3 gap-3 overflow-auto\"\n style=\"background-color: #fafaf9\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.metadataQuality.title</span\n >\n </div>\n @for (properties of propertiesByPage; track properties; let i = $index) {\n <div class=\"flex flex-col gap-2\">\n @for (property of properties; track property) {\n <gn-ui-button\n [extraClass]=\"getExtraClass(property.value)\"\n type=\"outline\"\n attr.data-cy=\"md-quality-btn-{{ property.label }}\"\n >\n <span>{{ property.label | translate }}</span>\n <div class=\"flex flex-row gap-2 items-center\">\n @if (property.value) {\n <ng-icon class=\"text-primary\" name=\"iconoirBadgeCheck\"></ng-icon>\n } @else {\n <ng-icon\n class=\"text-neutral-300\"\n name=\"iconoirSystemShut\"\n ></ng-icon>\n }\n </div>\n </gn-ui-button>\n }\n @if (i !== propertiesByPage.length - 1) {\n <hr class=\"border-gray-300 w-11/12 mx-auto\" />\n }\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { 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: TranslatePipe, name: "translate" }] }); }
|
|
44091
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
44092
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects }); }
|
|
44063
44093
|
}
|
|
44064
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type:
|
|
44065
|
-
type:
|
|
44066
|
-
|
|
44067
|
-
|
|
44068
|
-
|
|
44069
|
-
|
|
44070
|
-
|
|
44071
|
-
|
|
44072
|
-
|
|
44073
|
-
|
|
44074
|
-
|
|
44075
|
-
|
|
44076
|
-
|
|
44077
|
-
|
|
44078
|
-
|
|
44079
|
-
|
|
44080
|
-
|
|
44081
|
-
|
|
44082
|
-
|
|
44083
|
-
|
|
44084
|
-
}] } });
|
|
44094
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects, decorators: [{
|
|
44095
|
+
type: Injectable
|
|
44096
|
+
}] });
|
|
44097
|
+
|
|
44098
|
+
class FeatureEditorModule {
|
|
44099
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
44100
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, imports: [i1.StoreFeatureModule, i2$2.EffectsFeatureModule] }); }
|
|
44101
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, providers: [EditorFacade, provideHttpClient()], imports: [StoreModule.forFeature(EDITOR_FEATURE_KEY, editorReducer),
|
|
44102
|
+
EffectsModule.forFeature([EditorEffects])] }); }
|
|
44103
|
+
}
|
|
44104
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, decorators: [{
|
|
44105
|
+
type: NgModule,
|
|
44106
|
+
args: [{
|
|
44107
|
+
imports: [
|
|
44108
|
+
StoreModule.forFeature(EDITOR_FEATURE_KEY, editorReducer),
|
|
44109
|
+
EffectsModule.forFeature([EditorEffects]),
|
|
44110
|
+
],
|
|
44111
|
+
providers: [EditorFacade, provideHttpClient()],
|
|
44112
|
+
}]
|
|
44113
|
+
}] });
|
|
44085
44114
|
|
|
44086
44115
|
const ROUTER_STATE_KEY = 'router';
|
|
44087
44116
|
const ROUTER_ROUTE_SEARCH = 'search';
|
|
@@ -44524,5 +44553,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
44524
44553
|
* Generated bundle index. Do not edit.
|
|
44525
44554
|
*/
|
|
44526
44555
|
|
|
44527
|
-
export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, ActionMenuComponent, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, ApplicationBannerComponent, AuthService, AutocompleteComponent, AvailableServicesField, AvatarComponent, AvatarServiceInterface, BASEMAP_LAYERS, BadgeComponent, BaseConverter, BaseFileReader, BaseReader, BlockListComponent, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CarouselComponent, CatalogTitleComponent, CellPopinComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ClearError, ClearResults, ColorScaleComponent, ConfirmationDialogComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_GN4_LOGIN_URL, DEFAULT_GN4_LOGOUT_URL, DEFAULT_GN4_SETTINGS_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DISABLE_AUTH, 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, EmbeddedTranslateLoader, 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, 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, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageInputComponent, ImageOverlayPreviewComponent, ImportRecordComponent, InlineFilterComponent, InteractiveTableColumnComponent, InteractiveTableComponent, InternalLinkCardComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, 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, 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, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, 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, 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, RecordsMetricsComponent, RecordsRepositoryInterface, RecordsService, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResourceTypeLegacyField, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsHitsSearchKindComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, ReusePresentationForms, 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, 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, SortableListComponent, SourceLabelComponent, SourcesService, SpatialExtentComponent, 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, blockModelFixture, bytesToMegabytes, canEditRecord, checkFileFormat, clearSelectedFeatures, createChild, createDocument, createElement, createFuzzyFilter, createNestedChild, createNestedElement, currentPage, defaultMapStyleFixture, defaultMapStyleHlFixture, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, emptyBlockModelFixture, findChildElement, findChildOrCreate, findChildrenElement, findConverterForDocument, findNestedChildOrCreate, findNestedElement, findNestedElements, findParent, firstChildElement, formatDate, formatUserInfo, getAllKeysValidator, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryBoundingBox, getGeometryFromGeoJSON, getGlobalConfig, getIsMobile, getJsonDataItemsProxy, getLayers, getLinkId, getLinkLabel, getLinkPriority, getMapContext, getMapContextLayerFromConfig, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getNamespace, 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, isConfigLoaded, isDateRange, 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, provideRepositoryUrl, readAttribute, readDataset, readDatasetHeaders, 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, setFieldVisibility, setSelectedFeatures, setTextContent, someHabTableItemFixture, sortByFromString, sortByToString, sortByToStrings, stripHtml, stripNamespace, tableItemsFixture, toDate, toLang2, toLang3, totalPages, undoRecordDraft, unrecognizedKeysConfigFixture, updateLanguages, updateRecordField, updateRecordLanguages, wmsLayerFlatten, writeAttribute, wrongLanguageCodeConfigFixture, xmlToString };
|
|
44556
|
+
export { ABOUT_SECTION, ADD_RESULTS, ADD_SEARCH, ANNEXES_SECTION, ASSOCIATED_RESOURCES_SECTION, AVAILABLE_LICENSES, AbstractAction, AbstractSearchField, ActionMenuComponent, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, ApplicationBannerComponent, AuthService, AutocompleteComponent, AvailableServicesField, AvatarComponent, AvatarServiceInterface, BASEMAP_LAYERS, BadgeComponent, BaseConverter, BaseFileReader, BaseReader, BlockListComponent, ButtonComponent, CLASSIFICATION_SECTION, CLEAR_ERROR, CLEAR_RESULTS, CONSTRAINTS_SHORTCUTS, CONTACTS, CONTACTS_FOR_RESOURCE_FIELD, CarouselComponent, CatalogTitleComponent, CellPopinComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ClearError, ClearResults, ColorScaleComponent, ConfirmationDialogComponent, ContentGhostComponent, CopyTextButtonComponent, DATA_MANAGERS_SECTION, DEFAULT_CONFIGURATION, DEFAULT_GN4_LOGIN_URL, DEFAULT_GN4_LOGOUT_URL, DEFAULT_GN4_SETTINGS_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DISABLE_AUTH, 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, EmbeddedTranslateLoader, 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, FieldsService, FigureComponent, FigureContainerComponent, FileInputComponent, FileTranslateLoader, FilesDropDirective, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldDateComponent, FormFieldFileComponent, FormFieldKeywordsComponent, FormFieldLicenseComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentsComponent, FormFieldTopicsComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GEOGRAPHICAL_COVERAGE_SECTION, GEONETWORK_UI_TAG_NAME, GEONETWORK_UI_VERSION, GeoDataBadgeComponent, GeoTableViewComponent, GeocodingComponent, GeojsonReader, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GnUiHumanizeDateDirective, GpfApiDlComponent, GravatarService, HttpLoaderFactory, I18nInterceptor, INSPIRE_TOPICS, ImageFallbackDirective, ImageInputComponent, ImageOverlayPreviewComponent, ImportRecordComponent, InlineFilterComponent, InteractiveTableColumnComponent, InteractiveTableComponent, InternalLinkCardComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, KindBadgeComponent, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LEGAL_CONSTRAINTS_FIELD, 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, METADATA_POINT_OF_CONTACT_SECTION, 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, OTHER_CONSTRAINTS_FIELD, 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_ABSTRACT_FIELD, RECORD_DATASET_URL_TOKEN, RECORD_GRAPHICAL_OVERVIEW_FIELD, RECORD_KEYWORDS_FIELD, RECORD_LICENSE_FIELD, RECORD_ONLINE_LINK_RESOURCES, RECORD_ONLINE_RESOURCES, RECORD_RESOURCE_CREATED_FIELD, RECORD_RESOURCE_UPDATED_FIELD, RECORD_REUSE_URL_TOKEN, RECORD_SERVICE_URL_TOKEN, RECORD_SPATIAL_EXTENTS_FIELD, RECORD_SPATIAL_TOGGLE_FIELD, RECORD_TEMPORAL_EXTENTS_FIELD, RECORD_TITLE_FIELD, RECORD_TOPICS_FIELD, RECORD_UNIQUE_IDENTIFIER_FIELD, RECORD_UPDATED_FIELD, RECORD_UPDATE_FREQUENCY_FIELD, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESOURCE_IDENTIFIER_FIELD, RESULTS_LAYOUT_CONFIG, 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, RecordsMetricsComponent, RecordsRepositoryInterface, RecordsService, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResourceTypeLegacyField, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsHitsSearchKindComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, ReusePresentationForms, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SECURITY_CONSTRAINTS_FIELD, 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, SortableListComponent, SourceLabelComponent, SourcesService, SpatialExtentComponent, SpinningLoaderComponent, StacItemsResultGridComponent, StacViewComponent, StarToggleComponent, StickyHeaderComponent, SupportedTypes, SwitchToggleComponent, THUMBNAIL_PLACEHOLDER, TITLE_SECTION, TOPICS_SECTION, 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, USE_AND_ACCESS_CONDITIONS_SECTION, UpdateConfigAggregations, UpdateFilters, UrlInputComponent, UserFeedbackItemComponent, UserPreviewComponent, UserSearchField, VECTOR_STYLE_DEFAULT, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, XmlParseError, _reset, allChildrenElement, appConfigWithTranslationFixture, appendChildTree, appendChildren, assertValidXml, blockModelFixture, bytesToMegabytes, canEditRecord, checkFileFormat, clearSelectedFeatures, createChild, createDocument, createElement, createFuzzyFilter, createNestedChild, createNestedElement, currentPage, defaultMapStyleFixture, defaultMapStyleHlFixture, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, emptyBlockModelFixture, findChildElement, findChildOrCreate, findChildrenElement, findConverterForDocument, findNestedChildOrCreate, findNestedElement, findNestedElements, findParent, firstChildElement, formatDate, formatUserInfo, getAllKeysValidator, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryBoundingBox, getGeometryFromGeoJSON, getGlobalConfig, getIsMobile, getJsonDataItemsProxy, getLayers, getLinkId, getLinkLabel, getLinkPriority, getMapContext, getMapContextLayerFromConfig, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getNamespace, 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, isConfigLoaded, isDateRange, 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, provideRepositoryUrl, readAttribute, readDataset, readDatasetHeaders, 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, setSelectedFeatures, setTextContent, someHabTableItemFixture, sortByFromString, sortByToString, sortByToStrings, stripHtml, stripNamespace, tableItemsFixture, toDate, toLang2, toLang3, totalPages, undoRecordDraft, unrecognizedKeysConfigFixture, updateLanguages, updateRecordField, updateRecordLanguages, wmsLayerFlatten, writeAttribute, wrongLanguageCodeConfigFixture, xmlToString };
|
|
44528
44557
|
//# sourceMappingURL=geonetwork-ui.mjs.map
|