geonetwork-ui 2.9.0-dev.2757b04b7 → 2.9.0-dev.36b986bfb
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 +688 -553
- 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 -7
- package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +5 -1
- 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 +25 -8
- 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/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 +15 -3
- package/src/libs/feature/router/src/lib/default/state/router.effects.ts +40 -4
- package/src/libs/feature/router/src/lib/default/state/router.facade.ts +2 -0
- package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +1 -0
- package/src/libs/feature/search/src/lib/state/reducer.ts +4 -0
- package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +9 -3
- package/src/libs/feature/search/src/lib/utils/service/fields.ts +5 -5
- package/src/libs/feature/search/src/lib/utils/service/search.service.ts +2 -0
- 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/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';
|
|
@@ -18970,11 +18970,13 @@ var de = {
|
|
|
18970
18970
|
"map.ogc.urlInput.hint": "Die URL des OGC API-Dienstes eingeben",
|
|
18971
18971
|
"map.select.layer": "Datenquelle",
|
|
18972
18972
|
"map.select.style": "Style",
|
|
18973
|
+
"map.style.default": "Standard",
|
|
18973
18974
|
"map.wfs.urlInput.hint": "Die WFS URL eingeben",
|
|
18974
18975
|
"map.wms.urlInput.hint": "Die WMS URL eingeben",
|
|
18975
18976
|
"multiselect.filter.placeholder": "Suche",
|
|
18976
18977
|
"nav.back": "Zurück",
|
|
18977
18978
|
"navbar.mobile.menuTitle": "Schnellzugriff",
|
|
18979
|
+
"ogc.geojson.notsupported": "Dieser OGC API-Dienst unterstützt das GeoJSON-Format nicht.",
|
|
18978
18980
|
"ogc.unreachable.unknown": "Der Dienst konnte nicht erreicht werden",
|
|
18979
18981
|
"organisation.filter.placeholder": "Ergebnisse filtern",
|
|
18980
18982
|
"organisation.sort.sortBy": "Sortieren nach:",
|
|
@@ -19060,7 +19062,7 @@ var de = {
|
|
|
19060
19062
|
"record.metadata.download": "Herunterladen",
|
|
19061
19063
|
"record.metadata.feature.catalog": "Attributkatalog",
|
|
19062
19064
|
"record.metadata.formats": "Formate",
|
|
19063
|
-
"record.metadata.isGeographical": "
|
|
19065
|
+
"record.metadata.isGeographical": "geographischer Datensatz",
|
|
19064
19066
|
"record.metadata.keywords": "Stichworte",
|
|
19065
19067
|
"record.metadata.languages": "Sprachen",
|
|
19066
19068
|
"record.metadata.link.postgis.table": "Tabelle:",
|
|
@@ -19191,6 +19193,7 @@ var de = {
|
|
|
19191
19193
|
"search.filters.producerOrg": "Herausgeber",
|
|
19192
19194
|
"search.filters.publicationYear": "Veröffentlichungsjahr",
|
|
19193
19195
|
"search.filters.publisherOrg": "Vertreiber",
|
|
19196
|
+
"search.filters.recordKind": "",
|
|
19194
19197
|
"search.filters.recordKind.all": "Alle",
|
|
19195
19198
|
"search.filters.recordKind.dataset": "Datensätze",
|
|
19196
19199
|
"search.filters.recordKind.reuse": "Wiederverwendungen",
|
|
@@ -19229,8 +19232,8 @@ var de = {
|
|
|
19229
19232
|
"service.metadata.spatialExtent": "Räumliche Ausdehnung",
|
|
19230
19233
|
"share.tab.permalink": "Teilen",
|
|
19231
19234
|
"share.tab.webComponent": "Integrieren",
|
|
19232
|
-
"stac.filter.reset": "",
|
|
19233
19235
|
"stac.filter.enable": "",
|
|
19236
|
+
"stac.filter.reset": "",
|
|
19234
19237
|
"stac.results.noResults": "Ihre Suchfilter lieferten keine Ergebnisse",
|
|
19235
19238
|
"table.loading.data": "Daten werden geladen...",
|
|
19236
19239
|
"table.object.count": "Objekte in diesem Datensatz",
|
|
@@ -19249,7 +19252,7 @@ var de = {
|
|
|
19249
19252
|
"wfs.feature.limit": "Zu viele Features, um den WFS-Layer anzuzeigen!",
|
|
19250
19253
|
"wfs.featuretype.notfound": "Kein passender Feature-Typ wurde im Dienst gefunden",
|
|
19251
19254
|
"wfs.geojsongml.notsupported": "Dieser Dienst unterstützt das GeoJSON- oder GML-Format nicht",
|
|
19252
|
-
"wfs.unreachable.cors": "Der Dienst
|
|
19255
|
+
"wfs.unreachable.cors": "Der Remote-Dienst ist nicht für den Datenempfang (CORS) konfiguriert",
|
|
19253
19256
|
"wfs.unreachable.http": "Der Dienst hat einen HTTP-Fehler zurückgegeben",
|
|
19254
19257
|
"wfs.unreachable.unknown": "Der Dienst konnte nicht erreicht werden"
|
|
19255
19258
|
};
|
|
@@ -19640,11 +19643,13 @@ var en = {
|
|
|
19640
19643
|
"map.ogc.urlInput.hint": "Enter OGC API service URL",
|
|
19641
19644
|
"map.select.layer": "Data source",
|
|
19642
19645
|
"map.select.style": "Style",
|
|
19646
|
+
"map.style.default": "Default",
|
|
19643
19647
|
"map.wfs.urlInput.hint": "Enter WFS service URL",
|
|
19644
19648
|
"map.wms.urlInput.hint": "Enter WMS service URL",
|
|
19645
19649
|
"multiselect.filter.placeholder": "Search",
|
|
19646
19650
|
"nav.back": "Back",
|
|
19647
19651
|
"navbar.mobile.menuTitle": "Quick access",
|
|
19652
|
+
"ogc.geojson.notsupported": "This OGC API does not support the GeoJSON format",
|
|
19648
19653
|
"ogc.unreachable.unknown": "The service could not be reached",
|
|
19649
19654
|
"organisation.filter.placeholder": "Filter results",
|
|
19650
19655
|
"organisation.sort.sortBy": "Sort by:",
|
|
@@ -19672,9 +19677,9 @@ var en = {
|
|
|
19672
19677
|
"record.feature.catalog.number.total.attribute": "Total amount of objects",
|
|
19673
19678
|
"record.feature.catalog.number.total.object": "Total amount of attributes",
|
|
19674
19679
|
"record.feature.limit": "Preview disabled due to too many elements",
|
|
19675
|
-
"record.kind.dataset": "
|
|
19676
|
-
"record.kind.reuse": "
|
|
19677
|
-
"record.kind.service": "
|
|
19680
|
+
"record.kind.dataset": "dataset",
|
|
19681
|
+
"record.kind.reuse": "reuse",
|
|
19682
|
+
"record.kind.service": "service",
|
|
19678
19683
|
"record.metadata.about": "Description",
|
|
19679
19684
|
"record.metadata.api": "API",
|
|
19680
19685
|
"record.metadata.api.accessServiceProtocol.GPFDL": "GPFDL",
|
|
@@ -19730,7 +19735,7 @@ var en = {
|
|
|
19730
19735
|
"record.metadata.download": "Downloads",
|
|
19731
19736
|
"record.metadata.feature.catalog": "Feature catalog",
|
|
19732
19737
|
"record.metadata.formats": "Formats",
|
|
19733
|
-
"record.metadata.isGeographical": "
|
|
19738
|
+
"record.metadata.isGeographical": "geographic dataset",
|
|
19734
19739
|
"record.metadata.keywords": "Keywords",
|
|
19735
19740
|
"record.metadata.languages": "Languages",
|
|
19736
19741
|
"record.metadata.link.postgis.table": "table :",
|
|
@@ -19920,7 +19925,7 @@ var en = {
|
|
|
19920
19925
|
"wfs.feature.limit": "Too many features to display the WFS layer!",
|
|
19921
19926
|
"wfs.featuretype.notfound": "No matching feature type was found in the service",
|
|
19922
19927
|
"wfs.geojsongml.notsupported": "This service does not support the GeoJSON or GML format",
|
|
19923
|
-
"wfs.unreachable.cors": "The service
|
|
19928
|
+
"wfs.unreachable.cors": "The remote service is not configured to allow data retrieval (CORS)",
|
|
19924
19929
|
"wfs.unreachable.http": "The service returned an HTTP error",
|
|
19925
19930
|
"wfs.unreachable.unknown": "The service could not be reached"
|
|
19926
19931
|
};
|
|
@@ -20311,11 +20316,13 @@ var es = {
|
|
|
20311
20316
|
"map.ogc.urlInput.hint": "",
|
|
20312
20317
|
"map.select.layer": "",
|
|
20313
20318
|
"map.select.style": "",
|
|
20319
|
+
"map.style.default": "Por defecto",
|
|
20314
20320
|
"map.wfs.urlInput.hint": "",
|
|
20315
20321
|
"map.wms.urlInput.hint": "",
|
|
20316
20322
|
"multiselect.filter.placeholder": "",
|
|
20317
20323
|
"nav.back": "",
|
|
20318
20324
|
"navbar.mobile.menuTitle": "Acceso rápido",
|
|
20325
|
+
"ogc.geojson.notsupported": "",
|
|
20319
20326
|
"ogc.unreachable.unknown": "",
|
|
20320
20327
|
"organisation.filter.placeholder": "",
|
|
20321
20328
|
"organisation.sort.sortBy": "",
|
|
@@ -20982,11 +20989,13 @@ var fr = {
|
|
|
20982
20989
|
"map.ogc.urlInput.hint": "Entrez l'URL du service OGC API",
|
|
20983
20990
|
"map.select.layer": "Source de données",
|
|
20984
20991
|
"map.select.style": "Style",
|
|
20992
|
+
"map.style.default": "Par défaut",
|
|
20985
20993
|
"map.wfs.urlInput.hint": "Entrez l'URL du service WFS",
|
|
20986
20994
|
"map.wms.urlInput.hint": "Entrez l'URL du service WMS",
|
|
20987
20995
|
"multiselect.filter.placeholder": "Rechercher",
|
|
20988
20996
|
"nav.back": "Retour",
|
|
20989
20997
|
"navbar.mobile.menuTitle": "Navigation rapide",
|
|
20998
|
+
"ogc.geojson.notsupported": "Le service OGC API ne supporte pas le format GeoJSON",
|
|
20990
20999
|
"ogc.unreachable.unknown": "Le service n'est pas accessible",
|
|
20991
21000
|
"organisation.filter.placeholder": "Filtrer les résultats",
|
|
20992
21001
|
"organisation.sort.sortBy": "Trier par :",
|
|
@@ -21014,9 +21023,9 @@ var fr = {
|
|
|
21014
21023
|
"record.feature.catalog.number.total.attribute": "Nombre total d'attributs",
|
|
21015
21024
|
"record.feature.catalog.number.total.object": "Nombre total d'objets",
|
|
21016
21025
|
"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": "
|
|
21026
|
+
"record.kind.dataset": "donnée",
|
|
21027
|
+
"record.kind.reuse": "réutilisation",
|
|
21028
|
+
"record.kind.service": "service",
|
|
21020
21029
|
"record.metadata.about": "A propos",
|
|
21021
21030
|
"record.metadata.api": "API",
|
|
21022
21031
|
"record.metadata.api.accessServiceProtocol.GPFDL": "",
|
|
@@ -21072,7 +21081,7 @@ var fr = {
|
|
|
21072
21081
|
"record.metadata.download": "Téléchargements",
|
|
21073
21082
|
"record.metadata.feature.catalog": "Catalogue d'attributs",
|
|
21074
21083
|
"record.metadata.formats": "Formats",
|
|
21075
|
-
"record.metadata.isGeographical": "
|
|
21084
|
+
"record.metadata.isGeographical": "donnée géographique",
|
|
21076
21085
|
"record.metadata.keywords": "Mots-clés",
|
|
21077
21086
|
"record.metadata.languages": "Langues",
|
|
21078
21087
|
"record.metadata.link.postgis.table": "table :",
|
|
@@ -21262,7 +21271,7 @@ var fr = {
|
|
|
21262
21271
|
"wfs.feature.limit": "Trop d'objets pour afficher la couche WFS !",
|
|
21263
21272
|
"wfs.featuretype.notfound": "La classe d'objets n'a pas été trouvée dans le service",
|
|
21264
21273
|
"wfs.geojsongml.notsupported": "Le service ne supporte pas le format GeoJSON ou GML",
|
|
21265
|
-
"wfs.unreachable.cors": "Le service n'est pas
|
|
21274
|
+
"wfs.unreachable.cors": "Le service distant n'est pas configuré pour autoriser la consommation des données (CORS)",
|
|
21266
21275
|
"wfs.unreachable.http": "Le service a retourné une erreur HTTP",
|
|
21267
21276
|
"wfs.unreachable.unknown": "Le service n'est pas accessible"
|
|
21268
21277
|
};
|
|
@@ -21653,11 +21662,13 @@ var it = {
|
|
|
21653
21662
|
"map.ogc.urlInput.hint": "Inserisci URL del servizio OGC API",
|
|
21654
21663
|
"map.select.layer": "Sorgente dati",
|
|
21655
21664
|
"map.select.style": "Style",
|
|
21665
|
+
"map.style.default": "Predefinito",
|
|
21656
21666
|
"map.wfs.urlInput.hint": "Inserisci URL del servizio WFS",
|
|
21657
21667
|
"map.wms.urlInput.hint": "Inserisci URL del servizio WMS",
|
|
21658
21668
|
"multiselect.filter.placeholder": "Cerca",
|
|
21659
21669
|
"nav.back": "Indietro",
|
|
21660
21670
|
"navbar.mobile.menuTitle": "Accesso rapido",
|
|
21671
|
+
"ogc.geojson.notsupported": "Il servizio OGC API non supporta il formato GeoJSON.",
|
|
21661
21672
|
"ogc.unreachable.unknown": "Il servizio non è accessibile",
|
|
21662
21673
|
"organisation.filter.placeholder": "Filtra i risultati",
|
|
21663
21674
|
"organisation.sort.sortBy": "Ordina per:",
|
|
@@ -21685,9 +21696,9 @@ var it = {
|
|
|
21685
21696
|
"record.feature.catalog.number.total.attribute": "Quantità totale di oggetti",
|
|
21686
21697
|
"record.feature.catalog.number.total.object": "Quantità totale di attributi",
|
|
21687
21698
|
"record.feature.limit": "La visualizzazione è stata disabilitata a causa di troppi elementi ",
|
|
21688
|
-
"record.kind.dataset": "
|
|
21689
|
-
"record.kind.reuse": "
|
|
21690
|
-
"record.kind.service": "
|
|
21699
|
+
"record.kind.dataset": "dataset",
|
|
21700
|
+
"record.kind.reuse": "riutilizzato",
|
|
21701
|
+
"record.kind.service": "servizio",
|
|
21691
21702
|
"record.metadata.about": "Descrizione",
|
|
21692
21703
|
"record.metadata.api": "API",
|
|
21693
21704
|
"record.metadata.api.accessServiceProtocol.GPFDL": "",
|
|
@@ -21743,7 +21754,7 @@ var it = {
|
|
|
21743
21754
|
"record.metadata.download": "Download",
|
|
21744
21755
|
"record.metadata.feature.catalog": "Catalogo dei oggetti",
|
|
21745
21756
|
"record.metadata.formats": "Formati",
|
|
21746
|
-
"record.metadata.isGeographical": "
|
|
21757
|
+
"record.metadata.isGeographical": "dati geografici",
|
|
21747
21758
|
"record.metadata.keywords": "Parole chiave",
|
|
21748
21759
|
"record.metadata.languages": "Lingue",
|
|
21749
21760
|
"record.metadata.link.postgis.table": "",
|
|
@@ -21933,7 +21944,7 @@ var it = {
|
|
|
21933
21944
|
"wfs.feature.limit": "Troppi oggetti per visualizzare il WFS layer!",
|
|
21934
21945
|
"wfs.featuretype.notfound": "La classe di oggetto non è stata trovata nel servizio",
|
|
21935
21946
|
"wfs.geojsongml.notsupported": "Il servizio non supporta il formato GeoJSON o GML",
|
|
21936
|
-
"wfs.unreachable.cors": "Il servizio non è
|
|
21947
|
+
"wfs.unreachable.cors": "Il servizio remoto non è configurato per consentire il consumo di dati (CORS)",
|
|
21937
21948
|
"wfs.unreachable.http": "Il servizio ha restituito un errore HTTP",
|
|
21938
21949
|
"wfs.unreachable.unknown": "Il servizio non è accessibile"
|
|
21939
21950
|
};
|
|
@@ -22324,11 +22335,13 @@ var nl = {
|
|
|
22324
22335
|
"map.ogc.urlInput.hint": "",
|
|
22325
22336
|
"map.select.layer": "",
|
|
22326
22337
|
"map.select.style": "",
|
|
22338
|
+
"map.style.default": "Standaard",
|
|
22327
22339
|
"map.wfs.urlInput.hint": "",
|
|
22328
22340
|
"map.wms.urlInput.hint": "",
|
|
22329
22341
|
"multiselect.filter.placeholder": "",
|
|
22330
22342
|
"nav.back": "",
|
|
22331
22343
|
"navbar.mobile.menuTitle": "",
|
|
22344
|
+
"ogc.geojson.notsupported": "",
|
|
22332
22345
|
"ogc.unreachable.unknown": "",
|
|
22333
22346
|
"organisation.filter.placeholder": "",
|
|
22334
22347
|
"organisation.sort.sortBy": "",
|
|
@@ -22995,11 +23008,13 @@ var pt = {
|
|
|
22995
23008
|
"map.ogc.urlInput.hint": "",
|
|
22996
23009
|
"map.select.layer": "",
|
|
22997
23010
|
"map.select.style": "",
|
|
23011
|
+
"map.style.default": "Padrão",
|
|
22998
23012
|
"map.wfs.urlInput.hint": "",
|
|
22999
23013
|
"map.wms.urlInput.hint": "",
|
|
23000
23014
|
"multiselect.filter.placeholder": "",
|
|
23001
23015
|
"nav.back": "",
|
|
23002
23016
|
"navbar.mobile.menuTitle": "",
|
|
23017
|
+
"ogc.geojson.notsupported": "",
|
|
23003
23018
|
"ogc.unreachable.unknown": "",
|
|
23004
23019
|
"organisation.filter.placeholder": "",
|
|
23005
23020
|
"organisation.sort.sortBy": "",
|
|
@@ -23666,11 +23681,13 @@ var sk = {
|
|
|
23666
23681
|
"map.ogc.urlInput.hint": "",
|
|
23667
23682
|
"map.select.layer": "Zdroj dát",
|
|
23668
23683
|
"map.select.style": "",
|
|
23684
|
+
"map.style.default": "Predvolené",
|
|
23669
23685
|
"map.wfs.urlInput.hint": "Zadajte URL adresu služby WFS",
|
|
23670
23686
|
"map.wms.urlInput.hint": "Zadajte URL adresu služby WMS",
|
|
23671
23687
|
"multiselect.filter.placeholder": "Hľadať",
|
|
23672
23688
|
"nav.back": "Späť",
|
|
23673
23689
|
"navbar.mobile.menuTitle": "",
|
|
23690
|
+
"ogc.geojson.notsupported": "",
|
|
23674
23691
|
"ogc.unreachable.unknown": "So službou sa nedalo spojiť",
|
|
23675
23692
|
"organisation.filter.placeholder": "Filtrovať výsledky",
|
|
23676
23693
|
"organisation.sort.sortBy": "Zoradiť podľa:",
|
|
@@ -23946,7 +23963,7 @@ var sk = {
|
|
|
23946
23963
|
"wfs.feature.limit": "",
|
|
23947
23964
|
"wfs.featuretype.notfound": "V službe nebol nájdený žiadny zodpovedajúci typ funkcie",
|
|
23948
23965
|
"wfs.geojsongml.notsupported": "Táto služba nepodporuje formát GeoJSON alebo GML",
|
|
23949
|
-
"wfs.unreachable.cors": "
|
|
23966
|
+
"wfs.unreachable.cors": "Vzdialená služba nie je nakonfigurovaná tak, aby povoľovala spotrebu dát (CORS)",
|
|
23950
23967
|
"wfs.unreachable.http": "Služba vrátila chybu HTTP",
|
|
23951
23968
|
"wfs.unreachable.unknown": "So službou sa nedalo spojiť"
|
|
23952
23969
|
};
|
|
@@ -24520,34 +24537,23 @@ class ThemeService {
|
|
|
24520
24537
|
static getColor(name) {
|
|
24521
24538
|
return document.documentElement.style.getPropertyValue(`--color-${name}`);
|
|
24522
24539
|
}
|
|
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
24540
|
static applyCssVariables(primaryColor, secondaryColor, mainColor, backgroundColor, mainFont, titleFont, fontsStylesheetUrl) {
|
|
24538
|
-
const applyColor = (name, color) => {
|
|
24541
|
+
const applyColor = (name, color, includeRawValues) => {
|
|
24539
24542
|
document.documentElement.style.setProperty(`--color-${name}`, color.css());
|
|
24543
|
+
if (includeRawValues) {
|
|
24544
|
+
document.documentElement.style.setProperty(`--color-raw-${name}`, color.css().replace(/^rgba?\((.*)\)/, '$1'));
|
|
24545
|
+
}
|
|
24540
24546
|
};
|
|
24541
24547
|
const black = chroma('black');
|
|
24542
24548
|
const white = chroma('white');
|
|
24543
|
-
applyColor('primary', chroma(primaryColor));
|
|
24549
|
+
applyColor('primary', chroma(primaryColor), true);
|
|
24544
24550
|
applyColor('primary-lighter', chroma.scale([primaryColor, white]).mode('lab')(0.3));
|
|
24545
24551
|
applyColor('primary-lightest', chroma.scale([primaryColor, white]).mode('lab')(0.6));
|
|
24546
24552
|
applyColor('primary-white', chroma.scale([primaryColor, white]).mode('lab')(0.85));
|
|
24547
24553
|
applyColor('primary-darker', chroma.scale([primaryColor, black]).mode('lab')(0.3));
|
|
24548
24554
|
applyColor('primary-darkest', chroma.scale([primaryColor, black]).mode('lab')(0.6));
|
|
24549
24555
|
applyColor('primary-black', chroma.scale([primaryColor, black]).mode('lab')(0.85));
|
|
24550
|
-
applyColor('secondary', chroma(secondaryColor));
|
|
24556
|
+
applyColor('secondary', chroma(secondaryColor), true);
|
|
24551
24557
|
applyColor('secondary-lighter', chroma.scale([secondaryColor, white]).mode('lab')(0.3));
|
|
24552
24558
|
applyColor('secondary-lightest', chroma.scale([secondaryColor, white]).mode('lab')(0.6));
|
|
24553
24559
|
applyColor('secondary-white', chroma.scale([secondaryColor, white]).mode('lab')(0.85));
|
|
@@ -25511,7 +25517,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
25511
25517
|
}] } });
|
|
25512
25518
|
|
|
25513
25519
|
var name = "geonetwork-ui";
|
|
25514
|
-
var version = "2.9.0-dev.
|
|
25520
|
+
var version = "2.9.0-dev.36b986bfb";
|
|
25515
25521
|
var engines = {
|
|
25516
25522
|
node: ">=20"
|
|
25517
25523
|
};
|
|
@@ -25551,11 +25557,11 @@ var peerDependencies = {
|
|
|
25551
25557
|
};
|
|
25552
25558
|
var dependencies = {
|
|
25553
25559
|
"@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.
|
|
25560
|
+
"@camptocamp/ogc-client": "1.3.1-dev.12086e8",
|
|
25561
|
+
"@geospatial-sdk/core": "0.0.5-dev.61",
|
|
25562
|
+
"@geospatial-sdk/geocoding": "0.0.5-dev.61",
|
|
25563
|
+
"@geospatial-sdk/legend": "0.0.5-dev.61",
|
|
25564
|
+
"@geospatial-sdk/openlayers": "0.0.5-dev.61",
|
|
25559
25565
|
"@ltd/j-toml": "~1.35.2",
|
|
25560
25566
|
"@messageformat/core": "^3.0.1",
|
|
25561
25567
|
"@ng-icons/core": "29.10.0",
|
|
@@ -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]) => {
|
|
@@ -28165,8 +28175,9 @@ function getCustomTranslations(langCode) {
|
|
|
28165
28175
|
return langCode in customTranslations ? customTranslations[langCode] : {};
|
|
28166
28176
|
}
|
|
28167
28177
|
let appConfigLoaded = false;
|
|
28168
|
-
function loadAppConfig() {
|
|
28169
|
-
|
|
28178
|
+
function loadAppConfig(configUrl = 'assets/configuration/default.toml') {
|
|
28179
|
+
console.log(`[geonetwork-ui] Loading application configuration from ${configUrl}`);
|
|
28180
|
+
return fetch(configUrl)
|
|
28170
28181
|
.then((resp) => {
|
|
28171
28182
|
if (!resp.ok)
|
|
28172
28183
|
throw new Error('Configuration file could not be loaded');
|
|
@@ -28275,6 +28286,7 @@ function loadAppConfig() {
|
|
|
28275
28286
|
'record_kind_quick_filter',
|
|
28276
28287
|
'filter_geometry_data',
|
|
28277
28288
|
'filter_geometry_url',
|
|
28289
|
+
'do_not_use_default_search_preset',
|
|
28278
28290
|
'search_preset',
|
|
28279
28291
|
'advanced_filters',
|
|
28280
28292
|
'limit',
|
|
@@ -28287,6 +28299,7 @@ function loadAppConfig() {
|
|
|
28287
28299
|
RECORD_KIND_QUICK_FILTER: parsedSearchSection.record_kind_quick_filter,
|
|
28288
28300
|
FILTER_GEOMETRY_DATA: parsedSearchSection.filter_geometry_data,
|
|
28289
28301
|
FILTER_GEOMETRY_URL: parsedSearchSection.filter_geometry_url,
|
|
28302
|
+
DO_NOT_USE_DEFAULT_SEARCH_PRESET: !!parsedSearchSection.do_not_use_default_search_preset,
|
|
28290
28303
|
SEARCH_PRESET: parsedSearchParams.map((param) => ({
|
|
28291
28304
|
sort: param.sort,
|
|
28292
28305
|
name: param.name,
|
|
@@ -28377,6 +28390,7 @@ fonts_stylesheet_url = "https://fonts.googleapis.com/css2?family=Open+Sans"
|
|
|
28377
28390
|
[search]
|
|
28378
28391
|
record_kind_quick_filter = false
|
|
28379
28392
|
filter_geometry_url = 'https://my.domain.org/geom.json'
|
|
28393
|
+
do_not_use_default_search_preset = false
|
|
28380
28394
|
advanced_filters = ['publicationYear', 'documentStandard', 'inspireKeyword', 'topic', 'license']
|
|
28381
28395
|
|
|
28382
28396
|
[[search_preset]]
|
|
@@ -29192,9 +29206,8 @@ class AutocompleteComponent {
|
|
|
29192
29206
|
ngOnChanges(changes) {
|
|
29193
29207
|
const { value } = changes;
|
|
29194
29208
|
if (value) {
|
|
29195
|
-
const previousTextValue = this.displayWithFnInternal(value.previousValue);
|
|
29196
29209
|
const currentTextValue = this.displayWithFnInternal(value.currentValue);
|
|
29197
|
-
if (
|
|
29210
|
+
if (currentTextValue !== this.control.value) {
|
|
29198
29211
|
if (currentTextValue) {
|
|
29199
29212
|
this.searchActive = true;
|
|
29200
29213
|
this.isSearchActive.emit(true);
|
|
@@ -29208,13 +29221,15 @@ class AutocompleteComponent {
|
|
|
29208
29221
|
}
|
|
29209
29222
|
}
|
|
29210
29223
|
ngOnInit() {
|
|
29211
|
-
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()));
|
|
29212
29225
|
const externalValueChange$ = this.control.valueChanges.pipe(filter$1((value) => typeof value === 'object' && value.title), map$1((item) => item.title));
|
|
29213
29226
|
// this observable emits arrays of suggestions loaded using the given action
|
|
29214
29227
|
const suggestionsFromAction = merge(newValue$.pipe(filter$1((value) => value.length >= this.minCharacterCount)), externalValueChange$).pipe(tap$1(() => {
|
|
29215
29228
|
this.searching = true;
|
|
29216
29229
|
this.error = null;
|
|
29217
|
-
}), 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) => {
|
|
29218
29233
|
// forcing the panel to open if there are suggestions
|
|
29219
29234
|
if (suggestions.length > 0 && !this.searchActive) {
|
|
29220
29235
|
this.triggerRef?.openPanel();
|
|
@@ -29275,6 +29290,7 @@ class AutocompleteComponent {
|
|
|
29275
29290
|
}
|
|
29276
29291
|
clear() {
|
|
29277
29292
|
this.inputRef.nativeElement.value = '';
|
|
29293
|
+
this.control.setValue('');
|
|
29278
29294
|
this.searchActive = false;
|
|
29279
29295
|
this.isSearchActive.emit(false);
|
|
29280
29296
|
this.inputCleared.emit();
|
|
@@ -32004,7 +32020,10 @@ function reducerSearch(state, action) {
|
|
|
32004
32020
|
},
|
|
32005
32021
|
};
|
|
32006
32022
|
}
|
|
32023
|
+
// From router.effects
|
|
32024
|
+
// From home - fuzzy-search - search.service
|
|
32007
32025
|
case SET_FILTERS: {
|
|
32026
|
+
console.log('reducerSearch - SET_FILTERS', action.payload);
|
|
32008
32027
|
return {
|
|
32009
32028
|
...state,
|
|
32010
32029
|
params: {
|
|
@@ -32025,6 +32044,7 @@ function reducerSearch(state, action) {
|
|
|
32025
32044
|
},
|
|
32026
32045
|
};
|
|
32027
32046
|
}
|
|
32047
|
+
// From results WC
|
|
32028
32048
|
case SET_SEARCH: {
|
|
32029
32049
|
return {
|
|
32030
32050
|
...state,
|
|
@@ -32534,10 +32554,12 @@ class SearchService {
|
|
|
32534
32554
|
this.facade = inject(SearchFacade);
|
|
32535
32555
|
}
|
|
32536
32556
|
setSortAndFilters(filters, sort) {
|
|
32557
|
+
console.log('SearchService - setSortAndFilters', { filters, sort });
|
|
32537
32558
|
this.setFilters(filters);
|
|
32538
32559
|
this.setSortBy(sort);
|
|
32539
32560
|
}
|
|
32540
32561
|
updateFilters(params) {
|
|
32562
|
+
console.log('SearchService - updateFilters', params);
|
|
32541
32563
|
this.facade.searchFilters$
|
|
32542
32564
|
.pipe(first$1(), map$1((filters) => ({ ...filters, ...params })))
|
|
32543
32565
|
.subscribe((filters) => this.facade.setFilters(filters));
|
|
@@ -32976,8 +32998,8 @@ class RecordKindField extends SimpleSearchField {
|
|
|
32976
32998
|
};
|
|
32977
32999
|
const presentationFormFilter = {};
|
|
32978
33000
|
if (values.includes('reuse') && !values.includes('dataset')) {
|
|
32979
|
-
|
|
32980
|
-
|
|
33001
|
+
filters['gn-ui-crossFieldFilter'] =
|
|
33002
|
+
`(resourceType:("dataset" OR "document") AND cl_presentationForm.key:("mapDigital" OR "mapHardcopy")) OR resourceType:("application" OR "interactiveMap" OR "map" OR "map/static" OR "map/interactive" OR "map-interactive" OR "map-static" OR "mapDigital" OR "mapHardcopy" OR "staticMap")`;
|
|
32981
33003
|
}
|
|
32982
33004
|
else if (values.includes('dataset') && !values.includes('reuse')) {
|
|
32983
33005
|
presentationFormFilter['mapDigital'] = false;
|
|
@@ -33070,7 +33092,12 @@ class FieldsService {
|
|
|
33070
33092
|
: [fieldValues[fieldName]];
|
|
33071
33093
|
return this.getFiltersForValues(fieldName, values);
|
|
33072
33094
|
});
|
|
33073
|
-
return forkJoin(filtersByField$).pipe(map$1((filters) =>
|
|
33095
|
+
return forkJoin(filtersByField$).pipe(map$1((filters) => {
|
|
33096
|
+
if (typeof filters === 'string') {
|
|
33097
|
+
return filters;
|
|
33098
|
+
}
|
|
33099
|
+
return filters.reduce((prev, curr) => ({ ...prev, ...curr }), {});
|
|
33100
|
+
}));
|
|
33074
33101
|
}
|
|
33075
33102
|
readFieldValuesFromFilters(filters) {
|
|
33076
33103
|
const fieldValues$ = this.supportedFields.map((fieldName) => this.getValuesForFilters(fieldName, filters).pipe(map$1((values) => ({ [fieldName]: values }))));
|
|
@@ -33127,7 +33154,7 @@ class ApiCardComponent {
|
|
|
33127
33154
|
}
|
|
33128
33155
|
}
|
|
33129
33156
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ApiCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
33130
|
-
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
|
|
33157
|
+
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: [
|
|
33131
33158
|
provideIcons({
|
|
33132
33159
|
iconoirSettings,
|
|
33133
33160
|
}),
|
|
@@ -33152,7 +33179,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
33152
33179
|
provideNgIconsConfig({
|
|
33153
33180
|
size: '1.5em',
|
|
33154
33181
|
}),
|
|
33155
|
-
], 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
|
|
33182
|
+
], 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" }]
|
|
33156
33183
|
}], propDecorators: { link: [{
|
|
33157
33184
|
type: Input
|
|
33158
33185
|
}], currentLink: [{
|
|
@@ -33754,7 +33781,7 @@ class ImageInputComponent {
|
|
|
33754
33781
|
provideNgIconsConfig({
|
|
33755
33782
|
size: '1.5rem',
|
|
33756
33783
|
}),
|
|
33757
|
-
], ngImport: i0, template: "@if (previewUrl) {\n <div class=\"w-
|
|
33784
|
+
], 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 }); }
|
|
33758
33785
|
}
|
|
33759
33786
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ImageInputComponent, decorators: [{
|
|
33760
33787
|
type: Component,
|
|
@@ -33780,7 +33807,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
33780
33807
|
provideNgIconsConfig({
|
|
33781
33808
|
size: '1.5rem',
|
|
33782
33809
|
}),
|
|
33783
|
-
], template: "@if (previewUrl) {\n <div class=\"w-
|
|
33810
|
+
], 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"] }]
|
|
33784
33811
|
}], propDecorators: { previewUrl: [{
|
|
33785
33812
|
type: Input
|
|
33786
33813
|
}], altText: [{
|
|
@@ -33999,9 +34026,9 @@ class MetadataContactComponent {
|
|
|
33999
34026
|
return this.metadata.ownerOrganization;
|
|
34000
34027
|
}
|
|
34001
34028
|
get contacts() {
|
|
34002
|
-
return ((this.metadata.kind === '
|
|
34003
|
-
? this.metadata.
|
|
34004
|
-
: this.metadata.
|
|
34029
|
+
return ((this.metadata.kind === 'service'
|
|
34030
|
+
? this.metadata.contacts
|
|
34031
|
+
: this.metadata.contactsForResource) || []);
|
|
34005
34032
|
}
|
|
34006
34033
|
get address() {
|
|
34007
34034
|
const addressParts = this.contacts[0].address
|
|
@@ -34013,7 +34040,7 @@ class MetadataContactComponent {
|
|
|
34013
34040
|
this.organizationClick.emit(this.shownOrganization);
|
|
34014
34041
|
}
|
|
34015
34042
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
34016
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: MetadataContactComponent, isStandalone: true, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div\n class=\"py-5 px-5 rounded bg-gray-100 text-black\"\n data-cy=\"metadata-organization\"\n>\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-base font-medium\" translate>record.metadata.contact</p>\n </div>\n @if (shownOrganization?.logoUrl?.href) {\n <div\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grid grid-cols-1 gap-1\">\n <div class=\"flex\">\n <div\n class=\"font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name-link\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n @if (shownOrganization?.website) {\n <div>\n <
|
|
34043
|
+
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: [
|
|
34017
34044
|
provideIcons({
|
|
34018
34045
|
matOpenInNew,
|
|
34019
34046
|
matCallOutline,
|
|
@@ -34033,7 +34060,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
34033
34060
|
matPersonOutline,
|
|
34034
34061
|
matLocationOnOutline,
|
|
34035
34062
|
}),
|
|
34036
|
-
], template: "<div\n class=\"py-5 px-5 rounded bg-gray-100 text-black\"\n data-cy=\"metadata-organization\"\n>\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-base font-medium\" translate>record.metadata.contact</p>\n </div>\n @if (shownOrganization?.logoUrl?.href) {\n <div\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grid grid-cols-1 gap-1\">\n <div class=\"flex\">\n <div\n class=\"font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name-link\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n @if (shownOrganization?.website) {\n <div>\n <
|
|
34063
|
+
], 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" }]
|
|
34037
34064
|
}], propDecorators: { metadata: [{
|
|
34038
34065
|
type: Input
|
|
34039
34066
|
}], organizationClick: [{
|
|
@@ -34533,7 +34560,7 @@ class RecordApiFormComponent {
|
|
|
34533
34560
|
}
|
|
34534
34561
|
}
|
|
34535
34562
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
34536
|
-
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
|
|
34563
|
+
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 }); }
|
|
34537
34564
|
}
|
|
34538
34565
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RecordApiFormComponent, decorators: [{
|
|
34539
34566
|
type: Component,
|
|
@@ -34544,7 +34571,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
34544
34571
|
CopyTextButtonComponent,
|
|
34545
34572
|
TranslateDirective,
|
|
34546
34573
|
MatTooltipModule,
|
|
34547
|
-
], 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
|
|
34574
|
+
], 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"] }]
|
|
34548
34575
|
}], propDecorators: { apiLink: [{
|
|
34549
34576
|
type: Input
|
|
34550
34577
|
}] } });
|
|
@@ -34647,13 +34674,12 @@ class ApplicationBannerComponent {
|
|
|
34647
34674
|
this.icon = 'matWarning';
|
|
34648
34675
|
break;
|
|
34649
34676
|
case 'light':
|
|
34650
|
-
this.msgClass =
|
|
34651
|
-
'bg-primary-opacity-10 border-primary-lightest text-black';
|
|
34677
|
+
this.msgClass = 'bg-primary/10 border-primary-lightest text-black';
|
|
34652
34678
|
this.icon = 'matInfoOutline';
|
|
34653
34679
|
break;
|
|
34654
34680
|
case 'secondary':
|
|
34655
34681
|
default:
|
|
34656
|
-
this.msgClass = 'bg-primary
|
|
34682
|
+
this.msgClass = 'bg-primary/50 border-primary-darker text-black';
|
|
34657
34683
|
this.icon = 'matWarningAmberOutline';
|
|
34658
34684
|
break;
|
|
34659
34685
|
}
|
|
@@ -34742,7 +34768,7 @@ class InternalLinkCardComponent {
|
|
|
34742
34768
|
provideNgIconsConfig({
|
|
34743
34769
|
size: '1.2em',
|
|
34744
34770
|
}),
|
|
34745
|
-
], 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
|
|
34771
|
+
], 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"] }] }); }
|
|
34746
34772
|
}
|
|
34747
34773
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: InternalLinkCardComponent, decorators: [{
|
|
34748
34774
|
type: Component,
|
|
@@ -34762,7 +34788,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
34762
34788
|
provideNgIconsConfig({
|
|
34763
34789
|
size: '1.2em',
|
|
34764
34790
|
}),
|
|
34765
|
-
], 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
|
|
34791
|
+
], 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"] }]
|
|
34766
34792
|
}], propDecorators: { record: [{
|
|
34767
34793
|
type: Input
|
|
34768
34794
|
}], linkTarget: [{
|
|
@@ -34900,7 +34926,7 @@ class ServiceCapabilitiesComponent {
|
|
|
34900
34926
|
: `h-8 rounded-lg`;
|
|
34901
34927
|
}
|
|
34902
34928
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ServiceCapabilitiesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
34903
|
-
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
|
|
34929
|
+
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: [
|
|
34904
34930
|
provideIcons({
|
|
34905
34931
|
iconoirSearch,
|
|
34906
34932
|
matInfoOutline,
|
|
@@ -34924,7 +34950,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
34924
34950
|
matInfoOutline,
|
|
34925
34951
|
matClose,
|
|
34926
34952
|
}),
|
|
34927
|
-
], template: "@if (apiLinks.length > 0) {\n <div style=\"height: 652px\" id=\"preview\">\n <div class=\"bg-primary
|
|
34953
|
+
], 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" }]
|
|
34928
34954
|
}], propDecorators: { apiLinks: [{
|
|
34929
34955
|
type: Input
|
|
34930
34956
|
}] } });
|
|
@@ -35313,7 +35339,7 @@ class RecordPreviewFeedComponent extends RecordPreviewComponent {
|
|
|
35313
35339
|
return this.timeFormat.format(this.record.recordCreated, Date.now());
|
|
35314
35340
|
}
|
|
35315
35341
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RecordPreviewFeedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
35316
|
-
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
|
|
35342
|
+
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: [
|
|
35317
35343
|
provideIcons({
|
|
35318
35344
|
matMapOutline,
|
|
35319
35345
|
matCloudDownloadOutline,
|
|
@@ -35343,7 +35369,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
35343
35369
|
provideNgIconsConfig({
|
|
35344
35370
|
size: '1.5em',
|
|
35345
35371
|
}),
|
|
35346
|
-
], 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
|
|
35372
|
+
], 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"] }]
|
|
35347
35373
|
}], ctorParameters: () => [] });
|
|
35348
35374
|
|
|
35349
35375
|
class RecordPreviewListComponent extends RecordPreviewComponent {
|
|
@@ -36136,6 +36162,7 @@ class FuzzySearchComponent {
|
|
|
36136
36162
|
this.inputSubmitted.emit(any);
|
|
36137
36163
|
}
|
|
36138
36164
|
else {
|
|
36165
|
+
console.log('FuzzySearchComponent - handleInputSubmission', any);
|
|
36139
36166
|
this.searchService.updateFilters({ any });
|
|
36140
36167
|
}
|
|
36141
36168
|
}
|
|
@@ -38225,6 +38252,7 @@ marker('dataset.error.forbidden');
|
|
|
38225
38252
|
marker('wfs.unreachable.unknown');
|
|
38226
38253
|
marker('wfs.featuretype.notfound');
|
|
38227
38254
|
marker('wfs.geojsongml.notsupported');
|
|
38255
|
+
marker('ogc.geojson.notsupported');
|
|
38228
38256
|
marker('ogc.unreachable.unknown');
|
|
38229
38257
|
marker('dataset.error.network');
|
|
38230
38258
|
marker('dataset.error.http');
|
|
@@ -38358,12 +38386,12 @@ class DataService {
|
|
|
38358
38386
|
throw new Error(`ogc.unreachable.unknown`);
|
|
38359
38387
|
});
|
|
38360
38388
|
}
|
|
38361
|
-
async getItemsFromOgcApi(url) {
|
|
38389
|
+
async getItemsFromOgcApi(url, limit) {
|
|
38362
38390
|
const endpoint = new OgcApiEndpoint(url);
|
|
38363
38391
|
return await endpoint.featureCollections
|
|
38364
38392
|
.then((collections) => {
|
|
38365
38393
|
return collections.length
|
|
38366
|
-
? endpoint.getCollectionItems(collections[0])
|
|
38394
|
+
? endpoint.getCollectionItems(collections[0], limit)
|
|
38367
38395
|
: null;
|
|
38368
38396
|
})
|
|
38369
38397
|
.catch(() => {
|
|
@@ -38452,12 +38480,16 @@ class DataService {
|
|
|
38452
38480
|
else if (link.type === 'service' &&
|
|
38453
38481
|
link.accessServiceProtocol === 'ogcFeatures') {
|
|
38454
38482
|
return from(this.getDownloadUrlsFromOgcApi(link.url.href)).pipe(switchMap$1((collectionInfo) => {
|
|
38455
|
-
const
|
|
38456
|
-
|
|
38457
|
-
|
|
38458
|
-
|
|
38459
|
-
|
|
38483
|
+
const isMimeTypeJson = (mimeType) => {
|
|
38484
|
+
return mimeType.toLowerCase().indexOf('json') > -1;
|
|
38485
|
+
};
|
|
38486
|
+
const geojsonUrl = collectionInfo.bulkDownloadLinks[Object.keys(collectionInfo.bulkDownloadLinks).find((mimeType) => isMimeTypeJson(mimeType))];
|
|
38487
|
+
if (!geojsonUrl) {
|
|
38488
|
+
return throwError(() => 'ogc.geojson.notsupported');
|
|
38460
38489
|
}
|
|
38490
|
+
const urlWithoutLimit = new URL(geojsonUrl);
|
|
38491
|
+
urlWithoutLimit.searchParams.delete('limit');
|
|
38492
|
+
return openDataset(urlWithoutLimit.toString(), 'geojson', undefined, cacheActive);
|
|
38461
38493
|
}));
|
|
38462
38494
|
}
|
|
38463
38495
|
return throwError(() => 'protocol not supported');
|
|
@@ -39134,7 +39166,7 @@ class ChartViewComponent {
|
|
|
39134
39166
|
this.changeDetector.detectChanges();
|
|
39135
39167
|
}
|
|
39136
39168
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ChartViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
39137
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ChartViewComponent, isStandalone: true, selector: "gn-ui-chart-view", inputs: { featureCatalog: "featureCatalog", cacheActive: "cacheActive", link: "link", aggregation: "aggregation", xProperty: "xProperty", yProperty: "yProperty", chartType: "chartType", userChartConfig: "userChartConfig" }, outputs: { chartConfig$: "chartConfig$" }, ngImport: i0, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n @if (yChoices$ | async; as yChoices) {\n
|
|
39169
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ChartViewComponent, isStandalone: true, selector: "gn-ui-chart-view", inputs: { featureCatalog: "featureCatalog", cacheActive: "cacheActive", link: "link", aggregation: "aggregation", xProperty: "xProperty", yProperty: "yProperty", chartType: "chartType", userChartConfig: "userChartConfig" }, outputs: { chartConfig$: "chartConfig$" }, ngImport: i0, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n @if (yChoices$ | async; as yChoices) {\n <gn-ui-dropdown-selector\n class=\"basis-1/4 select-y-prop\"\n [choices]=\"yChoices\"\n [disabled]=\"isCountAggregation\"\n (selectValue)=\"yProperty$.next($event)\"\n [selected]=\"yProperty$.value\"\n [title]=\"'chart.dropdown.yProperty' | translate\"\n ></gn-ui-dropdown-selector>\n }\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"aggregationChoices\"\n class=\"aggregation-choices\"\n (selectValue)=\"aggregation$.next($event)\"\n [selected]=\"aggregation$.value\"\n [title]=\"'chart.dropdown.aggregation' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n <div\n class=\"relative h-full mt-2 bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n @if (!error) {\n <gn-ui-chart\n [data]=\"chartData$ | async\"\n [type]=\"chartType$.value\"\n [prettyLabel]=\"prettyLabel$ | async\"\n [labelProperty]=\"labelProperty\"\n [valueProperty]=\"valueProperty\"\n ></gn-ui-chart>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'chart.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: ChartComponent, selector: "gn-ui-chart", inputs: ["data", "labelProperty", "prettyLabel", "valueProperty", "secondaryValueProperty", "type"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
39138
39170
|
}
|
|
39139
39171
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ChartViewComponent, decorators: [{
|
|
39140
39172
|
type: Component,
|
|
@@ -39145,7 +39177,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
39145
39177
|
LoadingMaskComponent,
|
|
39146
39178
|
PopupAlertComponent,
|
|
39147
39179
|
TranslatePipe,
|
|
39148
|
-
], standalone: true, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n @if (yChoices$ | async; as yChoices) {\n
|
|
39180
|
+
], standalone: true, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n @if (yChoices$ | async; as yChoices) {\n <gn-ui-dropdown-selector\n class=\"basis-1/4 select-y-prop\"\n [choices]=\"yChoices\"\n [disabled]=\"isCountAggregation\"\n (selectValue)=\"yProperty$.next($event)\"\n [selected]=\"yProperty$.value\"\n [title]=\"'chart.dropdown.yProperty' | translate\"\n ></gn-ui-dropdown-selector>\n }\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"aggregationChoices\"\n class=\"aggregation-choices\"\n (selectValue)=\"aggregation$.next($event)\"\n [selected]=\"aggregation$.value\"\n [title]=\"'chart.dropdown.aggregation' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n <div\n class=\"relative h-full mt-2 bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n @if (!error) {\n <gn-ui-chart\n [data]=\"chartData$ | async\"\n [type]=\"chartType$.value\"\n [prettyLabel]=\"prettyLabel$ | async\"\n [labelProperty]=\"labelProperty\"\n [valueProperty]=\"valueProperty\"\n ></gn-ui-chart>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'chart.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n</div>\n" }]
|
|
39149
39181
|
}], propDecorators: { featureCatalog: [{
|
|
39150
39182
|
type: Input
|
|
39151
39183
|
}], cacheActive: [{
|
|
@@ -39458,7 +39490,7 @@ class MdViewFacade {
|
|
|
39458
39490
|
if (this.linkClassifier.hasUsage(link, LinkUsage.GEODATA)) {
|
|
39459
39491
|
if (link.type === 'service' &&
|
|
39460
39492
|
link.accessServiceProtocol === 'ogcFeatures') {
|
|
39461
|
-
return from(this.dataService.getItemsFromOgcApi(link.url.href)).pipe(map$1((collectionRecords) => {
|
|
39493
|
+
return from(this.dataService.getItemsFromOgcApi(link.url.href, 1)).pipe(map$1((collectionRecords) => {
|
|
39462
39494
|
return collectionRecords &&
|
|
39463
39495
|
collectionRecords[0] &&
|
|
39464
39496
|
collectionRecords[0].geometry
|
|
@@ -39876,6 +39908,7 @@ class ExternalViewerButtonComponent {
|
|
|
39876
39908
|
this.translateService = inject(TranslateService);
|
|
39877
39909
|
this.urlTemplate = inject(EXTERNAL_VIEWER_URL_TEMPLATE, { optional: true });
|
|
39878
39910
|
this.openinNewTab = inject(EXTERNAL_VIEWER_OPEN_NEW_TAB);
|
|
39911
|
+
this.mimeType = '';
|
|
39879
39912
|
this.extraClass = '';
|
|
39880
39913
|
}
|
|
39881
39914
|
get externalViewer() {
|
|
@@ -39906,11 +39939,12 @@ class ExternalViewerButtonComponent {
|
|
|
39906
39939
|
const url = templateUrl
|
|
39907
39940
|
.replace('${layer_name}', `${layerName}`)
|
|
39908
39941
|
.replace('${service_url}', `${encodeURIComponent(this.link.url.toString())}`)
|
|
39909
|
-
.replace('${service_type}', `${this.supportedLinkLayerType}`)
|
|
39942
|
+
.replace('${service_type}', `${this.supportedLinkLayerType}`)
|
|
39943
|
+
.replace('${mime_type}', `${encodeURIComponent(this.mimeType)}`);
|
|
39910
39944
|
window.open(url, this.openinNewTab ? '_blank' : '_self').focus();
|
|
39911
39945
|
}
|
|
39912
39946
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ExternalViewerButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
39913
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ExternalViewerButtonComponent, isStandalone: true, selector: "gn-ui-external-viewer-button", inputs: { link: "link", extraClass: "extraClass" }, ngImport: i0, template: "@if (externalViewer) {\n <gn-ui-button\n (buttonClick)=\"openInExternalViewer()\"\n type=\"primary\"\n [title]=\"'record.externalViewer.open' | translate\"\n [extraClass]=\"extraClass + 'bg-primary ms-2 !rounded-lg'\"\n >\n <ng-icon name=\"matOpenInNew\"></ng-icon>\n </gn-ui-button>\n}\n", styles: [""], dependencies: [{ kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
|
|
39947
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ExternalViewerButtonComponent, isStandalone: true, selector: "gn-ui-external-viewer-button", inputs: { link: "link", mimeType: "mimeType", extraClass: "extraClass" }, ngImport: i0, template: "@if (externalViewer) {\n <gn-ui-button\n (buttonClick)=\"openInExternalViewer()\"\n type=\"primary\"\n [title]=\"'record.externalViewer.open' | translate\"\n [extraClass]=\"extraClass + 'bg-primary ms-2 !rounded-lg'\"\n >\n <ng-icon name=\"matOpenInNew\"></ng-icon>\n </gn-ui-button>\n}\n", styles: [""], dependencies: [{ kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
|
|
39914
39948
|
provideIcons({ matOpenInNew }),
|
|
39915
39949
|
provideNgIconsConfig({
|
|
39916
39950
|
size: '1.5em',
|
|
@@ -39927,6 +39961,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
39927
39961
|
], template: "@if (externalViewer) {\n <gn-ui-button\n (buttonClick)=\"openInExternalViewer()\"\n type=\"primary\"\n [title]=\"'record.externalViewer.open' | translate\"\n [extraClass]=\"extraClass + 'bg-primary ms-2 !rounded-lg'\"\n >\n <ng-icon name=\"matOpenInNew\"></ng-icon>\n </gn-ui-button>\n}\n" }]
|
|
39928
39962
|
}], propDecorators: { link: [{
|
|
39929
39963
|
type: Input
|
|
39964
|
+
}], mimeType: [{
|
|
39965
|
+
type: Input
|
|
39930
39966
|
}], extraClass: [{
|
|
39931
39967
|
type: Input
|
|
39932
39968
|
}] } });
|
|
@@ -40122,7 +40158,7 @@ class GpfApiDlComponent {
|
|
|
40122
40158
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
40123
40159
|
}
|
|
40124
40160
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: GpfApiDlComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
40125
|
-
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
|
|
40161
|
+
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 }); }
|
|
40126
40162
|
}
|
|
40127
40163
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: GpfApiDlComponent, decorators: [{
|
|
40128
40164
|
type: Component,
|
|
@@ -40132,7 +40168,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
40132
40168
|
TranslatePipe,
|
|
40133
40169
|
DropdownSelectorComponent,
|
|
40134
40170
|
GpfApiDlListItemComponent,
|
|
40135
|
-
], 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
|
|
40171
|
+
], 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"] }]
|
|
40136
40172
|
}], propDecorators: { apiLink: [{
|
|
40137
40173
|
type: Input
|
|
40138
40174
|
}] } });
|
|
@@ -40141,6 +40177,7 @@ marker('map.dropdown.placeholder');
|
|
|
40141
40177
|
marker('wfs.feature.limit');
|
|
40142
40178
|
marker('dataset.error.restrictedAccess');
|
|
40143
40179
|
marker('map.select.style');
|
|
40180
|
+
marker('map.style.default');
|
|
40144
40181
|
class MapViewComponent {
|
|
40145
40182
|
constructor() {
|
|
40146
40183
|
this.mdViewFacade = inject(MdViewFacade);
|
|
@@ -40207,7 +40244,8 @@ class MapViewComponent {
|
|
|
40207
40244
|
return compatibleLinks[0];
|
|
40208
40245
|
}
|
|
40209
40246
|
}
|
|
40210
|
-
}));
|
|
40247
|
+
}), shareReplay$1(1));
|
|
40248
|
+
this.isWmsStyleMode$ = this.selectedSourceLink$.pipe(map$1((src) => src?.type === 'service' && src?.accessServiceProtocol === 'wms'), distinctUntilChanged(), shareReplay$1(1));
|
|
40211
40249
|
this.styleLinks$ = this.selectedSourceLink$.pipe(switchMap$1((src) => {
|
|
40212
40250
|
if (src &&
|
|
40213
40251
|
src.type === 'service' &&
|
|
@@ -40224,6 +40262,17 @@ class MapViewComponent {
|
|
|
40224
40262
|
return of(src);
|
|
40225
40263
|
}));
|
|
40226
40264
|
}
|
|
40265
|
+
if (src &&
|
|
40266
|
+
src.type === 'service' &&
|
|
40267
|
+
src.accessServiceProtocol === 'wms') {
|
|
40268
|
+
return from(new WmsEndpoint(src.url.toString()).isReady()).pipe(map$1((endpoint) => {
|
|
40269
|
+
const layer = endpoint.getLayerByName(src.name);
|
|
40270
|
+
return layer?.styles || [];
|
|
40271
|
+
}), catchError((error) => {
|
|
40272
|
+
this.handleError(error);
|
|
40273
|
+
return of([]);
|
|
40274
|
+
}));
|
|
40275
|
+
}
|
|
40227
40276
|
return of([]);
|
|
40228
40277
|
}), tap$1((styles) => {
|
|
40229
40278
|
if (this._styleFromConfig && this._styleFromConfig <= styles.length) {
|
|
@@ -40233,23 +40282,60 @@ class MapViewComponent {
|
|
|
40233
40282
|
this.selectedStyleId$.next(0);
|
|
40234
40283
|
}
|
|
40235
40284
|
}), shareReplay$1(1));
|
|
40236
|
-
this.styleDropdownChoices$ =
|
|
40285
|
+
this.styleDropdownChoices$ = combineLatest([
|
|
40286
|
+
this.styleLinks$,
|
|
40287
|
+
this.isWmsStyleMode$,
|
|
40288
|
+
]).pipe(map$1(([links, isWmsStyleMode]) => links.length
|
|
40237
40289
|
? links.map((link, index) => ({
|
|
40238
|
-
label:
|
|
40290
|
+
label: isWmsStyleMode
|
|
40291
|
+
? link.title || link.name
|
|
40292
|
+
: getLinkLabel(link),
|
|
40239
40293
|
value: index,
|
|
40240
40294
|
}))
|
|
40241
40295
|
: [
|
|
40242
40296
|
{
|
|
40243
|
-
label: '
|
|
40297
|
+
label: this.translateService.instant('map.style.default'),
|
|
40244
40298
|
value: 0,
|
|
40245
40299
|
},
|
|
40246
40300
|
]));
|
|
40301
|
+
this.selectedWmsStyleName$ = combineLatest([
|
|
40302
|
+
this.styleLinks$,
|
|
40303
|
+
this.isWmsStyleMode$,
|
|
40304
|
+
this.selectedStyleId$.pipe(distinctUntilChanged()),
|
|
40305
|
+
]).pipe(map$1(([styles, isWmsStyleMode, styleIdx]) => isWmsStyleMode && Array.isArray(styles)
|
|
40306
|
+
? styles[styleIdx]?.name
|
|
40307
|
+
: undefined));
|
|
40247
40308
|
this.selectedLink$ = combineLatest([
|
|
40248
40309
|
this.selectedSourceLink$,
|
|
40249
40310
|
this.styleLinks$,
|
|
40250
40311
|
this.selectedStyleId$.pipe(distinctUntilChanged()),
|
|
40251
|
-
|
|
40252
|
-
|
|
40312
|
+
this.isWmsStyleMode$,
|
|
40313
|
+
]).pipe(map$1(([src, styles, styleIdx, isWmsStyleMode]) => !isWmsStyleMode && styles.length ? styles[styleIdx] : src), shareReplay$1(1));
|
|
40314
|
+
this.wmsMimeType$ = this.selectedSourceLink$.pipe(switchMap$1((link) => {
|
|
40315
|
+
if (link?.type === 'service' && link?.accessServiceProtocol === 'wms') {
|
|
40316
|
+
return from(new WmsEndpoint(link.url.toString())
|
|
40317
|
+
.isReady()
|
|
40318
|
+
.then((endpoint) => {
|
|
40319
|
+
return endpoint.describeLayer(link.name).then((description) => {
|
|
40320
|
+
if (description) {
|
|
40321
|
+
return description.owsType === 'wfs'
|
|
40322
|
+
? 'image/png'
|
|
40323
|
+
: 'image/jpeg';
|
|
40324
|
+
}
|
|
40325
|
+
const layer = endpoint.getLayerByName(link.name);
|
|
40326
|
+
return layer?.opaque ? 'image/jpeg' : 'image/png';
|
|
40327
|
+
});
|
|
40328
|
+
})
|
|
40329
|
+
.catch(() => 'image/png'));
|
|
40330
|
+
}
|
|
40331
|
+
return of('');
|
|
40332
|
+
}), shareReplay$1(1));
|
|
40333
|
+
this.currentLayers$ = combineLatest([
|
|
40334
|
+
this.selectedLink$,
|
|
40335
|
+
this.excludeWfs$,
|
|
40336
|
+
this.selectedWmsStyleName$,
|
|
40337
|
+
this.wmsMimeType$,
|
|
40338
|
+
]).pipe(switchMap$1(([link, excludeWfs, wmsStyleName, wmsMimeType]) => {
|
|
40253
40339
|
if (!link) {
|
|
40254
40340
|
return of([]);
|
|
40255
40341
|
}
|
|
@@ -40263,7 +40349,13 @@ class MapViewComponent {
|
|
|
40263
40349
|
this.handleError('dataset.error.restrictedAccess');
|
|
40264
40350
|
return of([]);
|
|
40265
40351
|
}
|
|
40266
|
-
return this.getLayerFromLink(link).pipe(map$1((layer) =>
|
|
40352
|
+
return this.getLayerFromLink(link).pipe(map$1((layer) => layer.type === 'wms'
|
|
40353
|
+
? {
|
|
40354
|
+
...layer,
|
|
40355
|
+
...(wmsStyleName && { style: wmsStyleName }),
|
|
40356
|
+
...(wmsMimeType && { format: wmsMimeType }),
|
|
40357
|
+
}
|
|
40358
|
+
: layer), map$1((layer) => [layer]), catchError((e) => {
|
|
40267
40359
|
this.handleError(e);
|
|
40268
40360
|
return of([]);
|
|
40269
40361
|
}), finalize(() => (this.loading = false)));
|
|
@@ -40417,7 +40509,7 @@ class MapViewComponent {
|
|
|
40417
40509
|
this.changeRef.detectChanges();
|
|
40418
40510
|
}
|
|
40419
40511
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MapViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
40420
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: MapViewComponent, isStandalone: true, selector: "gn-ui-map-view", inputs: { exceedsLimit: "exceedsLimit", selectedView: "selectedView", datavizConfig: "datavizConfig", displaySource: "displaySource" }, outputs: { linkSelected: "linkSelected", styleSelected: "styleSelected" }, viewQueries: [{ propertyName: "mapContainer", first: true, predicate: ["mapContainer"], descendants: true }], ngImport: i0, template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n
|
|
40512
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: MapViewComponent, isStandalone: true, selector: "gn-ui-map-view", inputs: { exceedsLimit: "exceedsLimit", selectedView: "selectedView", datavizConfig: "datavizConfig", displaySource: "displaySource" }, outputs: { linkSelected: "linkSelected", styleSelected: "styleSelected" }, viewQueries: [{ propertyName: "mapContainer", first: true, predicate: ["mapContainer"], descendants: true }], ngImport: i0, template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.style' | translate\"\n [choices]=\"styleDropdownChoices$ | async\"\n [selected]=\"selectedStyleId$ | async\"\n [disabled]=\"(styleDropdownChoices$ | async)?.length <= 1\"\n (selectValue)=\"selectStyleToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n\n <div class=\"self-end md:ml-2\">\n <gn-ui-external-viewer-button\n extraClass=\"w-[44px] h-[44px]\"\n [link]=\"selectedLink$ | async\"\n [mimeType]=\"wmsMimeType$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n </div>\n @if (hidePreview) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n } @else {\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n (sourceLoadError)=\"onSourceLoadError($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail\n [featureCatalog]=\"mdViewFacade.featureCatalog$ | async\"\n [feature]=\"selection\"\n ></gn-ui-feature-detail>\n </div>\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\" translate>map.legend.title</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n @if (!showLegend && legendExists && !selection) {\n <gn-ui-button\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n translate\n >\n {{ 'map.legend.title' | translate }}\n </gn-ui-button>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick", "extentChange", "sourceLoadError", "resolvedExtentChange"] }, { kind: "component", type: FeatureDetailComponent, selector: "gn-ui-feature-detail", inputs: ["feature", "featureCatalog"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ExternalViewerButtonComponent, selector: "gn-ui-external-viewer-button", inputs: ["link", "mimeType", "extraClass"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: MapLegendComponent, selector: "gn-ui-map-legend", inputs: ["context"], outputs: ["legendStatusChange"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
|
|
40421
40513
|
provideIcons({ matClose }),
|
|
40422
40514
|
provideNgIconsConfig({
|
|
40423
40515
|
size: '1.5em',
|
|
@@ -40444,7 +40536,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
40444
40536
|
provideNgIconsConfig({
|
|
40445
40537
|
size: '1.5em',
|
|
40446
40538
|
}),
|
|
40447
|
-
], template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n
|
|
40539
|
+
], template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.style' | translate\"\n [choices]=\"styleDropdownChoices$ | async\"\n [selected]=\"selectedStyleId$ | async\"\n [disabled]=\"(styleDropdownChoices$ | async)?.length <= 1\"\n (selectValue)=\"selectStyleToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n\n <div class=\"self-end md:ml-2\">\n <gn-ui-external-viewer-button\n extraClass=\"w-[44px] h-[44px]\"\n [link]=\"selectedLink$ | async\"\n [mimeType]=\"wmsMimeType$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n </div>\n @if (hidePreview) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n } @else {\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n (sourceLoadError)=\"onSourceLoadError($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail\n [featureCatalog]=\"mdViewFacade.featureCatalog$ | async\"\n [feature]=\"selection\"\n ></gn-ui-feature-detail>\n </div>\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\" translate>map.legend.title</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n @if (!showLegend && legendExists && !selection) {\n <gn-ui-button\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n translate\n >\n {{ 'map.legend.title' | translate }}\n </gn-ui-button>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n }\n</div>\n" }]
|
|
40448
40540
|
}], propDecorators: { exceedsLimit: [{
|
|
40449
40541
|
type: Input
|
|
40450
40542
|
}], selectedView: [{
|
|
@@ -41099,6 +41191,7 @@ const saveRecordSuccess = createAction('[Editor] Save record success');
|
|
|
41099
41191
|
const saveRecordFailure = createAction('[Editor] Save record failure', props());
|
|
41100
41192
|
const draftSaveSuccess = createAction('[Editor] Draft save success');
|
|
41101
41193
|
const undoRecordDraft = createAction('[Editor] Undo record draft');
|
|
41194
|
+
const setEditorConfiguration = createAction('[Editor] Set editor configuration', props());
|
|
41102
41195
|
const setCurrentPage = createAction('[Editor] Set current page', props());
|
|
41103
41196
|
const setFieldVisibility = createAction('[Editor] Set field visibility', props());
|
|
41104
41197
|
const hasRecordChangedSinceDraft = createAction('[Editor] Has Record Changed Since Draft', props());
|
|
@@ -41521,6 +41614,9 @@ const reducer = createReducer(initialEditorState, on(openRecord, (state, { recor
|
|
|
41521
41614
|
})), on(markRecordAsChanged, (state) => ({
|
|
41522
41615
|
...state,
|
|
41523
41616
|
changedSinceSave: true,
|
|
41617
|
+
})), on(setEditorConfiguration, (state, { configuration }) => ({
|
|
41618
|
+
...state,
|
|
41619
|
+
editorConfig: configuration,
|
|
41524
41620
|
})), on(setCurrentPage, (state, { page }) => ({
|
|
41525
41621
|
...state,
|
|
41526
41622
|
currentPage: page,
|
|
@@ -41623,6 +41719,9 @@ class EditorFacade {
|
|
|
41623
41719
|
updateRecordLanguages(defaultLanguage, otherLanguages) {
|
|
41624
41720
|
this.store.dispatch(updateRecordLanguages({ defaultLanguage, otherLanguages }));
|
|
41625
41721
|
}
|
|
41722
|
+
setConfiguration(configuration) {
|
|
41723
|
+
this.store.dispatch(setEditorConfiguration({ configuration }));
|
|
41724
|
+
}
|
|
41626
41725
|
setCurrentPage(page) {
|
|
41627
41726
|
this.store.dispatch(setCurrentPage({ page }));
|
|
41628
41727
|
}
|
|
@@ -41645,149 +41744,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
41645
41744
|
type: Injectable
|
|
41646
41745
|
}] });
|
|
41647
41746
|
|
|
41648
|
-
function evaluate(expression) {
|
|
41649
|
-
if (expression.match(/^\${.*}$/)) {
|
|
41650
|
-
return evaluate(expression.slice(2, -1));
|
|
41651
|
-
}
|
|
41652
|
-
const operator = expression.split('(')[0];
|
|
41653
|
-
switch (operator) {
|
|
41654
|
-
case 'dateNow':
|
|
41655
|
-
return () => new Date();
|
|
41656
|
-
default:
|
|
41657
|
-
throw new Error(`Unknown operator: ${operator}`);
|
|
41658
|
-
}
|
|
41659
|
-
}
|
|
41660
|
-
|
|
41661
|
-
class EditorService {
|
|
41662
|
-
constructor() {
|
|
41663
|
-
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
41664
|
-
}
|
|
41665
|
-
// returns the record as it was when saved, alongside its source
|
|
41666
|
-
saveRecord(record, recordSource, fieldsConfig) {
|
|
41667
|
-
const savedRecord = { ...record };
|
|
41668
|
-
const fields = fieldsConfig.pages.flatMap((page) => page.sections.flatMap((section) => section.fields));
|
|
41669
|
-
// run onSave processes
|
|
41670
|
-
for (const field of fields) {
|
|
41671
|
-
if (field.onSaveProcess && field.model) {
|
|
41672
|
-
const evaluator = evaluate(field.onSaveProcess);
|
|
41673
|
-
savedRecord[field.model] = evaluator({
|
|
41674
|
-
model: field.model,
|
|
41675
|
-
value: record[field.model],
|
|
41676
|
-
});
|
|
41677
|
-
}
|
|
41678
|
-
}
|
|
41679
|
-
let publishToAll = true;
|
|
41680
|
-
// if the record is new, generate a new unique identifier and pass publishToAll as false
|
|
41681
|
-
if (!record.uniqueIdentifier) {
|
|
41682
|
-
savedRecord.uniqueIdentifier = null;
|
|
41683
|
-
publishToAll = false;
|
|
41684
|
-
}
|
|
41685
|
-
return this.recordsRepository
|
|
41686
|
-
.saveRecord(savedRecord, recordSource, publishToAll)
|
|
41687
|
-
.pipe(switchMap((uniqueIdentifier) => this.recordsRepository.openRecordForEdition(uniqueIdentifier)), tap$1(() => {
|
|
41688
|
-
// if saving was successful, the original draft can be discarded
|
|
41689
|
-
this.recordsRepository.clearRecordDraft(record.uniqueIdentifier);
|
|
41690
|
-
}), map$1(([record, recordSource]) => [record, recordSource]));
|
|
41691
|
-
}
|
|
41692
|
-
// emits and completes once saving is done
|
|
41693
|
-
// note: onSave processes are not run for drafts
|
|
41694
|
-
saveRecordAsDraft(record, recordSource) {
|
|
41695
|
-
record.recordUpdated = new Date();
|
|
41696
|
-
return this.recordsRepository
|
|
41697
|
-
.saveRecordAsDraft(record, recordSource)
|
|
41698
|
-
.pipe(map$1(() => undefined));
|
|
41699
|
-
}
|
|
41700
|
-
undoRecordDraft(record) {
|
|
41701
|
-
this.recordsRepository.clearRecordDraft(record.uniqueIdentifier);
|
|
41702
|
-
return this.recordsRepository.openRecordForEdition(record.uniqueIdentifier);
|
|
41703
|
-
}
|
|
41704
|
-
hasRecordChangedSinceDraft(localRecord) {
|
|
41705
|
-
return this.recordsRepository.hasRecordChangedSinceDraft(localRecord);
|
|
41706
|
-
}
|
|
41707
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
41708
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, providedIn: 'root' }); }
|
|
41709
|
-
}
|
|
41710
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, decorators: [{
|
|
41711
|
-
type: Injectable,
|
|
41712
|
-
args: [{
|
|
41713
|
-
providedIn: 'root',
|
|
41714
|
-
}]
|
|
41715
|
-
}] });
|
|
41716
|
-
|
|
41717
|
-
class EditorEffects {
|
|
41718
|
-
constructor() {
|
|
41719
|
-
this.actions$ = inject(Actions);
|
|
41720
|
-
this.editorService = inject(EditorService);
|
|
41721
|
-
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
41722
|
-
this.plateformService = inject(PlatformServiceInterface);
|
|
41723
|
-
this.store = inject(Store);
|
|
41724
|
-
this.saveRecord$ = createEffect(() => this.actions$.pipe(ofType(saveRecord), withLatestFrom$1(this.store.select(selectRecord), this.store.select(selectRecordSource), this.store.select(selectEditorConfig)), switchMap$1(([, record, recordSource, fieldsConfig]) => this.editorService.saveRecord(record, recordSource, fieldsConfig).pipe(switchMap$1(([savedRecord, savedRecordSource]) => {
|
|
41725
|
-
const actions = [saveRecordSuccess()];
|
|
41726
|
-
if (!record?.uniqueIdentifier) {
|
|
41727
|
-
actions.push(openRecord({
|
|
41728
|
-
record: savedRecord,
|
|
41729
|
-
recordSource: savedRecordSource,
|
|
41730
|
-
}));
|
|
41731
|
-
}
|
|
41732
|
-
return of(...actions);
|
|
41733
|
-
}), catchError((error) => of(saveRecordFailure({
|
|
41734
|
-
error,
|
|
41735
|
-
})))))));
|
|
41736
|
-
this.cleanRecordAttachments$ = createEffect(() => this.actions$.pipe(ofType(saveRecordSuccess), withLatestFrom$1(this.store.select(selectRecord)), switchMap$1(([_, record]) => {
|
|
41737
|
-
if (record.uniqueIdentifier !== null) {
|
|
41738
|
-
this.plateformService.cleanRecordAttachments(record).subscribe({
|
|
41739
|
-
next: (_) => undefined,
|
|
41740
|
-
error: (err) => {
|
|
41741
|
-
console.error(err);
|
|
41742
|
-
},
|
|
41743
|
-
});
|
|
41744
|
-
}
|
|
41745
|
-
return EMPTY;
|
|
41746
|
-
}), catchError((error) => {
|
|
41747
|
-
console.error(error);
|
|
41748
|
-
return EMPTY;
|
|
41749
|
-
})), { dispatch: false });
|
|
41750
|
-
this.markAsChanged$ = createEffect(() => this.actions$.pipe(ofType(updateRecordField, updateRecordLanguages), map$1(() => markRecordAsChanged())));
|
|
41751
|
-
this.saveRecordDraft$ = createEffect(() => this.actions$.pipe(ofType(updateRecordField, updateRecordLanguages), debounceTime$1(1000), withLatestFrom$1(this.store.select(selectRecord), this.store.select(selectRecordSource)), switchMap$1(([, record, recordSource]) => this.editorService.saveRecordAsDraft(record, recordSource)), map$1(() => draftSaveSuccess())));
|
|
41752
|
-
this.undoRecordDraft$ = createEffect(() => this.actions$.pipe(ofType(undoRecordDraft), withLatestFrom$1(this.store.select(selectRecord)), switchMap$1(([, record]) => this.editorService.undoRecordDraft(record)), map$1(([record, recordSource]) => openRecord({
|
|
41753
|
-
record,
|
|
41754
|
-
recordSource,
|
|
41755
|
-
}))));
|
|
41756
|
-
this.checkHasChangesOnOpen$ = createEffect(() => this.actions$.pipe(ofType(openRecord), map$1(({ record }) => this.recordsRepository.recordHasDraft(record.uniqueIdentifier)), filter((hasDraft) => hasDraft), map$1(() => markRecordAsChanged())));
|
|
41757
|
-
this.hasRecordChangedSinceDraft$ = createEffect(() => this.actions$.pipe(ofType(hasRecordChangedSinceDraft), switchMap$1(({ record }) => this.editorService
|
|
41758
|
-
.hasRecordChangedSinceDraft(record)
|
|
41759
|
-
.pipe(map$1((changes) => hasRecordChangedSinceDraftSuccess({ changes }))))));
|
|
41760
|
-
this.checkIsRecordPublished$ = createEffect(() => this.actions$.pipe(ofType(openRecord), map$1(({ record }) => record.uniqueIdentifier), switchMap$1((uniqueIdentifier) => this.recordsRepository.getRecordPublicationStatus(uniqueIdentifier)), map$1((isPublished$1) => isPublished({
|
|
41761
|
-
isPublished: isPublished$1,
|
|
41762
|
-
}))));
|
|
41763
|
-
this.checkCanEditRecord$ = createEffect(() => this.actions$.pipe(ofType(openRecord), map$1(({ record }) => record.uniqueIdentifier), switchMap$1((uniqueIdentifier) => this.recordsRepository.canEditRecord(uniqueIdentifier)), map$1((canEditRecord$1) => canEditRecord({
|
|
41764
|
-
canEditRecord: canEditRecord$1,
|
|
41765
|
-
}))));
|
|
41766
|
-
}
|
|
41767
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
41768
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects }); }
|
|
41769
|
-
}
|
|
41770
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects, decorators: [{
|
|
41771
|
-
type: Injectable
|
|
41772
|
-
}] });
|
|
41773
|
-
|
|
41774
|
-
class FeatureEditorModule {
|
|
41775
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
41776
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, imports: [i1.StoreFeatureModule, i2$2.EffectsFeatureModule] }); }
|
|
41777
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, providers: [EditorFacade, provideHttpClient()], imports: [StoreModule.forFeature(EDITOR_FEATURE_KEY, editorReducer),
|
|
41778
|
-
EffectsModule.forFeature([EditorEffects])] }); }
|
|
41779
|
-
}
|
|
41780
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, decorators: [{
|
|
41781
|
-
type: NgModule,
|
|
41782
|
-
args: [{
|
|
41783
|
-
imports: [
|
|
41784
|
-
StoreModule.forFeature(EDITOR_FEATURE_KEY, editorReducer),
|
|
41785
|
-
EffectsModule.forFeature([EditorEffects]),
|
|
41786
|
-
],
|
|
41787
|
-
providers: [EditorFacade, provideHttpClient()],
|
|
41788
|
-
}]
|
|
41789
|
-
}] });
|
|
41790
|
-
|
|
41791
41747
|
class ImportRecordComponent {
|
|
41792
41748
|
constructor() {
|
|
41793
41749
|
this.router = inject(Router);
|
|
@@ -41883,6 +41839,328 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
41883
41839
|
type: Output
|
|
41884
41840
|
}] } });
|
|
41885
41841
|
|
|
41842
|
+
//forced translations that are not available in fields.config.ts
|
|
41843
|
+
marker('editor.record.form.field.keywords');
|
|
41844
|
+
marker('editor.record.form.field.topics');
|
|
41845
|
+
marker('editor.record.form.field.contacts');
|
|
41846
|
+
marker('editor.record.form.field.organisation');
|
|
41847
|
+
class MetadataQualityPanelComponent {
|
|
41848
|
+
constructor() {
|
|
41849
|
+
this.propsToValidate = getAllKeysValidator();
|
|
41850
|
+
this.propertiesByPage = [];
|
|
41851
|
+
}
|
|
41852
|
+
ngOnChanges() {
|
|
41853
|
+
if (this.editorConfig && this.record) {
|
|
41854
|
+
const fieldsByPage = this.editorConfig.pages.map((page) => page.sections.flatMap((section) => section.fields
|
|
41855
|
+
.filter((field) => this.propsToValidate.includes(field.model))
|
|
41856
|
+
.map((field) => field.model)));
|
|
41857
|
+
// FIXME: temporarily add topics and organisation to the first and third page
|
|
41858
|
+
// as long as they are not handled by the editor
|
|
41859
|
+
if (fieldsByPage.length > 0) {
|
|
41860
|
+
fieldsByPage[0].includes('topics') || fieldsByPage[0].push('topics');
|
|
41861
|
+
fieldsByPage[2].includes('organisation') ||
|
|
41862
|
+
fieldsByPage[2].push('organisation');
|
|
41863
|
+
}
|
|
41864
|
+
this.propertiesByPage = fieldsByPage
|
|
41865
|
+
.map((fields) => getQualityValidators(this.record, fields).map(({ name, validator }) => ({
|
|
41866
|
+
label: `editor.record.form.field.${name}`, // use same translations as in fields.config.ts
|
|
41867
|
+
value: validator(),
|
|
41868
|
+
})))
|
|
41869
|
+
.filter((arr) => arr.length > 0);
|
|
41870
|
+
}
|
|
41871
|
+
}
|
|
41872
|
+
getExtraClass(checked) {
|
|
41873
|
+
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';
|
|
41874
|
+
return checked
|
|
41875
|
+
? `${baseClasses} bg-neutral-100 hover:bg-neutral-100`
|
|
41876
|
+
: `${baseClasses} bg-transparent hover:bg-transparent`;
|
|
41877
|
+
}
|
|
41878
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MetadataQualityPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
41879
|
+
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: [
|
|
41880
|
+
provideIcons({
|
|
41881
|
+
iconoirSystemShut,
|
|
41882
|
+
iconoirBadgeCheck,
|
|
41883
|
+
}),
|
|
41884
|
+
provideNgIconsConfig({
|
|
41885
|
+
size: '1.25em',
|
|
41886
|
+
}),
|
|
41887
|
+
], 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" }] }); }
|
|
41888
|
+
}
|
|
41889
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MetadataQualityPanelComponent, decorators: [{
|
|
41890
|
+
type: Component,
|
|
41891
|
+
args: [{ selector: 'gn-ui-metadata-quality-panel', standalone: true, imports: [
|
|
41892
|
+
TranslateDirective,
|
|
41893
|
+
TranslatePipe,
|
|
41894
|
+
ButtonComponent,
|
|
41895
|
+
NgIconComponent,
|
|
41896
|
+
], providers: [
|
|
41897
|
+
provideIcons({
|
|
41898
|
+
iconoirSystemShut,
|
|
41899
|
+
iconoirBadgeCheck,
|
|
41900
|
+
}),
|
|
41901
|
+
provideNgIconsConfig({
|
|
41902
|
+
size: '1.25em',
|
|
41903
|
+
}),
|
|
41904
|
+
], 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" }]
|
|
41905
|
+
}], propDecorators: { editorConfig: [{
|
|
41906
|
+
type: Input
|
|
41907
|
+
}], record: [{
|
|
41908
|
+
type: Input
|
|
41909
|
+
}] } });
|
|
41910
|
+
|
|
41911
|
+
const extraFlagMap = {
|
|
41912
|
+
ar: 'arab',
|
|
41913
|
+
en: 'gb',
|
|
41914
|
+
ko: 'kr',
|
|
41915
|
+
cs: 'cz',
|
|
41916
|
+
zh: 'cn',
|
|
41917
|
+
ca: 'es-ct',
|
|
41918
|
+
rm: 'ch',
|
|
41919
|
+
da: 'dk',
|
|
41920
|
+
sv: 'se',
|
|
41921
|
+
cy: 'gb-wls',
|
|
41922
|
+
hy: 'am',
|
|
41923
|
+
ka: 'ge',
|
|
41924
|
+
uk: 'ua',
|
|
41925
|
+
};
|
|
41926
|
+
class MultilingualPanelComponent {
|
|
41927
|
+
constructor() {
|
|
41928
|
+
this.facade = inject(EditorFacade);
|
|
41929
|
+
this.dialog = inject(MatDialog);
|
|
41930
|
+
this.translateService = inject(TranslateService);
|
|
41931
|
+
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
41932
|
+
this.overlay = inject(Overlay);
|
|
41933
|
+
this.viewContainerRef = inject(ViewContainerRef);
|
|
41934
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
41935
|
+
this.selectedLanguages = [];
|
|
41936
|
+
this.recordLanguages = [];
|
|
41937
|
+
this.formLanguage = '';
|
|
41938
|
+
this.isActionMenuOpen = false;
|
|
41939
|
+
this.subscription = new Subscription();
|
|
41940
|
+
this.supportedLanguages$ = this.recordsRepository
|
|
41941
|
+
.getApplicationLanguages()
|
|
41942
|
+
.pipe(map$2((languages) => this.sortLanguages(languages)));
|
|
41943
|
+
}
|
|
41944
|
+
set record(value) {
|
|
41945
|
+
this._record = value;
|
|
41946
|
+
this.isMultilingual = value.otherLanguages.length > 0;
|
|
41947
|
+
this.editTranslations = false;
|
|
41948
|
+
this.recordLanguages = [...value.otherLanguages, value.defaultLanguage];
|
|
41949
|
+
this.selectedLanguages = this.recordLanguages;
|
|
41950
|
+
this.formLanguage = value.defaultLanguage;
|
|
41951
|
+
}
|
|
41952
|
+
ngOnDestroy() {
|
|
41953
|
+
this.subscription.unsubscribe();
|
|
41954
|
+
}
|
|
41955
|
+
sortLanguages(languages) {
|
|
41956
|
+
return languages
|
|
41957
|
+
.map((lang) => {
|
|
41958
|
+
const label = this.translateService.instant('language.' + lang);
|
|
41959
|
+
const isTranslated = label !== 'language.' + lang;
|
|
41960
|
+
return {
|
|
41961
|
+
lang,
|
|
41962
|
+
label,
|
|
41963
|
+
isTranslated,
|
|
41964
|
+
};
|
|
41965
|
+
})
|
|
41966
|
+
.sort((a, b) => {
|
|
41967
|
+
if (a.isTranslated && !b.isTranslated)
|
|
41968
|
+
return -1;
|
|
41969
|
+
if (!a.isTranslated && b.isTranslated)
|
|
41970
|
+
return 1;
|
|
41971
|
+
return a.label.localeCompare(b.label);
|
|
41972
|
+
})
|
|
41973
|
+
.map((item) => item.lang);
|
|
41974
|
+
}
|
|
41975
|
+
toggleLanguageSelection() {
|
|
41976
|
+
this.editTranslations = !this.editTranslations;
|
|
41977
|
+
}
|
|
41978
|
+
getIconClass(lang) {
|
|
41979
|
+
return extraFlagMap[lang]
|
|
41980
|
+
? `fi fi-${extraFlagMap[lang]} w-4 h-3`
|
|
41981
|
+
: `fi fi-${lang} w-4 h-3`;
|
|
41982
|
+
}
|
|
41983
|
+
switchMultilingual() {
|
|
41984
|
+
if (this.isMultilingual && this.selectedLanguages.length > 1) {
|
|
41985
|
+
this.confirmDeleteAction();
|
|
41986
|
+
}
|
|
41987
|
+
else {
|
|
41988
|
+
this.isMultilingual = true;
|
|
41989
|
+
this.editTranslations = true;
|
|
41990
|
+
}
|
|
41991
|
+
}
|
|
41992
|
+
getExtraClass(lang) {
|
|
41993
|
+
const baseClass = 'h-[34px] w-full font-bold justify-start hover:bg-white';
|
|
41994
|
+
if (this.selectedLanguages.includes(lang)) {
|
|
41995
|
+
return `${baseClass} bg-white border border-black`;
|
|
41996
|
+
}
|
|
41997
|
+
return baseClass;
|
|
41998
|
+
}
|
|
41999
|
+
toggleLanguage(lang) {
|
|
42000
|
+
if (this.selectedLanguages.includes(lang)) {
|
|
42001
|
+
this.removeSelectedLanguage(lang);
|
|
42002
|
+
}
|
|
42003
|
+
else {
|
|
42004
|
+
this.selectedLanguages.push(lang);
|
|
42005
|
+
}
|
|
42006
|
+
}
|
|
42007
|
+
removeSelectedLanguage(lang) {
|
|
42008
|
+
this.selectedLanguages = this.selectedLanguages.filter((language) => language !== lang);
|
|
42009
|
+
}
|
|
42010
|
+
validateTranslations() {
|
|
42011
|
+
const equalLength = this.selectedLanguages.length === this.recordLanguages.length;
|
|
42012
|
+
if (this.selectedLanguages.length < this.recordLanguages.length ||
|
|
42013
|
+
(equalLength && this.selectedLanguages !== this.recordLanguages)) {
|
|
42014
|
+
this.confirmDeleteAction(this.selectedLanguages);
|
|
42015
|
+
}
|
|
42016
|
+
else {
|
|
42017
|
+
this.updateTranslations();
|
|
42018
|
+
}
|
|
42019
|
+
}
|
|
42020
|
+
updateTranslations() {
|
|
42021
|
+
const newLanguageSelection = this.selectedLanguages.filter((lang) => lang !== this.formLanguage);
|
|
42022
|
+
this.facade.updateRecordLanguages(this.formLanguage, newLanguageSelection);
|
|
42023
|
+
this.recordLanguages = newLanguageSelection;
|
|
42024
|
+
this.editTranslations = false;
|
|
42025
|
+
}
|
|
42026
|
+
switchFormLang(lang) {
|
|
42027
|
+
// TO IMPLEMENT FURTHER
|
|
42028
|
+
}
|
|
42029
|
+
switchDefaultLang(lang) {
|
|
42030
|
+
this.formLanguage = lang;
|
|
42031
|
+
this.facade.updateRecordLanguages(lang, this.selectedLanguages.filter((lang) => lang !== this.formLanguage));
|
|
42032
|
+
this.closeActionMenu();
|
|
42033
|
+
}
|
|
42034
|
+
confirmDeleteAction(lang) {
|
|
42035
|
+
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
42036
|
+
data: {
|
|
42037
|
+
title: this.translateService.instant('editor.record.multilingual.confirmation.title'),
|
|
42038
|
+
message: this.translateService.instant('editor.record.multilingual.confirmation.message'),
|
|
42039
|
+
confirmText: this.translateService.instant('editor.record.multilingual.confirmation.confirmText'),
|
|
42040
|
+
cancelText: this.translateService.instant('editor.record.multilingual.confirmation.cancelText'),
|
|
42041
|
+
focusCancel: true,
|
|
42042
|
+
},
|
|
42043
|
+
restoreFocus: true,
|
|
42044
|
+
});
|
|
42045
|
+
this.subscription.add(dialogRef.afterClosed().subscribe((confirmed) => {
|
|
42046
|
+
if (confirmed) {
|
|
42047
|
+
if (lang) {
|
|
42048
|
+
if (!Array.isArray(lang)) {
|
|
42049
|
+
this.removeSelectedLanguage(lang);
|
|
42050
|
+
this.closeActionMenu();
|
|
42051
|
+
}
|
|
42052
|
+
this.updateTranslations();
|
|
42053
|
+
}
|
|
42054
|
+
else {
|
|
42055
|
+
this.facade.updateRecordLanguages(this.formLanguage, []);
|
|
42056
|
+
this.isMultilingual = false;
|
|
42057
|
+
this.selectedLanguages = [];
|
|
42058
|
+
}
|
|
42059
|
+
}
|
|
42060
|
+
else {
|
|
42061
|
+
this.isMultilingual = true;
|
|
42062
|
+
this.selectedLanguages = this.recordLanguages;
|
|
42063
|
+
}
|
|
42064
|
+
this.editTranslations = false;
|
|
42065
|
+
}));
|
|
42066
|
+
}
|
|
42067
|
+
isFirstUnsupported(index) {
|
|
42068
|
+
const langs = this.sortLanguages(this.recordLanguages);
|
|
42069
|
+
return (langs[index].length === 3 &&
|
|
42070
|
+
langs.slice(0, index).every((lang) => lang.length !== 3));
|
|
42071
|
+
}
|
|
42072
|
+
isLangSupported(lang) {
|
|
42073
|
+
return lang.length === 2;
|
|
42074
|
+
}
|
|
42075
|
+
getToggleTitle(lang) {
|
|
42076
|
+
if (lang === this._record.defaultLanguage) {
|
|
42077
|
+
return this.translateService.instant('editor.record.form.multilingual.forbidden');
|
|
42078
|
+
}
|
|
42079
|
+
return '';
|
|
42080
|
+
}
|
|
42081
|
+
openActionMenu(item, template) {
|
|
42082
|
+
this.isActionMenuOpen = true;
|
|
42083
|
+
const index = this.sortLanguages(this.selectedLanguages).indexOf(item);
|
|
42084
|
+
const buttonElement = this.actionMenuButtons.toArray()[index];
|
|
42085
|
+
const positionStrategy = this.overlay
|
|
42086
|
+
.position()
|
|
42087
|
+
.flexibleConnectedTo(buttonElement)
|
|
42088
|
+
.withFlexibleDimensions(true)
|
|
42089
|
+
.withPush(true)
|
|
42090
|
+
.withPositions([
|
|
42091
|
+
{
|
|
42092
|
+
originX: 'end',
|
|
42093
|
+
originY: 'bottom',
|
|
42094
|
+
overlayX: 'end',
|
|
42095
|
+
overlayY: 'top',
|
|
42096
|
+
},
|
|
42097
|
+
{
|
|
42098
|
+
originX: 'end',
|
|
42099
|
+
originY: 'top',
|
|
42100
|
+
overlayX: 'end',
|
|
42101
|
+
overlayY: 'bottom',
|
|
42102
|
+
},
|
|
42103
|
+
]);
|
|
42104
|
+
this.overlayRef = this.overlay.create({
|
|
42105
|
+
hasBackdrop: true,
|
|
42106
|
+
backdropClass: 'cdk-overlay-transparent-backdrop',
|
|
42107
|
+
positionStrategy: positionStrategy,
|
|
42108
|
+
scrollStrategy: this.overlay.scrollStrategies.reposition(),
|
|
42109
|
+
});
|
|
42110
|
+
const portal = new TemplatePortal(template, this.viewContainerRef);
|
|
42111
|
+
this.overlayRef.attach(portal);
|
|
42112
|
+
this.subscription.add(this.overlayRef.backdropClick().subscribe(() => {
|
|
42113
|
+
this.closeActionMenu();
|
|
42114
|
+
}));
|
|
42115
|
+
}
|
|
42116
|
+
closeActionMenu() {
|
|
42117
|
+
if (this.overlayRef) {
|
|
42118
|
+
this.isActionMenuOpen = false;
|
|
42119
|
+
this.overlayRef.dispose();
|
|
42120
|
+
this.cdr.markForCheck();
|
|
42121
|
+
}
|
|
42122
|
+
}
|
|
42123
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MultilingualPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
42124
|
+
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: [
|
|
42125
|
+
provideIcons({
|
|
42126
|
+
iconoirSettings,
|
|
42127
|
+
matMoreHorizOutline,
|
|
42128
|
+
iconoirCheckCircle,
|
|
42129
|
+
iconoirCircle,
|
|
42130
|
+
}),
|
|
42131
|
+
provideNgIconsConfig({
|
|
42132
|
+
size: '1.25em',
|
|
42133
|
+
}),
|
|
42134
|
+
], 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" }] }); }
|
|
42135
|
+
}
|
|
42136
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MultilingualPanelComponent, decorators: [{
|
|
42137
|
+
type: Component,
|
|
42138
|
+
args: [{ selector: 'gn-ui-multilingual-panel', standalone: true, imports: [
|
|
42139
|
+
CommonModule,
|
|
42140
|
+
CheckToggleComponent,
|
|
42141
|
+
TranslateDirective,
|
|
42142
|
+
TranslatePipe,
|
|
42143
|
+
ButtonComponent,
|
|
42144
|
+
NgIconComponent,
|
|
42145
|
+
ActionMenuComponent,
|
|
42146
|
+
], providers: [
|
|
42147
|
+
provideIcons({
|
|
42148
|
+
iconoirSettings,
|
|
42149
|
+
matMoreHorizOutline,
|
|
42150
|
+
iconoirCheckCircle,
|
|
42151
|
+
iconoirCircle,
|
|
42152
|
+
}),
|
|
42153
|
+
provideNgIconsConfig({
|
|
42154
|
+
size: '1.25em',
|
|
42155
|
+
}),
|
|
42156
|
+
], 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" }]
|
|
42157
|
+
}], propDecorators: { record: [{
|
|
42158
|
+
type: Input
|
|
42159
|
+
}], actionMenuButtons: [{
|
|
42160
|
+
type: ViewChildren,
|
|
42161
|
+
args: ['actionMenuButton', { read: ElementRef }]
|
|
42162
|
+
}] } });
|
|
42163
|
+
|
|
41886
42164
|
class GenericKeywordsComponent {
|
|
41887
42165
|
constructor() {
|
|
41888
42166
|
this.platformService = inject(PlatformServiceInterface);
|
|
@@ -43689,7 +43967,7 @@ class FormFieldComponent {
|
|
|
43689
43967
|
}
|
|
43690
43968
|
}
|
|
43691
43969
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
43692
|
-
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 }); }
|
|
43970
|
+
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 }); }
|
|
43693
43971
|
}
|
|
43694
43972
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FormFieldComponent, decorators: [{
|
|
43695
43973
|
type: Component,
|
|
@@ -43716,7 +43994,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
43716
43994
|
FormFieldSpatialToggleComponent,
|
|
43717
43995
|
FormFieldTopicsComponent,
|
|
43718
43996
|
TextFieldModule,
|
|
43719
|
-
], 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
|
|
43997
|
+
], 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" }]
|
|
43720
43998
|
}], propDecorators: { uniqueIdentifier: [{
|
|
43721
43999
|
type: Input
|
|
43722
44000
|
}], model: [{
|
|
@@ -43761,327 +44039,148 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
43761
44039
|
args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, FormFieldComponent, TranslateDirective], template: "<div class=\"flex flex-col gap-6\">\n @for (\n section of facade.currentSections$ | async;\n track sectionTracker($index, section)\n ) {\n @if (!section.hidden) {\n <div class=\"flex flex-col gap-6 border p-8 rounded-[8px] shadow\">\n <div class=\"flex flex-col gap-2\">\n @if (section.labelKey) {\n <div class=\"text-2xl font-title text-black\" translate>\n {{ section.labelKey }}\n </div>\n }\n @if (section.descriptionKey) {\n <div class=\"text-gray-800 text-sm\" translate>\n {{ section.descriptionKey }}\n </div>\n }\n </div>\n <div class=\"grid auto-rows-auto grid-cols-2 gap-[32px]\">\n @for (\n field of section.fieldsWithValues;\n track fieldTracker($index, field)\n ) {\n @if (!field.config.hidden) {\n <gn-ui-form-field\n [ngClass]=\"\n field.config.gridColumnSpan === 1\n ? 'col-span-1'\n : 'col-span-2'\n \"\n [uniqueIdentifier]=\"recordUniqueIdentifier$ | async\"\n [model]=\"field.config.model!\"\n [modelSpecifier]=\"field.config.modelSpecifier!\"\n [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n [componentName]=\"field.config.componentName\"\n (valueChange)=\"\n handleFieldValueChange(field.config.model!, $event)\n \"\n ></gn-ui-form-field>\n }\n }\n </div>\n </div>\n }\n }\n</div>\n" }]
|
|
43762
44040
|
}] });
|
|
43763
44041
|
|
|
43764
|
-
|
|
43765
|
-
|
|
43766
|
-
|
|
43767
|
-
ko: 'kr',
|
|
43768
|
-
cs: 'cz',
|
|
43769
|
-
zh: 'cn',
|
|
43770
|
-
ca: 'es-ct',
|
|
43771
|
-
rm: 'ch',
|
|
43772
|
-
da: 'dk',
|
|
43773
|
-
sv: 'se',
|
|
43774
|
-
cy: 'gb-wls',
|
|
43775
|
-
hy: 'am',
|
|
43776
|
-
ka: 'ge',
|
|
43777
|
-
uk: 'ua',
|
|
43778
|
-
};
|
|
43779
|
-
class MultilingualPanelComponent {
|
|
43780
|
-
constructor() {
|
|
43781
|
-
this.facade = inject(EditorFacade);
|
|
43782
|
-
this.dialog = inject(MatDialog);
|
|
43783
|
-
this.translateService = inject(TranslateService);
|
|
43784
|
-
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
43785
|
-
this.overlay = inject(Overlay);
|
|
43786
|
-
this.viewContainerRef = inject(ViewContainerRef);
|
|
43787
|
-
this.cdr = inject(ChangeDetectorRef);
|
|
43788
|
-
this.selectedLanguages = [];
|
|
43789
|
-
this.recordLanguages = [];
|
|
43790
|
-
this.formLanguage = '';
|
|
43791
|
-
this.isActionMenuOpen = false;
|
|
43792
|
-
this.subscription = new Subscription();
|
|
43793
|
-
this.supportedLanguages$ = this.recordsRepository
|
|
43794
|
-
.getApplicationLanguages()
|
|
43795
|
-
.pipe(map$2((languages) => this.sortLanguages(languages)));
|
|
43796
|
-
}
|
|
43797
|
-
set record(value) {
|
|
43798
|
-
this._record = value;
|
|
43799
|
-
this.isMultilingual = value.otherLanguages.length > 0;
|
|
43800
|
-
this.editTranslations = false;
|
|
43801
|
-
this.recordLanguages = [...value.otherLanguages, value.defaultLanguage];
|
|
43802
|
-
this.selectedLanguages = this.recordLanguages;
|
|
43803
|
-
this.formLanguage = value.defaultLanguage;
|
|
43804
|
-
}
|
|
43805
|
-
ngOnDestroy() {
|
|
43806
|
-
this.subscription.unsubscribe();
|
|
43807
|
-
}
|
|
43808
|
-
sortLanguages(languages) {
|
|
43809
|
-
return languages
|
|
43810
|
-
.map((lang) => {
|
|
43811
|
-
const label = this.translateService.instant('language.' + lang);
|
|
43812
|
-
const isTranslated = label !== 'language.' + lang;
|
|
43813
|
-
return {
|
|
43814
|
-
lang,
|
|
43815
|
-
label,
|
|
43816
|
-
isTranslated,
|
|
43817
|
-
};
|
|
43818
|
-
})
|
|
43819
|
-
.sort((a, b) => {
|
|
43820
|
-
if (a.isTranslated && !b.isTranslated)
|
|
43821
|
-
return -1;
|
|
43822
|
-
if (!a.isTranslated && b.isTranslated)
|
|
43823
|
-
return 1;
|
|
43824
|
-
return a.label.localeCompare(b.label);
|
|
43825
|
-
})
|
|
43826
|
-
.map((item) => item.lang);
|
|
43827
|
-
}
|
|
43828
|
-
toggleLanguageSelection() {
|
|
43829
|
-
this.editTranslations = !this.editTranslations;
|
|
43830
|
-
}
|
|
43831
|
-
getIconClass(lang) {
|
|
43832
|
-
return extraFlagMap[lang]
|
|
43833
|
-
? `fi fi-${extraFlagMap[lang]} w-4 h-3`
|
|
43834
|
-
: `fi fi-${lang} w-4 h-3`;
|
|
43835
|
-
}
|
|
43836
|
-
switchMultilingual() {
|
|
43837
|
-
if (this.isMultilingual && this.selectedLanguages.length > 1) {
|
|
43838
|
-
this.confirmDeleteAction();
|
|
43839
|
-
}
|
|
43840
|
-
else {
|
|
43841
|
-
this.isMultilingual = true;
|
|
43842
|
-
this.editTranslations = true;
|
|
43843
|
-
}
|
|
43844
|
-
}
|
|
43845
|
-
getExtraClass(lang) {
|
|
43846
|
-
const baseClass = 'h-[34px] w-full font-bold justify-start hover:bg-white';
|
|
43847
|
-
if (this.selectedLanguages.includes(lang)) {
|
|
43848
|
-
return `${baseClass} bg-white border border-black`;
|
|
43849
|
-
}
|
|
43850
|
-
return baseClass;
|
|
44042
|
+
function evaluate(expression) {
|
|
44043
|
+
if (expression.match(/^\${.*}$/)) {
|
|
44044
|
+
return evaluate(expression.slice(2, -1));
|
|
43851
44045
|
}
|
|
43852
|
-
|
|
43853
|
-
|
|
43854
|
-
|
|
43855
|
-
|
|
43856
|
-
|
|
43857
|
-
|
|
43858
|
-
}
|
|
44046
|
+
const operator = expression.split('(')[0];
|
|
44047
|
+
switch (operator) {
|
|
44048
|
+
case 'dateNow':
|
|
44049
|
+
return () => new Date();
|
|
44050
|
+
default:
|
|
44051
|
+
throw new Error(`Unknown operator: ${operator}`);
|
|
43859
44052
|
}
|
|
43860
|
-
|
|
43861
|
-
|
|
44053
|
+
}
|
|
44054
|
+
|
|
44055
|
+
class EditorService {
|
|
44056
|
+
constructor() {
|
|
44057
|
+
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
43862
44058
|
}
|
|
43863
|
-
|
|
43864
|
-
|
|
43865
|
-
|
|
43866
|
-
|
|
43867
|
-
|
|
44059
|
+
// returns the record as it was when saved, alongside its source
|
|
44060
|
+
saveRecord(record, recordSource, fieldsConfig) {
|
|
44061
|
+
const savedRecord = { ...record };
|
|
44062
|
+
const fields = fieldsConfig.pages.flatMap((page) => page.sections.flatMap((section) => section.fields));
|
|
44063
|
+
// run onSave processes
|
|
44064
|
+
for (const field of fields) {
|
|
44065
|
+
if (field.onSaveProcess && field.model) {
|
|
44066
|
+
const evaluator = evaluate(field.onSaveProcess);
|
|
44067
|
+
savedRecord[field.model] = evaluator({
|
|
44068
|
+
model: field.model,
|
|
44069
|
+
value: record[field.model],
|
|
44070
|
+
});
|
|
44071
|
+
}
|
|
43868
44072
|
}
|
|
43869
|
-
|
|
43870
|
-
|
|
44073
|
+
let publishToAll = true;
|
|
44074
|
+
// if the record is new, generate a new unique identifier and pass publishToAll as false
|
|
44075
|
+
if (!record.uniqueIdentifier) {
|
|
44076
|
+
savedRecord.uniqueIdentifier = null;
|
|
44077
|
+
publishToAll = false;
|
|
43871
44078
|
}
|
|
44079
|
+
return this.recordsRepository
|
|
44080
|
+
.saveRecord(savedRecord, recordSource, publishToAll)
|
|
44081
|
+
.pipe(switchMap((uniqueIdentifier) => this.recordsRepository.openRecordForEdition(uniqueIdentifier)), tap$1(() => {
|
|
44082
|
+
// if saving was successful, the original draft can be discarded
|
|
44083
|
+
this.recordsRepository.clearRecordDraft(record.uniqueIdentifier);
|
|
44084
|
+
}), map$1(([record, recordSource]) => [record, recordSource]));
|
|
43872
44085
|
}
|
|
43873
|
-
|
|
43874
|
-
|
|
43875
|
-
|
|
43876
|
-
|
|
43877
|
-
this.
|
|
43878
|
-
|
|
43879
|
-
|
|
43880
|
-
// TO IMPLEMENT FURTHER
|
|
43881
|
-
}
|
|
43882
|
-
switchDefaultLang(lang) {
|
|
43883
|
-
this.formLanguage = lang;
|
|
43884
|
-
this.facade.updateRecordLanguages(lang, this.selectedLanguages.filter((lang) => lang !== this.formLanguage));
|
|
43885
|
-
this.closeActionMenu();
|
|
43886
|
-
}
|
|
43887
|
-
confirmDeleteAction(lang) {
|
|
43888
|
-
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
43889
|
-
data: {
|
|
43890
|
-
title: this.translateService.instant('editor.record.multilingual.confirmation.title'),
|
|
43891
|
-
message: this.translateService.instant('editor.record.multilingual.confirmation.message'),
|
|
43892
|
-
confirmText: this.translateService.instant('editor.record.multilingual.confirmation.confirmText'),
|
|
43893
|
-
cancelText: this.translateService.instant('editor.record.multilingual.confirmation.cancelText'),
|
|
43894
|
-
focusCancel: true,
|
|
43895
|
-
},
|
|
43896
|
-
restoreFocus: true,
|
|
43897
|
-
});
|
|
43898
|
-
this.subscription.add(dialogRef.afterClosed().subscribe((confirmed) => {
|
|
43899
|
-
if (confirmed) {
|
|
43900
|
-
if (lang) {
|
|
43901
|
-
if (!Array.isArray(lang)) {
|
|
43902
|
-
this.removeSelectedLanguage(lang);
|
|
43903
|
-
this.closeActionMenu();
|
|
43904
|
-
}
|
|
43905
|
-
this.updateTranslations();
|
|
43906
|
-
}
|
|
43907
|
-
else {
|
|
43908
|
-
this.facade.updateRecordLanguages(this.formLanguage, []);
|
|
43909
|
-
this.isMultilingual = false;
|
|
43910
|
-
this.selectedLanguages = [];
|
|
43911
|
-
}
|
|
43912
|
-
}
|
|
43913
|
-
else {
|
|
43914
|
-
this.isMultilingual = true;
|
|
43915
|
-
this.selectedLanguages = this.recordLanguages;
|
|
43916
|
-
}
|
|
43917
|
-
this.editTranslations = false;
|
|
43918
|
-
}));
|
|
43919
|
-
}
|
|
43920
|
-
isFirstUnsupported(index) {
|
|
43921
|
-
const langs = this.sortLanguages(this.recordLanguages);
|
|
43922
|
-
return (langs[index].length === 3 &&
|
|
43923
|
-
langs.slice(0, index).every((lang) => lang.length !== 3));
|
|
43924
|
-
}
|
|
43925
|
-
isLangSupported(lang) {
|
|
43926
|
-
return lang.length === 2;
|
|
43927
|
-
}
|
|
43928
|
-
getToggleTitle(lang) {
|
|
43929
|
-
if (lang === this._record.defaultLanguage) {
|
|
43930
|
-
return this.translateService.instant('editor.record.form.multilingual.forbidden');
|
|
43931
|
-
}
|
|
43932
|
-
return '';
|
|
44086
|
+
// emits and completes once saving is done
|
|
44087
|
+
// note: onSave processes are not run for drafts
|
|
44088
|
+
saveRecordAsDraft(record, recordSource) {
|
|
44089
|
+
record.recordUpdated = new Date();
|
|
44090
|
+
return this.recordsRepository
|
|
44091
|
+
.saveRecordAsDraft(record, recordSource)
|
|
44092
|
+
.pipe(map$1(() => undefined));
|
|
43933
44093
|
}
|
|
43934
|
-
|
|
43935
|
-
this.
|
|
43936
|
-
|
|
43937
|
-
const buttonElement = this.actionMenuButtons.toArray()[index];
|
|
43938
|
-
const positionStrategy = this.overlay
|
|
43939
|
-
.position()
|
|
43940
|
-
.flexibleConnectedTo(buttonElement)
|
|
43941
|
-
.withFlexibleDimensions(true)
|
|
43942
|
-
.withPush(true)
|
|
43943
|
-
.withPositions([
|
|
43944
|
-
{
|
|
43945
|
-
originX: 'end',
|
|
43946
|
-
originY: 'bottom',
|
|
43947
|
-
overlayX: 'end',
|
|
43948
|
-
overlayY: 'top',
|
|
43949
|
-
},
|
|
43950
|
-
{
|
|
43951
|
-
originX: 'end',
|
|
43952
|
-
originY: 'top',
|
|
43953
|
-
overlayX: 'end',
|
|
43954
|
-
overlayY: 'bottom',
|
|
43955
|
-
},
|
|
43956
|
-
]);
|
|
43957
|
-
this.overlayRef = this.overlay.create({
|
|
43958
|
-
hasBackdrop: true,
|
|
43959
|
-
backdropClass: 'cdk-overlay-transparent-backdrop',
|
|
43960
|
-
positionStrategy: positionStrategy,
|
|
43961
|
-
scrollStrategy: this.overlay.scrollStrategies.reposition(),
|
|
43962
|
-
});
|
|
43963
|
-
const portal = new TemplatePortal(template, this.viewContainerRef);
|
|
43964
|
-
this.overlayRef.attach(portal);
|
|
43965
|
-
this.subscription.add(this.overlayRef.backdropClick().subscribe(() => {
|
|
43966
|
-
this.closeActionMenu();
|
|
43967
|
-
}));
|
|
44094
|
+
undoRecordDraft(record) {
|
|
44095
|
+
this.recordsRepository.clearRecordDraft(record.uniqueIdentifier);
|
|
44096
|
+
return this.recordsRepository.openRecordForEdition(record.uniqueIdentifier);
|
|
43968
44097
|
}
|
|
43969
|
-
|
|
43970
|
-
|
|
43971
|
-
this.isActionMenuOpen = false;
|
|
43972
|
-
this.overlayRef.dispose();
|
|
43973
|
-
this.cdr.markForCheck();
|
|
43974
|
-
}
|
|
44098
|
+
hasRecordChangedSinceDraft(localRecord) {
|
|
44099
|
+
return this.recordsRepository.hasRecordChangedSinceDraft(localRecord);
|
|
43975
44100
|
}
|
|
43976
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type:
|
|
43977
|
-
static { this.ɵ
|
|
43978
|
-
provideIcons({
|
|
43979
|
-
iconoirSettings,
|
|
43980
|
-
matMoreHorizOutline,
|
|
43981
|
-
iconoirCheckCircle,
|
|
43982
|
-
iconoirCircle,
|
|
43983
|
-
}),
|
|
43984
|
-
provideNgIconsConfig({
|
|
43985
|
-
size: '1.25em',
|
|
43986
|
-
}),
|
|
43987
|
-
], viewQueries: [{ propertyName: "actionMenuButtons", predicate: ["actionMenuButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n class=\"flex flex-col h-full w-[302px] border-l border-gray-300 py-8 px-3 gap-6 overflow-auto\"\n style=\"background-color: #fafaf9\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.multilingual.title</span\n >\n @if (isMultilingual) {\n <button\n [title]=\"'editor.record.form.multilingual.open' | translate\"\n (click)=\"toggleLanguageSelection()\"\n data-test=\"activateSelection\"\n >\n <ng-icon class=\"mt-1\" name=\"iconoirSettings\"></ng-icon>\n </button>\n }\n </div>\n @if (editTranslations || !isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n <gn-ui-check-toggle\n class=\"p-2\"\n [label]=\"'editor.record.form.multilingual.enable' | translate\"\n [color]=\"'primary'\"\n [(value)]=\"isMultilingual\"\n (toggled)=\"switchMultilingual($event)\"\n ></gn-ui-check-toggle>\n @if (isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n <div\n class=\"flex flex-row justify-between border-t border-gray-300 p-3\"\n >\n <span class=\"mt-2 text-sm text-gray-600\" translate\n >editor.record.form.multilingual.activate</span\n >\n <gn-ui-button\n extraClass=\"w-16 h-8 font-bold\"\n type=\"gray\"\n (buttonClick)=\"validateTranslations()\"\n data-test=\"validateSelection\"\n >{{ 'editor.record.form.multilingual.validate' | translate }}\n </gn-ui-button>\n </div>\n @if (supportedLanguages$ | async; as languages) {\n @for (lang of languages; track lang) {\n <div\n class=\"flex flex-col gap-2 w-full px-2\"\n data-test=\"langAvailable\"\n [attr.data-test-lang]=\"lang\"\n >\n <gn-ui-button\n [extraClass]=\"getExtraClass(lang)\"\n type=\"gray\"\n (buttonClick)=\"toggleLanguage(lang)\"\n [disabled]=\"lang === _record.defaultLanguage\"\n [title]=\"getToggleTitle(lang)\"\n >\n <span [class]=\"getIconClass(lang)\"></span>\n <span class=\"ml-2\">{{ 'language.' + lang | translate }}</span>\n </gn-ui-button>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n @if (!editTranslations && isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n @for (\n recordLang of sortLanguages(recordLanguages);\n track recordLang;\n let i = $index\n ) {\n <gn-ui-button\n extraClass=\"flex flex-row justify-between bg-white border border-white rounded mb-1 h-[34px] w-full\"\n [ngClass]=\"{\n 'mt-8': isFirstUnsupported(i),\n '': true,\n }\"\n (buttonClick)=\"switchFormLang(recordLang)\"\n type=\"outline\"\n data-test=\"langSwitch\"\n >\n <div class=\"flex flex-row gap-2 items-center\">\n @if (recordLang === formLanguage) {\n <ng-icon\n class=\"text-primary mt-1\"\n name=\"iconoirCheckCircle\"\n ></ng-icon>\n }\n @if (recordLang !== formLanguage) {\n <ng-icon\n class=\"text-gray-800 mt-1\"\n name=\"iconoirCircle\"\n ></ng-icon>\n }\n @if (recordLang.length === 2) {\n <span [class]=\"getIconClass(recordLang) + 'mt-1'\"></span>\n }\n <span [ngClass]=\"recordLang === formLanguage ? 'text-black' : ''\">{{\n isLangSupported(recordLang)\n ? ('language.' + recordLang | translate)\n : recordLang.toUpperCase()\n }}</span>\n </div>\n <div class=\"flex flex-row gap-2 items-center\">\n @if (recordLang === formLanguage) {\n <span class=\"text-xs text-base\" translate\n >editor.record.form.multilingual.default</span\n >\n }\n <button\n (click)=\"\n openActionMenu(recordLang, template); $event.stopPropagation()\n \"\n cdkOverlayOrigin\n #actionMenuButton\n >\n <ng-icon class=\"pb-5\" name=\"matMoreHorizOutline\"></ng-icon>\n </button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDelete]=\"recordLang !== _record.defaultLanguage\"\n page=\"record\"\n (delete)=\"confirmDeleteAction(recordLang)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (switch)=\"switchDefaultLang(recordLang)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </div>\n </gn-ui-button>\n }\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: CheckToggleComponent, selector: "gn-ui-check-toggle", inputs: ["title", "label", "value", "color"], outputs: ["toggled"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ActionMenuComponent, selector: "gn-ui-action-menu", inputs: ["canDuplicate", "isDuplicating", "canDelete", "page"], outputs: ["duplicate", "delete", "closeActionMenu", "rollback", "switch"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
|
|
44101
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
44102
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, providedIn: 'root' }); }
|
|
43988
44103
|
}
|
|
43989
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type:
|
|
43990
|
-
type:
|
|
43991
|
-
args: [{
|
|
43992
|
-
|
|
43993
|
-
|
|
43994
|
-
|
|
43995
|
-
TranslatePipe,
|
|
43996
|
-
ButtonComponent,
|
|
43997
|
-
NgIconComponent,
|
|
43998
|
-
ActionMenuComponent,
|
|
43999
|
-
], providers: [
|
|
44000
|
-
provideIcons({
|
|
44001
|
-
iconoirSettings,
|
|
44002
|
-
matMoreHorizOutline,
|
|
44003
|
-
iconoirCheckCircle,
|
|
44004
|
-
iconoirCircle,
|
|
44005
|
-
}),
|
|
44006
|
-
provideNgIconsConfig({
|
|
44007
|
-
size: '1.25em',
|
|
44008
|
-
}),
|
|
44009
|
-
], template: "<div\n class=\"flex flex-col h-full w-[302px] border-l border-gray-300 py-8 px-3 gap-6 overflow-auto\"\n style=\"background-color: #fafaf9\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.multilingual.title</span\n >\n @if (isMultilingual) {\n <button\n [title]=\"'editor.record.form.multilingual.open' | translate\"\n (click)=\"toggleLanguageSelection()\"\n data-test=\"activateSelection\"\n >\n <ng-icon class=\"mt-1\" name=\"iconoirSettings\"></ng-icon>\n </button>\n }\n </div>\n @if (editTranslations || !isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n <gn-ui-check-toggle\n class=\"p-2\"\n [label]=\"'editor.record.form.multilingual.enable' | translate\"\n [color]=\"'primary'\"\n [(value)]=\"isMultilingual\"\n (toggled)=\"switchMultilingual($event)\"\n ></gn-ui-check-toggle>\n @if (isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n <div\n class=\"flex flex-row justify-between border-t border-gray-300 p-3\"\n >\n <span class=\"mt-2 text-sm text-gray-600\" translate\n >editor.record.form.multilingual.activate</span\n >\n <gn-ui-button\n extraClass=\"w-16 h-8 font-bold\"\n type=\"gray\"\n (buttonClick)=\"validateTranslations()\"\n data-test=\"validateSelection\"\n >{{ 'editor.record.form.multilingual.validate' | translate }}\n </gn-ui-button>\n </div>\n @if (supportedLanguages$ | async; as languages) {\n @for (lang of languages; track lang) {\n <div\n class=\"flex flex-col gap-2 w-full px-2\"\n data-test=\"langAvailable\"\n [attr.data-test-lang]=\"lang\"\n >\n <gn-ui-button\n [extraClass]=\"getExtraClass(lang)\"\n type=\"gray\"\n (buttonClick)=\"toggleLanguage(lang)\"\n [disabled]=\"lang === _record.defaultLanguage\"\n [title]=\"getToggleTitle(lang)\"\n >\n <span [class]=\"getIconClass(lang)\"></span>\n <span class=\"ml-2\">{{ 'language.' + lang | translate }}</span>\n </gn-ui-button>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n @if (!editTranslations && isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n @for (\n recordLang of sortLanguages(recordLanguages);\n track recordLang;\n let i = $index\n ) {\n <gn-ui-button\n extraClass=\"flex flex-row justify-between bg-white border border-white rounded mb-1 h-[34px] w-full\"\n [ngClass]=\"{\n 'mt-8': isFirstUnsupported(i),\n '': true,\n }\"\n (buttonClick)=\"switchFormLang(recordLang)\"\n type=\"outline\"\n data-test=\"langSwitch\"\n >\n <div class=\"flex flex-row gap-2 items-center\">\n @if (recordLang === formLanguage) {\n <ng-icon\n class=\"text-primary mt-1\"\n name=\"iconoirCheckCircle\"\n ></ng-icon>\n }\n @if (recordLang !== formLanguage) {\n <ng-icon\n class=\"text-gray-800 mt-1\"\n name=\"iconoirCircle\"\n ></ng-icon>\n }\n @if (recordLang.length === 2) {\n <span [class]=\"getIconClass(recordLang) + 'mt-1'\"></span>\n }\n <span [ngClass]=\"recordLang === formLanguage ? 'text-black' : ''\">{{\n isLangSupported(recordLang)\n ? ('language.' + recordLang | translate)\n : recordLang.toUpperCase()\n }}</span>\n </div>\n <div class=\"flex flex-row gap-2 items-center\">\n @if (recordLang === formLanguage) {\n <span class=\"text-xs text-base\" translate\n >editor.record.form.multilingual.default</span\n >\n }\n <button\n (click)=\"\n openActionMenu(recordLang, template); $event.stopPropagation()\n \"\n cdkOverlayOrigin\n #actionMenuButton\n >\n <ng-icon class=\"pb-5\" name=\"matMoreHorizOutline\"></ng-icon>\n </button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDelete]=\"recordLang !== _record.defaultLanguage\"\n page=\"record\"\n (delete)=\"confirmDeleteAction(recordLang)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (switch)=\"switchDefaultLang(recordLang)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </div>\n </gn-ui-button>\n }\n </div>\n }\n</div>\n" }]
|
|
44010
|
-
}], propDecorators: { record: [{
|
|
44011
|
-
type: Input
|
|
44012
|
-
}], actionMenuButtons: [{
|
|
44013
|
-
type: ViewChildren,
|
|
44014
|
-
args: ['actionMenuButton', { read: ElementRef }]
|
|
44015
|
-
}] } });
|
|
44104
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, decorators: [{
|
|
44105
|
+
type: Injectable,
|
|
44106
|
+
args: [{
|
|
44107
|
+
providedIn: 'root',
|
|
44108
|
+
}]
|
|
44109
|
+
}] });
|
|
44016
44110
|
|
|
44017
|
-
|
|
44018
|
-
marker('editor.record.form.field.keywords');
|
|
44019
|
-
marker('editor.record.form.field.topics');
|
|
44020
|
-
marker('editor.record.form.field.contacts');
|
|
44021
|
-
marker('editor.record.form.field.organisation');
|
|
44022
|
-
class MetadataQualityPanelComponent {
|
|
44111
|
+
class EditorEffects {
|
|
44023
44112
|
constructor() {
|
|
44024
|
-
this.
|
|
44025
|
-
this.
|
|
44026
|
-
|
|
44027
|
-
|
|
44028
|
-
|
|
44029
|
-
|
|
44030
|
-
|
|
44031
|
-
|
|
44032
|
-
|
|
44033
|
-
|
|
44034
|
-
|
|
44035
|
-
|
|
44036
|
-
fieldsByPage[2].includes('organisation') ||
|
|
44037
|
-
fieldsByPage[2].push('organisation');
|
|
44113
|
+
this.actions$ = inject(Actions);
|
|
44114
|
+
this.editorService = inject(EditorService);
|
|
44115
|
+
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
44116
|
+
this.plateformService = inject(PlatformServiceInterface);
|
|
44117
|
+
this.store = inject(Store);
|
|
44118
|
+
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]) => {
|
|
44119
|
+
const actions = [saveRecordSuccess()];
|
|
44120
|
+
if (!record?.uniqueIdentifier) {
|
|
44121
|
+
actions.push(openRecord({
|
|
44122
|
+
record: savedRecord,
|
|
44123
|
+
recordSource: savedRecordSource,
|
|
44124
|
+
}));
|
|
44038
44125
|
}
|
|
44039
|
-
|
|
44040
|
-
|
|
44041
|
-
|
|
44042
|
-
|
|
44043
|
-
|
|
44044
|
-
|
|
44045
|
-
|
|
44046
|
-
|
|
44047
|
-
|
|
44048
|
-
|
|
44049
|
-
|
|
44050
|
-
|
|
44051
|
-
|
|
44126
|
+
return of(...actions);
|
|
44127
|
+
}), catchError((error) => of(saveRecordFailure({
|
|
44128
|
+
error,
|
|
44129
|
+
})))))));
|
|
44130
|
+
this.cleanRecordAttachments$ = createEffect(() => this.actions$.pipe(ofType(saveRecordSuccess), withLatestFrom$1(this.store.select(selectRecord)), switchMap$1(([_, record]) => {
|
|
44131
|
+
if (record.uniqueIdentifier !== null) {
|
|
44132
|
+
this.plateformService.cleanRecordAttachments(record).subscribe({
|
|
44133
|
+
next: (_) => undefined,
|
|
44134
|
+
error: (err) => {
|
|
44135
|
+
console.error(err);
|
|
44136
|
+
},
|
|
44137
|
+
});
|
|
44138
|
+
}
|
|
44139
|
+
return EMPTY;
|
|
44140
|
+
}), catchError((error) => {
|
|
44141
|
+
console.error(error);
|
|
44142
|
+
return EMPTY;
|
|
44143
|
+
})), { dispatch: false });
|
|
44144
|
+
this.markAsChanged$ = createEffect(() => this.actions$.pipe(ofType(updateRecordField, updateRecordLanguages), map$1(() => markRecordAsChanged())));
|
|
44145
|
+
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())));
|
|
44146
|
+
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({
|
|
44147
|
+
record,
|
|
44148
|
+
recordSource,
|
|
44149
|
+
}))));
|
|
44150
|
+
this.checkHasChangesOnOpen$ = createEffect(() => this.actions$.pipe(ofType(openRecord), map$1(({ record }) => this.recordsRepository.recordHasDraft(record.uniqueIdentifier)), filter((hasDraft) => hasDraft), map$1(() => markRecordAsChanged())));
|
|
44151
|
+
this.hasRecordChangedSinceDraft$ = createEffect(() => this.actions$.pipe(ofType(hasRecordChangedSinceDraft), switchMap$1(({ record }) => this.editorService
|
|
44152
|
+
.hasRecordChangedSinceDraft(record)
|
|
44153
|
+
.pipe(map$1((changes) => hasRecordChangedSinceDraftSuccess({ changes }))))));
|
|
44154
|
+
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({
|
|
44155
|
+
isPublished: isPublished$1,
|
|
44156
|
+
}))));
|
|
44157
|
+
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({
|
|
44158
|
+
canEditRecord: canEditRecord$1,
|
|
44159
|
+
}))));
|
|
44052
44160
|
}
|
|
44053
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type:
|
|
44054
|
-
static { this.ɵ
|
|
44055
|
-
provideIcons({
|
|
44056
|
-
iconoirSystemShut,
|
|
44057
|
-
iconoirBadgeCheck,
|
|
44058
|
-
}),
|
|
44059
|
-
provideNgIconsConfig({
|
|
44060
|
-
size: '1.25em',
|
|
44061
|
-
}),
|
|
44062
|
-
], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"flex flex-col h-full w-[302px] border-l border-gray-300 py-8 px-3 gap-3 overflow-auto\"\n style=\"background-color: #fafaf9\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.metadataQuality.title</span\n >\n </div>\n @for (properties of propertiesByPage; track properties; let i = $index) {\n <div class=\"flex flex-col gap-2\">\n @for (property of properties; track property) {\n <gn-ui-button\n [extraClass]=\"getExtraClass(property.value)\"\n type=\"outline\"\n attr.data-cy=\"md-quality-btn-{{ property.label }}\"\n >\n <span>{{ property.label | translate }}</span>\n <div class=\"flex flex-row gap-2 items-center\">\n @if (property.value) {\n <ng-icon class=\"text-primary\" name=\"iconoirBadgeCheck\"></ng-icon>\n } @else {\n <ng-icon\n class=\"text-neutral-300\"\n name=\"iconoirSystemShut\"\n ></ng-icon>\n }\n </div>\n </gn-ui-button>\n }\n @if (i !== propertiesByPage.length - 1) {\n <hr class=\"border-gray-300 w-11/12 mx-auto\" />\n }\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
|
|
44161
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
44162
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects }); }
|
|
44063
44163
|
}
|
|
44064
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type:
|
|
44065
|
-
type:
|
|
44066
|
-
|
|
44067
|
-
|
|
44068
|
-
|
|
44069
|
-
|
|
44070
|
-
|
|
44071
|
-
|
|
44072
|
-
|
|
44073
|
-
|
|
44074
|
-
|
|
44075
|
-
|
|
44076
|
-
|
|
44077
|
-
|
|
44078
|
-
|
|
44079
|
-
|
|
44080
|
-
|
|
44081
|
-
|
|
44082
|
-
|
|
44083
|
-
|
|
44084
|
-
}] } });
|
|
44164
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects, decorators: [{
|
|
44165
|
+
type: Injectable
|
|
44166
|
+
}] });
|
|
44167
|
+
|
|
44168
|
+
class FeatureEditorModule {
|
|
44169
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
44170
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, imports: [i1.StoreFeatureModule, i2$2.EffectsFeatureModule] }); }
|
|
44171
|
+
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),
|
|
44172
|
+
EffectsModule.forFeature([EditorEffects])] }); }
|
|
44173
|
+
}
|
|
44174
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, decorators: [{
|
|
44175
|
+
type: NgModule,
|
|
44176
|
+
args: [{
|
|
44177
|
+
imports: [
|
|
44178
|
+
StoreModule.forFeature(EDITOR_FEATURE_KEY, editorReducer),
|
|
44179
|
+
EffectsModule.forFeature([EditorEffects]),
|
|
44180
|
+
],
|
|
44181
|
+
providers: [EditorFacade, provideHttpClient()],
|
|
44182
|
+
}]
|
|
44183
|
+
}] });
|
|
44085
44184
|
|
|
44086
44185
|
const ROUTER_STATE_KEY = 'router';
|
|
44087
44186
|
const ROUTER_ROUTE_SEARCH = 'search';
|
|
@@ -44271,6 +44370,7 @@ class RouterFacade {
|
|
|
44271
44370
|
});
|
|
44272
44371
|
}
|
|
44273
44372
|
updateSearch(query) {
|
|
44373
|
+
console.log('RouterFacade - updateSearch', query);
|
|
44274
44374
|
this.go({
|
|
44275
44375
|
path: this.routerService.getSearchRoute(),
|
|
44276
44376
|
...(query && { query: flattenQueryParams(query) }),
|
|
@@ -44278,6 +44378,7 @@ class RouterFacade {
|
|
|
44278
44378
|
});
|
|
44279
44379
|
}
|
|
44280
44380
|
setSearch(query) {
|
|
44381
|
+
console.log('RouterFacade - setSearch', query);
|
|
44281
44382
|
this.go({
|
|
44282
44383
|
path: this.routerService.getSearchRoute(),
|
|
44283
44384
|
...(query && { query: flattenQueryParams(query) }),
|
|
@@ -44317,6 +44418,12 @@ class RouterEffects {
|
|
|
44317
44418
|
this.syncSearchState$ = createEffect(() => this.facade.searchParams$.pipe(mergeMap((searchParams) => this.fieldsService
|
|
44318
44419
|
.buildFiltersFromFieldValues(searchParams)
|
|
44319
44420
|
.pipe(map$1((filters) => [searchParams, filters]))), startWith([null, {}]), pairwise(), map$1(([[oldParams, oldFilters], [newParams, newFilters]]) => {
|
|
44421
|
+
console.log('RouterEffects - syncSearchState', {
|
|
44422
|
+
oldParams,
|
|
44423
|
+
newParams,
|
|
44424
|
+
oldFilters,
|
|
44425
|
+
newFilters,
|
|
44426
|
+
});
|
|
44320
44427
|
let sortBy = ROUTE_PARAMS.SORT in newParams
|
|
44321
44428
|
? sortByFromString(newParams[ROUTE_PARAMS.SORT])
|
|
44322
44429
|
: this.routerService.getDefaultSort();
|
|
@@ -44354,6 +44461,23 @@ class RouterEffects {
|
|
|
44354
44461
|
}
|
|
44355
44462
|
return of(...actions);
|
|
44356
44463
|
})));
|
|
44464
|
+
/**
|
|
44465
|
+
* This effect is needed because on the page load, the search params from the URL are
|
|
44466
|
+
* directly applied to the underlying search facade; this means that it doesn't go
|
|
44467
|
+
* through the RouterSearchService which makes sure that a relevancy sort is applied
|
|
44468
|
+
* whenever there's a full text search criteria set.
|
|
44469
|
+
*/
|
|
44470
|
+
this.applyInitialRelevancySort$ = createEffect(() => this.facade.searchParams$.pipe(take(1), tap$1((filters) => {
|
|
44471
|
+
const relevancySort = sortByToString(SortByEnum.RELEVANCY);
|
|
44472
|
+
if (filters['q'] &&
|
|
44473
|
+
(!Array.isArray(filters['q']) || filters['q'].length > 0) &&
|
|
44474
|
+
!filters[ROUTE_PARAMS.SORT]) {
|
|
44475
|
+
this.facade.updateSearch({
|
|
44476
|
+
...filters,
|
|
44477
|
+
[ROUTE_PARAMS.SORT]: relevancySort,
|
|
44478
|
+
});
|
|
44479
|
+
}
|
|
44480
|
+
})), { dispatch: false });
|
|
44357
44481
|
/**
|
|
44358
44482
|
* This effect will load the metadata when a navigation to
|
|
44359
44483
|
* a metadata record happens
|
|
@@ -44444,6 +44568,7 @@ class RouterSearchService {
|
|
|
44444
44568
|
this.fieldsService = inject(FieldsService);
|
|
44445
44569
|
}
|
|
44446
44570
|
setSortAndFilters(filters, sortBy) {
|
|
44571
|
+
console.log('RouterSearchService - setSortAndFilters', { filters, sortBy });
|
|
44447
44572
|
this.fieldsService
|
|
44448
44573
|
.readFieldValuesFromFilters(filters)
|
|
44449
44574
|
.subscribe((values) => {
|
|
@@ -44454,17 +44579,27 @@ class RouterSearchService {
|
|
|
44454
44579
|
});
|
|
44455
44580
|
}
|
|
44456
44581
|
async setFilters(newFilters) {
|
|
44457
|
-
|
|
44582
|
+
let sortBy = await firstValueFrom(this.searchFacade.sortBy$);
|
|
44458
44583
|
const fieldSearchParams = await firstValueFrom(this.fieldsService.readFieldValuesFromFilters(newFilters));
|
|
44584
|
+
// apply relevancy sort if a full text criteria is given
|
|
44585
|
+
sortBy = newFilters['any'] ? SortByEnum.RELEVANCY : sortBy;
|
|
44459
44586
|
this.facade.setSearch({
|
|
44460
44587
|
...fieldSearchParams,
|
|
44461
44588
|
[ROUTE_PARAMS.SORT]: sortBy ? sortByToString(sortBy) : undefined,
|
|
44462
44589
|
});
|
|
44463
44590
|
}
|
|
44464
44591
|
async updateFilters(newFilters) {
|
|
44592
|
+
console.log('RouterSearchService - updateFilters', newFilters);
|
|
44465
44593
|
const currentFilters = await firstValueFrom(this.searchFacade.searchFilters$);
|
|
44466
44594
|
const updatedFilters = { ...currentFilters, ...newFilters };
|
|
44467
|
-
|
|
44595
|
+
let newParams = await firstValueFrom(this.fieldsService.readFieldValuesFromFilters(updatedFilters));
|
|
44596
|
+
if (newFilters['any']) {
|
|
44597
|
+
newParams = {
|
|
44598
|
+
...newParams,
|
|
44599
|
+
[ROUTE_PARAMS.SORT]: sortByToString(SortByEnum.RELEVANCY),
|
|
44600
|
+
};
|
|
44601
|
+
}
|
|
44602
|
+
console.log('RouterSearchService - updateFilters - newParams', newParams);
|
|
44468
44603
|
this.facade.updateSearch(newParams);
|
|
44469
44604
|
}
|
|
44470
44605
|
setSortBy(sortBy) {
|
|
@@ -44524,5 +44659,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
44524
44659
|
* Generated bundle index. Do not edit.
|
|
44525
44660
|
*/
|
|
44526
44661
|
|
|
44527
|
-
export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, ActionMenuComponent, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, ApplicationBannerComponent, AuthService, AutocompleteComponent, AvailableServicesField, AvatarComponent, AvatarServiceInterface, BASEMAP_LAYERS, BadgeComponent, BaseConverter, BaseFileReader, BaseReader, BlockListComponent, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CarouselComponent, CatalogTitleComponent, CellPopinComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ClearError, ClearResults, ColorScaleComponent, ConfirmationDialogComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_GN4_LOGIN_URL, DEFAULT_GN4_LOGOUT_URL, DEFAULT_GN4_SETTINGS_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DISABLE_AUTH, DO_NOT_USE_DEFAULT_BASEMAP, DataService, DataTableComponent, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangeDropdownComponent, DateRangeInputsComponent, DateRangePickerComponent, DateRangeSearchField, DateService, DcatApConverter, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EXTERNAL_VIEWER_OPEN_NEW_TAB, EXTERNAL_VIEWER_URL_TEMPLATE, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalLinkCardComponent, ExternalViewerButtonComponent, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FILTER_SUMMARY_IGNORE_LIST, FORMATS, FacetBlockComponent, FacetItemComponent, FacetListComponent, FacetsContainerComponent, FavoriteStarComponent, FavoritesService, FeatureCatalogListComponent, FeatureDetailComponent, FeatureEditorModule, FeatureMapModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileInputComponent, FileTranslateLoader, FilesDropDirective, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldDateComponent, FormFieldFileComponent, FormFieldKeywordsComponent, FormFieldLicenseComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentsComponent, FormFieldTopicsComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GEONETWORK_UI_TAG_NAME, GEONETWORK_UI_VERSION, GeoDataBadgeComponent, GeoTableViewComponent, GeocodingComponent, GeojsonReader, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GnUiHumanizeDateDirective, GpfApiDlComponent, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageInputComponent, ImageOverlayPreviewComponent, ImportRecordComponent, InlineFilterComponent, InteractiveTableColumnComponent, InteractiveTableComponent, InternalLinkCardComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, KindBadgeComponent, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LOGIN_URL, LOGOUT_URL, LONLAT_CRS_CODES, LanguageSwitcherComponent, LayersPanelComponent, LicenseSearchField, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_FEATURE_KEY, MAP_VIEW_CONSTRAINTS, METADATA_LANGUAGE, MapContainerComponent, MapFacade, MapLegendComponent, MapStateContainerComponent, MapStyleService, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataDoiComponent, MetadataInfoComponent, MetadataLinkType, MetadataMapperContext, MetadataQualityComponent, MetadataQualityItemComponent, MetadataQualityPanelComponent, ModalDialogComponent, MultilingualPanelComponent, MultilingualSearchField, MyOrgService, NAMESPACES, NOT_APPLICABLE_CONSTRAINT, NOT_KNOWN_CONSTRAINT, NotificationComponent, NotificationsContainerComponent, NotificationsService, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OrganizationsServiceInterface, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PaginationDotsComponent, PatchResultsAggregations, PlatformServiceInterface, PopoverComponent, PopupAlertComponent, PossibleResourceTypes, PossibleResourceTypesDefinition, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_DATASET_URL_TOKEN, RECORD_REUSE_URL_TOKEN, RECORD_SERVICE_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, ROUTER_ROUTE_REUSE, ROUTER_ROUTE_SEARCH, ROUTER_ROUTE_SERVICE, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordKindField, RecordMetaComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsRepositoryInterface, RecordsService, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResourceTypeLegacyField, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsHitsSearchKindComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, ReusePresentationForms, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SETTINGS_URL, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchFeatureCatalogComponent, SearchFiltersSummaryComponent, SearchFiltersSummaryItemComponent, SearchInputComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, ServiceCapabilitiesComponent, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortableListComponent, SourceLabelComponent, SourcesService, SpatialExtentComponent, SpinningLoaderComponent, StacItemsResultGridComponent, StacViewComponent, StarToggleComponent, StickyHeaderComponent, SupportedTypes, SwitchToggleComponent, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEBUG_CONFIG, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslatedSearchField, TruncatedTextComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UpdateConfigAggregations, UpdateFilters, UrlInputComponent, UserFeedbackItemComponent, UserPreviewComponent, UserSearchField, VECTOR_STYLE_DEFAULT, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, XmlParseError, _reset, allChildrenElement, appConfigWithTranslationFixture, appendChildTree, appendChildren, assertValidXml, blockModelFixture, bytesToMegabytes, canEditRecord, checkFileFormat, clearSelectedFeatures, createChild, createDocument, createElement, createFuzzyFilter, createNestedChild, createNestedElement, currentPage, defaultMapStyleFixture, defaultMapStyleHlFixture, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, emptyBlockModelFixture, findChildElement, findChildOrCreate, findChildrenElement, findConverterForDocument, findNestedChildOrCreate, findNestedElement, findNestedElements, findParent, firstChildElement, formatDate, formatUserInfo, getAllKeysValidator, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryBoundingBox, getGeometryFromGeoJSON, getGlobalConfig, getIsMobile, getJsonDataItemsProxy, getLayers, getLinkId, getLinkLabel, getLinkPriority, getMapContext, getMapContextLayerFromConfig, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getNamespace, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getQualityValidators, getResourceType, getReusePresentationForm, getReuseType, getRootElement, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSelectedFeatures, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, handleScrollOnNavigation, hasRecordChangedSinceDraft, hasRecordChangedSinceDraftSuccess, initSearch, initialEditorState, initialMapState, initialState, isConfigLoaded, isDateRange, isFormatInQueryParam, isPublished, itemModelFixture, kindToCodeListValue, loadAppConfig, malformedConfigFixture, mapConfigFixture, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, matchesNoApplicableConstraint, matchesNoKnownConstraint, megabytesToBytes, mimeTypeToFormat, minimalAppConfigFixture, missingMandatoryConfigFixture, mouseWheelZoomCondition, noDuplicateFileName, okAppConfigFixture, openDataset, openRecord, organizationsServiceFactory, parse, parseXmlString, placeholder, prioritizePageScroll, propagateToDocumentOnly, provideGn4, provideI18n, provideRepositoryUrl, readAttribute, readDataset, readDatasetHeaders, readText, reducer$2 as reducer, reducerSearch, removeAllChildren, removeChildren, removeChildrenByName, removeSearchParams, removeWhitespace, renameElements, saveRecord, saveRecordFailure, saveRecordSuccess, selectCanEditRecord, selectCurrentPage, selectEditorConfig, selectEditorState, selectFallback, selectFallbackFields, selectField, selectHasRecordChanged, selectIsPublished, selectRecord, selectRecordChangedSinceSave, selectRecordSaveError, selectRecordSaving, selectRecordSections, selectRecordSource, selectTranslatedField, selectTranslatedValue, setContext, setCurrentPage, setFieldVisibility, setSelectedFeatures, setTextContent, someHabTableItemFixture, sortByFromString, sortByToString, sortByToStrings, stripHtml, stripNamespace, tableItemsFixture, toDate, toLang2, toLang3, totalPages, undoRecordDraft, unrecognizedKeysConfigFixture, updateLanguages, updateRecordField, updateRecordLanguages, wmsLayerFlatten, writeAttribute, wrongLanguageCodeConfigFixture, xmlToString };
|
|
44662
|
+
export { ABOUT_SECTION, ADD_RESULTS, ADD_SEARCH, ANNEXES_SECTION, ASSOCIATED_RESOURCES_SECTION, AVAILABLE_LICENSES, AbstractAction, AbstractSearchField, ActionMenuComponent, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, ApplicationBannerComponent, AuthService, AutocompleteComponent, AvailableServicesField, AvatarComponent, AvatarServiceInterface, BASEMAP_LAYERS, BadgeComponent, BaseConverter, BaseFileReader, BaseReader, BlockListComponent, ButtonComponent, CLASSIFICATION_SECTION, CLEAR_ERROR, CLEAR_RESULTS, CONSTRAINTS_SHORTCUTS, CONTACTS, CONTACTS_FOR_RESOURCE_FIELD, CarouselComponent, CatalogTitleComponent, CellPopinComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ClearError, ClearResults, ColorScaleComponent, ConfirmationDialogComponent, ContentGhostComponent, CopyTextButtonComponent, DATA_MANAGERS_SECTION, DEFAULT_CONFIGURATION, DEFAULT_GN4_LOGIN_URL, DEFAULT_GN4_LOGOUT_URL, DEFAULT_GN4_SETTINGS_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DISABLE_AUTH, DO_NOT_USE_DEFAULT_BASEMAP, DataService, DataTableComponent, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangeDropdownComponent, DateRangeInputsComponent, DateRangePickerComponent, DateRangeSearchField, DateService, DcatApConverter, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EXTERNAL_VIEWER_OPEN_NEW_TAB, EXTERNAL_VIEWER_URL_TEMPLATE, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalLinkCardComponent, ExternalViewerButtonComponent, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FILTER_SUMMARY_IGNORE_LIST, FORMATS, FacetBlockComponent, FacetItemComponent, FacetListComponent, FacetsContainerComponent, FavoriteStarComponent, FavoritesService, FeatureCatalogListComponent, FeatureDetailComponent, FeatureEditorModule, FeatureMapModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileInputComponent, FileTranslateLoader, FilesDropDirective, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldDateComponent, FormFieldFileComponent, FormFieldKeywordsComponent, FormFieldLicenseComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentsComponent, FormFieldTopicsComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GEOGRAPHICAL_COVERAGE_SECTION, GEONETWORK_UI_TAG_NAME, GEONETWORK_UI_VERSION, GeoDataBadgeComponent, GeoTableViewComponent, GeocodingComponent, GeojsonReader, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GnUiHumanizeDateDirective, GpfApiDlComponent, GravatarService, HttpLoaderFactory, I18nInterceptor, INSPIRE_TOPICS, ImageFallbackDirective, ImageInputComponent, ImageOverlayPreviewComponent, ImportRecordComponent, InlineFilterComponent, InteractiveTableColumnComponent, InteractiveTableComponent, InternalLinkCardComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, KindBadgeComponent, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LEGAL_CONSTRAINTS_FIELD, LOGIN_URL, LOGOUT_URL, LONLAT_CRS_CODES, LanguageSwitcherComponent, LayersPanelComponent, LicenseSearchField, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_FEATURE_KEY, MAP_VIEW_CONSTRAINTS, MAX_UPLOAD_SIZE_MB, METADATA_LANGUAGE, METADATA_POINT_OF_CONTACT_SECTION, MapContainerComponent, MapFacade, MapLegendComponent, MapStateContainerComponent, MapStyleService, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataDoiComponent, MetadataInfoComponent, MetadataLinkType, MetadataMapperContext, MetadataQualityComponent, MetadataQualityItemComponent, MetadataQualityPanelComponent, ModalDialogComponent, MultilingualPanelComponent, MultilingualSearchField, MyOrgService, NAMESPACES, NOT_APPLICABLE_CONSTRAINT, NOT_KNOWN_CONSTRAINT, NotificationComponent, NotificationsContainerComponent, NotificationsService, OPEN_DATA_LICENSE, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OTHER_CONSTRAINTS_FIELD, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OrganizationsServiceInterface, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PaginationDotsComponent, PatchResultsAggregations, PlatformServiceInterface, PopoverComponent, PopupAlertComponent, PossibleResourceTypes, PossibleResourceTypesDefinition, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_ABSTRACT_FIELD, RECORD_DATASET_URL_TOKEN, RECORD_GRAPHICAL_OVERVIEW_FIELD, RECORD_KEYWORDS_FIELD, RECORD_LICENSE_FIELD, RECORD_ONLINE_LINK_RESOURCES, RECORD_ONLINE_RESOURCES, RECORD_RESOURCE_CREATED_FIELD, RECORD_RESOURCE_UPDATED_FIELD, RECORD_REUSE_URL_TOKEN, RECORD_SERVICE_URL_TOKEN, RECORD_SPATIAL_EXTENTS_FIELD, RECORD_SPATIAL_TOGGLE_FIELD, RECORD_TEMPORAL_EXTENTS_FIELD, RECORD_TITLE_FIELD, RECORD_TOPICS_FIELD, RECORD_UNIQUE_IDENTIFIER_FIELD, RECORD_UPDATED_FIELD, RECORD_UPDATE_FREQUENCY_FIELD, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESOURCE_IDENTIFIER_FIELD, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, ROUTER_ROUTE_REUSE, ROUTER_ROUTE_SEARCH, ROUTER_ROUTE_SERVICE, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordKindField, RecordMetaComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsRepositoryInterface, RecordsService, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResourceTypeLegacyField, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsHitsSearchKindComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, ReusePresentationForms, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SECURITY_CONSTRAINTS_FIELD, SETTINGS_URL, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SPATIAL_SCOPES, SearchEffects, SearchFacade, SearchFeatureCatalogComponent, SearchFiltersSummaryComponent, SearchFiltersSummaryItemComponent, SearchInputComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, ServiceCapabilitiesComponent, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortableListComponent, SourceLabelComponent, SourcesService, SpatialExtentComponent, SpinningLoaderComponent, StacItemsResultGridComponent, StacViewComponent, StarToggleComponent, StickyHeaderComponent, SupportedTypes, SwitchToggleComponent, THUMBNAIL_PLACEHOLDER, TITLE_SECTION, TOPICS_SECTION, TRANSLATE_DEBUG_CONFIG, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslatedSearchField, TruncatedTextComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, USE_AND_ACCESS_CONDITIONS_SECTION, UpdateConfigAggregations, UpdateFilters, UrlInputComponent, UserFeedbackItemComponent, UserPreviewComponent, UserSearchField, VECTOR_STYLE_DEFAULT, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, XmlParseError, _reset, allChildrenElement, appConfigWithTranslationFixture, appendChildTree, appendChildren, assertValidXml, blockModelFixture, bytesToMegabytes, canEditRecord, checkFileFormat, clearSelectedFeatures, createChild, createDocument, createElement, createFuzzyFilter, createNestedChild, createNestedElement, currentPage, defaultMapStyleFixture, defaultMapStyleHlFixture, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, emptyBlockModelFixture, findChildElement, findChildOrCreate, findChildrenElement, findConverterForDocument, findNestedChildOrCreate, findNestedElement, findNestedElements, findParent, firstChildElement, formatDate, formatUserInfo, getAllKeysValidator, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryBoundingBox, getGeometryFromGeoJSON, getGlobalConfig, getIsMobile, getJsonDataItemsProxy, getLayers, getLinkId, getLinkLabel, getLinkPriority, getMapContext, getMapContextLayerFromConfig, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getNamespace, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getQualityValidators, getResourceType, getReusePresentationForm, getReuseType, getRootElement, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSelectedFeatures, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, handleScrollOnNavigation, hasRecordChangedSinceDraft, hasRecordChangedSinceDraftSuccess, initSearch, initialEditorState, initialMapState, initialState, isConfigLoaded, isDateRange, isFormatInQueryParam, isPublished, itemModelFixture, kindToCodeListValue, loadAppConfig, malformedConfigFixture, mapConfigFixture, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, matchesNoApplicableConstraint, matchesNoKnownConstraint, megabytesToBytes, mimeTypeToFormat, minimalAppConfigFixture, missingMandatoryConfigFixture, mouseWheelZoomCondition, noDuplicateFileName, okAppConfigFixture, openDataset, openRecord, organizationsServiceFactory, parse, parseXmlString, placeholder, prioritizePageScroll, propagateToDocumentOnly, provideGn4, provideI18n, provideRepositoryUrl, readAttribute, readDataset, readDatasetHeaders, readText, reducer$2 as reducer, reducerSearch, removeAllChildren, removeChildren, removeChildrenByName, removeSearchParams, removeWhitespace, renameElements, saveRecord, saveRecordFailure, saveRecordSuccess, selectCanEditRecord, selectCurrentPage, selectEditorConfig, selectEditorState, selectFallback, selectFallbackFields, selectField, selectHasRecordChanged, selectIsPublished, selectRecord, selectRecordChangedSinceSave, selectRecordSaveError, selectRecordSaving, selectRecordSections, selectRecordSource, selectTranslatedField, selectTranslatedValue, setContext, setCurrentPage, setEditorConfiguration, setFieldVisibility, setSelectedFeatures, setTextContent, someHabTableItemFixture, sortByFromString, sortByToString, sortByToStrings, stripHtml, stripNamespace, tableItemsFixture, toDate, toLang2, toLang3, totalPages, undoRecordDraft, unrecognizedKeysConfigFixture, updateLanguages, updateRecordField, updateRecordLanguages, wmsLayerFlatten, writeAttribute, wrongLanguageCodeConfigFixture, xmlToString };
|
|
44528
44663
|
//# sourceMappingURL=geonetwork-ui.mjs.map
|