geonetwork-ui 2.9.0-dev.f3376949a → 2.9.0-dev.fc19cbfed
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 +690 -563
- package/fesm2022/geonetwork-ui.mjs.map +1 -1
- package/index.d.ts +253 -162
- package/index.d.ts.map +1 -1
- package/package.json +7 -8
- package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +11 -2
- package/src/libs/common/domain/src/index.ts +1 -0
- package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.html +8 -10
- package/src/libs/feature/dataviz/src/lib/service/data.service.ts +33 -11
- 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/editor/src/lib/components/record-form/form-field/form-field.component.html +2 -2
- package/src/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.ts +2 -0
- package/src/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.html +4 -4
- package/src/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.ts +3 -4
- package/src/libs/feature/record/src/lib/map-view/map-view.component.html +10 -18
- package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +96 -9
- package/src/libs/feature/record/src/lib/state/mdview.facade.ts +1 -1
- package/src/libs/feature/router/src/lib/default/router.module.ts +3 -3
- package/src/libs/feature/router/src/lib/default/router.service.ts +2 -2
- package/src/libs/feature/router/src/lib/default/services/router-search.service.ts +12 -3
- package/src/libs/feature/router/src/lib/default/state/router.effects.ts +34 -4
- package/src/libs/feature/search/src/lib/state/reducer.ts +3 -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/api-card/api-card.component.html +2 -2
- package/src/libs/ui/elements/src/lib/application-banner/application-banner.component.ts +2 -3
- package/src/libs/ui/elements/src/lib/image-input/image-input.component.html +5 -2
- package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +63 -56
- package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.scss +5 -5
- package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +11 -8
- package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.ts +3 -3
- package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +1 -1
- package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.html +1 -1
- package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.ts +7 -5
- package/src/libs/ui/map/src/lib/map-utils.ts +1 -1
- package/src/libs/ui/search/src/lib/record-preview-feed/record-preview-feed.component.html +19 -16
- package/src/libs/util/app-config/src/lib/app-config.ts +8 -2
- package/src/libs/util/app-config/src/lib/fixtures.ts +1 -0
- package/src/libs/util/app-config/src/lib/model.ts +1 -0
- package/src/libs/util/shared/src/lib/gn-ui-version.ts +5 -4
- package/src/libs/util/shared/src/lib/links/link-utils.ts +8 -4
- package/src/libs/util/shared/src/lib/services/theme.service.ts +9 -23
- package/tailwind.base.config.js +3 -2
- package/translations/de.json +5 -3
- package/translations/en.json +7 -5
- package/translations/es.json +2 -0
- package/translations/fr.json +7 -5
- package/translations/it.json +7 -5
- package/translations/nl.json +2 -0
- package/translations/pt.json +2 -0
- package/translations/sk.json +3 -1
|
@@ -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';
|
|
@@ -92,7 +92,6 @@ import { MatTableModule } from '@angular/material/table';
|
|
|
92
92
|
import * as i3 from '@angular/material/paginator';
|
|
93
93
|
import { MatPaginatorIntl, MatPaginatorModule, MatPaginator } from '@angular/material/paginator';
|
|
94
94
|
import { LetDirective } from '@ngrx/component';
|
|
95
|
-
import axios from 'axios';
|
|
96
95
|
import { Meta } from '@angular/platform-browser';
|
|
97
96
|
import { tablerFolderOpen } from '@ng-icons/tabler-icons';
|
|
98
97
|
import * as i3$1 from '@angular/material/radio';
|
|
@@ -18970,11 +18969,13 @@ var de = {
|
|
|
18970
18969
|
"map.ogc.urlInput.hint": "Die URL des OGC API-Dienstes eingeben",
|
|
18971
18970
|
"map.select.layer": "Datenquelle",
|
|
18972
18971
|
"map.select.style": "Style",
|
|
18972
|
+
"map.style.default": "Standard",
|
|
18973
18973
|
"map.wfs.urlInput.hint": "Die WFS URL eingeben",
|
|
18974
18974
|
"map.wms.urlInput.hint": "Die WMS URL eingeben",
|
|
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:",
|
|
@@ -19191,6 +19192,7 @@ var de = {
|
|
|
19191
19192
|
"search.filters.producerOrg": "Herausgeber",
|
|
19192
19193
|
"search.filters.publicationYear": "Veröffentlichungsjahr",
|
|
19193
19194
|
"search.filters.publisherOrg": "Vertreiber",
|
|
19195
|
+
"search.filters.recordKind": "",
|
|
19194
19196
|
"search.filters.recordKind.all": "Alle",
|
|
19195
19197
|
"search.filters.recordKind.dataset": "Datensätze",
|
|
19196
19198
|
"search.filters.recordKind.reuse": "Wiederverwendungen",
|
|
@@ -19229,8 +19231,8 @@ var de = {
|
|
|
19229
19231
|
"service.metadata.spatialExtent": "Räumliche Ausdehnung",
|
|
19230
19232
|
"share.tab.permalink": "Teilen",
|
|
19231
19233
|
"share.tab.webComponent": "Integrieren",
|
|
19232
|
-
"stac.filter.reset": "",
|
|
19233
19234
|
"stac.filter.enable": "",
|
|
19235
|
+
"stac.filter.reset": "",
|
|
19234
19236
|
"stac.results.noResults": "Ihre Suchfilter lieferten keine Ergebnisse",
|
|
19235
19237
|
"table.loading.data": "Daten werden geladen...",
|
|
19236
19238
|
"table.object.count": "Objekte in diesem Datensatz",
|
|
@@ -19249,7 +19251,7 @@ var de = {
|
|
|
19249
19251
|
"wfs.feature.limit": "Zu viele Features, um den WFS-Layer anzuzeigen!",
|
|
19250
19252
|
"wfs.featuretype.notfound": "Kein passender Feature-Typ wurde im Dienst gefunden",
|
|
19251
19253
|
"wfs.geojsongml.notsupported": "Dieser Dienst unterstützt das GeoJSON- oder GML-Format nicht",
|
|
19252
|
-
"wfs.unreachable.cors": "Der Dienst
|
|
19254
|
+
"wfs.unreachable.cors": "Der Remote-Dienst ist nicht für den Datenempfang (CORS) konfiguriert",
|
|
19253
19255
|
"wfs.unreachable.http": "Der Dienst hat einen HTTP-Fehler zurückgegeben",
|
|
19254
19256
|
"wfs.unreachable.unknown": "Der Dienst konnte nicht erreicht werden"
|
|
19255
19257
|
};
|
|
@@ -19640,11 +19642,13 @@ var en = {
|
|
|
19640
19642
|
"map.ogc.urlInput.hint": "Enter OGC API service URL",
|
|
19641
19643
|
"map.select.layer": "Data source",
|
|
19642
19644
|
"map.select.style": "Style",
|
|
19645
|
+
"map.style.default": "Default",
|
|
19643
19646
|
"map.wfs.urlInput.hint": "Enter WFS service URL",
|
|
19644
19647
|
"map.wms.urlInput.hint": "Enter WMS service URL",
|
|
19645
19648
|
"multiselect.filter.placeholder": "Search",
|
|
19646
19649
|
"nav.back": "Back",
|
|
19647
19650
|
"navbar.mobile.menuTitle": "Quick access",
|
|
19651
|
+
"ogc.geojson.notsupported": "This OGC API does not support the GeoJSON format",
|
|
19648
19652
|
"ogc.unreachable.unknown": "The service could not be reached",
|
|
19649
19653
|
"organisation.filter.placeholder": "Filter results",
|
|
19650
19654
|
"organisation.sort.sortBy": "Sort by:",
|
|
@@ -19672,9 +19676,9 @@ var en = {
|
|
|
19672
19676
|
"record.feature.catalog.number.total.attribute": "Total amount of objects",
|
|
19673
19677
|
"record.feature.catalog.number.total.object": "Total amount of attributes",
|
|
19674
19678
|
"record.feature.limit": "Preview disabled due to too many elements",
|
|
19675
|
-
"record.kind.dataset": "
|
|
19676
|
-
"record.kind.reuse": "
|
|
19677
|
-
"record.kind.service": "
|
|
19679
|
+
"record.kind.dataset": "dataset",
|
|
19680
|
+
"record.kind.reuse": "reuse",
|
|
19681
|
+
"record.kind.service": "service",
|
|
19678
19682
|
"record.metadata.about": "Description",
|
|
19679
19683
|
"record.metadata.api": "API",
|
|
19680
19684
|
"record.metadata.api.accessServiceProtocol.GPFDL": "GPFDL",
|
|
@@ -19730,7 +19734,7 @@ var en = {
|
|
|
19730
19734
|
"record.metadata.download": "Downloads",
|
|
19731
19735
|
"record.metadata.feature.catalog": "Feature catalog",
|
|
19732
19736
|
"record.metadata.formats": "Formats",
|
|
19733
|
-
"record.metadata.isGeographical": "
|
|
19737
|
+
"record.metadata.isGeographical": "geographic dataset",
|
|
19734
19738
|
"record.metadata.keywords": "Keywords",
|
|
19735
19739
|
"record.metadata.languages": "Languages",
|
|
19736
19740
|
"record.metadata.link.postgis.table": "table :",
|
|
@@ -19920,7 +19924,7 @@ var en = {
|
|
|
19920
19924
|
"wfs.feature.limit": "Too many features to display the WFS layer!",
|
|
19921
19925
|
"wfs.featuretype.notfound": "No matching feature type was found in the service",
|
|
19922
19926
|
"wfs.geojsongml.notsupported": "This service does not support the GeoJSON or GML format",
|
|
19923
|
-
"wfs.unreachable.cors": "The service
|
|
19927
|
+
"wfs.unreachable.cors": "The remote service is not configured to allow data retrieval (CORS)",
|
|
19924
19928
|
"wfs.unreachable.http": "The service returned an HTTP error",
|
|
19925
19929
|
"wfs.unreachable.unknown": "The service could not be reached"
|
|
19926
19930
|
};
|
|
@@ -20311,11 +20315,13 @@ var es = {
|
|
|
20311
20315
|
"map.ogc.urlInput.hint": "",
|
|
20312
20316
|
"map.select.layer": "",
|
|
20313
20317
|
"map.select.style": "",
|
|
20318
|
+
"map.style.default": "Por defecto",
|
|
20314
20319
|
"map.wfs.urlInput.hint": "",
|
|
20315
20320
|
"map.wms.urlInput.hint": "",
|
|
20316
20321
|
"multiselect.filter.placeholder": "",
|
|
20317
20322
|
"nav.back": "",
|
|
20318
20323
|
"navbar.mobile.menuTitle": "Acceso rápido",
|
|
20324
|
+
"ogc.geojson.notsupported": "",
|
|
20319
20325
|
"ogc.unreachable.unknown": "",
|
|
20320
20326
|
"organisation.filter.placeholder": "",
|
|
20321
20327
|
"organisation.sort.sortBy": "",
|
|
@@ -20982,11 +20988,13 @@ var fr = {
|
|
|
20982
20988
|
"map.ogc.urlInput.hint": "Entrez l'URL du service OGC API",
|
|
20983
20989
|
"map.select.layer": "Source de données",
|
|
20984
20990
|
"map.select.style": "Style",
|
|
20991
|
+
"map.style.default": "Par défaut",
|
|
20985
20992
|
"map.wfs.urlInput.hint": "Entrez l'URL du service WFS",
|
|
20986
20993
|
"map.wms.urlInput.hint": "Entrez l'URL du service WMS",
|
|
20987
20994
|
"multiselect.filter.placeholder": "Rechercher",
|
|
20988
20995
|
"nav.back": "Retour",
|
|
20989
20996
|
"navbar.mobile.menuTitle": "Navigation rapide",
|
|
20997
|
+
"ogc.geojson.notsupported": "Le service OGC API ne supporte pas le format GeoJSON",
|
|
20990
20998
|
"ogc.unreachable.unknown": "Le service n'est pas accessible",
|
|
20991
20999
|
"organisation.filter.placeholder": "Filtrer les résultats",
|
|
20992
21000
|
"organisation.sort.sortBy": "Trier par :",
|
|
@@ -21014,9 +21022,9 @@ var fr = {
|
|
|
21014
21022
|
"record.feature.catalog.number.total.attribute": "Nombre total d'attributs",
|
|
21015
21023
|
"record.feature.catalog.number.total.object": "Nombre total d'objets",
|
|
21016
21024
|
"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": "
|
|
21025
|
+
"record.kind.dataset": "donnée",
|
|
21026
|
+
"record.kind.reuse": "réutilisation",
|
|
21027
|
+
"record.kind.service": "service",
|
|
21020
21028
|
"record.metadata.about": "A propos",
|
|
21021
21029
|
"record.metadata.api": "API",
|
|
21022
21030
|
"record.metadata.api.accessServiceProtocol.GPFDL": "",
|
|
@@ -21072,7 +21080,7 @@ var fr = {
|
|
|
21072
21080
|
"record.metadata.download": "Téléchargements",
|
|
21073
21081
|
"record.metadata.feature.catalog": "Catalogue d'attributs",
|
|
21074
21082
|
"record.metadata.formats": "Formats",
|
|
21075
|
-
"record.metadata.isGeographical": "
|
|
21083
|
+
"record.metadata.isGeographical": "donnée géographique",
|
|
21076
21084
|
"record.metadata.keywords": "Mots-clés",
|
|
21077
21085
|
"record.metadata.languages": "Langues",
|
|
21078
21086
|
"record.metadata.link.postgis.table": "table :",
|
|
@@ -21262,7 +21270,7 @@ var fr = {
|
|
|
21262
21270
|
"wfs.feature.limit": "Trop d'objets pour afficher la couche WFS !",
|
|
21263
21271
|
"wfs.featuretype.notfound": "La classe d'objets n'a pas été trouvée dans le service",
|
|
21264
21272
|
"wfs.geojsongml.notsupported": "Le service ne supporte pas le format GeoJSON ou GML",
|
|
21265
|
-
"wfs.unreachable.cors": "Le service n'est pas
|
|
21273
|
+
"wfs.unreachable.cors": "Le service distant n'est pas configuré pour autoriser la consommation des données (CORS)",
|
|
21266
21274
|
"wfs.unreachable.http": "Le service a retourné une erreur HTTP",
|
|
21267
21275
|
"wfs.unreachable.unknown": "Le service n'est pas accessible"
|
|
21268
21276
|
};
|
|
@@ -21653,11 +21661,13 @@ var it = {
|
|
|
21653
21661
|
"map.ogc.urlInput.hint": "Inserisci URL del servizio OGC API",
|
|
21654
21662
|
"map.select.layer": "Sorgente dati",
|
|
21655
21663
|
"map.select.style": "Style",
|
|
21664
|
+
"map.style.default": "Predefinito",
|
|
21656
21665
|
"map.wfs.urlInput.hint": "Inserisci URL del servizio WFS",
|
|
21657
21666
|
"map.wms.urlInput.hint": "Inserisci URL del servizio WMS",
|
|
21658
21667
|
"multiselect.filter.placeholder": "Cerca",
|
|
21659
21668
|
"nav.back": "Indietro",
|
|
21660
21669
|
"navbar.mobile.menuTitle": "Accesso rapido",
|
|
21670
|
+
"ogc.geojson.notsupported": "Il servizio OGC API non supporta il formato GeoJSON.",
|
|
21661
21671
|
"ogc.unreachable.unknown": "Il servizio non è accessibile",
|
|
21662
21672
|
"organisation.filter.placeholder": "Filtra i risultati",
|
|
21663
21673
|
"organisation.sort.sortBy": "Ordina per:",
|
|
@@ -21685,9 +21695,9 @@ var it = {
|
|
|
21685
21695
|
"record.feature.catalog.number.total.attribute": "Quantità totale di oggetti",
|
|
21686
21696
|
"record.feature.catalog.number.total.object": "Quantità totale di attributi",
|
|
21687
21697
|
"record.feature.limit": "La visualizzazione è stata disabilitata a causa di troppi elementi ",
|
|
21688
|
-
"record.kind.dataset": "
|
|
21689
|
-
"record.kind.reuse": "
|
|
21690
|
-
"record.kind.service": "
|
|
21698
|
+
"record.kind.dataset": "dataset",
|
|
21699
|
+
"record.kind.reuse": "riutilizzato",
|
|
21700
|
+
"record.kind.service": "servizio",
|
|
21691
21701
|
"record.metadata.about": "Descrizione",
|
|
21692
21702
|
"record.metadata.api": "API",
|
|
21693
21703
|
"record.metadata.api.accessServiceProtocol.GPFDL": "",
|
|
@@ -21743,7 +21753,7 @@ var it = {
|
|
|
21743
21753
|
"record.metadata.download": "Download",
|
|
21744
21754
|
"record.metadata.feature.catalog": "Catalogo dei oggetti",
|
|
21745
21755
|
"record.metadata.formats": "Formati",
|
|
21746
|
-
"record.metadata.isGeographical": "
|
|
21756
|
+
"record.metadata.isGeographical": "dati geografici",
|
|
21747
21757
|
"record.metadata.keywords": "Parole chiave",
|
|
21748
21758
|
"record.metadata.languages": "Lingue",
|
|
21749
21759
|
"record.metadata.link.postgis.table": "",
|
|
@@ -21933,7 +21943,7 @@ var it = {
|
|
|
21933
21943
|
"wfs.feature.limit": "Troppi oggetti per visualizzare il WFS layer!",
|
|
21934
21944
|
"wfs.featuretype.notfound": "La classe di oggetto non è stata trovata nel servizio",
|
|
21935
21945
|
"wfs.geojsongml.notsupported": "Il servizio non supporta il formato GeoJSON o GML",
|
|
21936
|
-
"wfs.unreachable.cors": "Il servizio non è
|
|
21946
|
+
"wfs.unreachable.cors": "Il servizio remoto non è configurato per consentire il consumo di dati (CORS)",
|
|
21937
21947
|
"wfs.unreachable.http": "Il servizio ha restituito un errore HTTP",
|
|
21938
21948
|
"wfs.unreachable.unknown": "Il servizio non è accessibile"
|
|
21939
21949
|
};
|
|
@@ -22324,11 +22334,13 @@ var nl = {
|
|
|
22324
22334
|
"map.ogc.urlInput.hint": "",
|
|
22325
22335
|
"map.select.layer": "",
|
|
22326
22336
|
"map.select.style": "",
|
|
22337
|
+
"map.style.default": "Standaard",
|
|
22327
22338
|
"map.wfs.urlInput.hint": "",
|
|
22328
22339
|
"map.wms.urlInput.hint": "",
|
|
22329
22340
|
"multiselect.filter.placeholder": "",
|
|
22330
22341
|
"nav.back": "",
|
|
22331
22342
|
"navbar.mobile.menuTitle": "",
|
|
22343
|
+
"ogc.geojson.notsupported": "",
|
|
22332
22344
|
"ogc.unreachable.unknown": "",
|
|
22333
22345
|
"organisation.filter.placeholder": "",
|
|
22334
22346
|
"organisation.sort.sortBy": "",
|
|
@@ -22995,11 +23007,13 @@ var pt = {
|
|
|
22995
23007
|
"map.ogc.urlInput.hint": "",
|
|
22996
23008
|
"map.select.layer": "",
|
|
22997
23009
|
"map.select.style": "",
|
|
23010
|
+
"map.style.default": "Padrão",
|
|
22998
23011
|
"map.wfs.urlInput.hint": "",
|
|
22999
23012
|
"map.wms.urlInput.hint": "",
|
|
23000
23013
|
"multiselect.filter.placeholder": "",
|
|
23001
23014
|
"nav.back": "",
|
|
23002
23015
|
"navbar.mobile.menuTitle": "",
|
|
23016
|
+
"ogc.geojson.notsupported": "",
|
|
23003
23017
|
"ogc.unreachable.unknown": "",
|
|
23004
23018
|
"organisation.filter.placeholder": "",
|
|
23005
23019
|
"organisation.sort.sortBy": "",
|
|
@@ -23666,11 +23680,13 @@ var sk = {
|
|
|
23666
23680
|
"map.ogc.urlInput.hint": "",
|
|
23667
23681
|
"map.select.layer": "Zdroj dát",
|
|
23668
23682
|
"map.select.style": "",
|
|
23683
|
+
"map.style.default": "Predvolené",
|
|
23669
23684
|
"map.wfs.urlInput.hint": "Zadajte URL adresu služby WFS",
|
|
23670
23685
|
"map.wms.urlInput.hint": "Zadajte URL adresu služby WMS",
|
|
23671
23686
|
"multiselect.filter.placeholder": "Hľadať",
|
|
23672
23687
|
"nav.back": "Späť",
|
|
23673
23688
|
"navbar.mobile.menuTitle": "",
|
|
23689
|
+
"ogc.geojson.notsupported": "",
|
|
23674
23690
|
"ogc.unreachable.unknown": "So službou sa nedalo spojiť",
|
|
23675
23691
|
"organisation.filter.placeholder": "Filtrovať výsledky",
|
|
23676
23692
|
"organisation.sort.sortBy": "Zoradiť podľa:",
|
|
@@ -23946,7 +23962,7 @@ var sk = {
|
|
|
23946
23962
|
"wfs.feature.limit": "",
|
|
23947
23963
|
"wfs.featuretype.notfound": "V službe nebol nájdený žiadny zodpovedajúci typ funkcie",
|
|
23948
23964
|
"wfs.geojsongml.notsupported": "Táto služba nepodporuje formát GeoJSON alebo GML",
|
|
23949
|
-
"wfs.unreachable.cors": "
|
|
23965
|
+
"wfs.unreachable.cors": "Vzdialená služba nie je nakonfigurovaná tak, aby povoľovala spotrebu dát (CORS)",
|
|
23950
23966
|
"wfs.unreachable.http": "Služba vrátila chybu HTTP",
|
|
23951
23967
|
"wfs.unreachable.unknown": "So službou sa nedalo spojiť"
|
|
23952
23968
|
};
|
|
@@ -24520,34 +24536,23 @@ class ThemeService {
|
|
|
24520
24536
|
static getColor(name) {
|
|
24521
24537
|
return document.documentElement.style.getPropertyValue(`--color-${name}`);
|
|
24522
24538
|
}
|
|
24523
|
-
static generateBgOpacityClasses(colorName, colorValue, opacities = [0, 10, 25, 50, 75]) {
|
|
24524
|
-
const color = chroma(colorValue);
|
|
24525
|
-
const styleElement = document.createElement('style');
|
|
24526
|
-
styleElement.innerHTML = opacities.reduce((cssRules, opacity) => {
|
|
24527
|
-
cssRules += `.bg-${colorName}-opacity-${opacity}{background-color:${color
|
|
24528
|
-
.alpha(opacity / 100)
|
|
24529
|
-
.css()};}`;
|
|
24530
|
-
cssRules += `.hover-bg-${colorName}-opacity-${opacity}:hover {background-color:${color
|
|
24531
|
-
.alpha(opacity / 100)
|
|
24532
|
-
.css()};}`;
|
|
24533
|
-
return cssRules;
|
|
24534
|
-
}, '');
|
|
24535
|
-
document.getElementsByTagName('head')[0].appendChild(styleElement);
|
|
24536
|
-
}
|
|
24537
24539
|
static applyCssVariables(primaryColor, secondaryColor, mainColor, backgroundColor, mainFont, titleFont, fontsStylesheetUrl) {
|
|
24538
|
-
const applyColor = (name, color) => {
|
|
24540
|
+
const applyColor = (name, color, includeRawValues) => {
|
|
24539
24541
|
document.documentElement.style.setProperty(`--color-${name}`, color.css());
|
|
24542
|
+
if (includeRawValues) {
|
|
24543
|
+
document.documentElement.style.setProperty(`--color-raw-${name}`, color.css().replace(/^rgba?\((.*)\)/, '$1'));
|
|
24544
|
+
}
|
|
24540
24545
|
};
|
|
24541
24546
|
const black = chroma('black');
|
|
24542
24547
|
const white = chroma('white');
|
|
24543
|
-
applyColor('primary', chroma(primaryColor));
|
|
24548
|
+
applyColor('primary', chroma(primaryColor), true);
|
|
24544
24549
|
applyColor('primary-lighter', chroma.scale([primaryColor, white]).mode('lab')(0.3));
|
|
24545
24550
|
applyColor('primary-lightest', chroma.scale([primaryColor, white]).mode('lab')(0.6));
|
|
24546
24551
|
applyColor('primary-white', chroma.scale([primaryColor, white]).mode('lab')(0.85));
|
|
24547
24552
|
applyColor('primary-darker', chroma.scale([primaryColor, black]).mode('lab')(0.3));
|
|
24548
24553
|
applyColor('primary-darkest', chroma.scale([primaryColor, black]).mode('lab')(0.6));
|
|
24549
24554
|
applyColor('primary-black', chroma.scale([primaryColor, black]).mode('lab')(0.85));
|
|
24550
|
-
applyColor('secondary', chroma(secondaryColor));
|
|
24555
|
+
applyColor('secondary', chroma(secondaryColor), true);
|
|
24551
24556
|
applyColor('secondary-lighter', chroma.scale([secondaryColor, white]).mode('lab')(0.3));
|
|
24552
24557
|
applyColor('secondary-lightest', chroma.scale([secondaryColor, white]).mode('lab')(0.6));
|
|
24553
24558
|
applyColor('secondary-white', chroma.scale([secondaryColor, white]).mode('lab')(0.85));
|
|
@@ -25378,9 +25383,11 @@ async function getLayers(url, serviceProtocol) {
|
|
|
25378
25383
|
case 'wfs': {
|
|
25379
25384
|
const endpointWfs = await new WfsEndpoint(url).isReady();
|
|
25380
25385
|
const featureTypes = await endpointWfs.getFeatureTypes();
|
|
25381
|
-
const layers = await Promise.
|
|
25382
|
-
return
|
|
25383
|
-
}))
|
|
25386
|
+
const layers = (await Promise.allSettled(featureTypes.map((collection) => {
|
|
25387
|
+
return endpointWfs.getFeatureTypeFull(collection.name);
|
|
25388
|
+
})))
|
|
25389
|
+
.filter((settled) => settled.status === 'fulfilled')
|
|
25390
|
+
.map((fulfilled) => fulfilled.value);
|
|
25384
25391
|
return layers;
|
|
25385
25392
|
}
|
|
25386
25393
|
case 'wms': {
|
|
@@ -25511,7 +25518,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
25511
25518
|
}] } });
|
|
25512
25519
|
|
|
25513
25520
|
var name = "geonetwork-ui";
|
|
25514
|
-
var version = "2.9.0-dev.
|
|
25521
|
+
var version = "2.9.0-dev.fc19cbfed";
|
|
25515
25522
|
var engines = {
|
|
25516
25523
|
node: ">=20"
|
|
25517
25524
|
};
|
|
@@ -25551,11 +25558,11 @@ var peerDependencies = {
|
|
|
25551
25558
|
};
|
|
25552
25559
|
var dependencies = {
|
|
25553
25560
|
"@biesbjerg/ngx-translate-extract-marker": "~1.0.0",
|
|
25554
|
-
"@camptocamp/ogc-client": "1.3.1-dev.
|
|
25555
|
-
"@geospatial-sdk/core": "0.0.5-dev.
|
|
25556
|
-
"@geospatial-sdk/geocoding": "0.0.5-dev.
|
|
25557
|
-
"@geospatial-sdk/legend": "0.0.5-dev.
|
|
25558
|
-
"@geospatial-sdk/openlayers": "0.0.5-dev.
|
|
25561
|
+
"@camptocamp/ogc-client": "1.3.1-dev.12086e8",
|
|
25562
|
+
"@geospatial-sdk/core": "0.0.5-dev.61",
|
|
25563
|
+
"@geospatial-sdk/geocoding": "0.0.5-dev.61",
|
|
25564
|
+
"@geospatial-sdk/legend": "0.0.5-dev.61",
|
|
25565
|
+
"@geospatial-sdk/openlayers": "0.0.5-dev.61",
|
|
25559
25566
|
"@ltd/j-toml": "~1.35.2",
|
|
25560
25567
|
"@messageformat/core": "^3.0.1",
|
|
25561
25568
|
"@ng-icons/core": "29.10.0",
|
|
@@ -25565,7 +25572,6 @@ var dependencies = {
|
|
|
25565
25572
|
"@nx/angular": "22.0.4",
|
|
25566
25573
|
"@rgrove/parse-xml": "4.2.0",
|
|
25567
25574
|
alasql: "4.6.0",
|
|
25568
|
-
axios: "1.12.0",
|
|
25569
25575
|
basiclightbox: "^5.0.4",
|
|
25570
25576
|
"chart.js": "4.4.7",
|
|
25571
25577
|
"chroma-js": "3.1.2",
|
|
@@ -25581,7 +25587,7 @@ var dependencies = {
|
|
|
25581
25587
|
"ngx-chips": "3.0.0",
|
|
25582
25588
|
"ngx-dropzone": "3.1.0",
|
|
25583
25589
|
"ngx-translate-messageformat-compiler": "~7.1.0",
|
|
25584
|
-
ol: "^
|
|
25590
|
+
ol: "^10.0.0",
|
|
25585
25591
|
papaparse: "5.4.1",
|
|
25586
25592
|
pg: "^8.9.0",
|
|
25587
25593
|
proj4: "^2.9.2",
|
|
@@ -25607,7 +25613,7 @@ var packageJson = {
|
|
|
25607
25613
|
};
|
|
25608
25614
|
|
|
25609
25615
|
const GEONETWORK_UI_VERSION = packageJson.version;
|
|
25610
|
-
const GEONETWORK_UI_TAG_NAME = GEONETWORK_UI_VERSION.split('-')[1]
|
|
25616
|
+
const GEONETWORK_UI_TAG_NAME = GEONETWORK_UI_VERSION.split('-')[1]?.startsWith('dev')
|
|
25611
25617
|
? 'main'
|
|
25612
25618
|
: `v${packageJson.version}`;
|
|
25613
25619
|
|
|
@@ -25925,14 +25931,18 @@ class ElasticsearchService {
|
|
|
25925
25931
|
})
|
|
25926
25932
|
.join(' OR ');
|
|
25927
25933
|
};
|
|
25928
|
-
|
|
25934
|
+
let queryString = typeof filters === 'string'
|
|
25929
25935
|
? filters
|
|
25930
25936
|
: Object.keys(filters)
|
|
25937
|
+
.filter((fieldname) => fieldname !== 'gn-ui-crossFieldFilter')
|
|
25931
25938
|
.filter((fieldname) => !isDateRange(filters[fieldname]))
|
|
25932
25939
|
.filter((fieldname) => filters[fieldname] &&
|
|
25933
25940
|
JSON.stringify(filters[fieldname]) !== '{}')
|
|
25934
25941
|
.map((fieldname) => `${fieldname}:(${makeQuery(filters[fieldname])})`)
|
|
25935
25942
|
.join(' AND ');
|
|
25943
|
+
if (filters['gn-ui-crossFieldFilter']) {
|
|
25944
|
+
queryString = `${queryString} AND (${filters['gn-ui-crossFieldFilter']})`;
|
|
25945
|
+
}
|
|
25936
25946
|
const queryRange = Object.entries(filters)
|
|
25937
25947
|
.filter(([, value]) => isDateRange(value))
|
|
25938
25948
|
.map(([searchField, dateRange]) => {
|
|
@@ -26105,7 +26115,12 @@ class ElasticsearchService {
|
|
|
26105
26115
|
must_not: this.mustNotFilters(),
|
|
26106
26116
|
},
|
|
26107
26117
|
},
|
|
26108
|
-
_source: [
|
|
26118
|
+
_source: [
|
|
26119
|
+
'resourceTitleObject',
|
|
26120
|
+
'uuid',
|
|
26121
|
+
'resourceType',
|
|
26122
|
+
'cl_presentationForm',
|
|
26123
|
+
],
|
|
26109
26124
|
from: 0,
|
|
26110
26125
|
size: 20,
|
|
26111
26126
|
};
|
|
@@ -28160,8 +28175,9 @@ function getCustomTranslations(langCode) {
|
|
|
28160
28175
|
return langCode in customTranslations ? customTranslations[langCode] : {};
|
|
28161
28176
|
}
|
|
28162
28177
|
let appConfigLoaded = false;
|
|
28163
|
-
function loadAppConfig() {
|
|
28164
|
-
|
|
28178
|
+
function loadAppConfig(configUrl = 'assets/configuration/default.toml') {
|
|
28179
|
+
console.log(`[geonetwork-ui] Loading application configuration from ${configUrl}`);
|
|
28180
|
+
return fetch(configUrl)
|
|
28165
28181
|
.then((resp) => {
|
|
28166
28182
|
if (!resp.ok)
|
|
28167
28183
|
throw new Error('Configuration file could not be loaded');
|
|
@@ -28270,6 +28286,7 @@ function loadAppConfig() {
|
|
|
28270
28286
|
'record_kind_quick_filter',
|
|
28271
28287
|
'filter_geometry_data',
|
|
28272
28288
|
'filter_geometry_url',
|
|
28289
|
+
'do_not_use_default_search_preset',
|
|
28273
28290
|
'search_preset',
|
|
28274
28291
|
'advanced_filters',
|
|
28275
28292
|
'limit',
|
|
@@ -28282,6 +28299,7 @@ function loadAppConfig() {
|
|
|
28282
28299
|
RECORD_KIND_QUICK_FILTER: parsedSearchSection.record_kind_quick_filter,
|
|
28283
28300
|
FILTER_GEOMETRY_DATA: parsedSearchSection.filter_geometry_data,
|
|
28284
28301
|
FILTER_GEOMETRY_URL: parsedSearchSection.filter_geometry_url,
|
|
28302
|
+
DO_NOT_USE_DEFAULT_SEARCH_PRESET: !!parsedSearchSection.do_not_use_default_search_preset,
|
|
28285
28303
|
SEARCH_PRESET: parsedSearchParams.map((param) => ({
|
|
28286
28304
|
sort: param.sort,
|
|
28287
28305
|
name: param.name,
|
|
@@ -28372,6 +28390,7 @@ fonts_stylesheet_url = "https://fonts.googleapis.com/css2?family=Open+Sans"
|
|
|
28372
28390
|
[search]
|
|
28373
28391
|
record_kind_quick_filter = false
|
|
28374
28392
|
filter_geometry_url = 'https://my.domain.org/geom.json'
|
|
28393
|
+
do_not_use_default_search_preset = false
|
|
28375
28394
|
advanced_filters = ['publicationYear', 'documentStandard', 'inspireKeyword', 'topic', 'license']
|
|
28376
28395
|
|
|
28377
28396
|
[[search_preset]]
|
|
@@ -29187,9 +29206,8 @@ class AutocompleteComponent {
|
|
|
29187
29206
|
ngOnChanges(changes) {
|
|
29188
29207
|
const { value } = changes;
|
|
29189
29208
|
if (value) {
|
|
29190
|
-
const previousTextValue = this.displayWithFnInternal(value.previousValue);
|
|
29191
29209
|
const currentTextValue = this.displayWithFnInternal(value.currentValue);
|
|
29192
|
-
if (
|
|
29210
|
+
if (currentTextValue !== this.control.value) {
|
|
29193
29211
|
if (currentTextValue) {
|
|
29194
29212
|
this.searchActive = true;
|
|
29195
29213
|
this.isSearchActive.emit(true);
|
|
@@ -29203,13 +29221,15 @@ class AutocompleteComponent {
|
|
|
29203
29221
|
}
|
|
29204
29222
|
}
|
|
29205
29223
|
ngOnInit() {
|
|
29206
|
-
const newValue$ = merge(of(''), this.inputCleared.pipe(map$1(() => '')), this.control.valueChanges.pipe(filter$1((value) => typeof value === 'string'),
|
|
29224
|
+
const newValue$ = merge(of(''), this.inputCleared.pipe(map$1(() => '')), this.control.valueChanges.pipe(filter$1((value) => typeof value === 'string'), debounceTime(400), distinctUntilChanged()));
|
|
29207
29225
|
const externalValueChange$ = this.control.valueChanges.pipe(filter$1((value) => typeof value === 'object' && value.title), map$1((item) => item.title));
|
|
29208
29226
|
// this observable emits arrays of suggestions loaded using the given action
|
|
29209
29227
|
const suggestionsFromAction = merge(newValue$.pipe(filter$1((value) => value.length >= this.minCharacterCount)), externalValueChange$).pipe(tap$1(() => {
|
|
29210
29228
|
this.searching = true;
|
|
29211
29229
|
this.error = null;
|
|
29212
|
-
}), switchMap$1((value) => this.action(value)),
|
|
29230
|
+
}), switchMap$1((value) => this.action(value)), // this can trigger http requests
|
|
29231
|
+
shareReplay$1(1), // share the loaded suggestions to avoid multiple requests
|
|
29232
|
+
tap$1((suggestions) => {
|
|
29213
29233
|
// forcing the panel to open if there are suggestions
|
|
29214
29234
|
if (suggestions.length > 0 && !this.searchActive) {
|
|
29215
29235
|
this.triggerRef?.openPanel();
|
|
@@ -29270,6 +29290,7 @@ class AutocompleteComponent {
|
|
|
29270
29290
|
}
|
|
29271
29291
|
clear() {
|
|
29272
29292
|
this.inputRef.nativeElement.value = '';
|
|
29293
|
+
this.control.setValue('');
|
|
29273
29294
|
this.searchActive = false;
|
|
29274
29295
|
this.isSearchActive.emit(false);
|
|
29275
29296
|
this.inputCleared.emit();
|
|
@@ -31999,6 +32020,8 @@ function reducerSearch(state, action) {
|
|
|
31999
32020
|
},
|
|
32000
32021
|
};
|
|
32001
32022
|
}
|
|
32023
|
+
// From router.effects
|
|
32024
|
+
// From home - fuzzy-search - search.service
|
|
32002
32025
|
case SET_FILTERS: {
|
|
32003
32026
|
return {
|
|
32004
32027
|
...state,
|
|
@@ -32020,6 +32043,7 @@ function reducerSearch(state, action) {
|
|
|
32020
32043
|
},
|
|
32021
32044
|
};
|
|
32022
32045
|
}
|
|
32046
|
+
// From results WC
|
|
32023
32047
|
case SET_SEARCH: {
|
|
32024
32048
|
return {
|
|
32025
32049
|
...state,
|
|
@@ -32971,8 +32995,8 @@ class RecordKindField extends SimpleSearchField {
|
|
|
32971
32995
|
};
|
|
32972
32996
|
const presentationFormFilter = {};
|
|
32973
32997
|
if (values.includes('reuse') && !values.includes('dataset')) {
|
|
32974
|
-
|
|
32975
|
-
|
|
32998
|
+
filters['gn-ui-crossFieldFilter'] =
|
|
32999
|
+
`(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")`;
|
|
32976
33000
|
}
|
|
32977
33001
|
else if (values.includes('dataset') && !values.includes('reuse')) {
|
|
32978
33002
|
presentationFormFilter['mapDigital'] = false;
|
|
@@ -33065,7 +33089,12 @@ class FieldsService {
|
|
|
33065
33089
|
: [fieldValues[fieldName]];
|
|
33066
33090
|
return this.getFiltersForValues(fieldName, values);
|
|
33067
33091
|
});
|
|
33068
|
-
return forkJoin(filtersByField$).pipe(map$1((filters) =>
|
|
33092
|
+
return forkJoin(filtersByField$).pipe(map$1((filters) => {
|
|
33093
|
+
if (typeof filters === 'string') {
|
|
33094
|
+
return filters;
|
|
33095
|
+
}
|
|
33096
|
+
return filters.reduce((prev, curr) => ({ ...prev, ...curr }), {});
|
|
33097
|
+
}));
|
|
33069
33098
|
}
|
|
33070
33099
|
readFieldValuesFromFilters(filters) {
|
|
33071
33100
|
const fieldValues$ = this.supportedFields.map((fieldName) => this.getValuesForFilters(fieldName, filters).pipe(map$1((values) => ({ [fieldName]: values }))));
|
|
@@ -33122,7 +33151,7 @@ class ApiCardComponent {
|
|
|
33122
33151
|
}
|
|
33123
33152
|
}
|
|
33124
33153
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ApiCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
33125
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ApiCardComponent, isStandalone: true, selector: "gn-ui-api-card", inputs: { link: "link", currentLink: "currentLink", size: "size" }, outputs: { openRecordApiForm: "openRecordApiForm" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"group flex justify-between rounded filter overflow-hidden card-shadow\"\n [ngClass]=\"cardClass\"\n>\n @if (size !== 'S') {\n <div class=\"flex-1 min-w-0\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"flex items-center min-w-[32px]\">\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n @if (size === 'S') {\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n }\n</div>\n\n<ng-template #buttons>\n <div class=\"flex flex-row gap-2\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n class=\"border border-gray-300 rounded-lg pt-1 px-2 h-[34px]\"\n ></gn-ui-copy-text-button>\n @if (displayApiFormButton) {\n <button\n type=\"button\"\n class=\"gn-ui-card-icon\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText,\n }\"\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <ng-icon\n class=\"pointer-events-none align-middle card-icon\"\n name=\"iconoirSettings\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive,\n }\"\n ></ng-icon>\n </button>\n }\n </div>\n</ng-template>\n\n<ng-template #content>\n <div class=\"flex-1 min-w-0\">\n <div class=\"gn-ui-card-title\">\n {{ link.description || link.name }}\n </div>\n <div class=\"gn-ui-card-detail\">\n {{ link.name }}\n </div>\n </div>\n <div class=\"flex flex-row justify-between\">\n <div class=\"flex flex-row gap-2.5 items-center pt-1\">\n @if (link.accessServiceProtocol !== 'GPFDL') {\n <span\n class=\"bg-primary
|
|
33154
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ApiCardComponent, isStandalone: true, selector: "gn-ui-api-card", inputs: { link: "link", currentLink: "currentLink", size: "size" }, outputs: { openRecordApiForm: "openRecordApiForm" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"group flex justify-between rounded filter overflow-hidden card-shadow\"\n [ngClass]=\"cardClass\"\n>\n @if (size !== 'S') {\n <div class=\"flex-1 min-w-0\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"flex items-center min-w-[32px]\">\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n @if (size === 'S') {\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n }\n</div>\n\n<ng-template #buttons>\n <div class=\"flex flex-row gap-2\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n class=\"border border-gray-300 rounded-lg pt-1 px-2 h-[34px]\"\n ></gn-ui-copy-text-button>\n @if (displayApiFormButton) {\n <button\n type=\"button\"\n class=\"gn-ui-card-icon\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText,\n }\"\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <ng-icon\n class=\"pointer-events-none align-middle card-icon\"\n name=\"iconoirSettings\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive,\n }\"\n ></ng-icon>\n </button>\n }\n </div>\n</ng-template>\n\n<ng-template #content>\n <div class=\"flex-1 min-w-0\">\n <div class=\"gn-ui-card-title\">\n {{ link.description || link.name }}\n </div>\n <div class=\"gn-ui-card-detail\">\n {{ link.name }}\n </div>\n </div>\n <div class=\"flex flex-row justify-between\">\n <div class=\"flex flex-row gap-2.5 items-center pt-1\">\n @if (link.accessServiceProtocol !== 'GPFDL') {\n <span\n class=\"bg-primary/50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >record.metadata.api.accessServiceProtocol.{{\n link.accessServiceProtocol\n }}</span\n >\n }\n @if (link.accessServiceProtocol === 'GPFDL') {\n <span\n class=\"bg-primary/50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >\n record.metadata.api.gpfdl</span\n >\n }\n </div>\n @if (size === 'S') {\n <div>\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1$5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
|
|
33126
33155
|
provideIcons({
|
|
33127
33156
|
iconoirSettings,
|
|
33128
33157
|
}),
|
|
@@ -33147,7 +33176,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
33147
33176
|
provideNgIconsConfig({
|
|
33148
33177
|
size: '1.5em',
|
|
33149
33178
|
}),
|
|
33150
|
-
], template: "<div\n class=\"group flex justify-between rounded filter overflow-hidden card-shadow\"\n [ngClass]=\"cardClass\"\n>\n @if (size !== 'S') {\n <div class=\"flex-1 min-w-0\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"flex items-center min-w-[32px]\">\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n @if (size === 'S') {\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n }\n</div>\n\n<ng-template #buttons>\n <div class=\"flex flex-row gap-2\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n class=\"border border-gray-300 rounded-lg pt-1 px-2 h-[34px]\"\n ></gn-ui-copy-text-button>\n @if (displayApiFormButton) {\n <button\n type=\"button\"\n class=\"gn-ui-card-icon\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText,\n }\"\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <ng-icon\n class=\"pointer-events-none align-middle card-icon\"\n name=\"iconoirSettings\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive,\n }\"\n ></ng-icon>\n </button>\n }\n </div>\n</ng-template>\n\n<ng-template #content>\n <div class=\"flex-1 min-w-0\">\n <div class=\"gn-ui-card-title\">\n {{ link.description || link.name }}\n </div>\n <div class=\"gn-ui-card-detail\">\n {{ link.name }}\n </div>\n </div>\n <div class=\"flex flex-row justify-between\">\n <div class=\"flex flex-row gap-2.5 items-center pt-1\">\n @if (link.accessServiceProtocol !== 'GPFDL') {\n <span\n class=\"bg-primary
|
|
33179
|
+
], template: "<div\n class=\"group flex justify-between rounded filter overflow-hidden card-shadow\"\n [ngClass]=\"cardClass\"\n>\n @if (size !== 'S') {\n <div class=\"flex-1 min-w-0\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"flex items-center min-w-[32px]\">\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n @if (size === 'S') {\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n }\n</div>\n\n<ng-template #buttons>\n <div class=\"flex flex-row gap-2\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n class=\"border border-gray-300 rounded-lg pt-1 px-2 h-[34px]\"\n ></gn-ui-copy-text-button>\n @if (displayApiFormButton) {\n <button\n type=\"button\"\n class=\"gn-ui-card-icon\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText,\n }\"\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <ng-icon\n class=\"pointer-events-none align-middle card-icon\"\n name=\"iconoirSettings\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive,\n }\"\n ></ng-icon>\n </button>\n }\n </div>\n</ng-template>\n\n<ng-template #content>\n <div class=\"flex-1 min-w-0\">\n <div class=\"gn-ui-card-title\">\n {{ link.description || link.name }}\n </div>\n <div class=\"gn-ui-card-detail\">\n {{ link.name }}\n </div>\n </div>\n <div class=\"flex flex-row justify-between\">\n <div class=\"flex flex-row gap-2.5 items-center pt-1\">\n @if (link.accessServiceProtocol !== 'GPFDL') {\n <span\n class=\"bg-primary/50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >record.metadata.api.accessServiceProtocol.{{\n link.accessServiceProtocol\n }}</span\n >\n }\n @if (link.accessServiceProtocol === 'GPFDL') {\n <span\n class=\"bg-primary/50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >\n record.metadata.api.gpfdl</span\n >\n }\n </div>\n @if (size === 'S') {\n <div>\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n </div>\n</ng-template>\n" }]
|
|
33151
33180
|
}], propDecorators: { link: [{
|
|
33152
33181
|
type: Input
|
|
33153
33182
|
}], currentLink: [{
|
|
@@ -33749,7 +33778,7 @@ class ImageInputComponent {
|
|
|
33749
33778
|
provideNgIconsConfig({
|
|
33750
33779
|
size: '1.5rem',
|
|
33751
33780
|
}),
|
|
33752
|
-
], ngImport: i0, template: "@if (previewUrl) {\n <div class=\"w-
|
|
33781
|
+
], ngImport: i0, template: "@if (previewUrl) {\n <div class=\"w-[314px] h-full flex flex-col gap-2\">\n <gn-ui-image-overlay-preview\n class=\"w-[314px] h-[314px]\"\n [imageUrl]=\"previewUrl\"\n >\n </gn-ui-image-overlay-preview>\n @if (showAltTextInput) {\n <gn-ui-text-input\n [placeholder]=\"'input.image.altTextPlaceholder' | translate\"\n [value]=\"altText ?? ''\"\n (valueChange)=\"handleAltTextChange($event)\"\n extraClass=\"gn-ui-editor-textarea\"\n ></gn-ui-text-input>\n }\n <div class=\"flex flex-row gap-2 mt-2\">\n <gn-ui-button\n type=\"gray\"\n (buttonClick)=\"handleDelete()\"\n data-cy=\"delete-image\"\n >\n <ng-icon class=\"me-1 text-primary\" name=\"iconoirBin\"></ng-icon>\n {{ 'input.image.delete' | translate }}\n </gn-ui-button>\n @if (!showAltTextInput) {\n <gn-ui-button type=\"gray\" (buttonClick)=\"toggleAltTextInput()\">\n <ng-icon name=\"iconoirPlus\" class=\"me-1 text-primary\"></ng-icon>\n {{ 'input.image.displayAltTextInput' | translate }}\n </gn-ui-button>\n }\n </div>\n </div>\n} @else {\n <div class=\"w-full h-full flex flex-col gap-2\">\n <label\n gnUiFilesDrop\n class=\"flex-1 border-2 border-dashed rounded-lg p-6 flex flex-col items-center justify-center gap-4 transition-colors duration-100\"\n [ngClass]=\"{\n 'border-primary-lighter bg-primary-white': dragFilesOver,\n 'border-gray-300': !dragFilesOver,\n 'cursor-pointer hover:border-gray-500': !getIsActionBlocked(),\n 'cursor-not-allowed': disabled,\n }\"\n [attr.tabindex]=\"getIsActionBlocked() ? null : 0\"\n (keydown.enter)=\"fileInput.click()\"\n (dragFilesOver)=\"handleDragFilesOver($event)\"\n (dropFiles)=\"handleDropFiles($event)\"\n >\n @if (!isUploadInProgress && !imageFileError) {\n <div class=\"w-14 h-14 rounded-md bg-gray-50 grid\">\n @if (!dragFilesOver) {\n <ng-icon\n class=\"place-self-center text-primary\"\n name=\"iconoirMediaImage\"\n ></ng-icon>\n }\n @if (dragFilesOver) {\n <ng-icon\n class=\"place-self-center text-primary\"\n name=\"iconoirFramePlusIn\"\n ></ng-icon>\n }\n </div>\n }\n @if (isUploadInProgress && !imageFileError) {\n <div class=\"w-14 h-14 grid items-center justify-center relative\">\n <div class=\"text-gray-100 absolute\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n mode=\"determinate\"\n [value]=\"100\"\n ></mat-progress-spinner>\n </div>\n <div class=\"text-primary absolute\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n mode=\"determinate\"\n [value]=\"uploadProgress\"\n ></mat-progress-spinner>\n </div>\n <span class=\"text-sm text-main font-bold\">{{ uploadProgress }}%</span>\n </div>\n }\n @if (imageFileError) {\n <div class=\"w-14 h-14 rounded-md bg-gray-50 grid\">\n <ng-icon\n name=\"iconoirMediaImageXmark\"\n class=\"place-self-center text-rose-500\"\n data-cy=\"imgErrorIcon\"\n ></ng-icon>\n </div>\n }\n <div class=\"flex flex-col items-center gap-1\">\n <p class=\"font-medium\" data-cy=\"imgInputMsgPrimary\">\n {{ getPrimaryText() | translate }}\n </p>\n <p\n class=\"text-sm\"\n data-cy=\"imgInputMsgSecondary\"\n [class]=\"\n isUploadInProgress\n ? 'font-bold text-blue-500 cursor-pointer'\n : 'font-medium text-gray-500'\n \"\n (click)=\"handleSecondaryTextClick($event)\"\n >\n {{ getSecondaryText() | translate }}\n </p>\n </div>\n <input\n #fileInput\n accept=\"image/*\"\n type=\"file\"\n class=\"hidden\"\n (change)=\"handleFileInput($event)\"\n [disabled]=\"isUploadInProgress || disabled\"\n />\n </label>\n @if (!showUrlInput) {\n <div class=\"flex-none mt-2\">\n <gn-ui-button\n data-cy=\"imgUrlBtn\"\n (buttonClick)=\"displayUrlInput()\"\n type=\"gray\"\n [disabled]=\"disabled\"\n [extraClass]=\"disabled && 'cursor-not-allowed'\"\n >\n <ng-icon class=\"me-1 text-primary\" name=\"iconoirLink\"></ng-icon>\n {{ 'input.image.displayUrlInput' | translate }}\n </gn-ui-button>\n </div>\n }\n @if (showUrlInput) {\n <gn-ui-url-input\n class=\"mt-3.5\"\n data-cy=\"imgUrlInput\"\n (uploadClick)=\"downloadUrl($event)\"\n [disabled]=\"isUploadInProgress || disabled\"\n >\n </gn-ui-url-input>\n }\n </div>\n}\n", styles: [":host{--gn-ui-button-padding: 8px 8px;--gn-ui-button-rounded: 8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "directive", type: FilesDropDirective, selector: "[gnUiFilesDrop]", outputs: ["dragFilesOver", "dropFiles"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: UrlInputComponent, selector: "gn-ui-url-input", inputs: ["value", "extraClass", "placeholder", "disabled", "showValidateButton", "resetUrlOnChange"], outputs: ["valueChange", "uploadClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "placeholder", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ImageOverlayPreviewComponent, selector: "gn-ui-image-overlay-preview", inputs: ["imageUrl"], outputs: ["isPlaceholderShown"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
33753
33782
|
}
|
|
33754
33783
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ImageInputComponent, decorators: [{
|
|
33755
33784
|
type: Component,
|
|
@@ -33775,7 +33804,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
33775
33804
|
provideNgIconsConfig({
|
|
33776
33805
|
size: '1.5rem',
|
|
33777
33806
|
}),
|
|
33778
|
-
], template: "@if (previewUrl) {\n <div class=\"w-
|
|
33807
|
+
], template: "@if (previewUrl) {\n <div class=\"w-[314px] h-full flex flex-col gap-2\">\n <gn-ui-image-overlay-preview\n class=\"w-[314px] h-[314px]\"\n [imageUrl]=\"previewUrl\"\n >\n </gn-ui-image-overlay-preview>\n @if (showAltTextInput) {\n <gn-ui-text-input\n [placeholder]=\"'input.image.altTextPlaceholder' | translate\"\n [value]=\"altText ?? ''\"\n (valueChange)=\"handleAltTextChange($event)\"\n extraClass=\"gn-ui-editor-textarea\"\n ></gn-ui-text-input>\n }\n <div class=\"flex flex-row gap-2 mt-2\">\n <gn-ui-button\n type=\"gray\"\n (buttonClick)=\"handleDelete()\"\n data-cy=\"delete-image\"\n >\n <ng-icon class=\"me-1 text-primary\" name=\"iconoirBin\"></ng-icon>\n {{ 'input.image.delete' | translate }}\n </gn-ui-button>\n @if (!showAltTextInput) {\n <gn-ui-button type=\"gray\" (buttonClick)=\"toggleAltTextInput()\">\n <ng-icon name=\"iconoirPlus\" class=\"me-1 text-primary\"></ng-icon>\n {{ 'input.image.displayAltTextInput' | translate }}\n </gn-ui-button>\n }\n </div>\n </div>\n} @else {\n <div class=\"w-full h-full flex flex-col gap-2\">\n <label\n gnUiFilesDrop\n class=\"flex-1 border-2 border-dashed rounded-lg p-6 flex flex-col items-center justify-center gap-4 transition-colors duration-100\"\n [ngClass]=\"{\n 'border-primary-lighter bg-primary-white': dragFilesOver,\n 'border-gray-300': !dragFilesOver,\n 'cursor-pointer hover:border-gray-500': !getIsActionBlocked(),\n 'cursor-not-allowed': disabled,\n }\"\n [attr.tabindex]=\"getIsActionBlocked() ? null : 0\"\n (keydown.enter)=\"fileInput.click()\"\n (dragFilesOver)=\"handleDragFilesOver($event)\"\n (dropFiles)=\"handleDropFiles($event)\"\n >\n @if (!isUploadInProgress && !imageFileError) {\n <div class=\"w-14 h-14 rounded-md bg-gray-50 grid\">\n @if (!dragFilesOver) {\n <ng-icon\n class=\"place-self-center text-primary\"\n name=\"iconoirMediaImage\"\n ></ng-icon>\n }\n @if (dragFilesOver) {\n <ng-icon\n class=\"place-self-center text-primary\"\n name=\"iconoirFramePlusIn\"\n ></ng-icon>\n }\n </div>\n }\n @if (isUploadInProgress && !imageFileError) {\n <div class=\"w-14 h-14 grid items-center justify-center relative\">\n <div class=\"text-gray-100 absolute\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n mode=\"determinate\"\n [value]=\"100\"\n ></mat-progress-spinner>\n </div>\n <div class=\"text-primary absolute\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n mode=\"determinate\"\n [value]=\"uploadProgress\"\n ></mat-progress-spinner>\n </div>\n <span class=\"text-sm text-main font-bold\">{{ uploadProgress }}%</span>\n </div>\n }\n @if (imageFileError) {\n <div class=\"w-14 h-14 rounded-md bg-gray-50 grid\">\n <ng-icon\n name=\"iconoirMediaImageXmark\"\n class=\"place-self-center text-rose-500\"\n data-cy=\"imgErrorIcon\"\n ></ng-icon>\n </div>\n }\n <div class=\"flex flex-col items-center gap-1\">\n <p class=\"font-medium\" data-cy=\"imgInputMsgPrimary\">\n {{ getPrimaryText() | translate }}\n </p>\n <p\n class=\"text-sm\"\n data-cy=\"imgInputMsgSecondary\"\n [class]=\"\n isUploadInProgress\n ? 'font-bold text-blue-500 cursor-pointer'\n : 'font-medium text-gray-500'\n \"\n (click)=\"handleSecondaryTextClick($event)\"\n >\n {{ getSecondaryText() | translate }}\n </p>\n </div>\n <input\n #fileInput\n accept=\"image/*\"\n type=\"file\"\n class=\"hidden\"\n (change)=\"handleFileInput($event)\"\n [disabled]=\"isUploadInProgress || disabled\"\n />\n </label>\n @if (!showUrlInput) {\n <div class=\"flex-none mt-2\">\n <gn-ui-button\n data-cy=\"imgUrlBtn\"\n (buttonClick)=\"displayUrlInput()\"\n type=\"gray\"\n [disabled]=\"disabled\"\n [extraClass]=\"disabled && 'cursor-not-allowed'\"\n >\n <ng-icon class=\"me-1 text-primary\" name=\"iconoirLink\"></ng-icon>\n {{ 'input.image.displayUrlInput' | translate }}\n </gn-ui-button>\n </div>\n }\n @if (showUrlInput) {\n <gn-ui-url-input\n class=\"mt-3.5\"\n data-cy=\"imgUrlInput\"\n (uploadClick)=\"downloadUrl($event)\"\n [disabled]=\"isUploadInProgress || disabled\"\n >\n </gn-ui-url-input>\n }\n </div>\n}\n", styles: [":host{--gn-ui-button-padding: 8px 8px;--gn-ui-button-rounded: 8px}\n"] }]
|
|
33779
33808
|
}], propDecorators: { previewUrl: [{
|
|
33780
33809
|
type: Input
|
|
33781
33810
|
}], altText: [{
|
|
@@ -33994,9 +34023,9 @@ class MetadataContactComponent {
|
|
|
33994
34023
|
return this.metadata.ownerOrganization;
|
|
33995
34024
|
}
|
|
33996
34025
|
get contacts() {
|
|
33997
|
-
return ((this.metadata.kind === '
|
|
33998
|
-
? this.metadata.
|
|
33999
|
-
: this.metadata.
|
|
34026
|
+
return ((this.metadata.kind === 'service'
|
|
34027
|
+
? this.metadata.contacts
|
|
34028
|
+
: this.metadata.contactsForResource) || []);
|
|
34000
34029
|
}
|
|
34001
34030
|
get address() {
|
|
34002
34031
|
const addressParts = this.contacts[0].address
|
|
@@ -34008,7 +34037,7 @@ class MetadataContactComponent {
|
|
|
34008
34037
|
this.organizationClick.emit(this.shownOrganization);
|
|
34009
34038
|
}
|
|
34010
34039
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
34011
|
-
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 <
|
|
34040
|
+
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\" data-cy=\"contact-full-name\">\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: [
|
|
34012
34041
|
provideIcons({
|
|
34013
34042
|
matOpenInNew,
|
|
34014
34043
|
matCallOutline,
|
|
@@ -34028,7 +34057,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
34028
34057
|
matPersonOutline,
|
|
34029
34058
|
matLocationOnOutline,
|
|
34030
34059
|
}),
|
|
34031
|
-
], 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 <
|
|
34060
|
+
], 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\" data-cy=\"contact-full-name\">\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" }]
|
|
34032
34061
|
}], propDecorators: { metadata: [{
|
|
34033
34062
|
type: Input
|
|
34034
34063
|
}], organizationClick: [{
|
|
@@ -34528,7 +34557,7 @@ class RecordApiFormComponent {
|
|
|
34528
34557
|
}
|
|
34529
34558
|
}
|
|
34530
34559
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
34531
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: RecordApiFormComponent, isStandalone: true, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary
|
|
34560
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: RecordApiFormComponent, isStandalone: true, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary/50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n placeholder=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 relative\">\n <p class=\"text-sm\" [class.text-gray-600]=\"!supportOffset\" translate>\n record.metadata.api.form.offset\n </p>\n <div class=\"flex items-center\">\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n [disabled]=\"!supportOffset\"\n (valueChange)=\"supportOffset ? setOffset($event) : null\"\n placeholder=\"\"\n >\n </gn-ui-text-input>\n @if (!supportOffset) {\n <div class=\"flex items-center gap-2 text-orange-500 z-10 ml-3\">\n <span\n class=\"material-symbols-outlined\"\n matTooltip=\"Not supported on this service\"\n >\n warning\n </span>\n </div>\n }\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"outputFormats\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button ng-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover ng-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "placeholder", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1$5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
34532
34561
|
}
|
|
34533
34562
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RecordApiFormComponent, decorators: [{
|
|
34534
34563
|
type: Component,
|
|
@@ -34539,7 +34568,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
34539
34568
|
CopyTextButtonComponent,
|
|
34540
34569
|
TranslateDirective,
|
|
34541
34570
|
MatTooltipModule,
|
|
34542
|
-
], template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary
|
|
34571
|
+
], template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary/50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n placeholder=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 relative\">\n <p class=\"text-sm\" [class.text-gray-600]=\"!supportOffset\" translate>\n record.metadata.api.form.offset\n </p>\n <div class=\"flex items-center\">\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n [disabled]=\"!supportOffset\"\n (valueChange)=\"supportOffset ? setOffset($event) : null\"\n placeholder=\"\"\n >\n </gn-ui-text-input>\n @if (!supportOffset) {\n <div class=\"flex items-center gap-2 text-orange-500 z-10 ml-3\">\n <span\n class=\"material-symbols-outlined\"\n matTooltip=\"Not supported on this service\"\n >\n warning\n </span>\n </div>\n }\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"outputFormats\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button ng-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover ng-icon{color:#d3d3d3!important}\n"] }]
|
|
34543
34572
|
}], propDecorators: { apiLink: [{
|
|
34544
34573
|
type: Input
|
|
34545
34574
|
}] } });
|
|
@@ -34642,13 +34671,12 @@ class ApplicationBannerComponent {
|
|
|
34642
34671
|
this.icon = 'matWarning';
|
|
34643
34672
|
break;
|
|
34644
34673
|
case 'light':
|
|
34645
|
-
this.msgClass =
|
|
34646
|
-
'bg-primary-opacity-10 border-primary-lightest text-black';
|
|
34674
|
+
this.msgClass = 'bg-primary/10 border-primary-lightest text-black';
|
|
34647
34675
|
this.icon = 'matInfoOutline';
|
|
34648
34676
|
break;
|
|
34649
34677
|
case 'secondary':
|
|
34650
34678
|
default:
|
|
34651
|
-
this.msgClass = 'bg-primary
|
|
34679
|
+
this.msgClass = 'bg-primary/50 border-primary-darker text-black';
|
|
34652
34680
|
this.icon = 'matWarningAmberOutline';
|
|
34653
34681
|
break;
|
|
34654
34682
|
}
|
|
@@ -34737,7 +34765,7 @@ class InternalLinkCardComponent {
|
|
|
34737
34765
|
provideNgIconsConfig({
|
|
34738
34766
|
size: '1.2em',
|
|
34739
34767
|
}),
|
|
34740
|
-
], ngImport: i0, template: "<a\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n class=\"record-card\"\n [ngClass]=\"cardClass\"\n>\n @if (shouldShowThumbnail) {\n <div class=\"record-card__thumbnail\">\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grow pt-1\" [ngClass]=\"shouldShowThumbnail ? 'sm:w-0' : ''\">\n <div class=\"flex flex-col gap-2 h-full\">\n <h4\n class=\"record-card__title\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n <!-- force max width here as long a-href urls within the markdown parser can cause layout issues -->\n <div class=\"grow max-w-[248px] sm:max-w-full\">\n <gn-ui-markdown-parser\n data-cy=\"recordAbstract\"\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n class=\"record-card__abstract\"\n [title]=\"abstract\"\n ></gn-ui-markdown-parser>\n </div>\n <div class=\"record-card__footer\">\n
|
|
34768
|
+
], ngImport: i0, template: "<a\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n class=\"record-card\"\n [ngClass]=\"cardClass\"\n>\n @if (shouldShowThumbnail) {\n <div class=\"record-card__thumbnail\">\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grow pt-1\" [ngClass]=\"shouldShowThumbnail ? 'sm:w-0' : ''\">\n <div class=\"flex flex-col gap-2\" [class.h-full]=\"size !== 'M'\">\n <h4\n class=\"record-card__title\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n <!-- force max width here as long a-href urls within the markdown parser can cause layout issues -->\n <div class=\"grow max-w-[248px] sm:max-w-full\">\n <gn-ui-markdown-parser\n data-cy=\"recordAbstract\"\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n class=\"record-card__abstract\"\n [title]=\"abstract\"\n ></gn-ui-markdown-parser>\n </div>\n @if (size !== 'M') {\n <ng-container [ngTemplateOutlet]=\"footerTpl\"></ng-container>\n }\n </div>\n </div>\n @if (size === 'M') {\n <ng-container [ngTemplateOutlet]=\"footerTpl\"></ng-container>\n }\n</a>\n\n<ng-template #footerTpl>\n <div class=\"record-card__footer\">\n @if (record.ownerOrganization?.name) {\n <div\n data-cy=\"recordOrg\"\n class=\"grow flex flex-row gap-1 items-center text-primary-lighter\"\n [ngClass]=\"displayContactIconOnly ? 'justify-center' : ''\"\n >\n <ng-icon\n name=\"iconoirBank\"\n class=\"text-primary -translate-y-[0.5px] shrink-0\"\n [title]=\"record.ownerOrganization.name\"\n ></ng-icon>\n @if (!displayContactIconOnly) {\n <span\n data-cy=\"recordOrgName\"\n class=\"line-clamp-1\"\n [title]=\"record.ownerOrganization.name\"\n >{{ record.ownerOrganization.name }}</span\n >\n }\n </div>\n }\n <div class=\"record-card__footer__other\">\n <div class=\"xs:border-r last:border-r-0 flex grow gap-4 px-4 last:pr-0\">\n <gn-ui-kind-badge\n [extraClass]=\"'text-[1.2em]'\"\n [styling]=\"'gray'\"\n [kind]=\"record?.kind\"\n [contentTemplate]=\"customTemplate\"\n class=\"pt-1\"\n >\n <ng-template #customTemplate></ng-template\n ></gn-ui-kind-badge>\n @if (metadataQualityDisplay) {\n <gn-ui-metadata-quality\n class=\"flex items-center min-w-[113px]\"\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n [popoverDisplay]=\"true\"\n ></gn-ui-metadata-quality>\n }\n </div>\n <div\n class=\"flex justify-center\"\n data-cy=\"recordFav\"\n [ngClass]=\"displayContactIconOnly ? 'px-1' : 'px-4'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".record-card{@apply rounded-md bg-white hover:cursor-pointer hover:bg-slate-50 overflow-hidden items-stretch flex flex-row md:gap-0 justify-between py-3 pl-3 pr-5;}.record-card.size-L{@apply w-full md:h-[208px] gap-5;}.record-card.size-M{@apply max-w-[940px] gap-4 flex-wrap;}.record-card.size-S{@apply max-w-[572px] md:h-[315px] gap-4;}.record-card.size-XS{@apply max-w-[280px] md:h-[315px] gap-4;}.record-card:hover .record-card__title{@apply text-primary;}.record-card__thumbnail{@apply border rounded-lg overflow-hidden shrink-0;}.size-L .record-card__thumbnail{@apply w-[184px] h-[184px];}.size-M .record-card__thumbnail{@apply w-[138px] h-[138px];}.record-card__title{@apply text-xl font-medium text-title leading-6;}.size-L .record-card__title,.size-M .record-card__title{@apply line-clamp-2;}.size-S .record-card__title,.size-XS .record-card__title{@apply line-clamp-3 ml-2;}.record-card__abstract{@apply text-gray-900 overflow-hidden;}.size-L .record-card__abstract,.size-M .record-card__abstract{@apply line-clamp-3;}.size-S .record-card__abstract,.size-XS .record-card__abstract{@apply line-clamp-4 ml-2;}.record-card__footer{@apply flex sm:flex-row flex-col flex-nowrap gap-3 justify-end items-center w-full border-t pt-1 overflow-hidden;}@media (max-width: 450px){.size-S .record-card__footer{@apply flex-col items-stretch;}}.size-XS .record-card__footer{@apply flex-col items-stretch gap-2;}.record-card__footer__other{@apply flex flex-col xs:flex-row flex-nowrap gap-3 xs:border-l first:border-l-0;}.record-card__footer__other>div{@apply py-1;}@media (max-width: 450px){.size-S .record-card__footer__other,.size-S .record-card__footer__other>div{@apply border-0 px-0 py-0;}}.size-XS .record-card__footer__other,.size-XS .record-card__footer__other>div{@apply border-0;}.size-XS .record-card__footer__other>div{@apply px-0 py-0;}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: MetadataQualityComponent, selector: "gn-ui-metadata-quality", inputs: ["metadata", "smaller", "metadataQualityDisplay", "popoverDisplay", "propsToValidate", "forceComputeScore"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: KindBadgeComponent, selector: "gn-ui-kind-badge", inputs: ["styling", "contentTemplate", "kind", "extraClass"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }] }); }
|
|
34741
34769
|
}
|
|
34742
34770
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: InternalLinkCardComponent, decorators: [{
|
|
34743
34771
|
type: Component,
|
|
@@ -34757,7 +34785,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
34757
34785
|
provideNgIconsConfig({
|
|
34758
34786
|
size: '1.2em',
|
|
34759
34787
|
}),
|
|
34760
|
-
], template: "<a\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n class=\"record-card\"\n [ngClass]=\"cardClass\"\n>\n @if (shouldShowThumbnail) {\n <div class=\"record-card__thumbnail\">\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grow pt-1\" [ngClass]=\"shouldShowThumbnail ? 'sm:w-0' : ''\">\n <div class=\"flex flex-col gap-2 h-full\">\n <h4\n class=\"record-card__title\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n <!-- force max width here as long a-href urls within the markdown parser can cause layout issues -->\n <div class=\"grow max-w-[248px] sm:max-w-full\">\n <gn-ui-markdown-parser\n data-cy=\"recordAbstract\"\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n class=\"record-card__abstract\"\n [title]=\"abstract\"\n ></gn-ui-markdown-parser>\n </div>\n <div class=\"record-card__footer\">\n
|
|
34788
|
+
], template: "<a\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n class=\"record-card\"\n [ngClass]=\"cardClass\"\n>\n @if (shouldShowThumbnail) {\n <div class=\"record-card__thumbnail\">\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grow pt-1\" [ngClass]=\"shouldShowThumbnail ? 'sm:w-0' : ''\">\n <div class=\"flex flex-col gap-2\" [class.h-full]=\"size !== 'M'\">\n <h4\n class=\"record-card__title\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n <!-- force max width here as long a-href urls within the markdown parser can cause layout issues -->\n <div class=\"grow max-w-[248px] sm:max-w-full\">\n <gn-ui-markdown-parser\n data-cy=\"recordAbstract\"\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n class=\"record-card__abstract\"\n [title]=\"abstract\"\n ></gn-ui-markdown-parser>\n </div>\n @if (size !== 'M') {\n <ng-container [ngTemplateOutlet]=\"footerTpl\"></ng-container>\n }\n </div>\n </div>\n @if (size === 'M') {\n <ng-container [ngTemplateOutlet]=\"footerTpl\"></ng-container>\n }\n</a>\n\n<ng-template #footerTpl>\n <div class=\"record-card__footer\">\n @if (record.ownerOrganization?.name) {\n <div\n data-cy=\"recordOrg\"\n class=\"grow flex flex-row gap-1 items-center text-primary-lighter\"\n [ngClass]=\"displayContactIconOnly ? 'justify-center' : ''\"\n >\n <ng-icon\n name=\"iconoirBank\"\n class=\"text-primary -translate-y-[0.5px] shrink-0\"\n [title]=\"record.ownerOrganization.name\"\n ></ng-icon>\n @if (!displayContactIconOnly) {\n <span\n data-cy=\"recordOrgName\"\n class=\"line-clamp-1\"\n [title]=\"record.ownerOrganization.name\"\n >{{ record.ownerOrganization.name }}</span\n >\n }\n </div>\n }\n <div class=\"record-card__footer__other\">\n <div class=\"xs:border-r last:border-r-0 flex grow gap-4 px-4 last:pr-0\">\n <gn-ui-kind-badge\n [extraClass]=\"'text-[1.2em]'\"\n [styling]=\"'gray'\"\n [kind]=\"record?.kind\"\n [contentTemplate]=\"customTemplate\"\n class=\"pt-1\"\n >\n <ng-template #customTemplate></ng-template\n ></gn-ui-kind-badge>\n @if (metadataQualityDisplay) {\n <gn-ui-metadata-quality\n class=\"flex items-center min-w-[113px]\"\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n [popoverDisplay]=\"true\"\n ></gn-ui-metadata-quality>\n }\n </div>\n <div\n class=\"flex justify-center\"\n data-cy=\"recordFav\"\n [ngClass]=\"displayContactIconOnly ? 'px-1' : 'px-4'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".record-card{@apply rounded-md bg-white hover:cursor-pointer hover:bg-slate-50 overflow-hidden items-stretch flex flex-row md:gap-0 justify-between py-3 pl-3 pr-5;}.record-card.size-L{@apply w-full md:h-[208px] gap-5;}.record-card.size-M{@apply max-w-[940px] gap-4 flex-wrap;}.record-card.size-S{@apply max-w-[572px] md:h-[315px] gap-4;}.record-card.size-XS{@apply max-w-[280px] md:h-[315px] gap-4;}.record-card:hover .record-card__title{@apply text-primary;}.record-card__thumbnail{@apply border rounded-lg overflow-hidden shrink-0;}.size-L .record-card__thumbnail{@apply w-[184px] h-[184px];}.size-M .record-card__thumbnail{@apply w-[138px] h-[138px];}.record-card__title{@apply text-xl font-medium text-title leading-6;}.size-L .record-card__title,.size-M .record-card__title{@apply line-clamp-2;}.size-S .record-card__title,.size-XS .record-card__title{@apply line-clamp-3 ml-2;}.record-card__abstract{@apply text-gray-900 overflow-hidden;}.size-L .record-card__abstract,.size-M .record-card__abstract{@apply line-clamp-3;}.size-S .record-card__abstract,.size-XS .record-card__abstract{@apply line-clamp-4 ml-2;}.record-card__footer{@apply flex sm:flex-row flex-col flex-nowrap gap-3 justify-end items-center w-full border-t pt-1 overflow-hidden;}@media (max-width: 450px){.size-S .record-card__footer{@apply flex-col items-stretch;}}.size-XS .record-card__footer{@apply flex-col items-stretch gap-2;}.record-card__footer__other{@apply flex flex-col xs:flex-row flex-nowrap gap-3 xs:border-l first:border-l-0;}.record-card__footer__other>div{@apply py-1;}@media (max-width: 450px){.size-S .record-card__footer__other,.size-S .record-card__footer__other>div{@apply border-0 px-0 py-0;}}.size-XS .record-card__footer__other,.size-XS .record-card__footer__other>div{@apply border-0;}.size-XS .record-card__footer__other>div{@apply px-0 py-0;}\n"] }]
|
|
34761
34789
|
}], propDecorators: { record: [{
|
|
34762
34790
|
type: Input
|
|
34763
34791
|
}], linkTarget: [{
|
|
@@ -34895,7 +34923,7 @@ class ServiceCapabilitiesComponent {
|
|
|
34895
34923
|
: `h-8 rounded-lg`;
|
|
34896
34924
|
}
|
|
34897
34925
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ServiceCapabilitiesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
34898
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ServiceCapabilitiesComponent, isStandalone: true, selector: "gn-ui-service-capabilities", inputs: { apiLinks: "apiLinks" }, ngImport: i0, template: "@if (apiLinks.length > 0) {\n <div style=\"height: 652px\" id=\"preview\">\n <div class=\"bg-primary
|
|
34926
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ServiceCapabilitiesComponent, isStandalone: true, selector: "gn-ui-service-capabilities", inputs: { apiLinks: "apiLinks" }, ngImport: i0, template: "@if (apiLinks.length > 0) {\n <div style=\"height: 652px\" id=\"preview\">\n <div class=\"bg-primary/10 overflow-visible\" style=\"height: 420px\">\n <div class=\"container-lg px-4 lg:mx-auto\">\n <div>\n <div class=\"gn-ui-section-title mb-6\" translate>\n service.metadata.capabilities\n </div>\n @if (loading) {\n <div class=\"flex justify-center w-full h-[200px] items-center\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n }\n @if (!loading) {\n <div>\n <div class=\"flex flex-row gap-5\">\n <div class=\"h-14 md:w-2/5 w-full mb-4 flex flex-row relative\">\n <gn-ui-text-input\n class=\"w-full\"\n [(value)]=\"searchQuery\"\n [extraClass]=\"getExtraInputClass()\"\n [placeholder]=\"'service.metadata.search' | translate\"\n (input)=\"onSearchChange($event)\"\n (keydown.enter)=\"onSearchEnter($event)\"\n >\n </gn-ui-text-input>\n <div\n class=\"absolute right-14 h-14 w-14 flex items-center justify-center\"\n >\n @if (searchQuery) {\n <button\n #inputBtn\n [aria-label]=\"\n 'service.metadata.search.clear' | translate\n \"\n (click)=\"clearSearch()\"\n class=\"h-12 w-12 border-0 flex items-center justify-center\"\n >\n <ng-icon name=\"matClose\"></ng-icon>\n </button>\n }\n </div>\n <div\n class=\"border-l absolute border-gray-200 right-0 h-14 w-14\"\n >\n <gn-ui-button\n #inputBtn\n type=\"outline\"\n extraClass=\"h-12 w-12 border-0 absolute right-1 top-1 bg-white\"\n (buttonClick)=\"searchLayers()\"\n >\n <ng-icon name=\"iconoirSearch\"></ng-icon>\n </gn-ui-button>\n </div>\n </div>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light\"\n class=\"w-14 h-14 border border-gray-300 rounded-lg flex justify-center items-center\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"w-6 h-6 pt-0.5\"\n ></ng-icon>\n </gn-ui-popover>\n </div>\n <div\n style=\"height: 500px\"\n class=\"bg-white shadow-xl rounded p-0 flex md:flex-row flex-col\"\n >\n <div\n class=\"flex flex-col gap-2 bg-gray-100 md:w-1/2 md:h-full w-full h-1/2 rounded-l overflow-y-auto py-5 pr-1 pl-3\"\n data-test=\"layer-list\"\n >\n @for (layerItem of filteredLayers; track layerItem) {\n <gn-ui-button\n type=\"outline\"\n [extraClass]=\"getExtraClass(layerItem)\"\n (buttonClick)=\"selectLayer(layerItem)\"\n >\n {{ layerItem.title || layerItem.name }}\n </gn-ui-button>\n }\n @if (filteredLayers.length === 0) {\n <span class=\"text-gray-800\">\n {{ 'service.metadata.filter.noLayers' | translate }}\n </span>\n }\n </div>\n <div\n data-test=\"layer-information\"\n class=\"flex flex-col gap-4 md:h-full md:w-1/2 w-full h-1/2 py-5 px-10 overflow-y-auto\"\n >\n @for (item of layerInformation; track item) {\n <div class=\"flex flex-row gap-4 border-b border-gray-200\">\n <span class=\"font-semibold w-24\">{{\n item.displayName\n }}</span>\n @if (isList(item.value)) {\n <div>\n @for (subItem of item.value; track subItem) {\n <div class=\"flex flex-row break-words max-w-72\">\n {{ subItem }}\n </div>\n }\n </div>\n }\n @if (!isList(item.value)) {\n <div class=\"break-words max-w-72\">\n {{ item.value }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n}\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div translate>service.metadata.filter</div>\n </div>\n</ng-template>\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: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "placeholder", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: PopoverComponent, selector: "gn-ui-popover", inputs: ["content", "theme"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
|
|
34899
34927
|
provideIcons({
|
|
34900
34928
|
iconoirSearch,
|
|
34901
34929
|
matInfoOutline,
|
|
@@ -34919,7 +34947,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
34919
34947
|
matInfoOutline,
|
|
34920
34948
|
matClose,
|
|
34921
34949
|
}),
|
|
34922
|
-
], template: "@if (apiLinks.length > 0) {\n <div style=\"height: 652px\" id=\"preview\">\n <div class=\"bg-primary
|
|
34950
|
+
], template: "@if (apiLinks.length > 0) {\n <div style=\"height: 652px\" id=\"preview\">\n <div class=\"bg-primary/10 overflow-visible\" style=\"height: 420px\">\n <div class=\"container-lg px-4 lg:mx-auto\">\n <div>\n <div class=\"gn-ui-section-title mb-6\" translate>\n service.metadata.capabilities\n </div>\n @if (loading) {\n <div class=\"flex justify-center w-full h-[200px] items-center\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n }\n @if (!loading) {\n <div>\n <div class=\"flex flex-row gap-5\">\n <div class=\"h-14 md:w-2/5 w-full mb-4 flex flex-row relative\">\n <gn-ui-text-input\n class=\"w-full\"\n [(value)]=\"searchQuery\"\n [extraClass]=\"getExtraInputClass()\"\n [placeholder]=\"'service.metadata.search' | translate\"\n (input)=\"onSearchChange($event)\"\n (keydown.enter)=\"onSearchEnter($event)\"\n >\n </gn-ui-text-input>\n <div\n class=\"absolute right-14 h-14 w-14 flex items-center justify-center\"\n >\n @if (searchQuery) {\n <button\n #inputBtn\n [aria-label]=\"\n 'service.metadata.search.clear' | translate\n \"\n (click)=\"clearSearch()\"\n class=\"h-12 w-12 border-0 flex items-center justify-center\"\n >\n <ng-icon name=\"matClose\"></ng-icon>\n </button>\n }\n </div>\n <div\n class=\"border-l absolute border-gray-200 right-0 h-14 w-14\"\n >\n <gn-ui-button\n #inputBtn\n type=\"outline\"\n extraClass=\"h-12 w-12 border-0 absolute right-1 top-1 bg-white\"\n (buttonClick)=\"searchLayers()\"\n >\n <ng-icon name=\"iconoirSearch\"></ng-icon>\n </gn-ui-button>\n </div>\n </div>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light\"\n class=\"w-14 h-14 border border-gray-300 rounded-lg flex justify-center items-center\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"w-6 h-6 pt-0.5\"\n ></ng-icon>\n </gn-ui-popover>\n </div>\n <div\n style=\"height: 500px\"\n class=\"bg-white shadow-xl rounded p-0 flex md:flex-row flex-col\"\n >\n <div\n class=\"flex flex-col gap-2 bg-gray-100 md:w-1/2 md:h-full w-full h-1/2 rounded-l overflow-y-auto py-5 pr-1 pl-3\"\n data-test=\"layer-list\"\n >\n @for (layerItem of filteredLayers; track layerItem) {\n <gn-ui-button\n type=\"outline\"\n [extraClass]=\"getExtraClass(layerItem)\"\n (buttonClick)=\"selectLayer(layerItem)\"\n >\n {{ layerItem.title || layerItem.name }}\n </gn-ui-button>\n }\n @if (filteredLayers.length === 0) {\n <span class=\"text-gray-800\">\n {{ 'service.metadata.filter.noLayers' | translate }}\n </span>\n }\n </div>\n <div\n data-test=\"layer-information\"\n class=\"flex flex-col gap-4 md:h-full md:w-1/2 w-full h-1/2 py-5 px-10 overflow-y-auto\"\n >\n @for (item of layerInformation; track item) {\n <div class=\"flex flex-row gap-4 border-b border-gray-200\">\n <span class=\"font-semibold w-24\">{{\n item.displayName\n }}</span>\n @if (isList(item.value)) {\n <div>\n @for (subItem of item.value; track subItem) {\n <div class=\"flex flex-row break-words max-w-72\">\n {{ subItem }}\n </div>\n }\n </div>\n }\n @if (!isList(item.value)) {\n <div class=\"break-words max-w-72\">\n {{ item.value }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n}\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div translate>service.metadata.filter</div>\n </div>\n</ng-template>\n" }]
|
|
34923
34951
|
}], propDecorators: { apiLinks: [{
|
|
34924
34952
|
type: Input
|
|
34925
34953
|
}] } });
|
|
@@ -35308,7 +35336,7 @@ class RecordPreviewFeedComponent extends RecordPreviewComponent {
|
|
|
35308
35336
|
return this.timeFormat.format(this.record.recordCreated, Date.now());
|
|
35309
35337
|
}
|
|
35310
35338
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RecordPreviewFeedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
35311
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: RecordPreviewFeedComponent, isStandalone: true, selector: "gn-ui-record-preview-feed", usesInheritance: true, ngImport: i0, template: "<div\n class=\"mx-[18px] pl-[18px] pb-[18px] border-solid border-l-2 border-gray-100\"\n>\n <a\n class=\"record-container block rounded-lg bg-white border border-white card-shadow\"\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n >\n <div\n class=\"record-header py-4 px-4 border-b border-gray-300 flex flex-row items-center relative transition duration-200\"\n >\n <div\n class=\"absolute w-3 h-3 bg-secondary rounded-full\"\n style=\"right: calc(100% + 14px)\"\n ></div>\n <div\n class=\"record-header-image border border-gray-300 bg-white rounded-full w-16 h-16 object-contain mr-4 overflow-hidden transition duration-200 shrink-0\"\n >\n @if (!hasLogo) {\n <ng-icon\n class=\"text-gray-200\"\n name=\"{{ hasOnlyPerson ? 'matFace' : 'matHomeWorkOutline' }}\"\n style=\"width: 42px; height: 42px; font-size: 42px; margin: 10px\"\n ></ng-icon>\n }\n @if (hasLogo) {\n <gn-ui-thumbnail\n [thumbnailUrl]=\"record.ownerOrganization?.logoUrl?.toString()\"\n [fit]=\"'contain'\"\n ></gn-ui-thumbnail>\n }\n </div>\n <div class=\"flex flex-col overflow-hidden items-start\">\n @if (hasOrganization) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ record.ownerOrganization.name }}\n </span>\n }\n @if (hasOnlyPerson) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ contact.firstName }} {{ contact.lastName }}\n </span>\n }\n <p class=\"\">\n <span translate [translateParams]=\"{ time }\"\n >record.was.created.time</span\n >\n </p>\n </div>\n
|
|
35339
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: RecordPreviewFeedComponent, isStandalone: true, selector: "gn-ui-record-preview-feed", usesInheritance: true, ngImport: i0, template: "<div\n class=\"mx-[18px] pl-[18px] pb-[18px] border-solid border-l-2 border-gray-100\"\n>\n <a\n class=\"record-container block rounded-lg bg-white border border-white card-shadow\"\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n >\n <div\n class=\"record-header py-4 px-4 border-b border-gray-300 flex flex-row items-center relative transition duration-200\"\n >\n <div\n class=\"absolute w-3 h-3 bg-secondary rounded-full\"\n style=\"right: calc(100% + 14px)\"\n ></div>\n <div\n class=\"record-header-image border border-gray-300 bg-white rounded-full w-16 h-16 object-contain mr-4 overflow-hidden transition duration-200 shrink-0\"\n >\n @if (!hasLogo) {\n <ng-icon\n class=\"text-gray-200\"\n name=\"{{ hasOnlyPerson ? 'matFace' : 'matHomeWorkOutline' }}\"\n style=\"width: 42px; height: 42px; font-size: 42px; margin: 10px\"\n ></ng-icon>\n }\n @if (hasLogo) {\n <gn-ui-thumbnail\n [thumbnailUrl]=\"record.ownerOrganization?.logoUrl?.toString()\"\n [fit]=\"'contain'\"\n ></gn-ui-thumbnail>\n }\n </div>\n <div class=\"flex flex-col overflow-hidden items-start grow\">\n @if (hasOrganization) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ record.ownerOrganization.name }}\n </span>\n }\n @if (hasOnlyPerson) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ contact.firstName }} {{ contact.lastName }}\n </span>\n }\n <p class=\"\">\n <span translate [translateParams]=\"{ time }\"\n >record.was.created.time</span\n >\n </p>\n </div>\n <div class=\"ml-3 shrink-0\">\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n <div class=\"pt-5 pb-5 px-10 relative\">\n <div class=\"flex flex-col sm:flex-row gap-4 mb-3\">\n @if (record.overviews?.[0]) {\n <gn-ui-thumbnail\n class=\"block shrink-0 w-[120px] h-[120px] border border-gray-100 rounded-lg overflow-hidden\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n }\n <h1\n class=\"font-title text-black text-[21px] font-medium\"\n data-cy=\"recordTitle\"\n >\n {{ record.title }}\n </h1>\n </div>\n <p class=\"line-clamp-3\">\n <gn-ui-markdown-parser\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n />\n </p>\n @if (isDownloadable || isViewable) {\n <div class=\"flex flex-row mt-3\">\n @if (isDownloadable) {\n <ng-icon\n class=\"text-primary opacity-45 mr-3\"\n name=\"matCloudDownloadOutline\"\n >\n </ng-icon>\n }\n @if (isViewable) {\n <ng-icon class=\"text-primary opacity-45 mr-3\" name=\"matMapOutline\">\n </ng-icon>\n }\n </div>\n }\n </div>\n </a>\n</div>\n", styles: [".record-container:hover .record-header,.record-container:hover .record-header-image{border-color:var(--color-primary-lightest)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], viewProviders: [
|
|
35312
35340
|
provideIcons({
|
|
35313
35341
|
matMapOutline,
|
|
35314
35342
|
matCloudDownloadOutline,
|
|
@@ -35338,7 +35366,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
35338
35366
|
provideNgIconsConfig({
|
|
35339
35367
|
size: '1.5em',
|
|
35340
35368
|
}),
|
|
35341
|
-
], template: "<div\n class=\"mx-[18px] pl-[18px] pb-[18px] border-solid border-l-2 border-gray-100\"\n>\n <a\n class=\"record-container block rounded-lg bg-white border border-white card-shadow\"\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n >\n <div\n class=\"record-header py-4 px-4 border-b border-gray-300 flex flex-row items-center relative transition duration-200\"\n >\n <div\n class=\"absolute w-3 h-3 bg-secondary rounded-full\"\n style=\"right: calc(100% + 14px)\"\n ></div>\n <div\n class=\"record-header-image border border-gray-300 bg-white rounded-full w-16 h-16 object-contain mr-4 overflow-hidden transition duration-200 shrink-0\"\n >\n @if (!hasLogo) {\n <ng-icon\n class=\"text-gray-200\"\n name=\"{{ hasOnlyPerson ? 'matFace' : 'matHomeWorkOutline' }}\"\n style=\"width: 42px; height: 42px; font-size: 42px; margin: 10px\"\n ></ng-icon>\n }\n @if (hasLogo) {\n <gn-ui-thumbnail\n [thumbnailUrl]=\"record.ownerOrganization?.logoUrl?.toString()\"\n [fit]=\"'contain'\"\n ></gn-ui-thumbnail>\n }\n </div>\n <div class=\"flex flex-col overflow-hidden items-start\">\n @if (hasOrganization) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ record.ownerOrganization.name }}\n </span>\n }\n @if (hasOnlyPerson) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ contact.firstName }} {{ contact.lastName }}\n </span>\n }\n <p class=\"\">\n <span translate [translateParams]=\"{ time }\"\n >record.was.created.time</span\n >\n </p>\n </div>\n
|
|
35369
|
+
], template: "<div\n class=\"mx-[18px] pl-[18px] pb-[18px] border-solid border-l-2 border-gray-100\"\n>\n <a\n class=\"record-container block rounded-lg bg-white border border-white card-shadow\"\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n >\n <div\n class=\"record-header py-4 px-4 border-b border-gray-300 flex flex-row items-center relative transition duration-200\"\n >\n <div\n class=\"absolute w-3 h-3 bg-secondary rounded-full\"\n style=\"right: calc(100% + 14px)\"\n ></div>\n <div\n class=\"record-header-image border border-gray-300 bg-white rounded-full w-16 h-16 object-contain mr-4 overflow-hidden transition duration-200 shrink-0\"\n >\n @if (!hasLogo) {\n <ng-icon\n class=\"text-gray-200\"\n name=\"{{ hasOnlyPerson ? 'matFace' : 'matHomeWorkOutline' }}\"\n style=\"width: 42px; height: 42px; font-size: 42px; margin: 10px\"\n ></ng-icon>\n }\n @if (hasLogo) {\n <gn-ui-thumbnail\n [thumbnailUrl]=\"record.ownerOrganization?.logoUrl?.toString()\"\n [fit]=\"'contain'\"\n ></gn-ui-thumbnail>\n }\n </div>\n <div class=\"flex flex-col overflow-hidden items-start grow\">\n @if (hasOrganization) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ record.ownerOrganization.name }}\n </span>\n }\n @if (hasOnlyPerson) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ contact.firstName }} {{ contact.lastName }}\n </span>\n }\n <p class=\"\">\n <span translate [translateParams]=\"{ time }\"\n >record.was.created.time</span\n >\n </p>\n </div>\n <div class=\"ml-3 shrink-0\">\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n <div class=\"pt-5 pb-5 px-10 relative\">\n <div class=\"flex flex-col sm:flex-row gap-4 mb-3\">\n @if (record.overviews?.[0]) {\n <gn-ui-thumbnail\n class=\"block shrink-0 w-[120px] h-[120px] border border-gray-100 rounded-lg overflow-hidden\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n }\n <h1\n class=\"font-title text-black text-[21px] font-medium\"\n data-cy=\"recordTitle\"\n >\n {{ record.title }}\n </h1>\n </div>\n <p class=\"line-clamp-3\">\n <gn-ui-markdown-parser\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n />\n </p>\n @if (isDownloadable || isViewable) {\n <div class=\"flex flex-row mt-3\">\n @if (isDownloadable) {\n <ng-icon\n class=\"text-primary opacity-45 mr-3\"\n name=\"matCloudDownloadOutline\"\n >\n </ng-icon>\n }\n @if (isViewable) {\n <ng-icon class=\"text-primary opacity-45 mr-3\" name=\"matMapOutline\">\n </ng-icon>\n }\n </div>\n }\n </div>\n </a>\n</div>\n", styles: [".record-container:hover .record-header,.record-container:hover .record-header-image{border-color:var(--color-primary-lightest)}\n"] }]
|
|
35342
35370
|
}], ctorParameters: () => [] });
|
|
35343
35371
|
|
|
35344
35372
|
class RecordPreviewListComponent extends RecordPreviewComponent {
|
|
@@ -38220,6 +38248,7 @@ marker('dataset.error.forbidden');
|
|
|
38220
38248
|
marker('wfs.unreachable.unknown');
|
|
38221
38249
|
marker('wfs.featuretype.notfound');
|
|
38222
38250
|
marker('wfs.geojsongml.notsupported');
|
|
38251
|
+
marker('ogc.geojson.notsupported');
|
|
38223
38252
|
marker('ogc.unreachable.unknown');
|
|
38224
38253
|
marker('dataset.error.network');
|
|
38225
38254
|
marker('dataset.error.http');
|
|
@@ -38333,13 +38362,15 @@ class DataService {
|
|
|
38333
38362
|
}
|
|
38334
38363
|
async getDownloadLinksFromOgcApiFeatures(ogcApiLink) {
|
|
38335
38364
|
const collectionInfo = await this.getDownloadUrlsFromOgcApi(ogcApiLink.url.href);
|
|
38336
|
-
return Object.keys(collectionInfo.bulkDownloadLinks).map((
|
|
38365
|
+
return Object.keys(collectionInfo.bulkDownloadLinks).map((mimeType) => {
|
|
38366
|
+
const urlWithoutLimit = new URL(collectionInfo.bulkDownloadLinks[mimeType]);
|
|
38367
|
+
urlWithoutLimit.searchParams.delete('limit');
|
|
38337
38368
|
return {
|
|
38338
38369
|
...ogcApiLink,
|
|
38339
38370
|
name: collectionInfo.id,
|
|
38340
38371
|
type: 'download',
|
|
38341
|
-
url:
|
|
38342
|
-
mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(
|
|
38372
|
+
url: urlWithoutLimit,
|
|
38373
|
+
mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(mimeType)),
|
|
38343
38374
|
};
|
|
38344
38375
|
});
|
|
38345
38376
|
}
|
|
@@ -38353,12 +38384,12 @@ class DataService {
|
|
|
38353
38384
|
throw new Error(`ogc.unreachable.unknown`);
|
|
38354
38385
|
});
|
|
38355
38386
|
}
|
|
38356
|
-
async getItemsFromOgcApi(url) {
|
|
38387
|
+
async getItemsFromOgcApi(url, limit) {
|
|
38357
38388
|
const endpoint = new OgcApiEndpoint(url);
|
|
38358
38389
|
return await endpoint.featureCollections
|
|
38359
38390
|
.then((collections) => {
|
|
38360
38391
|
return collections.length
|
|
38361
|
-
? endpoint.getCollectionItems(collections[0])
|
|
38392
|
+
? endpoint.getCollectionItems(collections[0], limit)
|
|
38362
38393
|
: null;
|
|
38363
38394
|
})
|
|
38364
38395
|
.catch(() => {
|
|
@@ -38447,12 +38478,16 @@ class DataService {
|
|
|
38447
38478
|
else if (link.type === 'service' &&
|
|
38448
38479
|
link.accessServiceProtocol === 'ogcFeatures') {
|
|
38449
38480
|
return from(this.getDownloadUrlsFromOgcApi(link.url.href)).pipe(switchMap$1((collectionInfo) => {
|
|
38450
|
-
const
|
|
38451
|
-
|
|
38452
|
-
|
|
38453
|
-
|
|
38454
|
-
|
|
38481
|
+
const isMimeTypeJson = (mimeType) => {
|
|
38482
|
+
return mimeType.toLowerCase().indexOf('json') > -1;
|
|
38483
|
+
};
|
|
38484
|
+
const geojsonUrl = collectionInfo.bulkDownloadLinks[Object.keys(collectionInfo.bulkDownloadLinks).find((mimeType) => isMimeTypeJson(mimeType))];
|
|
38485
|
+
if (!geojsonUrl) {
|
|
38486
|
+
return throwError(() => 'ogc.geojson.notsupported');
|
|
38455
38487
|
}
|
|
38488
|
+
const urlWithoutLimit = new URL(geojsonUrl);
|
|
38489
|
+
urlWithoutLimit.searchParams.delete('limit');
|
|
38490
|
+
return openDataset(urlWithoutLimit.toString(), 'geojson', undefined, cacheActive);
|
|
38456
38491
|
}));
|
|
38457
38492
|
}
|
|
38458
38493
|
return throwError(() => 'protocol not supported');
|
|
@@ -39129,7 +39164,7 @@ class ChartViewComponent {
|
|
|
39129
39164
|
this.changeDetector.detectChanges();
|
|
39130
39165
|
}
|
|
39131
39166
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ChartViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
39132
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ChartViewComponent, isStandalone: true, selector: "gn-ui-chart-view", inputs: { featureCatalog: "featureCatalog", cacheActive: "cacheActive", link: "link", aggregation: "aggregation", xProperty: "xProperty", yProperty: "yProperty", chartType: "chartType", userChartConfig: "userChartConfig" }, outputs: { chartConfig$: "chartConfig$" }, ngImport: i0, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n @if (yChoices$ | async; as yChoices) {\n
|
|
39167
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ChartViewComponent, isStandalone: true, selector: "gn-ui-chart-view", inputs: { featureCatalog: "featureCatalog", cacheActive: "cacheActive", link: "link", aggregation: "aggregation", xProperty: "xProperty", yProperty: "yProperty", chartType: "chartType", userChartConfig: "userChartConfig" }, outputs: { chartConfig$: "chartConfig$" }, ngImport: i0, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n @if (yChoices$ | async; as yChoices) {\n <gn-ui-dropdown-selector\n class=\"basis-1/4 select-y-prop\"\n [choices]=\"yChoices\"\n [disabled]=\"isCountAggregation\"\n (selectValue)=\"yProperty$.next($event)\"\n [selected]=\"yProperty$.value\"\n [title]=\"'chart.dropdown.yProperty' | translate\"\n ></gn-ui-dropdown-selector>\n }\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"aggregationChoices\"\n class=\"aggregation-choices\"\n (selectValue)=\"aggregation$.next($event)\"\n [selected]=\"aggregation$.value\"\n [title]=\"'chart.dropdown.aggregation' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n <div\n class=\"relative h-full mt-2 bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n @if (!error) {\n <gn-ui-chart\n [data]=\"chartData$ | async\"\n [type]=\"chartType$.value\"\n [prettyLabel]=\"prettyLabel$ | async\"\n [labelProperty]=\"labelProperty\"\n [valueProperty]=\"valueProperty\"\n ></gn-ui-chart>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'chart.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: ChartComponent, selector: "gn-ui-chart", inputs: ["data", "labelProperty", "prettyLabel", "valueProperty", "secondaryValueProperty", "type"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
39133
39168
|
}
|
|
39134
39169
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ChartViewComponent, decorators: [{
|
|
39135
39170
|
type: Component,
|
|
@@ -39140,7 +39175,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
39140
39175
|
LoadingMaskComponent,
|
|
39141
39176
|
PopupAlertComponent,
|
|
39142
39177
|
TranslatePipe,
|
|
39143
|
-
], standalone: true, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n @if (yChoices$ | async; as yChoices) {\n
|
|
39178
|
+
], standalone: true, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n @if (yChoices$ | async; as yChoices) {\n <gn-ui-dropdown-selector\n class=\"basis-1/4 select-y-prop\"\n [choices]=\"yChoices\"\n [disabled]=\"isCountAggregation\"\n (selectValue)=\"yProperty$.next($event)\"\n [selected]=\"yProperty$.value\"\n [title]=\"'chart.dropdown.yProperty' | translate\"\n ></gn-ui-dropdown-selector>\n }\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"aggregationChoices\"\n class=\"aggregation-choices\"\n (selectValue)=\"aggregation$.next($event)\"\n [selected]=\"aggregation$.value\"\n [title]=\"'chart.dropdown.aggregation' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n <div\n class=\"relative h-full mt-2 bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n @if (!error) {\n <gn-ui-chart\n [data]=\"chartData$ | async\"\n [type]=\"chartType$.value\"\n [prettyLabel]=\"prettyLabel$ | async\"\n [labelProperty]=\"labelProperty\"\n [valueProperty]=\"valueProperty\"\n ></gn-ui-chart>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'chart.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n</div>\n" }]
|
|
39144
39179
|
}], propDecorators: { featureCatalog: [{
|
|
39145
39180
|
type: Input
|
|
39146
39181
|
}], cacheActive: [{
|
|
@@ -39453,7 +39488,7 @@ class MdViewFacade {
|
|
|
39453
39488
|
if (this.linkClassifier.hasUsage(link, LinkUsage.GEODATA)) {
|
|
39454
39489
|
if (link.type === 'service' &&
|
|
39455
39490
|
link.accessServiceProtocol === 'ogcFeatures') {
|
|
39456
|
-
return from(this.dataService.getItemsFromOgcApi(link.url.href)).pipe(map$1((collectionRecords) => {
|
|
39491
|
+
return from(this.dataService.getItemsFromOgcApi(link.url.href, 1)).pipe(map$1((collectionRecords) => {
|
|
39457
39492
|
return collectionRecords &&
|
|
39458
39493
|
collectionRecords[0] &&
|
|
39459
39494
|
collectionRecords[0].geometry
|
|
@@ -39871,6 +39906,7 @@ class ExternalViewerButtonComponent {
|
|
|
39871
39906
|
this.translateService = inject(TranslateService);
|
|
39872
39907
|
this.urlTemplate = inject(EXTERNAL_VIEWER_URL_TEMPLATE, { optional: true });
|
|
39873
39908
|
this.openinNewTab = inject(EXTERNAL_VIEWER_OPEN_NEW_TAB);
|
|
39909
|
+
this.mimeType = '';
|
|
39874
39910
|
this.extraClass = '';
|
|
39875
39911
|
}
|
|
39876
39912
|
get externalViewer() {
|
|
@@ -39901,11 +39937,12 @@ class ExternalViewerButtonComponent {
|
|
|
39901
39937
|
const url = templateUrl
|
|
39902
39938
|
.replace('${layer_name}', `${layerName}`)
|
|
39903
39939
|
.replace('${service_url}', `${encodeURIComponent(this.link.url.toString())}`)
|
|
39904
|
-
.replace('${service_type}', `${this.supportedLinkLayerType}`)
|
|
39940
|
+
.replace('${service_type}', `${this.supportedLinkLayerType}`)
|
|
39941
|
+
.replace('${mime_type}', `${encodeURIComponent(this.mimeType)}`);
|
|
39905
39942
|
window.open(url, this.openinNewTab ? '_blank' : '_self').focus();
|
|
39906
39943
|
}
|
|
39907
39944
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ExternalViewerButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
39908
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ExternalViewerButtonComponent, isStandalone: true, selector: "gn-ui-external-viewer-button", inputs: { link: "link", extraClass: "extraClass" }, ngImport: i0, template: "@if (externalViewer) {\n <gn-ui-button\n (buttonClick)=\"openInExternalViewer()\"\n type=\"primary\"\n [title]=\"'record.externalViewer.open' | translate\"\n [extraClass]=\"extraClass + 'bg-primary ms-2 !rounded-lg'\"\n >\n <ng-icon name=\"matOpenInNew\"></ng-icon>\n </gn-ui-button>\n}\n", styles: [""], dependencies: [{ kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
|
|
39945
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ExternalViewerButtonComponent, isStandalone: true, selector: "gn-ui-external-viewer-button", inputs: { link: "link", mimeType: "mimeType", extraClass: "extraClass" }, ngImport: i0, template: "@if (externalViewer) {\n <gn-ui-button\n (buttonClick)=\"openInExternalViewer()\"\n type=\"primary\"\n [title]=\"'record.externalViewer.open' | translate\"\n [extraClass]=\"extraClass + 'bg-primary ms-2 !rounded-lg'\"\n >\n <ng-icon name=\"matOpenInNew\"></ng-icon>\n </gn-ui-button>\n}\n", styles: [""], dependencies: [{ kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
|
|
39909
39946
|
provideIcons({ matOpenInNew }),
|
|
39910
39947
|
provideNgIconsConfig({
|
|
39911
39948
|
size: '1.5em',
|
|
@@ -39922,6 +39959,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
39922
39959
|
], template: "@if (externalViewer) {\n <gn-ui-button\n (buttonClick)=\"openInExternalViewer()\"\n type=\"primary\"\n [title]=\"'record.externalViewer.open' | translate\"\n [extraClass]=\"extraClass + 'bg-primary ms-2 !rounded-lg'\"\n >\n <ng-icon name=\"matOpenInNew\"></ng-icon>\n </gn-ui-button>\n}\n" }]
|
|
39923
39960
|
}], propDecorators: { link: [{
|
|
39924
39961
|
type: Input
|
|
39962
|
+
}], mimeType: [{
|
|
39963
|
+
type: Input
|
|
39925
39964
|
}], extraClass: [{
|
|
39926
39965
|
type: Input
|
|
39927
39966
|
}] } });
|
|
@@ -40084,7 +40123,7 @@ class GpfApiDlComponent {
|
|
|
40084
40123
|
let choicesTest = undefined;
|
|
40085
40124
|
let pageCount = 1;
|
|
40086
40125
|
while (choicesTest === undefined && pageCount > page) {
|
|
40087
|
-
const response = await
|
|
40126
|
+
const response = await fetch(this.url.concat(`&limit=200&page=${page}`)).then((resp) => resp.json());
|
|
40088
40127
|
choicesTest = response.data.entry.filter((element) => element['id'] == this.apiBaseUrl)[0];
|
|
40089
40128
|
page += 1;
|
|
40090
40129
|
pageCount = response.data.pagecount;
|
|
@@ -40117,7 +40156,7 @@ class GpfApiDlComponent {
|
|
|
40117
40156
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
40118
40157
|
}
|
|
40119
40158
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: GpfApiDlComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
40120
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: GpfApiDlComponent, isStandalone: true, selector: "gn-ui-gpf-api-dl", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-6 p-8 bg-white shadow-xl rounded-lg\">\n <!-- Header with Filter Title and Reset Button -->\n <div class=\"flex items-center justify-between\">\n <h2\n class=\"text-xl font-semibold\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.filterDescription' | translate\n \"\n >\n record.metadata.api.form.filter\n </h2>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary
|
|
40159
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: GpfApiDlComponent, isStandalone: true, selector: "gn-ui-gpf-api-dl", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-6 p-8 bg-white shadow-xl rounded-lg\">\n <!-- Header with Filter Title and Reset Button -->\n <div class=\"flex items-center justify-between\">\n <h2\n class=\"text-xl font-semibold\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.filterDescription' | translate\n \"\n >\n record.metadata.api.form.filter\n </h2>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary/50 inline-flex items-center justify-center px-4 py-2 text-white rounded hover:bg-primary transition\"\n [attr.title]=\"'record.metadata.api.form.resetTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.resetTooltip' | translate\"\n >\n <span translate>record.metadata.api.form.reset</span>\n </button>\n </div>\n\n <!-- Dropdown Selectors -->\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <gn-ui-dropdown-selector\n #zone\n [title]=\"'record.metadata.api.form.zoneTitle' | translate\"\n [choices]=\"bucketPromisesZone\"\n (selectValue)=\"setZone($event)\"\n [selected]=\"zone$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.zoneTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.zoneTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n\n <gn-ui-dropdown-selector\n #format\n [title]=\"'record.metadata.api.form.formatTitle' | translate\"\n [choices]=\"bucketPromisesFormat\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.formatTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.formatTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n\n <gn-ui-dropdown-selector\n #crs\n [title]=\"'record.metadata.api.form.crsTitle' | translate\"\n [choices]=\"bucketPromisesCrs\"\n (selectValue)=\"setCrs($event)\"\n [selected]=\"crs$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.crsTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.crsTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n\n <!-- Filtered Items Section -->\n <div class=\"bg-gray-50 p-4 rounded-lg\">\n <h3\n class=\"text-lg font-medium\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.itemsDescription' | translate\n \"\n >\n record.metadata.api.form.items\n </h3>\n <div\n class=\"overflow-auto max-h-60\"\n [attr.title]=\"'record.metadata.api.form.itemsTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.itemsTooltip' | translate\"\n >\n @for (link of listFilteredProduct$ | async; track link) {\n <div class=\"mb-2 sm:mb-3\">\n <gn-ui-gpf-api-dl-list-item\n [link]=\"link\"\n color=\"rgb(124 45 18)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"true\"\n [attr.title]=\"'record.metadata.api.form.productTooltip' | translate\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.productTooltip' | translate\n \"\n ></gn-ui-gpf-api-dl-list-item>\n </div>\n }\n </div>\n </div>\n\n <!-- Pagination Section -->\n <div class=\"flex items-center justify-between\">\n <button\n (click)=\"lessResult()\"\n [class]=\"\n 'px-4 py-2 text-white rounded transition ' +\n ((page$ | async) <= 1\n ? 'bg-gray-400 cursor-not-allowed '\n : 'bg-primary/50 hover:bg-primary')\n \"\n [attr.title]=\"'record.metadata.api.form.previousPageTooltip' | translate\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.previousPageTooltip' | translate\n \"\n >\n <span translate>record.metadata.api.form.previousPage</span>\n </button>\n <div\n class=\"font-semibold place-content-center\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.paginationDescription' | translate\n \"\n >\n {{ page$ | async }}/{{ pageMax$ | async }}\n </div>\n <button\n (click)=\"moreResult()\"\n [class]=\"\n 'bg-primary/50 px-4 py-2 text-white rounded transition ' +\n ((page$ | async) >= (pageMax$ | async)\n ? 'bg-gray-400 cursor-not-allowed '\n : 'bg-primary/50 hover:bg-primary')\n \"\n [attr.title]=\"'record.metadata.api.form.nextPageTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.nextPageTooltip' | translate\"\n >\n <span translate>record.metadata.api.form.nextPage</span>\n </button>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button ng-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover ng-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: GpfApiDlListItemComponent, selector: "gn-ui-gpf-api-dl-list-item", inputs: ["link", "color", "format", "isFromWfs"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
40121
40160
|
}
|
|
40122
40161
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: GpfApiDlComponent, decorators: [{
|
|
40123
40162
|
type: Component,
|
|
@@ -40127,7 +40166,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
40127
40166
|
TranslatePipe,
|
|
40128
40167
|
DropdownSelectorComponent,
|
|
40129
40168
|
GpfApiDlListItemComponent,
|
|
40130
|
-
], template: "<div class=\"flex flex-col gap-6 p-8 bg-white shadow-xl rounded-lg\">\n <!-- Header with Filter Title and Reset Button -->\n <div class=\"flex items-center justify-between\">\n <h2\n class=\"text-xl font-semibold\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.filterDescription' | translate\n \"\n >\n record.metadata.api.form.filter\n </h2>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary
|
|
40169
|
+
], template: "<div class=\"flex flex-col gap-6 p-8 bg-white shadow-xl rounded-lg\">\n <!-- Header with Filter Title and Reset Button -->\n <div class=\"flex items-center justify-between\">\n <h2\n class=\"text-xl font-semibold\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.filterDescription' | translate\n \"\n >\n record.metadata.api.form.filter\n </h2>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary/50 inline-flex items-center justify-center px-4 py-2 text-white rounded hover:bg-primary transition\"\n [attr.title]=\"'record.metadata.api.form.resetTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.resetTooltip' | translate\"\n >\n <span translate>record.metadata.api.form.reset</span>\n </button>\n </div>\n\n <!-- Dropdown Selectors -->\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <gn-ui-dropdown-selector\n #zone\n [title]=\"'record.metadata.api.form.zoneTitle' | translate\"\n [choices]=\"bucketPromisesZone\"\n (selectValue)=\"setZone($event)\"\n [selected]=\"zone$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.zoneTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.zoneTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n\n <gn-ui-dropdown-selector\n #format\n [title]=\"'record.metadata.api.form.formatTitle' | translate\"\n [choices]=\"bucketPromisesFormat\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.formatTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.formatTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n\n <gn-ui-dropdown-selector\n #crs\n [title]=\"'record.metadata.api.form.crsTitle' | translate\"\n [choices]=\"bucketPromisesCrs\"\n (selectValue)=\"setCrs($event)\"\n [selected]=\"crs$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.crsTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.crsTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n\n <!-- Filtered Items Section -->\n <div class=\"bg-gray-50 p-4 rounded-lg\">\n <h3\n class=\"text-lg font-medium\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.itemsDescription' | translate\n \"\n >\n record.metadata.api.form.items\n </h3>\n <div\n class=\"overflow-auto max-h-60\"\n [attr.title]=\"'record.metadata.api.form.itemsTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.itemsTooltip' | translate\"\n >\n @for (link of listFilteredProduct$ | async; track link) {\n <div class=\"mb-2 sm:mb-3\">\n <gn-ui-gpf-api-dl-list-item\n [link]=\"link\"\n color=\"rgb(124 45 18)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"true\"\n [attr.title]=\"'record.metadata.api.form.productTooltip' | translate\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.productTooltip' | translate\n \"\n ></gn-ui-gpf-api-dl-list-item>\n </div>\n }\n </div>\n </div>\n\n <!-- Pagination Section -->\n <div class=\"flex items-center justify-between\">\n <button\n (click)=\"lessResult()\"\n [class]=\"\n 'px-4 py-2 text-white rounded transition ' +\n ((page$ | async) <= 1\n ? 'bg-gray-400 cursor-not-allowed '\n : 'bg-primary/50 hover:bg-primary')\n \"\n [attr.title]=\"'record.metadata.api.form.previousPageTooltip' | translate\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.previousPageTooltip' | translate\n \"\n >\n <span translate>record.metadata.api.form.previousPage</span>\n </button>\n <div\n class=\"font-semibold place-content-center\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.paginationDescription' | translate\n \"\n >\n {{ page$ | async }}/{{ pageMax$ | async }}\n </div>\n <button\n (click)=\"moreResult()\"\n [class]=\"\n 'bg-primary/50 px-4 py-2 text-white rounded transition ' +\n ((page$ | async) >= (pageMax$ | async)\n ? 'bg-gray-400 cursor-not-allowed '\n : 'bg-primary/50 hover:bg-primary')\n \"\n [attr.title]=\"'record.metadata.api.form.nextPageTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.nextPageTooltip' | translate\"\n >\n <span translate>record.metadata.api.form.nextPage</span>\n </button>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button ng-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover ng-icon{color:#d3d3d3!important}\n"] }]
|
|
40131
40170
|
}], propDecorators: { apiLink: [{
|
|
40132
40171
|
type: Input
|
|
40133
40172
|
}] } });
|
|
@@ -40136,6 +40175,7 @@ marker('map.dropdown.placeholder');
|
|
|
40136
40175
|
marker('wfs.feature.limit');
|
|
40137
40176
|
marker('dataset.error.restrictedAccess');
|
|
40138
40177
|
marker('map.select.style');
|
|
40178
|
+
marker('map.style.default');
|
|
40139
40179
|
class MapViewComponent {
|
|
40140
40180
|
constructor() {
|
|
40141
40181
|
this.mdViewFacade = inject(MdViewFacade);
|
|
@@ -40202,7 +40242,8 @@ class MapViewComponent {
|
|
|
40202
40242
|
return compatibleLinks[0];
|
|
40203
40243
|
}
|
|
40204
40244
|
}
|
|
40205
|
-
}));
|
|
40245
|
+
}), shareReplay$1(1));
|
|
40246
|
+
this.isWmsStyleMode$ = this.selectedSourceLink$.pipe(map$1((src) => src?.type === 'service' && src?.accessServiceProtocol === 'wms'), distinctUntilChanged(), shareReplay$1(1));
|
|
40206
40247
|
this.styleLinks$ = this.selectedSourceLink$.pipe(switchMap$1((src) => {
|
|
40207
40248
|
if (src &&
|
|
40208
40249
|
src.type === 'service' &&
|
|
@@ -40219,6 +40260,17 @@ class MapViewComponent {
|
|
|
40219
40260
|
return of(src);
|
|
40220
40261
|
}));
|
|
40221
40262
|
}
|
|
40263
|
+
if (src &&
|
|
40264
|
+
src.type === 'service' &&
|
|
40265
|
+
src.accessServiceProtocol === 'wms') {
|
|
40266
|
+
return from(new WmsEndpoint(src.url.toString()).isReady()).pipe(map$1((endpoint) => {
|
|
40267
|
+
const layer = endpoint.getLayerByName(src.name);
|
|
40268
|
+
return layer?.styles || [];
|
|
40269
|
+
}), catchError((error) => {
|
|
40270
|
+
this.handleError(error);
|
|
40271
|
+
return of([]);
|
|
40272
|
+
}));
|
|
40273
|
+
}
|
|
40222
40274
|
return of([]);
|
|
40223
40275
|
}), tap$1((styles) => {
|
|
40224
40276
|
if (this._styleFromConfig && this._styleFromConfig <= styles.length) {
|
|
@@ -40228,23 +40280,60 @@ class MapViewComponent {
|
|
|
40228
40280
|
this.selectedStyleId$.next(0);
|
|
40229
40281
|
}
|
|
40230
40282
|
}), shareReplay$1(1));
|
|
40231
|
-
this.styleDropdownChoices$ =
|
|
40283
|
+
this.styleDropdownChoices$ = combineLatest([
|
|
40284
|
+
this.styleLinks$,
|
|
40285
|
+
this.isWmsStyleMode$,
|
|
40286
|
+
]).pipe(map$1(([links, isWmsStyleMode]) => links.length
|
|
40232
40287
|
? links.map((link, index) => ({
|
|
40233
|
-
label:
|
|
40288
|
+
label: isWmsStyleMode
|
|
40289
|
+
? link.title || link.name
|
|
40290
|
+
: getLinkLabel(link),
|
|
40234
40291
|
value: index,
|
|
40235
40292
|
}))
|
|
40236
40293
|
: [
|
|
40237
40294
|
{
|
|
40238
|
-
label: '
|
|
40295
|
+
label: this.translateService.instant('map.style.default'),
|
|
40239
40296
|
value: 0,
|
|
40240
40297
|
},
|
|
40241
40298
|
]));
|
|
40299
|
+
this.selectedWmsStyleName$ = combineLatest([
|
|
40300
|
+
this.styleLinks$,
|
|
40301
|
+
this.isWmsStyleMode$,
|
|
40302
|
+
this.selectedStyleId$.pipe(distinctUntilChanged()),
|
|
40303
|
+
]).pipe(map$1(([styles, isWmsStyleMode, styleIdx]) => isWmsStyleMode && Array.isArray(styles)
|
|
40304
|
+
? styles[styleIdx]?.name
|
|
40305
|
+
: undefined));
|
|
40242
40306
|
this.selectedLink$ = combineLatest([
|
|
40243
40307
|
this.selectedSourceLink$,
|
|
40244
40308
|
this.styleLinks$,
|
|
40245
40309
|
this.selectedStyleId$.pipe(distinctUntilChanged()),
|
|
40246
|
-
|
|
40247
|
-
|
|
40310
|
+
this.isWmsStyleMode$,
|
|
40311
|
+
]).pipe(map$1(([src, styles, styleIdx, isWmsStyleMode]) => !isWmsStyleMode && styles.length ? styles[styleIdx] : src), shareReplay$1(1));
|
|
40312
|
+
this.wmsMimeType$ = this.selectedSourceLink$.pipe(switchMap$1((link) => {
|
|
40313
|
+
if (link?.type === 'service' && link?.accessServiceProtocol === 'wms') {
|
|
40314
|
+
return from(new WmsEndpoint(link.url.toString())
|
|
40315
|
+
.isReady()
|
|
40316
|
+
.then((endpoint) => {
|
|
40317
|
+
return endpoint.describeLayer(link.name).then((description) => {
|
|
40318
|
+
if (description) {
|
|
40319
|
+
return description.owsType === 'wfs'
|
|
40320
|
+
? 'image/png'
|
|
40321
|
+
: 'image/jpeg';
|
|
40322
|
+
}
|
|
40323
|
+
const layer = endpoint.getLayerByName(link.name);
|
|
40324
|
+
return layer?.opaque ? 'image/jpeg' : 'image/png';
|
|
40325
|
+
});
|
|
40326
|
+
})
|
|
40327
|
+
.catch(() => 'image/png'));
|
|
40328
|
+
}
|
|
40329
|
+
return of('');
|
|
40330
|
+
}), shareReplay$1(1));
|
|
40331
|
+
this.currentLayers$ = combineLatest([
|
|
40332
|
+
this.selectedLink$,
|
|
40333
|
+
this.excludeWfs$,
|
|
40334
|
+
this.selectedWmsStyleName$,
|
|
40335
|
+
this.wmsMimeType$,
|
|
40336
|
+
]).pipe(switchMap$1(([link, excludeWfs, wmsStyleName, wmsMimeType]) => {
|
|
40248
40337
|
if (!link) {
|
|
40249
40338
|
return of([]);
|
|
40250
40339
|
}
|
|
@@ -40258,7 +40347,13 @@ class MapViewComponent {
|
|
|
40258
40347
|
this.handleError('dataset.error.restrictedAccess');
|
|
40259
40348
|
return of([]);
|
|
40260
40349
|
}
|
|
40261
|
-
return this.getLayerFromLink(link).pipe(map$1((layer) =>
|
|
40350
|
+
return this.getLayerFromLink(link).pipe(map$1((layer) => layer.type === 'wms'
|
|
40351
|
+
? {
|
|
40352
|
+
...layer,
|
|
40353
|
+
...(wmsStyleName && { style: wmsStyleName }),
|
|
40354
|
+
...(wmsMimeType && { format: wmsMimeType }),
|
|
40355
|
+
}
|
|
40356
|
+
: layer), map$1((layer) => [layer]), catchError((e) => {
|
|
40262
40357
|
this.handleError(e);
|
|
40263
40358
|
return of([]);
|
|
40264
40359
|
}), finalize(() => (this.loading = false)));
|
|
@@ -40412,7 +40507,7 @@ class MapViewComponent {
|
|
|
40412
40507
|
this.changeRef.detectChanges();
|
|
40413
40508
|
}
|
|
40414
40509
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MapViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
40415
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: MapViewComponent, isStandalone: true, selector: "gn-ui-map-view", inputs: { exceedsLimit: "exceedsLimit", selectedView: "selectedView", datavizConfig: "datavizConfig", displaySource: "displaySource" }, outputs: { linkSelected: "linkSelected", styleSelected: "styleSelected" }, viewQueries: [{ propertyName: "mapContainer", first: true, predicate: ["mapContainer"], descendants: true }], ngImport: i0, template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n
|
|
40510
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: MapViewComponent, isStandalone: true, selector: "gn-ui-map-view", inputs: { exceedsLimit: "exceedsLimit", selectedView: "selectedView", datavizConfig: "datavizConfig", displaySource: "displaySource" }, outputs: { linkSelected: "linkSelected", styleSelected: "styleSelected" }, viewQueries: [{ propertyName: "mapContainer", first: true, predicate: ["mapContainer"], descendants: true }], ngImport: i0, template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.style' | translate\"\n [choices]=\"styleDropdownChoices$ | async\"\n [selected]=\"selectedStyleId$ | async\"\n [disabled]=\"(styleDropdownChoices$ | async)?.length <= 1\"\n (selectValue)=\"selectStyleToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n\n <div class=\"self-end md:ml-2\">\n <gn-ui-external-viewer-button\n extraClass=\"w-[44px] h-[44px]\"\n [link]=\"selectedLink$ | async\"\n [mimeType]=\"wmsMimeType$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n </div>\n @if (hidePreview) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n } @else {\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n (sourceLoadError)=\"onSourceLoadError($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail\n [featureCatalog]=\"mdViewFacade.featureCatalog$ | async\"\n [feature]=\"selection\"\n ></gn-ui-feature-detail>\n </div>\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\" translate>map.legend.title</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n @if (!showLegend && legendExists && !selection) {\n <gn-ui-button\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n translate\n >\n {{ 'map.legend.title' | translate }}\n </gn-ui-button>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick", "extentChange", "sourceLoadError", "resolvedExtentChange"] }, { kind: "component", type: FeatureDetailComponent, selector: "gn-ui-feature-detail", inputs: ["feature", "featureCatalog"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ExternalViewerButtonComponent, selector: "gn-ui-external-viewer-button", inputs: ["link", "mimeType", "extraClass"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: MapLegendComponent, selector: "gn-ui-map-legend", inputs: ["context"], outputs: ["legendStatusChange"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
|
|
40416
40511
|
provideIcons({ matClose }),
|
|
40417
40512
|
provideNgIconsConfig({
|
|
40418
40513
|
size: '1.5em',
|
|
@@ -40439,7 +40534,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
40439
40534
|
provideNgIconsConfig({
|
|
40440
40535
|
size: '1.5em',
|
|
40441
40536
|
}),
|
|
40442
|
-
], template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n
|
|
40537
|
+
], template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.style' | translate\"\n [choices]=\"styleDropdownChoices$ | async\"\n [selected]=\"selectedStyleId$ | async\"\n [disabled]=\"(styleDropdownChoices$ | async)?.length <= 1\"\n (selectValue)=\"selectStyleToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n\n <div class=\"self-end md:ml-2\">\n <gn-ui-external-viewer-button\n extraClass=\"w-[44px] h-[44px]\"\n [link]=\"selectedLink$ | async\"\n [mimeType]=\"wmsMimeType$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n </div>\n @if (hidePreview) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n } @else {\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n (sourceLoadError)=\"onSourceLoadError($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail\n [featureCatalog]=\"mdViewFacade.featureCatalog$ | async\"\n [feature]=\"selection\"\n ></gn-ui-feature-detail>\n </div>\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\" translate>map.legend.title</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n @if (!showLegend && legendExists && !selection) {\n <gn-ui-button\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n translate\n >\n {{ 'map.legend.title' | translate }}\n </gn-ui-button>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n }\n</div>\n" }]
|
|
40443
40538
|
}], propDecorators: { exceedsLimit: [{
|
|
40444
40539
|
type: Input
|
|
40445
40540
|
}], selectedView: [{
|
|
@@ -41094,6 +41189,7 @@ const saveRecordSuccess = createAction('[Editor] Save record success');
|
|
|
41094
41189
|
const saveRecordFailure = createAction('[Editor] Save record failure', props());
|
|
41095
41190
|
const draftSaveSuccess = createAction('[Editor] Draft save success');
|
|
41096
41191
|
const undoRecordDraft = createAction('[Editor] Undo record draft');
|
|
41192
|
+
const setEditorConfiguration = createAction('[Editor] Set editor configuration', props());
|
|
41097
41193
|
const setCurrentPage = createAction('[Editor] Set current page', props());
|
|
41098
41194
|
const setFieldVisibility = createAction('[Editor] Set field visibility', props());
|
|
41099
41195
|
const hasRecordChangedSinceDraft = createAction('[Editor] Has Record Changed Since Draft', props());
|
|
@@ -41516,6 +41612,9 @@ const reducer = createReducer(initialEditorState, on(openRecord, (state, { recor
|
|
|
41516
41612
|
})), on(markRecordAsChanged, (state) => ({
|
|
41517
41613
|
...state,
|
|
41518
41614
|
changedSinceSave: true,
|
|
41615
|
+
})), on(setEditorConfiguration, (state, { configuration }) => ({
|
|
41616
|
+
...state,
|
|
41617
|
+
editorConfig: configuration,
|
|
41519
41618
|
})), on(setCurrentPage, (state, { page }) => ({
|
|
41520
41619
|
...state,
|
|
41521
41620
|
currentPage: page,
|
|
@@ -41618,6 +41717,9 @@ class EditorFacade {
|
|
|
41618
41717
|
updateRecordLanguages(defaultLanguage, otherLanguages) {
|
|
41619
41718
|
this.store.dispatch(updateRecordLanguages({ defaultLanguage, otherLanguages }));
|
|
41620
41719
|
}
|
|
41720
|
+
setConfiguration(configuration) {
|
|
41721
|
+
this.store.dispatch(setEditorConfiguration({ configuration }));
|
|
41722
|
+
}
|
|
41621
41723
|
setCurrentPage(page) {
|
|
41622
41724
|
this.store.dispatch(setCurrentPage({ page }));
|
|
41623
41725
|
}
|
|
@@ -41640,149 +41742,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
41640
41742
|
type: Injectable
|
|
41641
41743
|
}] });
|
|
41642
41744
|
|
|
41643
|
-
function evaluate(expression) {
|
|
41644
|
-
if (expression.match(/^\${.*}$/)) {
|
|
41645
|
-
return evaluate(expression.slice(2, -1));
|
|
41646
|
-
}
|
|
41647
|
-
const operator = expression.split('(')[0];
|
|
41648
|
-
switch (operator) {
|
|
41649
|
-
case 'dateNow':
|
|
41650
|
-
return () => new Date();
|
|
41651
|
-
default:
|
|
41652
|
-
throw new Error(`Unknown operator: ${operator}`);
|
|
41653
|
-
}
|
|
41654
|
-
}
|
|
41655
|
-
|
|
41656
|
-
class EditorService {
|
|
41657
|
-
constructor() {
|
|
41658
|
-
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
41659
|
-
}
|
|
41660
|
-
// returns the record as it was when saved, alongside its source
|
|
41661
|
-
saveRecord(record, recordSource, fieldsConfig) {
|
|
41662
|
-
const savedRecord = { ...record };
|
|
41663
|
-
const fields = fieldsConfig.pages.flatMap((page) => page.sections.flatMap((section) => section.fields));
|
|
41664
|
-
// run onSave processes
|
|
41665
|
-
for (const field of fields) {
|
|
41666
|
-
if (field.onSaveProcess && field.model) {
|
|
41667
|
-
const evaluator = evaluate(field.onSaveProcess);
|
|
41668
|
-
savedRecord[field.model] = evaluator({
|
|
41669
|
-
model: field.model,
|
|
41670
|
-
value: record[field.model],
|
|
41671
|
-
});
|
|
41672
|
-
}
|
|
41673
|
-
}
|
|
41674
|
-
let publishToAll = true;
|
|
41675
|
-
// if the record is new, generate a new unique identifier and pass publishToAll as false
|
|
41676
|
-
if (!record.uniqueIdentifier) {
|
|
41677
|
-
savedRecord.uniqueIdentifier = null;
|
|
41678
|
-
publishToAll = false;
|
|
41679
|
-
}
|
|
41680
|
-
return this.recordsRepository
|
|
41681
|
-
.saveRecord(savedRecord, recordSource, publishToAll)
|
|
41682
|
-
.pipe(switchMap((uniqueIdentifier) => this.recordsRepository.openRecordForEdition(uniqueIdentifier)), tap$1(() => {
|
|
41683
|
-
// if saving was successful, the original draft can be discarded
|
|
41684
|
-
this.recordsRepository.clearRecordDraft(record.uniqueIdentifier);
|
|
41685
|
-
}), map$1(([record, recordSource]) => [record, recordSource]));
|
|
41686
|
-
}
|
|
41687
|
-
// emits and completes once saving is done
|
|
41688
|
-
// note: onSave processes are not run for drafts
|
|
41689
|
-
saveRecordAsDraft(record, recordSource) {
|
|
41690
|
-
record.recordUpdated = new Date();
|
|
41691
|
-
return this.recordsRepository
|
|
41692
|
-
.saveRecordAsDraft(record, recordSource)
|
|
41693
|
-
.pipe(map$1(() => undefined));
|
|
41694
|
-
}
|
|
41695
|
-
undoRecordDraft(record) {
|
|
41696
|
-
this.recordsRepository.clearRecordDraft(record.uniqueIdentifier);
|
|
41697
|
-
return this.recordsRepository.openRecordForEdition(record.uniqueIdentifier);
|
|
41698
|
-
}
|
|
41699
|
-
hasRecordChangedSinceDraft(localRecord) {
|
|
41700
|
-
return this.recordsRepository.hasRecordChangedSinceDraft(localRecord);
|
|
41701
|
-
}
|
|
41702
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
41703
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, providedIn: 'root' }); }
|
|
41704
|
-
}
|
|
41705
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, decorators: [{
|
|
41706
|
-
type: Injectable,
|
|
41707
|
-
args: [{
|
|
41708
|
-
providedIn: 'root',
|
|
41709
|
-
}]
|
|
41710
|
-
}] });
|
|
41711
|
-
|
|
41712
|
-
class EditorEffects {
|
|
41713
|
-
constructor() {
|
|
41714
|
-
this.actions$ = inject(Actions);
|
|
41715
|
-
this.editorService = inject(EditorService);
|
|
41716
|
-
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
41717
|
-
this.plateformService = inject(PlatformServiceInterface);
|
|
41718
|
-
this.store = inject(Store);
|
|
41719
|
-
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]) => {
|
|
41720
|
-
const actions = [saveRecordSuccess()];
|
|
41721
|
-
if (!record?.uniqueIdentifier) {
|
|
41722
|
-
actions.push(openRecord({
|
|
41723
|
-
record: savedRecord,
|
|
41724
|
-
recordSource: savedRecordSource,
|
|
41725
|
-
}));
|
|
41726
|
-
}
|
|
41727
|
-
return of(...actions);
|
|
41728
|
-
}), catchError((error) => of(saveRecordFailure({
|
|
41729
|
-
error,
|
|
41730
|
-
})))))));
|
|
41731
|
-
this.cleanRecordAttachments$ = createEffect(() => this.actions$.pipe(ofType(saveRecordSuccess), withLatestFrom$1(this.store.select(selectRecord)), switchMap$1(([_, record]) => {
|
|
41732
|
-
if (record.uniqueIdentifier !== null) {
|
|
41733
|
-
this.plateformService.cleanRecordAttachments(record).subscribe({
|
|
41734
|
-
next: (_) => undefined,
|
|
41735
|
-
error: (err) => {
|
|
41736
|
-
console.error(err);
|
|
41737
|
-
},
|
|
41738
|
-
});
|
|
41739
|
-
}
|
|
41740
|
-
return EMPTY;
|
|
41741
|
-
}), catchError((error) => {
|
|
41742
|
-
console.error(error);
|
|
41743
|
-
return EMPTY;
|
|
41744
|
-
})), { dispatch: false });
|
|
41745
|
-
this.markAsChanged$ = createEffect(() => this.actions$.pipe(ofType(updateRecordField, updateRecordLanguages), map$1(() => markRecordAsChanged())));
|
|
41746
|
-
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())));
|
|
41747
|
-
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({
|
|
41748
|
-
record,
|
|
41749
|
-
recordSource,
|
|
41750
|
-
}))));
|
|
41751
|
-
this.checkHasChangesOnOpen$ = createEffect(() => this.actions$.pipe(ofType(openRecord), map$1(({ record }) => this.recordsRepository.recordHasDraft(record.uniqueIdentifier)), filter((hasDraft) => hasDraft), map$1(() => markRecordAsChanged())));
|
|
41752
|
-
this.hasRecordChangedSinceDraft$ = createEffect(() => this.actions$.pipe(ofType(hasRecordChangedSinceDraft), switchMap$1(({ record }) => this.editorService
|
|
41753
|
-
.hasRecordChangedSinceDraft(record)
|
|
41754
|
-
.pipe(map$1((changes) => hasRecordChangedSinceDraftSuccess({ changes }))))));
|
|
41755
|
-
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({
|
|
41756
|
-
isPublished: isPublished$1,
|
|
41757
|
-
}))));
|
|
41758
|
-
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({
|
|
41759
|
-
canEditRecord: canEditRecord$1,
|
|
41760
|
-
}))));
|
|
41761
|
-
}
|
|
41762
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
41763
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects }); }
|
|
41764
|
-
}
|
|
41765
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects, decorators: [{
|
|
41766
|
-
type: Injectable
|
|
41767
|
-
}] });
|
|
41768
|
-
|
|
41769
|
-
class FeatureEditorModule {
|
|
41770
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
41771
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, imports: [i1.StoreFeatureModule, i2$2.EffectsFeatureModule] }); }
|
|
41772
|
-
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),
|
|
41773
|
-
EffectsModule.forFeature([EditorEffects])] }); }
|
|
41774
|
-
}
|
|
41775
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, decorators: [{
|
|
41776
|
-
type: NgModule,
|
|
41777
|
-
args: [{
|
|
41778
|
-
imports: [
|
|
41779
|
-
StoreModule.forFeature(EDITOR_FEATURE_KEY, editorReducer),
|
|
41780
|
-
EffectsModule.forFeature([EditorEffects]),
|
|
41781
|
-
],
|
|
41782
|
-
providers: [EditorFacade, provideHttpClient()],
|
|
41783
|
-
}]
|
|
41784
|
-
}] });
|
|
41785
|
-
|
|
41786
41745
|
class ImportRecordComponent {
|
|
41787
41746
|
constructor() {
|
|
41788
41747
|
this.router = inject(Router);
|
|
@@ -41878,6 +41837,328 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
41878
41837
|
type: Output
|
|
41879
41838
|
}] } });
|
|
41880
41839
|
|
|
41840
|
+
//forced translations that are not available in fields.config.ts
|
|
41841
|
+
marker('editor.record.form.field.keywords');
|
|
41842
|
+
marker('editor.record.form.field.topics');
|
|
41843
|
+
marker('editor.record.form.field.contacts');
|
|
41844
|
+
marker('editor.record.form.field.organisation');
|
|
41845
|
+
class MetadataQualityPanelComponent {
|
|
41846
|
+
constructor() {
|
|
41847
|
+
this.propsToValidate = getAllKeysValidator();
|
|
41848
|
+
this.propertiesByPage = [];
|
|
41849
|
+
}
|
|
41850
|
+
ngOnChanges() {
|
|
41851
|
+
if (this.editorConfig && this.record) {
|
|
41852
|
+
const fieldsByPage = this.editorConfig.pages.map((page) => page.sections.flatMap((section) => section.fields
|
|
41853
|
+
.filter((field) => this.propsToValidate.includes(field.model))
|
|
41854
|
+
.map((field) => field.model)));
|
|
41855
|
+
// FIXME: temporarily add topics and organisation to the first and third page
|
|
41856
|
+
// as long as they are not handled by the editor
|
|
41857
|
+
if (fieldsByPage.length > 0) {
|
|
41858
|
+
fieldsByPage[0].includes('topics') || fieldsByPage[0].push('topics');
|
|
41859
|
+
fieldsByPage[2].includes('organisation') ||
|
|
41860
|
+
fieldsByPage[2].push('organisation');
|
|
41861
|
+
}
|
|
41862
|
+
this.propertiesByPage = fieldsByPage
|
|
41863
|
+
.map((fields) => getQualityValidators(this.record, fields).map(({ name, validator }) => ({
|
|
41864
|
+
label: `editor.record.form.field.${name}`, // use same translations as in fields.config.ts
|
|
41865
|
+
value: validator(),
|
|
41866
|
+
})))
|
|
41867
|
+
.filter((arr) => arr.length > 0);
|
|
41868
|
+
}
|
|
41869
|
+
}
|
|
41870
|
+
getExtraClass(checked) {
|
|
41871
|
+
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';
|
|
41872
|
+
return checked
|
|
41873
|
+
? `${baseClasses} bg-neutral-100 hover:bg-neutral-100`
|
|
41874
|
+
: `${baseClasses} bg-transparent hover:bg-transparent`;
|
|
41875
|
+
}
|
|
41876
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MetadataQualityPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
41877
|
+
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: [
|
|
41878
|
+
provideIcons({
|
|
41879
|
+
iconoirSystemShut,
|
|
41880
|
+
iconoirBadgeCheck,
|
|
41881
|
+
}),
|
|
41882
|
+
provideNgIconsConfig({
|
|
41883
|
+
size: '1.25em',
|
|
41884
|
+
}),
|
|
41885
|
+
], 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" }] }); }
|
|
41886
|
+
}
|
|
41887
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MetadataQualityPanelComponent, decorators: [{
|
|
41888
|
+
type: Component,
|
|
41889
|
+
args: [{ selector: 'gn-ui-metadata-quality-panel', standalone: true, imports: [
|
|
41890
|
+
TranslateDirective,
|
|
41891
|
+
TranslatePipe,
|
|
41892
|
+
ButtonComponent,
|
|
41893
|
+
NgIconComponent,
|
|
41894
|
+
], providers: [
|
|
41895
|
+
provideIcons({
|
|
41896
|
+
iconoirSystemShut,
|
|
41897
|
+
iconoirBadgeCheck,
|
|
41898
|
+
}),
|
|
41899
|
+
provideNgIconsConfig({
|
|
41900
|
+
size: '1.25em',
|
|
41901
|
+
}),
|
|
41902
|
+
], 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" }]
|
|
41903
|
+
}], propDecorators: { editorConfig: [{
|
|
41904
|
+
type: Input
|
|
41905
|
+
}], record: [{
|
|
41906
|
+
type: Input
|
|
41907
|
+
}] } });
|
|
41908
|
+
|
|
41909
|
+
const extraFlagMap = {
|
|
41910
|
+
ar: 'arab',
|
|
41911
|
+
en: 'gb',
|
|
41912
|
+
ko: 'kr',
|
|
41913
|
+
cs: 'cz',
|
|
41914
|
+
zh: 'cn',
|
|
41915
|
+
ca: 'es-ct',
|
|
41916
|
+
rm: 'ch',
|
|
41917
|
+
da: 'dk',
|
|
41918
|
+
sv: 'se',
|
|
41919
|
+
cy: 'gb-wls',
|
|
41920
|
+
hy: 'am',
|
|
41921
|
+
ka: 'ge',
|
|
41922
|
+
uk: 'ua',
|
|
41923
|
+
};
|
|
41924
|
+
class MultilingualPanelComponent {
|
|
41925
|
+
constructor() {
|
|
41926
|
+
this.facade = inject(EditorFacade);
|
|
41927
|
+
this.dialog = inject(MatDialog);
|
|
41928
|
+
this.translateService = inject(TranslateService);
|
|
41929
|
+
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
41930
|
+
this.overlay = inject(Overlay);
|
|
41931
|
+
this.viewContainerRef = inject(ViewContainerRef);
|
|
41932
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
41933
|
+
this.selectedLanguages = [];
|
|
41934
|
+
this.recordLanguages = [];
|
|
41935
|
+
this.formLanguage = '';
|
|
41936
|
+
this.isActionMenuOpen = false;
|
|
41937
|
+
this.subscription = new Subscription();
|
|
41938
|
+
this.supportedLanguages$ = this.recordsRepository
|
|
41939
|
+
.getApplicationLanguages()
|
|
41940
|
+
.pipe(map$2((languages) => this.sortLanguages(languages)));
|
|
41941
|
+
}
|
|
41942
|
+
set record(value) {
|
|
41943
|
+
this._record = value;
|
|
41944
|
+
this.isMultilingual = value.otherLanguages.length > 0;
|
|
41945
|
+
this.editTranslations = false;
|
|
41946
|
+
this.recordLanguages = [...value.otherLanguages, value.defaultLanguage];
|
|
41947
|
+
this.selectedLanguages = this.recordLanguages;
|
|
41948
|
+
this.formLanguage = value.defaultLanguage;
|
|
41949
|
+
}
|
|
41950
|
+
ngOnDestroy() {
|
|
41951
|
+
this.subscription.unsubscribe();
|
|
41952
|
+
}
|
|
41953
|
+
sortLanguages(languages) {
|
|
41954
|
+
return languages
|
|
41955
|
+
.map((lang) => {
|
|
41956
|
+
const label = this.translateService.instant('language.' + lang);
|
|
41957
|
+
const isTranslated = label !== 'language.' + lang;
|
|
41958
|
+
return {
|
|
41959
|
+
lang,
|
|
41960
|
+
label,
|
|
41961
|
+
isTranslated,
|
|
41962
|
+
};
|
|
41963
|
+
})
|
|
41964
|
+
.sort((a, b) => {
|
|
41965
|
+
if (a.isTranslated && !b.isTranslated)
|
|
41966
|
+
return -1;
|
|
41967
|
+
if (!a.isTranslated && b.isTranslated)
|
|
41968
|
+
return 1;
|
|
41969
|
+
return a.label.localeCompare(b.label);
|
|
41970
|
+
})
|
|
41971
|
+
.map((item) => item.lang);
|
|
41972
|
+
}
|
|
41973
|
+
toggleLanguageSelection() {
|
|
41974
|
+
this.editTranslations = !this.editTranslations;
|
|
41975
|
+
}
|
|
41976
|
+
getIconClass(lang) {
|
|
41977
|
+
return extraFlagMap[lang]
|
|
41978
|
+
? `fi fi-${extraFlagMap[lang]} w-4 h-3`
|
|
41979
|
+
: `fi fi-${lang} w-4 h-3`;
|
|
41980
|
+
}
|
|
41981
|
+
switchMultilingual() {
|
|
41982
|
+
if (this.isMultilingual && this.selectedLanguages.length > 1) {
|
|
41983
|
+
this.confirmDeleteAction();
|
|
41984
|
+
}
|
|
41985
|
+
else {
|
|
41986
|
+
this.isMultilingual = true;
|
|
41987
|
+
this.editTranslations = true;
|
|
41988
|
+
}
|
|
41989
|
+
}
|
|
41990
|
+
getExtraClass(lang) {
|
|
41991
|
+
const baseClass = 'h-[34px] w-full font-bold justify-start hover:bg-white';
|
|
41992
|
+
if (this.selectedLanguages.includes(lang)) {
|
|
41993
|
+
return `${baseClass} bg-white border border-black`;
|
|
41994
|
+
}
|
|
41995
|
+
return baseClass;
|
|
41996
|
+
}
|
|
41997
|
+
toggleLanguage(lang) {
|
|
41998
|
+
if (this.selectedLanguages.includes(lang)) {
|
|
41999
|
+
this.removeSelectedLanguage(lang);
|
|
42000
|
+
}
|
|
42001
|
+
else {
|
|
42002
|
+
this.selectedLanguages.push(lang);
|
|
42003
|
+
}
|
|
42004
|
+
}
|
|
42005
|
+
removeSelectedLanguage(lang) {
|
|
42006
|
+
this.selectedLanguages = this.selectedLanguages.filter((language) => language !== lang);
|
|
42007
|
+
}
|
|
42008
|
+
validateTranslations() {
|
|
42009
|
+
const equalLength = this.selectedLanguages.length === this.recordLanguages.length;
|
|
42010
|
+
if (this.selectedLanguages.length < this.recordLanguages.length ||
|
|
42011
|
+
(equalLength && this.selectedLanguages !== this.recordLanguages)) {
|
|
42012
|
+
this.confirmDeleteAction(this.selectedLanguages);
|
|
42013
|
+
}
|
|
42014
|
+
else {
|
|
42015
|
+
this.updateTranslations();
|
|
42016
|
+
}
|
|
42017
|
+
}
|
|
42018
|
+
updateTranslations() {
|
|
42019
|
+
const newLanguageSelection = this.selectedLanguages.filter((lang) => lang !== this.formLanguage);
|
|
42020
|
+
this.facade.updateRecordLanguages(this.formLanguage, newLanguageSelection);
|
|
42021
|
+
this.recordLanguages = newLanguageSelection;
|
|
42022
|
+
this.editTranslations = false;
|
|
42023
|
+
}
|
|
42024
|
+
switchFormLang(lang) {
|
|
42025
|
+
// TO IMPLEMENT FURTHER
|
|
42026
|
+
}
|
|
42027
|
+
switchDefaultLang(lang) {
|
|
42028
|
+
this.formLanguage = lang;
|
|
42029
|
+
this.facade.updateRecordLanguages(lang, this.selectedLanguages.filter((lang) => lang !== this.formLanguage));
|
|
42030
|
+
this.closeActionMenu();
|
|
42031
|
+
}
|
|
42032
|
+
confirmDeleteAction(lang) {
|
|
42033
|
+
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
42034
|
+
data: {
|
|
42035
|
+
title: this.translateService.instant('editor.record.multilingual.confirmation.title'),
|
|
42036
|
+
message: this.translateService.instant('editor.record.multilingual.confirmation.message'),
|
|
42037
|
+
confirmText: this.translateService.instant('editor.record.multilingual.confirmation.confirmText'),
|
|
42038
|
+
cancelText: this.translateService.instant('editor.record.multilingual.confirmation.cancelText'),
|
|
42039
|
+
focusCancel: true,
|
|
42040
|
+
},
|
|
42041
|
+
restoreFocus: true,
|
|
42042
|
+
});
|
|
42043
|
+
this.subscription.add(dialogRef.afterClosed().subscribe((confirmed) => {
|
|
42044
|
+
if (confirmed) {
|
|
42045
|
+
if (lang) {
|
|
42046
|
+
if (!Array.isArray(lang)) {
|
|
42047
|
+
this.removeSelectedLanguage(lang);
|
|
42048
|
+
this.closeActionMenu();
|
|
42049
|
+
}
|
|
42050
|
+
this.updateTranslations();
|
|
42051
|
+
}
|
|
42052
|
+
else {
|
|
42053
|
+
this.facade.updateRecordLanguages(this.formLanguage, []);
|
|
42054
|
+
this.isMultilingual = false;
|
|
42055
|
+
this.selectedLanguages = [];
|
|
42056
|
+
}
|
|
42057
|
+
}
|
|
42058
|
+
else {
|
|
42059
|
+
this.isMultilingual = true;
|
|
42060
|
+
this.selectedLanguages = this.recordLanguages;
|
|
42061
|
+
}
|
|
42062
|
+
this.editTranslations = false;
|
|
42063
|
+
}));
|
|
42064
|
+
}
|
|
42065
|
+
isFirstUnsupported(index) {
|
|
42066
|
+
const langs = this.sortLanguages(this.recordLanguages);
|
|
42067
|
+
return (langs[index].length === 3 &&
|
|
42068
|
+
langs.slice(0, index).every((lang) => lang.length !== 3));
|
|
42069
|
+
}
|
|
42070
|
+
isLangSupported(lang) {
|
|
42071
|
+
return lang.length === 2;
|
|
42072
|
+
}
|
|
42073
|
+
getToggleTitle(lang) {
|
|
42074
|
+
if (lang === this._record.defaultLanguage) {
|
|
42075
|
+
return this.translateService.instant('editor.record.form.multilingual.forbidden');
|
|
42076
|
+
}
|
|
42077
|
+
return '';
|
|
42078
|
+
}
|
|
42079
|
+
openActionMenu(item, template) {
|
|
42080
|
+
this.isActionMenuOpen = true;
|
|
42081
|
+
const index = this.sortLanguages(this.selectedLanguages).indexOf(item);
|
|
42082
|
+
const buttonElement = this.actionMenuButtons.toArray()[index];
|
|
42083
|
+
const positionStrategy = this.overlay
|
|
42084
|
+
.position()
|
|
42085
|
+
.flexibleConnectedTo(buttonElement)
|
|
42086
|
+
.withFlexibleDimensions(true)
|
|
42087
|
+
.withPush(true)
|
|
42088
|
+
.withPositions([
|
|
42089
|
+
{
|
|
42090
|
+
originX: 'end',
|
|
42091
|
+
originY: 'bottom',
|
|
42092
|
+
overlayX: 'end',
|
|
42093
|
+
overlayY: 'top',
|
|
42094
|
+
},
|
|
42095
|
+
{
|
|
42096
|
+
originX: 'end',
|
|
42097
|
+
originY: 'top',
|
|
42098
|
+
overlayX: 'end',
|
|
42099
|
+
overlayY: 'bottom',
|
|
42100
|
+
},
|
|
42101
|
+
]);
|
|
42102
|
+
this.overlayRef = this.overlay.create({
|
|
42103
|
+
hasBackdrop: true,
|
|
42104
|
+
backdropClass: 'cdk-overlay-transparent-backdrop',
|
|
42105
|
+
positionStrategy: positionStrategy,
|
|
42106
|
+
scrollStrategy: this.overlay.scrollStrategies.reposition(),
|
|
42107
|
+
});
|
|
42108
|
+
const portal = new TemplatePortal(template, this.viewContainerRef);
|
|
42109
|
+
this.overlayRef.attach(portal);
|
|
42110
|
+
this.subscription.add(this.overlayRef.backdropClick().subscribe(() => {
|
|
42111
|
+
this.closeActionMenu();
|
|
42112
|
+
}));
|
|
42113
|
+
}
|
|
42114
|
+
closeActionMenu() {
|
|
42115
|
+
if (this.overlayRef) {
|
|
42116
|
+
this.isActionMenuOpen = false;
|
|
42117
|
+
this.overlayRef.dispose();
|
|
42118
|
+
this.cdr.markForCheck();
|
|
42119
|
+
}
|
|
42120
|
+
}
|
|
42121
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MultilingualPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
42122
|
+
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: [
|
|
42123
|
+
provideIcons({
|
|
42124
|
+
iconoirSettings,
|
|
42125
|
+
matMoreHorizOutline,
|
|
42126
|
+
iconoirCheckCircle,
|
|
42127
|
+
iconoirCircle,
|
|
42128
|
+
}),
|
|
42129
|
+
provideNgIconsConfig({
|
|
42130
|
+
size: '1.25em',
|
|
42131
|
+
}),
|
|
42132
|
+
], 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" }] }); }
|
|
42133
|
+
}
|
|
42134
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MultilingualPanelComponent, decorators: [{
|
|
42135
|
+
type: Component,
|
|
42136
|
+
args: [{ selector: 'gn-ui-multilingual-panel', standalone: true, imports: [
|
|
42137
|
+
CommonModule,
|
|
42138
|
+
CheckToggleComponent,
|
|
42139
|
+
TranslateDirective,
|
|
42140
|
+
TranslatePipe,
|
|
42141
|
+
ButtonComponent,
|
|
42142
|
+
NgIconComponent,
|
|
42143
|
+
ActionMenuComponent,
|
|
42144
|
+
], providers: [
|
|
42145
|
+
provideIcons({
|
|
42146
|
+
iconoirSettings,
|
|
42147
|
+
matMoreHorizOutline,
|
|
42148
|
+
iconoirCheckCircle,
|
|
42149
|
+
iconoirCircle,
|
|
42150
|
+
}),
|
|
42151
|
+
provideNgIconsConfig({
|
|
42152
|
+
size: '1.25em',
|
|
42153
|
+
}),
|
|
42154
|
+
], 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" }]
|
|
42155
|
+
}], propDecorators: { record: [{
|
|
42156
|
+
type: Input
|
|
42157
|
+
}], actionMenuButtons: [{
|
|
42158
|
+
type: ViewChildren,
|
|
42159
|
+
args: ['actionMenuButton', { read: ElementRef }]
|
|
42160
|
+
}] } });
|
|
42161
|
+
|
|
41881
42162
|
class GenericKeywordsComponent {
|
|
41882
42163
|
constructor() {
|
|
41883
42164
|
this.platformService = inject(PlatformServiceInterface);
|
|
@@ -43684,7 +43965,7 @@ class FormFieldComponent {
|
|
|
43684
43965
|
}
|
|
43685
43966
|
}
|
|
43686
43967
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
43687
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: FormFieldComponent, isStandalone: true, selector: "gn-ui-form-field", inputs: { uniqueIdentifier: "uniqueIdentifier", model: "model", modelSpecifier: "modelSpecifier", componentName: "componentName", config: "config", value: "value" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "titleInput", first: true, predicate: ["titleInput"], descendants: true }], ngImport: i0, template: "<!-- TEMPORARY - disabling the open data switch -->\n<!-- <ng-container *ngIf=\"model === 'licenses'\">\n <gn-ui-form-field-open-data\n [value]=\"valueAsConstraints\"\n (valueChange)=\"valueChange.emit($event)\"\n (openDataChange)=\"toggleIsOpenData($event)\"\n ></gn-ui-form-field-open-data>\n</ng-container> -->\n<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container [ngSwitch]=\"model\">\n <ng-container *ngSwitchCase=\"'title'\">\n <div class=\"flex flex-row flex-start items-center gap-3 mb-[12px]\">\n <textarea\n #titleInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"1\"\n data-test=\"recordTitleInput\"\n class=\"grow font-title text-3xl font-normal overflow-hidden text-black/80\"\n (change)=\"valueChange.emit($event.target.value)\"\n [placeholder]=\"\n 'editor.record.form.field.title.placeholder' | translate\n \"\n >{{ valueAsString }}</textarea\n >\n <div class=\"flex flex-row justify-between self-start mt-0.5\">\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n *ngIf=\"config.hintKey\"\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey! | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'abstract'\">\n <gn-ui-form-field-rich\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n [value]=\"valueAsString\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngSwitchCase=\"'overviews'\">\n <gn-ui-form-field-overviews\n [metadataUuid]=\"uniqueIdentifier\"\n [value]=\"valueAsOverviews\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-overviews>\n </ng-container>\n <ng-container *ngSwitchCase=\"'resourceIdentifiers'\">\n <gn-ui-form-field-simple\n [type]=\"'text'\"\n [value]=\"valueAsResourceIdentifierCode\"\n (valueChange)=\"handleResourceIdentifierChange($event)\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngSwitchCase=\"'resourceCreated'\">\n <gn-ui-form-field-date\n [value]=\"valueAsDate\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-date>\n </ng-container>\n <ng-container *ngSwitchCase=\"'resourceUpdated'\">\n <gn-ui-form-field-date\n [value]=\"valueAsDate\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-date>\n </ng-container>\n <ng-container *ngSwitchCase=\"'updateFrequency'\">\n <gn-ui-form-field-update-frequency\n [value]=\"valueAsUpdateFrequency\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-update-frequency>\n </ng-container>\n <ng-container *ngSwitchCase=\"'temporalExtents'\">\n <gn-ui-form-field-temporal-extents\n [value]=\"valueAsTemporalExtents\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-temporal-extents>\n </ng-container>\n <ng-container *ngSwitchCase=\"'spatialExtents'\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngSwitchCase=\"'keywords'\">\n <gn-ui-form-field-keywords\n [value]=\"valueAsKeywords\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-keywords>\n </ng-container>\n <ng-container *ngSwitchCase=\"'topics'\">\n <gn-ui-form-field-topics\n [value]=\"valueAsTopics\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-topics>\n </ng-container>\n <ng-container *ngSwitchCase=\"'licenses'\">\n <gn-ui-form-field-license\n [label]=\"config.labelKey! | translate\"\n [recordLicences]=\"valueAsConstraints\"\n (recordLicencesChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-license>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'legalConstraints'\">\n <ng-container *ngTemplateOutlet=\"formFieldConstraints\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'securityConstraints'\">\n <ng-container *ngTemplateOutlet=\"formFieldConstraints\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'otherConstraints'\">\n <ng-container *ngTemplateOutlet=\"formFieldConstraints\"></ng-container\n ></ng-container>\n <ng-template #formFieldConstraints>\n <gn-ui-form-field-constraints\n [label]=\"config.labelKey\"\n [value]=\"valueAsConstraints\"\n [constraintType]=\"model\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-constraints\n ></ng-template>\n\n <ng-container *ngSwitchCase=\"'contactsForResource'\">\n <gn-ui-form-field-contacts-for-resource\n [value]=\"valueAsIndividuals\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-contacts-for-resource>\n </ng-container>\n <ng-container *ngSwitchCase=\"'contacts'\">\n <gn-ui-form-field-contacts\n [value]=\"valueAsIndividuals\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-contacts>\n </ng-container>\n <ng-container *ngSwitchCase=\"'onlineResources'\">\n <gn-ui-form-field-online-resources\n *ngIf=\"modelSpecifier === 'onlineResourceType:!link'\"\n [metadataUuid]=\"uniqueIdentifier\"\n [value]=\"valueAsOnlineResources\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-online-resources>\n </ng-container>\n <ng-container *ngSwitchCase=\"'onlineResources'\">\n <gn-ui-form-field-online-link-resources\n *ngIf=\"modelSpecifier === 'onlineResourceType:link'\"\n [metadataUuid]=\"uniqueIdentifier\"\n [value]=\"valueAsOnlineResources\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-online-link-resources>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!model\">\n <ng-container [ngSwitch]=\"componentName\">\n <ng-container *ngSwitchCase=\"'form-field-constraints-shortcuts'\">\n <gn-ui-form-field-constraints-shortcuts></gn-ui-form-field-constraints-shortcuts>\n </ng-container>\n <ng-container *ngSwitchCase=\"'form-field-spatial-toggle'\">\n <gn-ui-form-field-spatial-toggle></gn-ui-form-field-spatial-toggle>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1$5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: FormFieldWrapperComponent, selector: "gn-ui-form-field-wrapper", inputs: ["label", "hint"] }, { kind: "component", type: FormFieldLicenseComponent, selector: "gn-ui-form-field-license", inputs: ["label", "recordLicences"], outputs: ["recordLicencesChange"] }, { kind: "component", type: FormFieldDateComponent, selector: "gn-ui-form-field-date", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldUpdateFrequencyComponent, selector: "gn-ui-form-field-update-frequency", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldTemporalExtentsComponent, selector: "gn-ui-form-field-temporal-extents", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldSimpleComponent, selector: "gn-ui-form-field-simple", inputs: ["type", "readonly", "invalid", "placeholder", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldRichComponent, selector: "gn-ui-form-field-rich", inputs: ["label", "hint", "placeholder", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldSpatialExtentComponent, selector: "gn-ui-form-field-spatial-extent" }, { kind: "component", type: FormFieldKeywordsComponent, selector: "gn-ui-form-field-keywords", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldOverviewsComponent, selector: "gn-ui-form-field-overviews", inputs: ["metadataUuid", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldContactsForResourceComponent, selector: "gn-ui-form-field-contacts-for-resource", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldOnlineResourcesComponent, selector: "gn-ui-form-field-online-resources", inputs: ["metadataUuid", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldOnlineLinkResourcesComponent, selector: "gn-ui-form-field-online-link-resources", inputs: ["metadataUuid", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldContactsComponent, selector: "gn-ui-form-field-contacts", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldConstraintsComponent, selector: "gn-ui-form-field-constraints", inputs: ["label", "value", "constraintType"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldConstraintsShortcutsComponent, selector: "gn-ui-form-field-constraints-shortcuts" }, { kind: "component", type: FormFieldSpatialToggleComponent, selector: "gn-ui-form-field-spatial-toggle" }, { kind: "component", type: FormFieldTopicsComponent, selector: "gn-ui-form-field-topics", inputs: ["value"], outputs: ["valueChange"] }, { kind: "ngmodule", type: TextFieldModule }, { kind: "directive", type: i3$2.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
43968
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: FormFieldComponent, isStandalone: true, selector: "gn-ui-form-field", inputs: { uniqueIdentifier: "uniqueIdentifier", model: "model", modelSpecifier: "modelSpecifier", componentName: "componentName", config: "config", value: "value" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "titleInput", first: true, predicate: ["titleInput"], descendants: true }], ngImport: i0, template: "<!-- TEMPORARY - disabling the open data switch -->\n<!-- <ng-container *ngIf=\"model === 'licenses'\">\n <gn-ui-form-field-open-data\n [value]=\"valueAsConstraints\"\n (valueChange)=\"valueChange.emit($event)\"\n (openDataChange)=\"toggleIsOpenData($event)\"\n ></gn-ui-form-field-open-data>\n</ng-container> -->\n<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container [ngSwitch]=\"model\">\n <ng-container *ngSwitchCase=\"'title'\">\n <div class=\"flex flex-row flex-start items-center gap-3 mb-[12px]\">\n <textarea\n #titleInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"1\"\n data-test=\"recordTitleInput\"\n class=\"grow font-title text-3xl font-normal overflow-hidden text-black/80\"\n [value]=\"valueAsString\"\n (change)=\"valueChange.emit($event.target.value)\"\n [placeholder]=\"\n 'editor.record.form.field.title.placeholder' | translate\n \"\n ></textarea>\n <div class=\"flex flex-row justify-between self-start mt-0.5\">\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n *ngIf=\"config.hintKey\"\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey! | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'abstract'\">\n <gn-ui-form-field-rich\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n [value]=\"valueAsString\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngSwitchCase=\"'overviews'\">\n <gn-ui-form-field-overviews\n [metadataUuid]=\"uniqueIdentifier\"\n [value]=\"valueAsOverviews\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-overviews>\n </ng-container>\n <ng-container *ngSwitchCase=\"'resourceIdentifiers'\">\n <gn-ui-form-field-simple\n [type]=\"'text'\"\n [value]=\"valueAsResourceIdentifierCode\"\n (valueChange)=\"handleResourceIdentifierChange($event)\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngSwitchCase=\"'resourceCreated'\">\n <gn-ui-form-field-date\n [value]=\"valueAsDate\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-date>\n </ng-container>\n <ng-container *ngSwitchCase=\"'resourceUpdated'\">\n <gn-ui-form-field-date\n [value]=\"valueAsDate\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-date>\n </ng-container>\n <ng-container *ngSwitchCase=\"'updateFrequency'\">\n <gn-ui-form-field-update-frequency\n [value]=\"valueAsUpdateFrequency\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-update-frequency>\n </ng-container>\n <ng-container *ngSwitchCase=\"'temporalExtents'\">\n <gn-ui-form-field-temporal-extents\n [value]=\"valueAsTemporalExtents\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-temporal-extents>\n </ng-container>\n <ng-container *ngSwitchCase=\"'spatialExtents'\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngSwitchCase=\"'keywords'\">\n <gn-ui-form-field-keywords\n [value]=\"valueAsKeywords\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-keywords>\n </ng-container>\n <ng-container *ngSwitchCase=\"'topics'\">\n <gn-ui-form-field-topics\n [value]=\"valueAsTopics\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-topics>\n </ng-container>\n <ng-container *ngSwitchCase=\"'licenses'\">\n <gn-ui-form-field-license\n [label]=\"config.labelKey! | translate\"\n [recordLicences]=\"valueAsConstraints\"\n (recordLicencesChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-license>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'legalConstraints'\">\n <ng-container *ngTemplateOutlet=\"formFieldConstraints\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'securityConstraints'\">\n <ng-container *ngTemplateOutlet=\"formFieldConstraints\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'otherConstraints'\">\n <ng-container *ngTemplateOutlet=\"formFieldConstraints\"></ng-container\n ></ng-container>\n <ng-template #formFieldConstraints>\n <gn-ui-form-field-constraints\n [label]=\"config.labelKey\"\n [value]=\"valueAsConstraints\"\n [constraintType]=\"model\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-constraints\n ></ng-template>\n\n <ng-container *ngSwitchCase=\"'contactsForResource'\">\n <gn-ui-form-field-contacts-for-resource\n [value]=\"valueAsIndividuals\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-contacts-for-resource>\n </ng-container>\n <ng-container *ngSwitchCase=\"'contacts'\">\n <gn-ui-form-field-contacts\n [value]=\"valueAsIndividuals\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-contacts>\n </ng-container>\n <ng-container *ngSwitchCase=\"'onlineResources'\">\n <gn-ui-form-field-online-resources\n *ngIf=\"modelSpecifier === 'onlineResourceType:!link'\"\n [metadataUuid]=\"uniqueIdentifier\"\n [value]=\"valueAsOnlineResources\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-online-resources>\n </ng-container>\n <ng-container *ngSwitchCase=\"'onlineResources'\">\n <gn-ui-form-field-online-link-resources\n *ngIf=\"modelSpecifier === 'onlineResourceType:link'\"\n [metadataUuid]=\"uniqueIdentifier\"\n [value]=\"valueAsOnlineResources\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-online-link-resources>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!model\">\n <ng-container [ngSwitch]=\"componentName\">\n <ng-container *ngSwitchCase=\"'form-field-constraints-shortcuts'\">\n <gn-ui-form-field-constraints-shortcuts></gn-ui-form-field-constraints-shortcuts>\n </ng-container>\n <ng-container *ngSwitchCase=\"'form-field-spatial-toggle'\">\n <gn-ui-form-field-spatial-toggle></gn-ui-form-field-spatial-toggle>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1$5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: FormFieldWrapperComponent, selector: "gn-ui-form-field-wrapper", inputs: ["label", "hint"] }, { kind: "component", type: FormFieldLicenseComponent, selector: "gn-ui-form-field-license", inputs: ["label", "recordLicences"], outputs: ["recordLicencesChange"] }, { kind: "component", type: FormFieldDateComponent, selector: "gn-ui-form-field-date", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldUpdateFrequencyComponent, selector: "gn-ui-form-field-update-frequency", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldTemporalExtentsComponent, selector: "gn-ui-form-field-temporal-extents", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldSimpleComponent, selector: "gn-ui-form-field-simple", inputs: ["type", "readonly", "invalid", "placeholder", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldRichComponent, selector: "gn-ui-form-field-rich", inputs: ["label", "hint", "placeholder", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldSpatialExtentComponent, selector: "gn-ui-form-field-spatial-extent" }, { kind: "component", type: FormFieldKeywordsComponent, selector: "gn-ui-form-field-keywords", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldOverviewsComponent, selector: "gn-ui-form-field-overviews", inputs: ["metadataUuid", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldContactsForResourceComponent, selector: "gn-ui-form-field-contacts-for-resource", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldOnlineResourcesComponent, selector: "gn-ui-form-field-online-resources", inputs: ["metadataUuid", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldOnlineLinkResourcesComponent, selector: "gn-ui-form-field-online-link-resources", inputs: ["metadataUuid", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldContactsComponent, selector: "gn-ui-form-field-contacts", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldConstraintsComponent, selector: "gn-ui-form-field-constraints", inputs: ["label", "value", "constraintType"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldConstraintsShortcutsComponent, selector: "gn-ui-form-field-constraints-shortcuts" }, { kind: "component", type: FormFieldSpatialToggleComponent, selector: "gn-ui-form-field-spatial-toggle" }, { kind: "component", type: FormFieldTopicsComponent, selector: "gn-ui-form-field-topics", inputs: ["value"], outputs: ["valueChange"] }, { kind: "ngmodule", type: TextFieldModule }, { kind: "directive", type: i3$2.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
43688
43969
|
}
|
|
43689
43970
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FormFieldComponent, decorators: [{
|
|
43690
43971
|
type: Component,
|
|
@@ -43711,7 +43992,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
43711
43992
|
FormFieldSpatialToggleComponent,
|
|
43712
43993
|
FormFieldTopicsComponent,
|
|
43713
43994
|
TextFieldModule,
|
|
43714
|
-
], template: "<!-- TEMPORARY - disabling the open data switch -->\n<!-- <ng-container *ngIf=\"model === 'licenses'\">\n <gn-ui-form-field-open-data\n [value]=\"valueAsConstraints\"\n (valueChange)=\"valueChange.emit($event)\"\n (openDataChange)=\"toggleIsOpenData($event)\"\n ></gn-ui-form-field-open-data>\n</ng-container> -->\n<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container [ngSwitch]=\"model\">\n <ng-container *ngSwitchCase=\"'title'\">\n <div class=\"flex flex-row flex-start items-center gap-3 mb-[12px]\">\n <textarea\n #titleInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"1\"\n data-test=\"recordTitleInput\"\n class=\"grow font-title text-3xl font-normal overflow-hidden text-black/80\"\n (change)=\"valueChange.emit($event.target.value)\"\n [placeholder]=\"\n 'editor.record.form.field.title.placeholder' | translate\n \"\n
|
|
43995
|
+
], template: "<!-- TEMPORARY - disabling the open data switch -->\n<!-- <ng-container *ngIf=\"model === 'licenses'\">\n <gn-ui-form-field-open-data\n [value]=\"valueAsConstraints\"\n (valueChange)=\"valueChange.emit($event)\"\n (openDataChange)=\"toggleIsOpenData($event)\"\n ></gn-ui-form-field-open-data>\n</ng-container> -->\n<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container [ngSwitch]=\"model\">\n <ng-container *ngSwitchCase=\"'title'\">\n <div class=\"flex flex-row flex-start items-center gap-3 mb-[12px]\">\n <textarea\n #titleInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"1\"\n data-test=\"recordTitleInput\"\n class=\"grow font-title text-3xl font-normal overflow-hidden text-black/80\"\n [value]=\"valueAsString\"\n (change)=\"valueChange.emit($event.target.value)\"\n [placeholder]=\"\n 'editor.record.form.field.title.placeholder' | translate\n \"\n ></textarea>\n <div class=\"flex flex-row justify-between self-start mt-0.5\">\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n *ngIf=\"config.hintKey\"\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey! | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'abstract'\">\n <gn-ui-form-field-rich\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n [value]=\"valueAsString\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngSwitchCase=\"'overviews'\">\n <gn-ui-form-field-overviews\n [metadataUuid]=\"uniqueIdentifier\"\n [value]=\"valueAsOverviews\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-overviews>\n </ng-container>\n <ng-container *ngSwitchCase=\"'resourceIdentifiers'\">\n <gn-ui-form-field-simple\n [type]=\"'text'\"\n [value]=\"valueAsResourceIdentifierCode\"\n (valueChange)=\"handleResourceIdentifierChange($event)\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngSwitchCase=\"'resourceCreated'\">\n <gn-ui-form-field-date\n [value]=\"valueAsDate\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-date>\n </ng-container>\n <ng-container *ngSwitchCase=\"'resourceUpdated'\">\n <gn-ui-form-field-date\n [value]=\"valueAsDate\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-date>\n </ng-container>\n <ng-container *ngSwitchCase=\"'updateFrequency'\">\n <gn-ui-form-field-update-frequency\n [value]=\"valueAsUpdateFrequency\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-update-frequency>\n </ng-container>\n <ng-container *ngSwitchCase=\"'temporalExtents'\">\n <gn-ui-form-field-temporal-extents\n [value]=\"valueAsTemporalExtents\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-temporal-extents>\n </ng-container>\n <ng-container *ngSwitchCase=\"'spatialExtents'\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngSwitchCase=\"'keywords'\">\n <gn-ui-form-field-keywords\n [value]=\"valueAsKeywords\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-keywords>\n </ng-container>\n <ng-container *ngSwitchCase=\"'topics'\">\n <gn-ui-form-field-topics\n [value]=\"valueAsTopics\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-topics>\n </ng-container>\n <ng-container *ngSwitchCase=\"'licenses'\">\n <gn-ui-form-field-license\n [label]=\"config.labelKey! | translate\"\n [recordLicences]=\"valueAsConstraints\"\n (recordLicencesChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-license>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'legalConstraints'\">\n <ng-container *ngTemplateOutlet=\"formFieldConstraints\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'securityConstraints'\">\n <ng-container *ngTemplateOutlet=\"formFieldConstraints\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'otherConstraints'\">\n <ng-container *ngTemplateOutlet=\"formFieldConstraints\"></ng-container\n ></ng-container>\n <ng-template #formFieldConstraints>\n <gn-ui-form-field-constraints\n [label]=\"config.labelKey\"\n [value]=\"valueAsConstraints\"\n [constraintType]=\"model\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-constraints\n ></ng-template>\n\n <ng-container *ngSwitchCase=\"'contactsForResource'\">\n <gn-ui-form-field-contacts-for-resource\n [value]=\"valueAsIndividuals\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-contacts-for-resource>\n </ng-container>\n <ng-container *ngSwitchCase=\"'contacts'\">\n <gn-ui-form-field-contacts\n [value]=\"valueAsIndividuals\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-contacts>\n </ng-container>\n <ng-container *ngSwitchCase=\"'onlineResources'\">\n <gn-ui-form-field-online-resources\n *ngIf=\"modelSpecifier === 'onlineResourceType:!link'\"\n [metadataUuid]=\"uniqueIdentifier\"\n [value]=\"valueAsOnlineResources\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-online-resources>\n </ng-container>\n <ng-container *ngSwitchCase=\"'onlineResources'\">\n <gn-ui-form-field-online-link-resources\n *ngIf=\"modelSpecifier === 'onlineResourceType:link'\"\n [metadataUuid]=\"uniqueIdentifier\"\n [value]=\"valueAsOnlineResources\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-online-link-resources>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!model\">\n <ng-container [ngSwitch]=\"componentName\">\n <ng-container *ngSwitchCase=\"'form-field-constraints-shortcuts'\">\n <gn-ui-form-field-constraints-shortcuts></gn-ui-form-field-constraints-shortcuts>\n </ng-container>\n <ng-container *ngSwitchCase=\"'form-field-spatial-toggle'\">\n <gn-ui-form-field-spatial-toggle></gn-ui-form-field-spatial-toggle>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n" }]
|
|
43715
43996
|
}], propDecorators: { uniqueIdentifier: [{
|
|
43716
43997
|
type: Input
|
|
43717
43998
|
}], model: [{
|
|
@@ -43756,327 +44037,148 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
43756
44037
|
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" }]
|
|
43757
44038
|
}] });
|
|
43758
44039
|
|
|
43759
|
-
|
|
43760
|
-
|
|
43761
|
-
|
|
43762
|
-
ko: 'kr',
|
|
43763
|
-
cs: 'cz',
|
|
43764
|
-
zh: 'cn',
|
|
43765
|
-
ca: 'es-ct',
|
|
43766
|
-
rm: 'ch',
|
|
43767
|
-
da: 'dk',
|
|
43768
|
-
sv: 'se',
|
|
43769
|
-
cy: 'gb-wls',
|
|
43770
|
-
hy: 'am',
|
|
43771
|
-
ka: 'ge',
|
|
43772
|
-
uk: 'ua',
|
|
43773
|
-
};
|
|
43774
|
-
class MultilingualPanelComponent {
|
|
43775
|
-
constructor() {
|
|
43776
|
-
this.facade = inject(EditorFacade);
|
|
43777
|
-
this.dialog = inject(MatDialog);
|
|
43778
|
-
this.translateService = inject(TranslateService);
|
|
43779
|
-
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
43780
|
-
this.overlay = inject(Overlay);
|
|
43781
|
-
this.viewContainerRef = inject(ViewContainerRef);
|
|
43782
|
-
this.cdr = inject(ChangeDetectorRef);
|
|
43783
|
-
this.selectedLanguages = [];
|
|
43784
|
-
this.recordLanguages = [];
|
|
43785
|
-
this.formLanguage = '';
|
|
43786
|
-
this.isActionMenuOpen = false;
|
|
43787
|
-
this.subscription = new Subscription();
|
|
43788
|
-
this.supportedLanguages$ = this.recordsRepository
|
|
43789
|
-
.getApplicationLanguages()
|
|
43790
|
-
.pipe(map$2((languages) => this.sortLanguages(languages)));
|
|
43791
|
-
}
|
|
43792
|
-
set record(value) {
|
|
43793
|
-
this._record = value;
|
|
43794
|
-
this.isMultilingual = value.otherLanguages.length > 0;
|
|
43795
|
-
this.editTranslations = false;
|
|
43796
|
-
this.recordLanguages = [...value.otherLanguages, value.defaultLanguage];
|
|
43797
|
-
this.selectedLanguages = this.recordLanguages;
|
|
43798
|
-
this.formLanguage = value.defaultLanguage;
|
|
43799
|
-
}
|
|
43800
|
-
ngOnDestroy() {
|
|
43801
|
-
this.subscription.unsubscribe();
|
|
43802
|
-
}
|
|
43803
|
-
sortLanguages(languages) {
|
|
43804
|
-
return languages
|
|
43805
|
-
.map((lang) => {
|
|
43806
|
-
const label = this.translateService.instant('language.' + lang);
|
|
43807
|
-
const isTranslated = label !== 'language.' + lang;
|
|
43808
|
-
return {
|
|
43809
|
-
lang,
|
|
43810
|
-
label,
|
|
43811
|
-
isTranslated,
|
|
43812
|
-
};
|
|
43813
|
-
})
|
|
43814
|
-
.sort((a, b) => {
|
|
43815
|
-
if (a.isTranslated && !b.isTranslated)
|
|
43816
|
-
return -1;
|
|
43817
|
-
if (!a.isTranslated && b.isTranslated)
|
|
43818
|
-
return 1;
|
|
43819
|
-
return a.label.localeCompare(b.label);
|
|
43820
|
-
})
|
|
43821
|
-
.map((item) => item.lang);
|
|
43822
|
-
}
|
|
43823
|
-
toggleLanguageSelection() {
|
|
43824
|
-
this.editTranslations = !this.editTranslations;
|
|
43825
|
-
}
|
|
43826
|
-
getIconClass(lang) {
|
|
43827
|
-
return extraFlagMap[lang]
|
|
43828
|
-
? `fi fi-${extraFlagMap[lang]} w-4 h-3`
|
|
43829
|
-
: `fi fi-${lang} w-4 h-3`;
|
|
43830
|
-
}
|
|
43831
|
-
switchMultilingual() {
|
|
43832
|
-
if (this.isMultilingual && this.selectedLanguages.length > 1) {
|
|
43833
|
-
this.confirmDeleteAction();
|
|
43834
|
-
}
|
|
43835
|
-
else {
|
|
43836
|
-
this.isMultilingual = true;
|
|
43837
|
-
this.editTranslations = true;
|
|
43838
|
-
}
|
|
43839
|
-
}
|
|
43840
|
-
getExtraClass(lang) {
|
|
43841
|
-
const baseClass = 'h-[34px] w-full font-bold justify-start hover:bg-white';
|
|
43842
|
-
if (this.selectedLanguages.includes(lang)) {
|
|
43843
|
-
return `${baseClass} bg-white border border-black`;
|
|
43844
|
-
}
|
|
43845
|
-
return baseClass;
|
|
44040
|
+
function evaluate(expression) {
|
|
44041
|
+
if (expression.match(/^\${.*}$/)) {
|
|
44042
|
+
return evaluate(expression.slice(2, -1));
|
|
43846
44043
|
}
|
|
43847
|
-
|
|
43848
|
-
|
|
43849
|
-
|
|
43850
|
-
|
|
43851
|
-
|
|
43852
|
-
|
|
43853
|
-
}
|
|
44044
|
+
const operator = expression.split('(')[0];
|
|
44045
|
+
switch (operator) {
|
|
44046
|
+
case 'dateNow':
|
|
44047
|
+
return () => new Date();
|
|
44048
|
+
default:
|
|
44049
|
+
throw new Error(`Unknown operator: ${operator}`);
|
|
43854
44050
|
}
|
|
43855
|
-
|
|
43856
|
-
|
|
44051
|
+
}
|
|
44052
|
+
|
|
44053
|
+
class EditorService {
|
|
44054
|
+
constructor() {
|
|
44055
|
+
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
43857
44056
|
}
|
|
43858
|
-
|
|
43859
|
-
|
|
43860
|
-
|
|
43861
|
-
|
|
43862
|
-
|
|
44057
|
+
// returns the record as it was when saved, alongside its source
|
|
44058
|
+
saveRecord(record, recordSource, fieldsConfig) {
|
|
44059
|
+
const savedRecord = { ...record };
|
|
44060
|
+
const fields = fieldsConfig.pages.flatMap((page) => page.sections.flatMap((section) => section.fields));
|
|
44061
|
+
// run onSave processes
|
|
44062
|
+
for (const field of fields) {
|
|
44063
|
+
if (field.onSaveProcess && field.model) {
|
|
44064
|
+
const evaluator = evaluate(field.onSaveProcess);
|
|
44065
|
+
savedRecord[field.model] = evaluator({
|
|
44066
|
+
model: field.model,
|
|
44067
|
+
value: record[field.model],
|
|
44068
|
+
});
|
|
44069
|
+
}
|
|
43863
44070
|
}
|
|
43864
|
-
|
|
43865
|
-
|
|
44071
|
+
let publishToAll = true;
|
|
44072
|
+
// if the record is new, generate a new unique identifier and pass publishToAll as false
|
|
44073
|
+
if (!record.uniqueIdentifier) {
|
|
44074
|
+
savedRecord.uniqueIdentifier = null;
|
|
44075
|
+
publishToAll = false;
|
|
43866
44076
|
}
|
|
44077
|
+
return this.recordsRepository
|
|
44078
|
+
.saveRecord(savedRecord, recordSource, publishToAll)
|
|
44079
|
+
.pipe(switchMap((uniqueIdentifier) => this.recordsRepository.openRecordForEdition(uniqueIdentifier)), tap$1(() => {
|
|
44080
|
+
// if saving was successful, the original draft can be discarded
|
|
44081
|
+
this.recordsRepository.clearRecordDraft(record.uniqueIdentifier);
|
|
44082
|
+
}), map$1(([record, recordSource]) => [record, recordSource]));
|
|
43867
44083
|
}
|
|
43868
|
-
|
|
43869
|
-
|
|
43870
|
-
|
|
43871
|
-
|
|
43872
|
-
this.
|
|
43873
|
-
|
|
43874
|
-
|
|
43875
|
-
// TO IMPLEMENT FURTHER
|
|
43876
|
-
}
|
|
43877
|
-
switchDefaultLang(lang) {
|
|
43878
|
-
this.formLanguage = lang;
|
|
43879
|
-
this.facade.updateRecordLanguages(lang, this.selectedLanguages.filter((lang) => lang !== this.formLanguage));
|
|
43880
|
-
this.closeActionMenu();
|
|
43881
|
-
}
|
|
43882
|
-
confirmDeleteAction(lang) {
|
|
43883
|
-
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
43884
|
-
data: {
|
|
43885
|
-
title: this.translateService.instant('editor.record.multilingual.confirmation.title'),
|
|
43886
|
-
message: this.translateService.instant('editor.record.multilingual.confirmation.message'),
|
|
43887
|
-
confirmText: this.translateService.instant('editor.record.multilingual.confirmation.confirmText'),
|
|
43888
|
-
cancelText: this.translateService.instant('editor.record.multilingual.confirmation.cancelText'),
|
|
43889
|
-
focusCancel: true,
|
|
43890
|
-
},
|
|
43891
|
-
restoreFocus: true,
|
|
43892
|
-
});
|
|
43893
|
-
this.subscription.add(dialogRef.afterClosed().subscribe((confirmed) => {
|
|
43894
|
-
if (confirmed) {
|
|
43895
|
-
if (lang) {
|
|
43896
|
-
if (!Array.isArray(lang)) {
|
|
43897
|
-
this.removeSelectedLanguage(lang);
|
|
43898
|
-
this.closeActionMenu();
|
|
43899
|
-
}
|
|
43900
|
-
this.updateTranslations();
|
|
43901
|
-
}
|
|
43902
|
-
else {
|
|
43903
|
-
this.facade.updateRecordLanguages(this.formLanguage, []);
|
|
43904
|
-
this.isMultilingual = false;
|
|
43905
|
-
this.selectedLanguages = [];
|
|
43906
|
-
}
|
|
43907
|
-
}
|
|
43908
|
-
else {
|
|
43909
|
-
this.isMultilingual = true;
|
|
43910
|
-
this.selectedLanguages = this.recordLanguages;
|
|
43911
|
-
}
|
|
43912
|
-
this.editTranslations = false;
|
|
43913
|
-
}));
|
|
43914
|
-
}
|
|
43915
|
-
isFirstUnsupported(index) {
|
|
43916
|
-
const langs = this.sortLanguages(this.recordLanguages);
|
|
43917
|
-
return (langs[index].length === 3 &&
|
|
43918
|
-
langs.slice(0, index).every((lang) => lang.length !== 3));
|
|
43919
|
-
}
|
|
43920
|
-
isLangSupported(lang) {
|
|
43921
|
-
return lang.length === 2;
|
|
43922
|
-
}
|
|
43923
|
-
getToggleTitle(lang) {
|
|
43924
|
-
if (lang === this._record.defaultLanguage) {
|
|
43925
|
-
return this.translateService.instant('editor.record.form.multilingual.forbidden');
|
|
43926
|
-
}
|
|
43927
|
-
return '';
|
|
44084
|
+
// emits and completes once saving is done
|
|
44085
|
+
// note: onSave processes are not run for drafts
|
|
44086
|
+
saveRecordAsDraft(record, recordSource) {
|
|
44087
|
+
record.recordUpdated = new Date();
|
|
44088
|
+
return this.recordsRepository
|
|
44089
|
+
.saveRecordAsDraft(record, recordSource)
|
|
44090
|
+
.pipe(map$1(() => undefined));
|
|
43928
44091
|
}
|
|
43929
|
-
|
|
43930
|
-
this.
|
|
43931
|
-
|
|
43932
|
-
const buttonElement = this.actionMenuButtons.toArray()[index];
|
|
43933
|
-
const positionStrategy = this.overlay
|
|
43934
|
-
.position()
|
|
43935
|
-
.flexibleConnectedTo(buttonElement)
|
|
43936
|
-
.withFlexibleDimensions(true)
|
|
43937
|
-
.withPush(true)
|
|
43938
|
-
.withPositions([
|
|
43939
|
-
{
|
|
43940
|
-
originX: 'end',
|
|
43941
|
-
originY: 'bottom',
|
|
43942
|
-
overlayX: 'end',
|
|
43943
|
-
overlayY: 'top',
|
|
43944
|
-
},
|
|
43945
|
-
{
|
|
43946
|
-
originX: 'end',
|
|
43947
|
-
originY: 'top',
|
|
43948
|
-
overlayX: 'end',
|
|
43949
|
-
overlayY: 'bottom',
|
|
43950
|
-
},
|
|
43951
|
-
]);
|
|
43952
|
-
this.overlayRef = this.overlay.create({
|
|
43953
|
-
hasBackdrop: true,
|
|
43954
|
-
backdropClass: 'cdk-overlay-transparent-backdrop',
|
|
43955
|
-
positionStrategy: positionStrategy,
|
|
43956
|
-
scrollStrategy: this.overlay.scrollStrategies.reposition(),
|
|
43957
|
-
});
|
|
43958
|
-
const portal = new TemplatePortal(template, this.viewContainerRef);
|
|
43959
|
-
this.overlayRef.attach(portal);
|
|
43960
|
-
this.subscription.add(this.overlayRef.backdropClick().subscribe(() => {
|
|
43961
|
-
this.closeActionMenu();
|
|
43962
|
-
}));
|
|
44092
|
+
undoRecordDraft(record) {
|
|
44093
|
+
this.recordsRepository.clearRecordDraft(record.uniqueIdentifier);
|
|
44094
|
+
return this.recordsRepository.openRecordForEdition(record.uniqueIdentifier);
|
|
43963
44095
|
}
|
|
43964
|
-
|
|
43965
|
-
|
|
43966
|
-
this.isActionMenuOpen = false;
|
|
43967
|
-
this.overlayRef.dispose();
|
|
43968
|
-
this.cdr.markForCheck();
|
|
43969
|
-
}
|
|
44096
|
+
hasRecordChangedSinceDraft(localRecord) {
|
|
44097
|
+
return this.recordsRepository.hasRecordChangedSinceDraft(localRecord);
|
|
43970
44098
|
}
|
|
43971
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type:
|
|
43972
|
-
static { this.ɵ
|
|
43973
|
-
provideIcons({
|
|
43974
|
-
iconoirSettings,
|
|
43975
|
-
matMoreHorizOutline,
|
|
43976
|
-
iconoirCheckCircle,
|
|
43977
|
-
iconoirCircle,
|
|
43978
|
-
}),
|
|
43979
|
-
provideNgIconsConfig({
|
|
43980
|
-
size: '1.25em',
|
|
43981
|
-
}),
|
|
43982
|
-
], 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" }] }); }
|
|
44099
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
44100
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, providedIn: 'root' }); }
|
|
43983
44101
|
}
|
|
43984
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type:
|
|
43985
|
-
type:
|
|
43986
|
-
args: [{
|
|
43987
|
-
|
|
43988
|
-
|
|
43989
|
-
|
|
43990
|
-
TranslatePipe,
|
|
43991
|
-
ButtonComponent,
|
|
43992
|
-
NgIconComponent,
|
|
43993
|
-
ActionMenuComponent,
|
|
43994
|
-
], providers: [
|
|
43995
|
-
provideIcons({
|
|
43996
|
-
iconoirSettings,
|
|
43997
|
-
matMoreHorizOutline,
|
|
43998
|
-
iconoirCheckCircle,
|
|
43999
|
-
iconoirCircle,
|
|
44000
|
-
}),
|
|
44001
|
-
provideNgIconsConfig({
|
|
44002
|
-
size: '1.25em',
|
|
44003
|
-
}),
|
|
44004
|
-
], 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" }]
|
|
44005
|
-
}], propDecorators: { record: [{
|
|
44006
|
-
type: Input
|
|
44007
|
-
}], actionMenuButtons: [{
|
|
44008
|
-
type: ViewChildren,
|
|
44009
|
-
args: ['actionMenuButton', { read: ElementRef }]
|
|
44010
|
-
}] } });
|
|
44102
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, decorators: [{
|
|
44103
|
+
type: Injectable,
|
|
44104
|
+
args: [{
|
|
44105
|
+
providedIn: 'root',
|
|
44106
|
+
}]
|
|
44107
|
+
}] });
|
|
44011
44108
|
|
|
44012
|
-
|
|
44013
|
-
marker('editor.record.form.field.keywords');
|
|
44014
|
-
marker('editor.record.form.field.topics');
|
|
44015
|
-
marker('editor.record.form.field.contacts');
|
|
44016
|
-
marker('editor.record.form.field.organisation');
|
|
44017
|
-
class MetadataQualityPanelComponent {
|
|
44109
|
+
class EditorEffects {
|
|
44018
44110
|
constructor() {
|
|
44019
|
-
this.
|
|
44020
|
-
this.
|
|
44021
|
-
|
|
44022
|
-
|
|
44023
|
-
|
|
44024
|
-
|
|
44025
|
-
|
|
44026
|
-
|
|
44027
|
-
|
|
44028
|
-
|
|
44029
|
-
|
|
44030
|
-
|
|
44031
|
-
fieldsByPage[2].includes('organisation') ||
|
|
44032
|
-
fieldsByPage[2].push('organisation');
|
|
44111
|
+
this.actions$ = inject(Actions);
|
|
44112
|
+
this.editorService = inject(EditorService);
|
|
44113
|
+
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
44114
|
+
this.plateformService = inject(PlatformServiceInterface);
|
|
44115
|
+
this.store = inject(Store);
|
|
44116
|
+
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]) => {
|
|
44117
|
+
const actions = [saveRecordSuccess()];
|
|
44118
|
+
if (!record?.uniqueIdentifier) {
|
|
44119
|
+
actions.push(openRecord({
|
|
44120
|
+
record: savedRecord,
|
|
44121
|
+
recordSource: savedRecordSource,
|
|
44122
|
+
}));
|
|
44033
44123
|
}
|
|
44034
|
-
|
|
44035
|
-
|
|
44036
|
-
|
|
44037
|
-
|
|
44038
|
-
|
|
44039
|
-
|
|
44040
|
-
|
|
44041
|
-
|
|
44042
|
-
|
|
44043
|
-
|
|
44044
|
-
|
|
44045
|
-
|
|
44046
|
-
|
|
44124
|
+
return of(...actions);
|
|
44125
|
+
}), catchError((error) => of(saveRecordFailure({
|
|
44126
|
+
error,
|
|
44127
|
+
})))))));
|
|
44128
|
+
this.cleanRecordAttachments$ = createEffect(() => this.actions$.pipe(ofType(saveRecordSuccess), withLatestFrom$1(this.store.select(selectRecord)), switchMap$1(([_, record]) => {
|
|
44129
|
+
if (record.uniqueIdentifier !== null) {
|
|
44130
|
+
this.plateformService.cleanRecordAttachments(record).subscribe({
|
|
44131
|
+
next: (_) => undefined,
|
|
44132
|
+
error: (err) => {
|
|
44133
|
+
console.error(err);
|
|
44134
|
+
},
|
|
44135
|
+
});
|
|
44136
|
+
}
|
|
44137
|
+
return EMPTY;
|
|
44138
|
+
}), catchError((error) => {
|
|
44139
|
+
console.error(error);
|
|
44140
|
+
return EMPTY;
|
|
44141
|
+
})), { dispatch: false });
|
|
44142
|
+
this.markAsChanged$ = createEffect(() => this.actions$.pipe(ofType(updateRecordField, updateRecordLanguages), map$1(() => markRecordAsChanged())));
|
|
44143
|
+
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())));
|
|
44144
|
+
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({
|
|
44145
|
+
record,
|
|
44146
|
+
recordSource,
|
|
44147
|
+
}))));
|
|
44148
|
+
this.checkHasChangesOnOpen$ = createEffect(() => this.actions$.pipe(ofType(openRecord), map$1(({ record }) => this.recordsRepository.recordHasDraft(record.uniqueIdentifier)), filter((hasDraft) => hasDraft), map$1(() => markRecordAsChanged())));
|
|
44149
|
+
this.hasRecordChangedSinceDraft$ = createEffect(() => this.actions$.pipe(ofType(hasRecordChangedSinceDraft), switchMap$1(({ record }) => this.editorService
|
|
44150
|
+
.hasRecordChangedSinceDraft(record)
|
|
44151
|
+
.pipe(map$1((changes) => hasRecordChangedSinceDraftSuccess({ changes }))))));
|
|
44152
|
+
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({
|
|
44153
|
+
isPublished: isPublished$1,
|
|
44154
|
+
}))));
|
|
44155
|
+
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({
|
|
44156
|
+
canEditRecord: canEditRecord$1,
|
|
44157
|
+
}))));
|
|
44047
44158
|
}
|
|
44048
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type:
|
|
44049
|
-
static { this.ɵ
|
|
44050
|
-
provideIcons({
|
|
44051
|
-
iconoirSystemShut,
|
|
44052
|
-
iconoirBadgeCheck,
|
|
44053
|
-
}),
|
|
44054
|
-
provideNgIconsConfig({
|
|
44055
|
-
size: '1.25em',
|
|
44056
|
-
}),
|
|
44057
|
-
], 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" }] }); }
|
|
44159
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
44160
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects }); }
|
|
44058
44161
|
}
|
|
44059
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type:
|
|
44060
|
-
type:
|
|
44061
|
-
|
|
44062
|
-
|
|
44063
|
-
|
|
44064
|
-
|
|
44065
|
-
|
|
44066
|
-
|
|
44067
|
-
|
|
44068
|
-
|
|
44069
|
-
|
|
44070
|
-
|
|
44071
|
-
|
|
44072
|
-
|
|
44073
|
-
|
|
44074
|
-
|
|
44075
|
-
|
|
44076
|
-
|
|
44077
|
-
|
|
44078
|
-
|
|
44079
|
-
}] } });
|
|
44162
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects, decorators: [{
|
|
44163
|
+
type: Injectable
|
|
44164
|
+
}] });
|
|
44165
|
+
|
|
44166
|
+
class FeatureEditorModule {
|
|
44167
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
44168
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, imports: [i1.StoreFeatureModule, i2$2.EffectsFeatureModule] }); }
|
|
44169
|
+
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),
|
|
44170
|
+
EffectsModule.forFeature([EditorEffects])] }); }
|
|
44171
|
+
}
|
|
44172
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, decorators: [{
|
|
44173
|
+
type: NgModule,
|
|
44174
|
+
args: [{
|
|
44175
|
+
imports: [
|
|
44176
|
+
StoreModule.forFeature(EDITOR_FEATURE_KEY, editorReducer),
|
|
44177
|
+
EffectsModule.forFeature([EditorEffects]),
|
|
44178
|
+
],
|
|
44179
|
+
providers: [EditorFacade, provideHttpClient()],
|
|
44180
|
+
}]
|
|
44181
|
+
}] });
|
|
44080
44182
|
|
|
44081
44183
|
const ROUTER_STATE_KEY = 'router';
|
|
44082
44184
|
const ROUTER_ROUTE_SEARCH = 'search';
|
|
@@ -44349,6 +44451,23 @@ class RouterEffects {
|
|
|
44349
44451
|
}
|
|
44350
44452
|
return of(...actions);
|
|
44351
44453
|
})));
|
|
44454
|
+
/**
|
|
44455
|
+
* This effect is needed because on the page load, the search params from the URL are
|
|
44456
|
+
* directly applied to the underlying search facade; this means that it doesn't go
|
|
44457
|
+
* through the RouterSearchService which makes sure that a relevancy sort is applied
|
|
44458
|
+
* whenever there's a full text search criteria set.
|
|
44459
|
+
*/
|
|
44460
|
+
this.applyInitialRelevancySort$ = createEffect(() => this.facade.searchParams$.pipe(take(1), tap$1((filters) => {
|
|
44461
|
+
const relevancySort = sortByToString(SortByEnum.RELEVANCY);
|
|
44462
|
+
if (filters['q'] &&
|
|
44463
|
+
(!Array.isArray(filters['q']) || filters['q'].length > 0) &&
|
|
44464
|
+
!filters[ROUTE_PARAMS.SORT]) {
|
|
44465
|
+
this.facade.updateSearch({
|
|
44466
|
+
...filters,
|
|
44467
|
+
[ROUTE_PARAMS.SORT]: relevancySort,
|
|
44468
|
+
});
|
|
44469
|
+
}
|
|
44470
|
+
})), { dispatch: false });
|
|
44352
44471
|
/**
|
|
44353
44472
|
* This effect will load the metadata when a navigation to
|
|
44354
44473
|
* a metadata record happens
|
|
@@ -44449,8 +44568,10 @@ class RouterSearchService {
|
|
|
44449
44568
|
});
|
|
44450
44569
|
}
|
|
44451
44570
|
async setFilters(newFilters) {
|
|
44452
|
-
|
|
44571
|
+
let sortBy = await firstValueFrom(this.searchFacade.sortBy$);
|
|
44453
44572
|
const fieldSearchParams = await firstValueFrom(this.fieldsService.readFieldValuesFromFilters(newFilters));
|
|
44573
|
+
// apply relevancy sort if a full text criteria is given
|
|
44574
|
+
sortBy = newFilters['any'] ? SortByEnum.RELEVANCY : sortBy;
|
|
44454
44575
|
this.facade.setSearch({
|
|
44455
44576
|
...fieldSearchParams,
|
|
44456
44577
|
[ROUTE_PARAMS.SORT]: sortBy ? sortByToString(sortBy) : undefined,
|
|
@@ -44459,7 +44580,13 @@ class RouterSearchService {
|
|
|
44459
44580
|
async updateFilters(newFilters) {
|
|
44460
44581
|
const currentFilters = await firstValueFrom(this.searchFacade.searchFilters$);
|
|
44461
44582
|
const updatedFilters = { ...currentFilters, ...newFilters };
|
|
44462
|
-
|
|
44583
|
+
let newParams = await firstValueFrom(this.fieldsService.readFieldValuesFromFilters(updatedFilters));
|
|
44584
|
+
if (newFilters['any']) {
|
|
44585
|
+
newParams = {
|
|
44586
|
+
...newParams,
|
|
44587
|
+
[ROUTE_PARAMS.SORT]: sortByToString(SortByEnum.RELEVANCY),
|
|
44588
|
+
};
|
|
44589
|
+
}
|
|
44463
44590
|
this.facade.updateSearch(newParams);
|
|
44464
44591
|
}
|
|
44465
44592
|
setSortBy(sortBy) {
|
|
@@ -44519,5 +44646,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
44519
44646
|
* Generated bundle index. Do not edit.
|
|
44520
44647
|
*/
|
|
44521
44648
|
|
|
44522
|
-
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, 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 };
|
|
44649
|
+
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 };
|
|
44523
44650
|
//# sourceMappingURL=geonetwork-ui.mjs.map
|