geonetwork-ui 2.9.0-dev.f3376949a → 2.9.0
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 +716 -567
- package/fesm2022/geonetwork-ui.mjs.map +1 -1
- package/index.d.ts +299 -184
- package/index.d.ts.map +1 -1
- package/package.json +7 -8
- package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +11 -2
- package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +1 -0
- package/src/libs/common/domain/src/index.ts +2 -0
- package/src/libs/common/domain/src/lib/model/index.ts +3 -0
- package/src/libs/common/domain/src/lib/model/record/index.ts +2 -2
- package/src/libs/common/domain/src/lib/model/search/index.ts +1 -1
- package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.html +10 -12
- package/src/libs/feature/dataviz/src/lib/service/data.service.ts +33 -11
- package/src/libs/feature/editor/src/index.ts +8 -7
- package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +6 -1
- package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +5 -1
- package/src/libs/feature/editor/src/lib/+state/editor.reducer.ts +4 -0
- package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +2 -2
- package/src/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.ts +2 -0
- package/src/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.html +4 -4
- package/src/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.ts +11 -8
- package/src/libs/feature/record/src/lib/map-view/map-view.component.html +10 -18
- package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +96 -9
- package/src/libs/feature/record/src/lib/state/mdview.facade.ts +1 -1
- package/src/libs/feature/router/src/lib/default/router.module.ts +3 -3
- package/src/libs/feature/router/src/lib/default/router.service.ts +2 -2
- package/src/libs/feature/router/src/lib/default/services/router-search.service.ts +12 -3
- package/src/libs/feature/router/src/lib/default/state/router.effects.ts +34 -4
- package/src/libs/feature/search/src/lib/state/reducer.ts +3 -0
- package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +9 -3
- package/src/libs/feature/search/src/lib/utils/service/fields.ts +5 -5
- package/src/libs/ui/elements/src/lib/api-card/api-card.component.html +2 -2
- package/src/libs/ui/elements/src/lib/application-banner/application-banner.component.ts +2 -3
- package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +5 -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/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +1 -1
- 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 +10 -2
- package/src/libs/util/app-config/src/lib/fixtures.ts +1 -0
- package/src/libs/util/app-config/src/lib/model.ts +2 -0
- package/src/libs/util/shared/src/lib/gn-ui-version.ts +5 -4
- package/src/libs/util/shared/src/lib/links/link-utils.ts +8 -4
- package/src/libs/util/shared/src/lib/services/theme.service.ts +9 -23
- package/tailwind.base.config.js +3 -2
- package/translations/de.json +6 -3
- package/translations/en.json +8 -5
- package/translations/es.json +3 -0
- package/translations/fr.json +8 -5
- package/translations/it.json +8 -5
- package/translations/nl.json +3 -0
- package/translations/pt.json +3 -0
- package/translations/sk.json +4 -1
|
@@ -13,7 +13,7 @@ import * as i4 from '@ngx-translate/core';
|
|
|
13
13
|
import { TranslateLoader, TranslateCompiler, TranslateDefaultParser, TranslateParser, TranslateService, provideTranslateService, TranslateDirective, TranslatePipe, TranslateModule } from '@ngx-translate/core';
|
|
14
14
|
import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler';
|
|
15
15
|
import { TranslateHttpLoader } from '@ngx-translate/http-loader';
|
|
16
|
-
import { map as map$1, shareReplay as shareReplay$1, catchError, tap as tap$1, filter as filter$1, startWith as startWith$1, withLatestFrom, switchMap as switchMap$1, take, mergeMap, delay,
|
|
16
|
+
import { map as map$1, shareReplay as shareReplay$1, catchError, tap as tap$1, filter as filter$1, startWith as startWith$1, withLatestFrom, switchMap as switchMap$1, take, mergeMap, delay, debounceTime, distinctUntilChanged, finalize, throttleTime, first as first$1, pairwise as pairwise$1, share, defaultIfEmpty, toArray } from 'rxjs/operators';
|
|
17
17
|
import { of, map as map$2, lastValueFrom, fromEvent, startWith, shareReplay, filter, pairwise, switchMap, Subject, combineLatest, from, exhaustMap, throwError, forkJoin, takeLast, firstValueFrom, merge, BehaviorSubject, timer, ReplaySubject, Subscription, first, distinctUntilChanged as distinctUntilChanged$1, animationFrameScheduler, debounceTime as debounceTime$1, Observable, buffer, tap as tap$2, combineLatestWith, take as take$1, catchError as catchError$1, takeUntil, EMPTY, mergeMap as mergeMap$1, withLatestFrom as withLatestFrom$1 } from 'rxjs';
|
|
18
18
|
import { lt, valid, coerce, satisfies, ltr } from 'semver';
|
|
19
19
|
import chroma from 'chroma-js';
|
|
@@ -41,7 +41,7 @@ import * as TOML from '@ltd/j-toml';
|
|
|
41
41
|
import { Style, Stroke, Fill, Circle } from 'ol/style.js';
|
|
42
42
|
import CircleStyle from 'ol/style/Circle.js';
|
|
43
43
|
import EmblaCarousel from 'embla-carousel';
|
|
44
|
-
import { iconoirNavArrowLeft, iconoirNavArrowRight, iconoirLongArrowDownLeft, iconoirSearch, iconoirCalendar, iconoirArrowUp, iconoirLink, iconoirFramePlusIn, iconoirCloudUpload, iconoirReduce, iconoirNavArrowUp, iconoirNavArrowDown, iconoirExpand, iconoirSettings, iconoirDownload, iconoirPlus, iconoirBin, iconoirMediaImageXmark, iconoirMediaImage, iconoirAppWindow, iconoirCode, iconoirDatabase, iconoirAppleWallet, iconoirBank, iconoirList, iconoirTranslate, iconoirLock, iconoirUser, iconoirArrowLeft, iconoirLightBulbOn, iconoirImport,
|
|
44
|
+
import { iconoirNavArrowLeft, iconoirNavArrowRight, iconoirLongArrowDownLeft, iconoirSearch, iconoirCalendar, iconoirArrowUp, iconoirLink, iconoirFramePlusIn, iconoirCloudUpload, iconoirReduce, iconoirNavArrowUp, iconoirNavArrowDown, iconoirExpand, iconoirSettings, iconoirDownload, iconoirPlus, iconoirBin, iconoirMediaImageXmark, iconoirMediaImage, iconoirAppWindow, iconoirCode, iconoirDatabase, iconoirAppleWallet, iconoirBank, iconoirList, iconoirTranslate, iconoirLock, iconoirUser, iconoirArrowLeft, iconoirLightBulbOn, iconoirImport, iconoirBadgeCheck, iconoirSystemShut, iconoirCircle, iconoirCheckCircle, iconoirAttachment, iconoirRefresh } from '@ng-icons/iconoir';
|
|
45
45
|
import { MatButtonModule } from '@angular/material/button';
|
|
46
46
|
import * as i1$8 from '@angular/cdk/overlay';
|
|
47
47
|
import { OverlayContainer, ScrollStrategyOptions, OverlayModule, CdkConnectedOverlay, ScrollDispatcher, Overlay, CdkOverlayOrigin } from '@angular/cdk/overlay';
|
|
@@ -92,7 +92,6 @@ import { MatTableModule } from '@angular/material/table';
|
|
|
92
92
|
import * as i3 from '@angular/material/paginator';
|
|
93
93
|
import { MatPaginatorIntl, MatPaginatorModule, MatPaginator } from '@angular/material/paginator';
|
|
94
94
|
import { LetDirective } from '@ngrx/component';
|
|
95
|
-
import axios from 'axios';
|
|
96
95
|
import { Meta } from '@angular/platform-browser';
|
|
97
96
|
import { tablerFolderOpen } from '@ng-icons/tabler-icons';
|
|
98
97
|
import * as i3$1 from '@angular/material/radio';
|
|
@@ -18626,6 +18625,7 @@ var de = {
|
|
|
18626
18625
|
"dashboard.records.username": "Benutzername",
|
|
18627
18626
|
"dashboard.records.users": "{count, plural, =1{Benutzer} other{Benutzer}}",
|
|
18628
18627
|
"datahub.header.datasets": "Katalog",
|
|
18628
|
+
"datahub.header.edit.url.open": "",
|
|
18629
18629
|
"datahub.header.lastRecords": "Die neuesten",
|
|
18630
18630
|
"datahub.header.myfavorites": "Meine Favoriten",
|
|
18631
18631
|
"datahub.header.news": "Startseite",
|
|
@@ -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
|
};
|
|
@@ -19296,6 +19299,7 @@ var en = {
|
|
|
19296
19299
|
"dashboard.records.username": "Username",
|
|
19297
19300
|
"dashboard.records.users": "{count, plural, =1{user} other{users}}",
|
|
19298
19301
|
"datahub.header.datasets": "Catalog",
|
|
19302
|
+
"datahub.header.edit.url.open": "Edit",
|
|
19299
19303
|
"datahub.header.lastRecords": "The latest",
|
|
19300
19304
|
"datahub.header.myfavorites": "My favorites",
|
|
19301
19305
|
"datahub.header.news": "Home",
|
|
@@ -19640,11 +19644,13 @@ var en = {
|
|
|
19640
19644
|
"map.ogc.urlInput.hint": "Enter OGC API service URL",
|
|
19641
19645
|
"map.select.layer": "Data source",
|
|
19642
19646
|
"map.select.style": "Style",
|
|
19647
|
+
"map.style.default": "Default",
|
|
19643
19648
|
"map.wfs.urlInput.hint": "Enter WFS service URL",
|
|
19644
19649
|
"map.wms.urlInput.hint": "Enter WMS service URL",
|
|
19645
19650
|
"multiselect.filter.placeholder": "Search",
|
|
19646
19651
|
"nav.back": "Back",
|
|
19647
19652
|
"navbar.mobile.menuTitle": "Quick access",
|
|
19653
|
+
"ogc.geojson.notsupported": "This OGC API does not support the GeoJSON format",
|
|
19648
19654
|
"ogc.unreachable.unknown": "The service could not be reached",
|
|
19649
19655
|
"organisation.filter.placeholder": "Filter results",
|
|
19650
19656
|
"organisation.sort.sortBy": "Sort by:",
|
|
@@ -19672,9 +19678,9 @@ var en = {
|
|
|
19672
19678
|
"record.feature.catalog.number.total.attribute": "Total amount of objects",
|
|
19673
19679
|
"record.feature.catalog.number.total.object": "Total amount of attributes",
|
|
19674
19680
|
"record.feature.limit": "Preview disabled due to too many elements",
|
|
19675
|
-
"record.kind.dataset": "
|
|
19676
|
-
"record.kind.reuse": "
|
|
19677
|
-
"record.kind.service": "
|
|
19681
|
+
"record.kind.dataset": "dataset",
|
|
19682
|
+
"record.kind.reuse": "reuse",
|
|
19683
|
+
"record.kind.service": "service",
|
|
19678
19684
|
"record.metadata.about": "Description",
|
|
19679
19685
|
"record.metadata.api": "API",
|
|
19680
19686
|
"record.metadata.api.accessServiceProtocol.GPFDL": "GPFDL",
|
|
@@ -19730,7 +19736,7 @@ var en = {
|
|
|
19730
19736
|
"record.metadata.download": "Downloads",
|
|
19731
19737
|
"record.metadata.feature.catalog": "Feature catalog",
|
|
19732
19738
|
"record.metadata.formats": "Formats",
|
|
19733
|
-
"record.metadata.isGeographical": "
|
|
19739
|
+
"record.metadata.isGeographical": "geographic dataset",
|
|
19734
19740
|
"record.metadata.keywords": "Keywords",
|
|
19735
19741
|
"record.metadata.languages": "Languages",
|
|
19736
19742
|
"record.metadata.link.postgis.table": "table :",
|
|
@@ -19920,7 +19926,7 @@ var en = {
|
|
|
19920
19926
|
"wfs.feature.limit": "Too many features to display the WFS layer!",
|
|
19921
19927
|
"wfs.featuretype.notfound": "No matching feature type was found in the service",
|
|
19922
19928
|
"wfs.geojsongml.notsupported": "This service does not support the GeoJSON or GML format",
|
|
19923
|
-
"wfs.unreachable.cors": "The service
|
|
19929
|
+
"wfs.unreachable.cors": "The remote service is not configured to allow data retrieval (CORS)",
|
|
19924
19930
|
"wfs.unreachable.http": "The service returned an HTTP error",
|
|
19925
19931
|
"wfs.unreachable.unknown": "The service could not be reached"
|
|
19926
19932
|
};
|
|
@@ -19967,6 +19973,7 @@ var es = {
|
|
|
19967
19973
|
"dashboard.records.username": "",
|
|
19968
19974
|
"dashboard.records.users": "",
|
|
19969
19975
|
"datahub.header.datasets": "Catálogo",
|
|
19976
|
+
"datahub.header.edit.url.open": "",
|
|
19970
19977
|
"datahub.header.lastRecords": "",
|
|
19971
19978
|
"datahub.header.myfavorites": "",
|
|
19972
19979
|
"datahub.header.news": "",
|
|
@@ -20311,11 +20318,13 @@ var es = {
|
|
|
20311
20318
|
"map.ogc.urlInput.hint": "",
|
|
20312
20319
|
"map.select.layer": "",
|
|
20313
20320
|
"map.select.style": "",
|
|
20321
|
+
"map.style.default": "Por defecto",
|
|
20314
20322
|
"map.wfs.urlInput.hint": "",
|
|
20315
20323
|
"map.wms.urlInput.hint": "",
|
|
20316
20324
|
"multiselect.filter.placeholder": "",
|
|
20317
20325
|
"nav.back": "",
|
|
20318
20326
|
"navbar.mobile.menuTitle": "Acceso rápido",
|
|
20327
|
+
"ogc.geojson.notsupported": "",
|
|
20319
20328
|
"ogc.unreachable.unknown": "",
|
|
20320
20329
|
"organisation.filter.placeholder": "",
|
|
20321
20330
|
"organisation.sort.sortBy": "",
|
|
@@ -20638,6 +20647,7 @@ var fr = {
|
|
|
20638
20647
|
"dashboard.records.username": "Nom d'utilisateur",
|
|
20639
20648
|
"dashboard.records.users": "{count, plural, =1{utilisateur} other{utilisateurs}}",
|
|
20640
20649
|
"datahub.header.datasets": "Catalogue",
|
|
20650
|
+
"datahub.header.edit.url.open": "Editer",
|
|
20641
20651
|
"datahub.header.lastRecords": "Les plus récentes",
|
|
20642
20652
|
"datahub.header.myfavorites": "Mes favoris",
|
|
20643
20653
|
"datahub.header.news": "Accueil",
|
|
@@ -20982,11 +20992,13 @@ var fr = {
|
|
|
20982
20992
|
"map.ogc.urlInput.hint": "Entrez l'URL du service OGC API",
|
|
20983
20993
|
"map.select.layer": "Source de données",
|
|
20984
20994
|
"map.select.style": "Style",
|
|
20995
|
+
"map.style.default": "Par défaut",
|
|
20985
20996
|
"map.wfs.urlInput.hint": "Entrez l'URL du service WFS",
|
|
20986
20997
|
"map.wms.urlInput.hint": "Entrez l'URL du service WMS",
|
|
20987
20998
|
"multiselect.filter.placeholder": "Rechercher",
|
|
20988
20999
|
"nav.back": "Retour",
|
|
20989
21000
|
"navbar.mobile.menuTitle": "Navigation rapide",
|
|
21001
|
+
"ogc.geojson.notsupported": "Le service OGC API ne supporte pas le format GeoJSON",
|
|
20990
21002
|
"ogc.unreachable.unknown": "Le service n'est pas accessible",
|
|
20991
21003
|
"organisation.filter.placeholder": "Filtrer les résultats",
|
|
20992
21004
|
"organisation.sort.sortBy": "Trier par :",
|
|
@@ -21014,9 +21026,9 @@ var fr = {
|
|
|
21014
21026
|
"record.feature.catalog.number.total.attribute": "Nombre total d'attributs",
|
|
21015
21027
|
"record.feature.catalog.number.total.object": "Nombre total d'objets",
|
|
21016
21028
|
"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": "
|
|
21029
|
+
"record.kind.dataset": "donnée",
|
|
21030
|
+
"record.kind.reuse": "réutilisation",
|
|
21031
|
+
"record.kind.service": "service",
|
|
21020
21032
|
"record.metadata.about": "A propos",
|
|
21021
21033
|
"record.metadata.api": "API",
|
|
21022
21034
|
"record.metadata.api.accessServiceProtocol.GPFDL": "",
|
|
@@ -21072,7 +21084,7 @@ var fr = {
|
|
|
21072
21084
|
"record.metadata.download": "Téléchargements",
|
|
21073
21085
|
"record.metadata.feature.catalog": "Catalogue d'attributs",
|
|
21074
21086
|
"record.metadata.formats": "Formats",
|
|
21075
|
-
"record.metadata.isGeographical": "
|
|
21087
|
+
"record.metadata.isGeographical": "donnée géographique",
|
|
21076
21088
|
"record.metadata.keywords": "Mots-clés",
|
|
21077
21089
|
"record.metadata.languages": "Langues",
|
|
21078
21090
|
"record.metadata.link.postgis.table": "table :",
|
|
@@ -21262,7 +21274,7 @@ var fr = {
|
|
|
21262
21274
|
"wfs.feature.limit": "Trop d'objets pour afficher la couche WFS !",
|
|
21263
21275
|
"wfs.featuretype.notfound": "La classe d'objets n'a pas été trouvée dans le service",
|
|
21264
21276
|
"wfs.geojsongml.notsupported": "Le service ne supporte pas le format GeoJSON ou GML",
|
|
21265
|
-
"wfs.unreachable.cors": "Le service n'est pas
|
|
21277
|
+
"wfs.unreachable.cors": "Le service distant n'est pas configuré pour autoriser la consommation des données (CORS)",
|
|
21266
21278
|
"wfs.unreachable.http": "Le service a retourné une erreur HTTP",
|
|
21267
21279
|
"wfs.unreachable.unknown": "Le service n'est pas accessible"
|
|
21268
21280
|
};
|
|
@@ -21309,6 +21321,7 @@ var it = {
|
|
|
21309
21321
|
"dashboard.records.username": "Nome utente",
|
|
21310
21322
|
"dashboard.records.users": "utenti",
|
|
21311
21323
|
"datahub.header.datasets": "Catalogo",
|
|
21324
|
+
"datahub.header.edit.url.open": "",
|
|
21312
21325
|
"datahub.header.lastRecords": "Ultimi",
|
|
21313
21326
|
"datahub.header.myfavorites": "Miei preferiti",
|
|
21314
21327
|
"datahub.header.news": "Home",
|
|
@@ -21653,11 +21666,13 @@ var it = {
|
|
|
21653
21666
|
"map.ogc.urlInput.hint": "Inserisci URL del servizio OGC API",
|
|
21654
21667
|
"map.select.layer": "Sorgente dati",
|
|
21655
21668
|
"map.select.style": "Style",
|
|
21669
|
+
"map.style.default": "Predefinito",
|
|
21656
21670
|
"map.wfs.urlInput.hint": "Inserisci URL del servizio WFS",
|
|
21657
21671
|
"map.wms.urlInput.hint": "Inserisci URL del servizio WMS",
|
|
21658
21672
|
"multiselect.filter.placeholder": "Cerca",
|
|
21659
21673
|
"nav.back": "Indietro",
|
|
21660
21674
|
"navbar.mobile.menuTitle": "Accesso rapido",
|
|
21675
|
+
"ogc.geojson.notsupported": "Il servizio OGC API non supporta il formato GeoJSON.",
|
|
21661
21676
|
"ogc.unreachable.unknown": "Il servizio non è accessibile",
|
|
21662
21677
|
"organisation.filter.placeholder": "Filtra i risultati",
|
|
21663
21678
|
"organisation.sort.sortBy": "Ordina per:",
|
|
@@ -21685,9 +21700,9 @@ var it = {
|
|
|
21685
21700
|
"record.feature.catalog.number.total.attribute": "Quantità totale di oggetti",
|
|
21686
21701
|
"record.feature.catalog.number.total.object": "Quantità totale di attributi",
|
|
21687
21702
|
"record.feature.limit": "La visualizzazione è stata disabilitata a causa di troppi elementi ",
|
|
21688
|
-
"record.kind.dataset": "
|
|
21689
|
-
"record.kind.reuse": "
|
|
21690
|
-
"record.kind.service": "
|
|
21703
|
+
"record.kind.dataset": "dataset",
|
|
21704
|
+
"record.kind.reuse": "riutilizzato",
|
|
21705
|
+
"record.kind.service": "servizio",
|
|
21691
21706
|
"record.metadata.about": "Descrizione",
|
|
21692
21707
|
"record.metadata.api": "API",
|
|
21693
21708
|
"record.metadata.api.accessServiceProtocol.GPFDL": "",
|
|
@@ -21743,7 +21758,7 @@ var it = {
|
|
|
21743
21758
|
"record.metadata.download": "Download",
|
|
21744
21759
|
"record.metadata.feature.catalog": "Catalogo dei oggetti",
|
|
21745
21760
|
"record.metadata.formats": "Formati",
|
|
21746
|
-
"record.metadata.isGeographical": "
|
|
21761
|
+
"record.metadata.isGeographical": "dati geografici",
|
|
21747
21762
|
"record.metadata.keywords": "Parole chiave",
|
|
21748
21763
|
"record.metadata.languages": "Lingue",
|
|
21749
21764
|
"record.metadata.link.postgis.table": "",
|
|
@@ -21933,7 +21948,7 @@ var it = {
|
|
|
21933
21948
|
"wfs.feature.limit": "Troppi oggetti per visualizzare il WFS layer!",
|
|
21934
21949
|
"wfs.featuretype.notfound": "La classe di oggetto non è stata trovata nel servizio",
|
|
21935
21950
|
"wfs.geojsongml.notsupported": "Il servizio non supporta il formato GeoJSON o GML",
|
|
21936
|
-
"wfs.unreachable.cors": "Il servizio non è
|
|
21951
|
+
"wfs.unreachable.cors": "Il servizio remoto non è configurato per consentire il consumo di dati (CORS)",
|
|
21937
21952
|
"wfs.unreachable.http": "Il servizio ha restituito un errore HTTP",
|
|
21938
21953
|
"wfs.unreachable.unknown": "Il servizio non è accessibile"
|
|
21939
21954
|
};
|
|
@@ -21980,6 +21995,7 @@ var nl = {
|
|
|
21980
21995
|
"dashboard.records.username": "",
|
|
21981
21996
|
"dashboard.records.users": "",
|
|
21982
21997
|
"datahub.header.datasets": "Catalog",
|
|
21998
|
+
"datahub.header.edit.url.open": "",
|
|
21983
21999
|
"datahub.header.lastRecords": "",
|
|
21984
22000
|
"datahub.header.myfavorites": "",
|
|
21985
22001
|
"datahub.header.news": "",
|
|
@@ -22324,11 +22340,13 @@ var nl = {
|
|
|
22324
22340
|
"map.ogc.urlInput.hint": "",
|
|
22325
22341
|
"map.select.layer": "",
|
|
22326
22342
|
"map.select.style": "",
|
|
22343
|
+
"map.style.default": "Standaard",
|
|
22327
22344
|
"map.wfs.urlInput.hint": "",
|
|
22328
22345
|
"map.wms.urlInput.hint": "",
|
|
22329
22346
|
"multiselect.filter.placeholder": "",
|
|
22330
22347
|
"nav.back": "",
|
|
22331
22348
|
"navbar.mobile.menuTitle": "",
|
|
22349
|
+
"ogc.geojson.notsupported": "",
|
|
22332
22350
|
"ogc.unreachable.unknown": "",
|
|
22333
22351
|
"organisation.filter.placeholder": "",
|
|
22334
22352
|
"organisation.sort.sortBy": "",
|
|
@@ -22651,6 +22669,7 @@ var pt = {
|
|
|
22651
22669
|
"dashboard.records.username": "",
|
|
22652
22670
|
"dashboard.records.users": "",
|
|
22653
22671
|
"datahub.header.datasets": "Catálogo",
|
|
22672
|
+
"datahub.header.edit.url.open": "",
|
|
22654
22673
|
"datahub.header.lastRecords": "",
|
|
22655
22674
|
"datahub.header.myfavorites": "",
|
|
22656
22675
|
"datahub.header.news": "",
|
|
@@ -22995,11 +23014,13 @@ var pt = {
|
|
|
22995
23014
|
"map.ogc.urlInput.hint": "",
|
|
22996
23015
|
"map.select.layer": "",
|
|
22997
23016
|
"map.select.style": "",
|
|
23017
|
+
"map.style.default": "Padrão",
|
|
22998
23018
|
"map.wfs.urlInput.hint": "",
|
|
22999
23019
|
"map.wms.urlInput.hint": "",
|
|
23000
23020
|
"multiselect.filter.placeholder": "",
|
|
23001
23021
|
"nav.back": "",
|
|
23002
23022
|
"navbar.mobile.menuTitle": "",
|
|
23023
|
+
"ogc.geojson.notsupported": "",
|
|
23003
23024
|
"ogc.unreachable.unknown": "",
|
|
23004
23025
|
"organisation.filter.placeholder": "",
|
|
23005
23026
|
"organisation.sort.sortBy": "",
|
|
@@ -23322,6 +23343,7 @@ var sk = {
|
|
|
23322
23343
|
"dashboard.records.username": "Užívateľské meno",
|
|
23323
23344
|
"dashboard.records.users": "{count, plural, =1{užívateľ} other{užívatelia}}",
|
|
23324
23345
|
"datahub.header.datasets": "Katalóg",
|
|
23346
|
+
"datahub.header.edit.url.open": "",
|
|
23325
23347
|
"datahub.header.lastRecords": "Najnovšie",
|
|
23326
23348
|
"datahub.header.myfavorites": "Moje obľúbené",
|
|
23327
23349
|
"datahub.header.news": "Domov",
|
|
@@ -23666,11 +23688,13 @@ var sk = {
|
|
|
23666
23688
|
"map.ogc.urlInput.hint": "",
|
|
23667
23689
|
"map.select.layer": "Zdroj dát",
|
|
23668
23690
|
"map.select.style": "",
|
|
23691
|
+
"map.style.default": "Predvolené",
|
|
23669
23692
|
"map.wfs.urlInput.hint": "Zadajte URL adresu služby WFS",
|
|
23670
23693
|
"map.wms.urlInput.hint": "Zadajte URL adresu služby WMS",
|
|
23671
23694
|
"multiselect.filter.placeholder": "Hľadať",
|
|
23672
23695
|
"nav.back": "Späť",
|
|
23673
23696
|
"navbar.mobile.menuTitle": "",
|
|
23697
|
+
"ogc.geojson.notsupported": "",
|
|
23674
23698
|
"ogc.unreachable.unknown": "So službou sa nedalo spojiť",
|
|
23675
23699
|
"organisation.filter.placeholder": "Filtrovať výsledky",
|
|
23676
23700
|
"organisation.sort.sortBy": "Zoradiť podľa:",
|
|
@@ -23946,7 +23970,7 @@ var sk = {
|
|
|
23946
23970
|
"wfs.feature.limit": "",
|
|
23947
23971
|
"wfs.featuretype.notfound": "V službe nebol nájdený žiadny zodpovedajúci typ funkcie",
|
|
23948
23972
|
"wfs.geojsongml.notsupported": "Táto služba nepodporuje formát GeoJSON alebo GML",
|
|
23949
|
-
"wfs.unreachable.cors": "
|
|
23973
|
+
"wfs.unreachable.cors": "Vzdialená služba nie je nakonfigurovaná tak, aby povoľovala spotrebu dát (CORS)",
|
|
23950
23974
|
"wfs.unreachable.http": "Služba vrátila chybu HTTP",
|
|
23951
23975
|
"wfs.unreachable.unknown": "So službou sa nedalo spojiť"
|
|
23952
23976
|
};
|
|
@@ -24520,34 +24544,23 @@ class ThemeService {
|
|
|
24520
24544
|
static getColor(name) {
|
|
24521
24545
|
return document.documentElement.style.getPropertyValue(`--color-${name}`);
|
|
24522
24546
|
}
|
|
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
24547
|
static applyCssVariables(primaryColor, secondaryColor, mainColor, backgroundColor, mainFont, titleFont, fontsStylesheetUrl) {
|
|
24538
|
-
const applyColor = (name, color) => {
|
|
24548
|
+
const applyColor = (name, color, includeRawValues) => {
|
|
24539
24549
|
document.documentElement.style.setProperty(`--color-${name}`, color.css());
|
|
24550
|
+
if (includeRawValues) {
|
|
24551
|
+
document.documentElement.style.setProperty(`--color-raw-${name}`, color.css().replace(/^rgba?\((.*)\)/, '$1'));
|
|
24552
|
+
}
|
|
24540
24553
|
};
|
|
24541
24554
|
const black = chroma('black');
|
|
24542
24555
|
const white = chroma('white');
|
|
24543
|
-
applyColor('primary', chroma(primaryColor));
|
|
24556
|
+
applyColor('primary', chroma(primaryColor), true);
|
|
24544
24557
|
applyColor('primary-lighter', chroma.scale([primaryColor, white]).mode('lab')(0.3));
|
|
24545
24558
|
applyColor('primary-lightest', chroma.scale([primaryColor, white]).mode('lab')(0.6));
|
|
24546
24559
|
applyColor('primary-white', chroma.scale([primaryColor, white]).mode('lab')(0.85));
|
|
24547
24560
|
applyColor('primary-darker', chroma.scale([primaryColor, black]).mode('lab')(0.3));
|
|
24548
24561
|
applyColor('primary-darkest', chroma.scale([primaryColor, black]).mode('lab')(0.6));
|
|
24549
24562
|
applyColor('primary-black', chroma.scale([primaryColor, black]).mode('lab')(0.85));
|
|
24550
|
-
applyColor('secondary', chroma(secondaryColor));
|
|
24563
|
+
applyColor('secondary', chroma(secondaryColor), true);
|
|
24551
24564
|
applyColor('secondary-lighter', chroma.scale([secondaryColor, white]).mode('lab')(0.3));
|
|
24552
24565
|
applyColor('secondary-lightest', chroma.scale([secondaryColor, white]).mode('lab')(0.6));
|
|
24553
24566
|
applyColor('secondary-white', chroma.scale([secondaryColor, white]).mode('lab')(0.85));
|
|
@@ -25378,9 +25391,11 @@ async function getLayers(url, serviceProtocol) {
|
|
|
25378
25391
|
case 'wfs': {
|
|
25379
25392
|
const endpointWfs = await new WfsEndpoint(url).isReady();
|
|
25380
25393
|
const featureTypes = await endpointWfs.getFeatureTypes();
|
|
25381
|
-
const layers = await Promise.
|
|
25382
|
-
return
|
|
25383
|
-
}))
|
|
25394
|
+
const layers = (await Promise.allSettled(featureTypes.map((collection) => {
|
|
25395
|
+
return endpointWfs.getFeatureTypeFull(collection.name);
|
|
25396
|
+
})))
|
|
25397
|
+
.filter((settled) => settled.status === 'fulfilled')
|
|
25398
|
+
.map((fulfilled) => fulfilled.value);
|
|
25384
25399
|
return layers;
|
|
25385
25400
|
}
|
|
25386
25401
|
case 'wms': {
|
|
@@ -25511,7 +25526,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
25511
25526
|
}] } });
|
|
25512
25527
|
|
|
25513
25528
|
var name = "geonetwork-ui";
|
|
25514
|
-
var version = "2.9.0
|
|
25529
|
+
var version = "2.9.0";
|
|
25515
25530
|
var engines = {
|
|
25516
25531
|
node: ">=20"
|
|
25517
25532
|
};
|
|
@@ -25551,11 +25566,11 @@ var peerDependencies = {
|
|
|
25551
25566
|
};
|
|
25552
25567
|
var dependencies = {
|
|
25553
25568
|
"@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.
|
|
25569
|
+
"@camptocamp/ogc-client": "1.3.1-dev.12086e8",
|
|
25570
|
+
"@geospatial-sdk/core": "0.0.5-dev.61",
|
|
25571
|
+
"@geospatial-sdk/geocoding": "0.0.5-dev.61",
|
|
25572
|
+
"@geospatial-sdk/legend": "0.0.5-dev.61",
|
|
25573
|
+
"@geospatial-sdk/openlayers": "0.0.5-dev.61",
|
|
25559
25574
|
"@ltd/j-toml": "~1.35.2",
|
|
25560
25575
|
"@messageformat/core": "^3.0.1",
|
|
25561
25576
|
"@ng-icons/core": "29.10.0",
|
|
@@ -25565,7 +25580,6 @@ var dependencies = {
|
|
|
25565
25580
|
"@nx/angular": "22.0.4",
|
|
25566
25581
|
"@rgrove/parse-xml": "4.2.0",
|
|
25567
25582
|
alasql: "4.6.0",
|
|
25568
|
-
axios: "1.12.0",
|
|
25569
25583
|
basiclightbox: "^5.0.4",
|
|
25570
25584
|
"chart.js": "4.4.7",
|
|
25571
25585
|
"chroma-js": "3.1.2",
|
|
@@ -25581,7 +25595,7 @@ var dependencies = {
|
|
|
25581
25595
|
"ngx-chips": "3.0.0",
|
|
25582
25596
|
"ngx-dropzone": "3.1.0",
|
|
25583
25597
|
"ngx-translate-messageformat-compiler": "~7.1.0",
|
|
25584
|
-
ol: "^
|
|
25598
|
+
ol: "^10.0.0",
|
|
25585
25599
|
papaparse: "5.4.1",
|
|
25586
25600
|
pg: "^8.9.0",
|
|
25587
25601
|
proj4: "^2.9.2",
|
|
@@ -25607,7 +25621,7 @@ var packageJson = {
|
|
|
25607
25621
|
};
|
|
25608
25622
|
|
|
25609
25623
|
const GEONETWORK_UI_VERSION = packageJson.version;
|
|
25610
|
-
const GEONETWORK_UI_TAG_NAME = GEONETWORK_UI_VERSION.split('-')[1]
|
|
25624
|
+
const GEONETWORK_UI_TAG_NAME = GEONETWORK_UI_VERSION.split('-')[1]?.startsWith('dev')
|
|
25611
25625
|
? 'main'
|
|
25612
25626
|
: `v${packageJson.version}`;
|
|
25613
25627
|
|
|
@@ -25925,14 +25939,18 @@ class ElasticsearchService {
|
|
|
25925
25939
|
})
|
|
25926
25940
|
.join(' OR ');
|
|
25927
25941
|
};
|
|
25928
|
-
|
|
25942
|
+
let queryString = typeof filters === 'string'
|
|
25929
25943
|
? filters
|
|
25930
25944
|
: Object.keys(filters)
|
|
25945
|
+
.filter((fieldname) => fieldname !== 'gn-ui-crossFieldFilter')
|
|
25931
25946
|
.filter((fieldname) => !isDateRange(filters[fieldname]))
|
|
25932
25947
|
.filter((fieldname) => filters[fieldname] &&
|
|
25933
25948
|
JSON.stringify(filters[fieldname]) !== '{}')
|
|
25934
25949
|
.map((fieldname) => `${fieldname}:(${makeQuery(filters[fieldname])})`)
|
|
25935
25950
|
.join(' AND ');
|
|
25951
|
+
if (filters['gn-ui-crossFieldFilter']) {
|
|
25952
|
+
queryString = `${queryString} AND (${filters['gn-ui-crossFieldFilter']})`;
|
|
25953
|
+
}
|
|
25936
25954
|
const queryRange = Object.entries(filters)
|
|
25937
25955
|
.filter(([, value]) => isDateRange(value))
|
|
25938
25956
|
.map(([searchField, dateRange]) => {
|
|
@@ -26105,7 +26123,12 @@ class ElasticsearchService {
|
|
|
26105
26123
|
must_not: this.mustNotFilters(),
|
|
26106
26124
|
},
|
|
26107
26125
|
},
|
|
26108
|
-
_source: [
|
|
26126
|
+
_source: [
|
|
26127
|
+
'resourceTitleObject',
|
|
26128
|
+
'uuid',
|
|
26129
|
+
'resourceType',
|
|
26130
|
+
'cl_presentationForm',
|
|
26131
|
+
],
|
|
26109
26132
|
from: 0,
|
|
26110
26133
|
size: 20,
|
|
26111
26134
|
};
|
|
@@ -26440,7 +26463,8 @@ class Gn4Repository {
|
|
|
26440
26463
|
}));
|
|
26441
26464
|
}
|
|
26442
26465
|
canEdit(record, allowEditHarvested) {
|
|
26443
|
-
return (
|
|
26466
|
+
return (this.platformService.supportsAuthentication() &&
|
|
26467
|
+
record.kind === 'dataset' &&
|
|
26444
26468
|
record.extras['edit'] &&
|
|
26445
26469
|
(!record.extras['isHarvested'] || allowEditHarvested));
|
|
26446
26470
|
}
|
|
@@ -28160,8 +28184,9 @@ function getCustomTranslations(langCode) {
|
|
|
28160
28184
|
return langCode in customTranslations ? customTranslations[langCode] : {};
|
|
28161
28185
|
}
|
|
28162
28186
|
let appConfigLoaded = false;
|
|
28163
|
-
function loadAppConfig() {
|
|
28164
|
-
|
|
28187
|
+
function loadAppConfig(configUrl = 'assets/configuration/default.toml') {
|
|
28188
|
+
console.log(`[geonetwork-ui] Loading application configuration from ${configUrl}`);
|
|
28189
|
+
return fetch(configUrl)
|
|
28165
28190
|
.then((resp) => {
|
|
28166
28191
|
if (!resp.ok)
|
|
28167
28192
|
throw new Error('Configuration file could not be loaded');
|
|
@@ -28179,6 +28204,7 @@ function loadAppConfig() {
|
|
|
28179
28204
|
const warnings = [];
|
|
28180
28205
|
let parsedGlobalSection = parseConfigSection(parsed, 'global', ['geonetwork4_api_url'], [
|
|
28181
28206
|
'datahub_url',
|
|
28207
|
+
'edit_url_template',
|
|
28182
28208
|
'proxy_path',
|
|
28183
28209
|
'metadata_language',
|
|
28184
28210
|
'login_url',
|
|
@@ -28198,6 +28224,7 @@ function loadAppConfig() {
|
|
|
28198
28224
|
: {
|
|
28199
28225
|
GN4_API_URL: parsedGlobalSection.geonetwork4_api_url,
|
|
28200
28226
|
DATAHUB_URL: parsedGlobalSection.datahub_url,
|
|
28227
|
+
EDIT_URL_TEMPLATE: parsedGlobalSection.edit_url_template,
|
|
28201
28228
|
PROXY_PATH: parsedGlobalSection.proxy_path,
|
|
28202
28229
|
METADATA_LANGUAGE: parsedGlobalSection.metadata_language
|
|
28203
28230
|
? parsedGlobalSection.metadata_language.toLowerCase()
|
|
@@ -28270,6 +28297,7 @@ function loadAppConfig() {
|
|
|
28270
28297
|
'record_kind_quick_filter',
|
|
28271
28298
|
'filter_geometry_data',
|
|
28272
28299
|
'filter_geometry_url',
|
|
28300
|
+
'do_not_use_default_search_preset',
|
|
28273
28301
|
'search_preset',
|
|
28274
28302
|
'advanced_filters',
|
|
28275
28303
|
'limit',
|
|
@@ -28282,6 +28310,7 @@ function loadAppConfig() {
|
|
|
28282
28310
|
RECORD_KIND_QUICK_FILTER: parsedSearchSection.record_kind_quick_filter,
|
|
28283
28311
|
FILTER_GEOMETRY_DATA: parsedSearchSection.filter_geometry_data,
|
|
28284
28312
|
FILTER_GEOMETRY_URL: parsedSearchSection.filter_geometry_url,
|
|
28313
|
+
DO_NOT_USE_DEFAULT_SEARCH_PRESET: !!parsedSearchSection.do_not_use_default_search_preset,
|
|
28285
28314
|
SEARCH_PRESET: parsedSearchParams.map((param) => ({
|
|
28286
28315
|
sort: param.sort,
|
|
28287
28316
|
name: param.name,
|
|
@@ -28372,6 +28401,7 @@ fonts_stylesheet_url = "https://fonts.googleapis.com/css2?family=Open+Sans"
|
|
|
28372
28401
|
[search]
|
|
28373
28402
|
record_kind_quick_filter = false
|
|
28374
28403
|
filter_geometry_url = 'https://my.domain.org/geom.json'
|
|
28404
|
+
do_not_use_default_search_preset = false
|
|
28375
28405
|
advanced_filters = ['publicationYear', 'documentStandard', 'inspireKeyword', 'topic', 'license']
|
|
28376
28406
|
|
|
28377
28407
|
[[search_preset]]
|
|
@@ -29187,9 +29217,8 @@ class AutocompleteComponent {
|
|
|
29187
29217
|
ngOnChanges(changes) {
|
|
29188
29218
|
const { value } = changes;
|
|
29189
29219
|
if (value) {
|
|
29190
|
-
const previousTextValue = this.displayWithFnInternal(value.previousValue);
|
|
29191
29220
|
const currentTextValue = this.displayWithFnInternal(value.currentValue);
|
|
29192
|
-
if (
|
|
29221
|
+
if (currentTextValue !== this.control.value) {
|
|
29193
29222
|
if (currentTextValue) {
|
|
29194
29223
|
this.searchActive = true;
|
|
29195
29224
|
this.isSearchActive.emit(true);
|
|
@@ -29203,13 +29232,15 @@ class AutocompleteComponent {
|
|
|
29203
29232
|
}
|
|
29204
29233
|
}
|
|
29205
29234
|
ngOnInit() {
|
|
29206
|
-
const newValue$ = merge(of(''), this.inputCleared.pipe(map$1(() => '')), this.control.valueChanges.pipe(filter$1((value) => typeof value === 'string'),
|
|
29235
|
+
const newValue$ = merge(of(''), this.inputCleared.pipe(map$1(() => '')), this.control.valueChanges.pipe(filter$1((value) => typeof value === 'string'), debounceTime(400), distinctUntilChanged()));
|
|
29207
29236
|
const externalValueChange$ = this.control.valueChanges.pipe(filter$1((value) => typeof value === 'object' && value.title), map$1((item) => item.title));
|
|
29208
29237
|
// this observable emits arrays of suggestions loaded using the given action
|
|
29209
29238
|
const suggestionsFromAction = merge(newValue$.pipe(filter$1((value) => value.length >= this.minCharacterCount)), externalValueChange$).pipe(tap$1(() => {
|
|
29210
29239
|
this.searching = true;
|
|
29211
29240
|
this.error = null;
|
|
29212
|
-
}), switchMap$1((value) => this.action(value)),
|
|
29241
|
+
}), switchMap$1((value) => this.action(value)), // this can trigger http requests
|
|
29242
|
+
shareReplay$1(1), // share the loaded suggestions to avoid multiple requests
|
|
29243
|
+
tap$1((suggestions) => {
|
|
29213
29244
|
// forcing the panel to open if there are suggestions
|
|
29214
29245
|
if (suggestions.length > 0 && !this.searchActive) {
|
|
29215
29246
|
this.triggerRef?.openPanel();
|
|
@@ -29270,6 +29301,7 @@ class AutocompleteComponent {
|
|
|
29270
29301
|
}
|
|
29271
29302
|
clear() {
|
|
29272
29303
|
this.inputRef.nativeElement.value = '';
|
|
29304
|
+
this.control.setValue('');
|
|
29273
29305
|
this.searchActive = false;
|
|
29274
29306
|
this.isSearchActive.emit(false);
|
|
29275
29307
|
this.inputCleared.emit();
|
|
@@ -29896,7 +29928,7 @@ class DropdownSelectorComponent {
|
|
|
29896
29928
|
return this.title.toLowerCase().replace(/[^a-z]+/g, '-');
|
|
29897
29929
|
}
|
|
29898
29930
|
getChoiceLabel() {
|
|
29899
|
-
return this.selectedChoice?.label;
|
|
29931
|
+
return this.selectedChoice?.label ?? '\u00A0';
|
|
29900
29932
|
}
|
|
29901
29933
|
ngOnInit() {
|
|
29902
29934
|
if (!this.maxRows)
|
|
@@ -31999,6 +32031,8 @@ function reducerSearch(state, action) {
|
|
|
31999
32031
|
},
|
|
32000
32032
|
};
|
|
32001
32033
|
}
|
|
32034
|
+
// From router.effects
|
|
32035
|
+
// From home - fuzzy-search - search.service
|
|
32002
32036
|
case SET_FILTERS: {
|
|
32003
32037
|
return {
|
|
32004
32038
|
...state,
|
|
@@ -32020,6 +32054,7 @@ function reducerSearch(state, action) {
|
|
|
32020
32054
|
},
|
|
32021
32055
|
};
|
|
32022
32056
|
}
|
|
32057
|
+
// From results WC
|
|
32023
32058
|
case SET_SEARCH: {
|
|
32024
32059
|
return {
|
|
32025
32060
|
...state,
|
|
@@ -32971,8 +33006,8 @@ class RecordKindField extends SimpleSearchField {
|
|
|
32971
33006
|
};
|
|
32972
33007
|
const presentationFormFilter = {};
|
|
32973
33008
|
if (values.includes('reuse') && !values.includes('dataset')) {
|
|
32974
|
-
|
|
32975
|
-
|
|
33009
|
+
filters['gn-ui-crossFieldFilter'] =
|
|
33010
|
+
`(resourceType:("dataset" OR "document") AND cl_presentationForm.key:("mapDigital" OR "mapHardcopy")) OR resourceType:("application" OR "interactiveMap" OR "map" OR "map/static" OR "map/interactive" OR "map-interactive" OR "map-static" OR "mapDigital" OR "mapHardcopy" OR "staticMap")`;
|
|
32976
33011
|
}
|
|
32977
33012
|
else if (values.includes('dataset') && !values.includes('reuse')) {
|
|
32978
33013
|
presentationFormFilter['mapDigital'] = false;
|
|
@@ -33065,7 +33100,12 @@ class FieldsService {
|
|
|
33065
33100
|
: [fieldValues[fieldName]];
|
|
33066
33101
|
return this.getFiltersForValues(fieldName, values);
|
|
33067
33102
|
});
|
|
33068
|
-
return forkJoin(filtersByField$).pipe(map$1((filters) =>
|
|
33103
|
+
return forkJoin(filtersByField$).pipe(map$1((filters) => {
|
|
33104
|
+
if (typeof filters === 'string') {
|
|
33105
|
+
return filters;
|
|
33106
|
+
}
|
|
33107
|
+
return filters.reduce((prev, curr) => ({ ...prev, ...curr }), {});
|
|
33108
|
+
}));
|
|
33069
33109
|
}
|
|
33070
33110
|
readFieldValuesFromFilters(filters) {
|
|
33071
33111
|
const fieldValues$ = this.supportedFields.map((fieldName) => this.getValuesForFilters(fieldName, filters).pipe(map$1((values) => ({ [fieldName]: values }))));
|
|
@@ -33122,7 +33162,7 @@ class ApiCardComponent {
|
|
|
33122
33162
|
}
|
|
33123
33163
|
}
|
|
33124
33164
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ApiCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
33125
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ApiCardComponent, isStandalone: true, selector: "gn-ui-api-card", inputs: { link: "link", currentLink: "currentLink", size: "size" }, outputs: { openRecordApiForm: "openRecordApiForm" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"group flex justify-between rounded filter overflow-hidden card-shadow\"\n [ngClass]=\"cardClass\"\n>\n @if (size !== 'S') {\n <div class=\"flex-1 min-w-0\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"flex items-center min-w-[32px]\">\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n @if (size === 'S') {\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n }\n</div>\n\n<ng-template #buttons>\n <div class=\"flex flex-row gap-2\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n class=\"border border-gray-300 rounded-lg pt-1 px-2 h-[34px]\"\n ></gn-ui-copy-text-button>\n @if (displayApiFormButton) {\n <button\n type=\"button\"\n class=\"gn-ui-card-icon\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText,\n }\"\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <ng-icon\n class=\"pointer-events-none align-middle card-icon\"\n name=\"iconoirSettings\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive,\n }\"\n ></ng-icon>\n </button>\n }\n </div>\n</ng-template>\n\n<ng-template #content>\n <div class=\"flex-1 min-w-0\">\n <div class=\"gn-ui-card-title\">\n {{ link.description || link.name }}\n </div>\n <div class=\"gn-ui-card-detail\">\n {{ link.name }}\n </div>\n </div>\n <div class=\"flex flex-row justify-between\">\n <div class=\"flex flex-row gap-2.5 items-center pt-1\">\n @if (link.accessServiceProtocol !== 'GPFDL') {\n <span\n class=\"bg-primary
|
|
33165
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ApiCardComponent, isStandalone: true, selector: "gn-ui-api-card", inputs: { link: "link", currentLink: "currentLink", size: "size" }, outputs: { openRecordApiForm: "openRecordApiForm" }, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"group flex justify-between rounded filter overflow-hidden card-shadow\"\n [ngClass]=\"cardClass\"\n>\n @if (size !== 'S') {\n <div class=\"flex-1 min-w-0\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"flex items-center min-w-[32px]\">\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n @if (size === 'S') {\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n }\n</div>\n\n<ng-template #buttons>\n <div class=\"flex flex-row gap-2\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n class=\"border border-gray-300 rounded-lg pt-1 px-2 h-[34px]\"\n ></gn-ui-copy-text-button>\n @if (displayApiFormButton) {\n <button\n type=\"button\"\n class=\"gn-ui-card-icon\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText,\n }\"\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <ng-icon\n class=\"pointer-events-none align-middle card-icon\"\n name=\"iconoirSettings\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive,\n }\"\n ></ng-icon>\n </button>\n }\n </div>\n</ng-template>\n\n<ng-template #content>\n <div class=\"flex-1 min-w-0\">\n <div class=\"gn-ui-card-title\">\n {{ link.description || link.name }}\n </div>\n <div class=\"gn-ui-card-detail\">\n {{ link.name }}\n </div>\n </div>\n <div class=\"flex flex-row justify-between\">\n <div class=\"flex flex-row gap-2.5 items-center pt-1\">\n @if (link.accessServiceProtocol !== 'GPFDL') {\n <span\n class=\"bg-primary/50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >record.metadata.api.accessServiceProtocol.{{\n link.accessServiceProtocol\n }}</span\n >\n }\n @if (link.accessServiceProtocol === 'GPFDL') {\n <span\n class=\"bg-primary/50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >\n record.metadata.api.gpfdl</span\n >\n }\n </div>\n @if (size === 'S') {\n <div>\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1$5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
|
|
33126
33166
|
provideIcons({
|
|
33127
33167
|
iconoirSettings,
|
|
33128
33168
|
}),
|
|
@@ -33147,7 +33187,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
33147
33187
|
provideNgIconsConfig({
|
|
33148
33188
|
size: '1.5em',
|
|
33149
33189
|
}),
|
|
33150
|
-
], template: "<div\n class=\"group flex justify-between rounded filter overflow-hidden card-shadow\"\n [ngClass]=\"cardClass\"\n>\n @if (size !== 'S') {\n <div class=\"flex-1 min-w-0\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"flex items-center min-w-[32px]\">\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n @if (size === 'S') {\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n }\n</div>\n\n<ng-template #buttons>\n <div class=\"flex flex-row gap-2\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n class=\"border border-gray-300 rounded-lg pt-1 px-2 h-[34px]\"\n ></gn-ui-copy-text-button>\n @if (displayApiFormButton) {\n <button\n type=\"button\"\n class=\"gn-ui-card-icon\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText,\n }\"\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <ng-icon\n class=\"pointer-events-none align-middle card-icon\"\n name=\"iconoirSettings\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive,\n }\"\n ></ng-icon>\n </button>\n }\n </div>\n</ng-template>\n\n<ng-template #content>\n <div class=\"flex-1 min-w-0\">\n <div class=\"gn-ui-card-title\">\n {{ link.description || link.name }}\n </div>\n <div class=\"gn-ui-card-detail\">\n {{ link.name }}\n </div>\n </div>\n <div class=\"flex flex-row justify-between\">\n <div class=\"flex flex-row gap-2.5 items-center pt-1\">\n @if (link.accessServiceProtocol !== 'GPFDL') {\n <span\n class=\"bg-primary
|
|
33190
|
+
], template: "<div\n class=\"group flex justify-between rounded filter overflow-hidden card-shadow\"\n [ngClass]=\"cardClass\"\n>\n @if (size !== 'S') {\n <div class=\"flex-1 min-w-0\">\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n </div>\n <div class=\"flex items-center min-w-[32px]\">\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n @if (size === 'S') {\n <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n }\n</div>\n\n<ng-template #buttons>\n <div class=\"flex flex-row gap-2\">\n <gn-ui-copy-text-button\n [text]=\"link.url\"\n [tooltipText]=\"'tooltip.url.copy' | translate\"\n [displayText]=\"false\"\n class=\"border border-gray-300 rounded-lg pt-1 px-2 h-[34px]\"\n ></gn-ui-copy-text-button>\n @if (displayApiFormButton) {\n <button\n type=\"button\"\n class=\"gn-ui-card-icon\"\n [ngClass]=\"{\n 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':\n displayText,\n }\"\n [matTooltip]=\"\n !currentlyActive\n ? ('record.metadata.api.form.openForm' | translate)\n : ('record.metadata.api.form.closeForm' | translate)\n \"\n matTooltipPosition=\"above\"\n (click)=\"openRecordApiFormPanel()\"\n >\n <ng-icon\n class=\"pointer-events-none align-middle card-icon\"\n name=\"iconoirSettings\"\n [ngClass]=\"{\n 'text-secondary opacity-100': currentlyActive,\n }\"\n ></ng-icon>\n </button>\n }\n </div>\n</ng-template>\n\n<ng-template #content>\n <div class=\"flex-1 min-w-0\">\n <div class=\"gn-ui-card-title\">\n {{ link.description || link.name }}\n </div>\n <div class=\"gn-ui-card-detail\">\n {{ link.name }}\n </div>\n </div>\n <div class=\"flex flex-row justify-between\">\n <div class=\"flex flex-row gap-2.5 items-center pt-1\">\n @if (link.accessServiceProtocol !== 'GPFDL') {\n <span\n class=\"bg-primary/50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >record.metadata.api.accessServiceProtocol.{{\n link.accessServiceProtocol\n }}</span\n >\n }\n @if (link.accessServiceProtocol === 'GPFDL') {\n <span\n class=\"bg-primary/50 uppercase inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded text-primary-lightest group-hover:bg-primary transition-colors\"\n [ngClass]=\"{\n '!bg-primary': currentlyActive,\n }\"\n translate\n >\n record.metadata.api.gpfdl</span\n >\n }\n </div>\n @if (size === 'S') {\n <div>\n <ng-container *ngTemplateOutlet=\"buttons\"></ng-container>\n </div>\n }\n </div>\n</ng-template>\n" }]
|
|
33151
33191
|
}], propDecorators: { link: [{
|
|
33152
33192
|
type: Input
|
|
33153
33193
|
}], currentLink: [{
|
|
@@ -33286,10 +33326,12 @@ class DownloadsListComponent {
|
|
|
33286
33326
|
}
|
|
33287
33327
|
removeDuplicateFormats(links) {
|
|
33288
33328
|
const preferredLinks = new Map();
|
|
33289
|
-
links.forEach((link) => {
|
|
33329
|
+
links.forEach((link, index) => {
|
|
33290
33330
|
const format = getFileFormat(link);
|
|
33291
33331
|
const withoutNameSpace = (link.name || link.description || '').replace(/^.*?:/, '');
|
|
33292
|
-
const uniqueKey =
|
|
33332
|
+
const uniqueKey = link.accessServiceProtocol
|
|
33333
|
+
? `${format}-${withoutNameSpace}`
|
|
33334
|
+
: index.toString(); // direct download links should not be deduplicated
|
|
33293
33335
|
if (!preferredLinks.has(uniqueKey)) {
|
|
33294
33336
|
preferredLinks.set(uniqueKey, link);
|
|
33295
33337
|
}
|
|
@@ -33749,7 +33791,7 @@ class ImageInputComponent {
|
|
|
33749
33791
|
provideNgIconsConfig({
|
|
33750
33792
|
size: '1.5rem',
|
|
33751
33793
|
}),
|
|
33752
|
-
], ngImport: i0, template: "@if (previewUrl) {\n <div class=\"w-
|
|
33794
|
+
], ngImport: i0, template: "@if (previewUrl) {\n <div class=\"w-[314px] h-full flex flex-col gap-2\">\n <gn-ui-image-overlay-preview\n class=\"w-[314px] h-[314px]\"\n [imageUrl]=\"previewUrl\"\n >\n </gn-ui-image-overlay-preview>\n @if (showAltTextInput) {\n <gn-ui-text-input\n [placeholder]=\"'input.image.altTextPlaceholder' | translate\"\n [value]=\"altText ?? ''\"\n (valueChange)=\"handleAltTextChange($event)\"\n extraClass=\"gn-ui-editor-textarea\"\n ></gn-ui-text-input>\n }\n <div class=\"flex flex-row gap-2 mt-2\">\n <gn-ui-button\n type=\"gray\"\n (buttonClick)=\"handleDelete()\"\n data-cy=\"delete-image\"\n >\n <ng-icon class=\"me-1 text-primary\" name=\"iconoirBin\"></ng-icon>\n {{ 'input.image.delete' | translate }}\n </gn-ui-button>\n @if (!showAltTextInput) {\n <gn-ui-button type=\"gray\" (buttonClick)=\"toggleAltTextInput()\">\n <ng-icon name=\"iconoirPlus\" class=\"me-1 text-primary\"></ng-icon>\n {{ 'input.image.displayAltTextInput' | translate }}\n </gn-ui-button>\n }\n </div>\n </div>\n} @else {\n <div class=\"w-full h-full flex flex-col gap-2\">\n <label\n gnUiFilesDrop\n class=\"flex-1 border-2 border-dashed rounded-lg p-6 flex flex-col items-center justify-center gap-4 transition-colors duration-100\"\n [ngClass]=\"{\n 'border-primary-lighter bg-primary-white': dragFilesOver,\n 'border-gray-300': !dragFilesOver,\n 'cursor-pointer hover:border-gray-500': !getIsActionBlocked(),\n 'cursor-not-allowed': disabled,\n }\"\n [attr.tabindex]=\"getIsActionBlocked() ? null : 0\"\n (keydown.enter)=\"fileInput.click()\"\n (dragFilesOver)=\"handleDragFilesOver($event)\"\n (dropFiles)=\"handleDropFiles($event)\"\n >\n @if (!isUploadInProgress && !imageFileError) {\n <div class=\"w-14 h-14 rounded-md bg-gray-50 grid\">\n @if (!dragFilesOver) {\n <ng-icon\n class=\"place-self-center text-primary\"\n name=\"iconoirMediaImage\"\n ></ng-icon>\n }\n @if (dragFilesOver) {\n <ng-icon\n class=\"place-self-center text-primary\"\n name=\"iconoirFramePlusIn\"\n ></ng-icon>\n }\n </div>\n }\n @if (isUploadInProgress && !imageFileError) {\n <div class=\"w-14 h-14 grid items-center justify-center relative\">\n <div class=\"text-gray-100 absolute\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n mode=\"determinate\"\n [value]=\"100\"\n ></mat-progress-spinner>\n </div>\n <div class=\"text-primary absolute\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n mode=\"determinate\"\n [value]=\"uploadProgress\"\n ></mat-progress-spinner>\n </div>\n <span class=\"text-sm text-main font-bold\">{{ uploadProgress }}%</span>\n </div>\n }\n @if (imageFileError) {\n <div class=\"w-14 h-14 rounded-md bg-gray-50 grid\">\n <ng-icon\n name=\"iconoirMediaImageXmark\"\n class=\"place-self-center text-rose-500\"\n data-cy=\"imgErrorIcon\"\n ></ng-icon>\n </div>\n }\n <div class=\"flex flex-col items-center gap-1\">\n <p class=\"font-medium\" data-cy=\"imgInputMsgPrimary\">\n {{ getPrimaryText() | translate }}\n </p>\n <p\n class=\"text-sm\"\n data-cy=\"imgInputMsgSecondary\"\n [class]=\"\n isUploadInProgress\n ? 'font-bold text-blue-500 cursor-pointer'\n : 'font-medium text-gray-500'\n \"\n (click)=\"handleSecondaryTextClick($event)\"\n >\n {{ getSecondaryText() | translate }}\n </p>\n </div>\n <input\n #fileInput\n accept=\"image/*\"\n type=\"file\"\n class=\"hidden\"\n (change)=\"handleFileInput($event)\"\n [disabled]=\"isUploadInProgress || disabled\"\n />\n </label>\n @if (!showUrlInput) {\n <div class=\"flex-none mt-2\">\n <gn-ui-button\n data-cy=\"imgUrlBtn\"\n (buttonClick)=\"displayUrlInput()\"\n type=\"gray\"\n [disabled]=\"disabled\"\n [extraClass]=\"disabled && 'cursor-not-allowed'\"\n >\n <ng-icon class=\"me-1 text-primary\" name=\"iconoirLink\"></ng-icon>\n {{ 'input.image.displayUrlInput' | translate }}\n </gn-ui-button>\n </div>\n }\n @if (showUrlInput) {\n <gn-ui-url-input\n class=\"mt-3.5\"\n data-cy=\"imgUrlInput\"\n (uploadClick)=\"downloadUrl($event)\"\n [disabled]=\"isUploadInProgress || disabled\"\n >\n </gn-ui-url-input>\n }\n </div>\n}\n", styles: [":host{--gn-ui-button-padding: 8px 8px;--gn-ui-button-rounded: 8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "directive", type: FilesDropDirective, selector: "[gnUiFilesDrop]", outputs: ["dragFilesOver", "dropFiles"] }, { kind: "ngmodule", type: MatProgressSpinnerModule }, { kind: "component", type: i2.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: UrlInputComponent, selector: "gn-ui-url-input", inputs: ["value", "extraClass", "placeholder", "disabled", "showValidateButton", "resetUrlOnChange"], outputs: ["valueChange", "uploadClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "placeholder", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ImageOverlayPreviewComponent, selector: "gn-ui-image-overlay-preview", inputs: ["imageUrl"], outputs: ["isPlaceholderShown"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
33753
33795
|
}
|
|
33754
33796
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ImageInputComponent, decorators: [{
|
|
33755
33797
|
type: Component,
|
|
@@ -33775,7 +33817,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
33775
33817
|
provideNgIconsConfig({
|
|
33776
33818
|
size: '1.5rem',
|
|
33777
33819
|
}),
|
|
33778
|
-
], template: "@if (previewUrl) {\n <div class=\"w-
|
|
33820
|
+
], template: "@if (previewUrl) {\n <div class=\"w-[314px] h-full flex flex-col gap-2\">\n <gn-ui-image-overlay-preview\n class=\"w-[314px] h-[314px]\"\n [imageUrl]=\"previewUrl\"\n >\n </gn-ui-image-overlay-preview>\n @if (showAltTextInput) {\n <gn-ui-text-input\n [placeholder]=\"'input.image.altTextPlaceholder' | translate\"\n [value]=\"altText ?? ''\"\n (valueChange)=\"handleAltTextChange($event)\"\n extraClass=\"gn-ui-editor-textarea\"\n ></gn-ui-text-input>\n }\n <div class=\"flex flex-row gap-2 mt-2\">\n <gn-ui-button\n type=\"gray\"\n (buttonClick)=\"handleDelete()\"\n data-cy=\"delete-image\"\n >\n <ng-icon class=\"me-1 text-primary\" name=\"iconoirBin\"></ng-icon>\n {{ 'input.image.delete' | translate }}\n </gn-ui-button>\n @if (!showAltTextInput) {\n <gn-ui-button type=\"gray\" (buttonClick)=\"toggleAltTextInput()\">\n <ng-icon name=\"iconoirPlus\" class=\"me-1 text-primary\"></ng-icon>\n {{ 'input.image.displayAltTextInput' | translate }}\n </gn-ui-button>\n }\n </div>\n </div>\n} @else {\n <div class=\"w-full h-full flex flex-col gap-2\">\n <label\n gnUiFilesDrop\n class=\"flex-1 border-2 border-dashed rounded-lg p-6 flex flex-col items-center justify-center gap-4 transition-colors duration-100\"\n [ngClass]=\"{\n 'border-primary-lighter bg-primary-white': dragFilesOver,\n 'border-gray-300': !dragFilesOver,\n 'cursor-pointer hover:border-gray-500': !getIsActionBlocked(),\n 'cursor-not-allowed': disabled,\n }\"\n [attr.tabindex]=\"getIsActionBlocked() ? null : 0\"\n (keydown.enter)=\"fileInput.click()\"\n (dragFilesOver)=\"handleDragFilesOver($event)\"\n (dropFiles)=\"handleDropFiles($event)\"\n >\n @if (!isUploadInProgress && !imageFileError) {\n <div class=\"w-14 h-14 rounded-md bg-gray-50 grid\">\n @if (!dragFilesOver) {\n <ng-icon\n class=\"place-self-center text-primary\"\n name=\"iconoirMediaImage\"\n ></ng-icon>\n }\n @if (dragFilesOver) {\n <ng-icon\n class=\"place-self-center text-primary\"\n name=\"iconoirFramePlusIn\"\n ></ng-icon>\n }\n </div>\n }\n @if (isUploadInProgress && !imageFileError) {\n <div class=\"w-14 h-14 grid items-center justify-center relative\">\n <div class=\"text-gray-100 absolute\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n mode=\"determinate\"\n [value]=\"100\"\n ></mat-progress-spinner>\n </div>\n <div class=\"text-primary absolute\">\n <mat-progress-spinner\n class=\"place-self-center\"\n [diameter]=\"56\"\n mode=\"determinate\"\n [value]=\"uploadProgress\"\n ></mat-progress-spinner>\n </div>\n <span class=\"text-sm text-main font-bold\">{{ uploadProgress }}%</span>\n </div>\n }\n @if (imageFileError) {\n <div class=\"w-14 h-14 rounded-md bg-gray-50 grid\">\n <ng-icon\n name=\"iconoirMediaImageXmark\"\n class=\"place-self-center text-rose-500\"\n data-cy=\"imgErrorIcon\"\n ></ng-icon>\n </div>\n }\n <div class=\"flex flex-col items-center gap-1\">\n <p class=\"font-medium\" data-cy=\"imgInputMsgPrimary\">\n {{ getPrimaryText() | translate }}\n </p>\n <p\n class=\"text-sm\"\n data-cy=\"imgInputMsgSecondary\"\n [class]=\"\n isUploadInProgress\n ? 'font-bold text-blue-500 cursor-pointer'\n : 'font-medium text-gray-500'\n \"\n (click)=\"handleSecondaryTextClick($event)\"\n >\n {{ getSecondaryText() | translate }}\n </p>\n </div>\n <input\n #fileInput\n accept=\"image/*\"\n type=\"file\"\n class=\"hidden\"\n (change)=\"handleFileInput($event)\"\n [disabled]=\"isUploadInProgress || disabled\"\n />\n </label>\n @if (!showUrlInput) {\n <div class=\"flex-none mt-2\">\n <gn-ui-button\n data-cy=\"imgUrlBtn\"\n (buttonClick)=\"displayUrlInput()\"\n type=\"gray\"\n [disabled]=\"disabled\"\n [extraClass]=\"disabled && 'cursor-not-allowed'\"\n >\n <ng-icon class=\"me-1 text-primary\" name=\"iconoirLink\"></ng-icon>\n {{ 'input.image.displayUrlInput' | translate }}\n </gn-ui-button>\n </div>\n }\n @if (showUrlInput) {\n <gn-ui-url-input\n class=\"mt-3.5\"\n data-cy=\"imgUrlInput\"\n (uploadClick)=\"downloadUrl($event)\"\n [disabled]=\"isUploadInProgress || disabled\"\n >\n </gn-ui-url-input>\n }\n </div>\n}\n", styles: [":host{--gn-ui-button-padding: 8px 8px;--gn-ui-button-rounded: 8px}\n"] }]
|
|
33779
33821
|
}], propDecorators: { previewUrl: [{
|
|
33780
33822
|
type: Input
|
|
33781
33823
|
}], altText: [{
|
|
@@ -33994,9 +34036,9 @@ class MetadataContactComponent {
|
|
|
33994
34036
|
return this.metadata.ownerOrganization;
|
|
33995
34037
|
}
|
|
33996
34038
|
get contacts() {
|
|
33997
|
-
return ((this.metadata.kind === '
|
|
33998
|
-
? this.metadata.
|
|
33999
|
-
: this.metadata.
|
|
34039
|
+
return ((this.metadata.kind === 'service'
|
|
34040
|
+
? this.metadata.contacts
|
|
34041
|
+
: this.metadata.contactsForResource) || []);
|
|
34000
34042
|
}
|
|
34001
34043
|
get address() {
|
|
34002
34044
|
const addressParts = this.contacts[0].address
|
|
@@ -34008,7 +34050,7 @@ class MetadataContactComponent {
|
|
|
34008
34050
|
this.organizationClick.emit(this.shownOrganization);
|
|
34009
34051
|
}
|
|
34010
34052
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MetadataContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
34011
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: MetadataContactComponent, isStandalone: true, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div\n class=\"py-5 px-5 rounded bg-gray-100 text-black\"\n data-cy=\"metadata-organization\"\n>\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-base font-medium\" translate>record.metadata.contact</p>\n </div>\n @if (shownOrganization?.logoUrl?.href) {\n <div\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grid grid-cols-1 gap-1\">\n <div class=\"flex\">\n <div\n class=\"font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name-link\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n @if (shownOrganization?.website) {\n <div>\n <
|
|
34053
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: MetadataContactComponent, isStandalone: true, selector: "gn-ui-metadata-contact", inputs: { metadata: "metadata" }, outputs: { organizationClick: "organizationClick", contactClick: "contactClick" }, ngImport: i0, template: "<div\n class=\"py-5 px-5 rounded bg-gray-100 text-black\"\n data-cy=\"metadata-organization\"\n>\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-base font-medium\" translate>record.metadata.contact</p>\n </div>\n @if (shownOrganization?.logoUrl?.href) {\n <div\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grid grid-cols-1 gap-1\">\n <div class=\"flex\">\n <div\n class=\"font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name-link\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n @if (shownOrganization?.website) {\n <div>\n <div class=\"flex items-center mt-1\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-sm cursor-pointer hover:underline transition-all ml-2\"\n >\n {{ shownOrganization.website }}\n </a>\n </div>\n </div>\n }\n </div>\n <div class=\"grid grid-cols-1 gap-5 py-3 overflow-hidden\">\n @if (contacts[0]?.phone) {\n <div>\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matCallOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n }\n @if (contacts[0]?.email) {\n <div>\n <div class=\"flex gap-2\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n @if (contacts.length) {\n <a\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"break-all text-sm hover:underline\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n }\n </div>\n </div>\n }\n @if (contacts[0]?.firstName || contacts[0]?.lastName) {\n <div>\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matPersonOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\" data-cy=\"contact-full-name\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n }\n @if (contacts[0]?.address) {\n <div>\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matLocationOnOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n @for (addressPart of address; track addressPart) {\n <p class=\"text-sm\">\n {{ addressPart }}\n </p>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], viewProviders: [
|
|
34012
34054
|
provideIcons({
|
|
34013
34055
|
matOpenInNew,
|
|
34014
34056
|
matCallOutline,
|
|
@@ -34028,7 +34070,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
34028
34070
|
matPersonOutline,
|
|
34029
34071
|
matLocationOnOutline,
|
|
34030
34072
|
}),
|
|
34031
|
-
], template: "<div\n class=\"py-5 px-5 rounded bg-gray-100 text-black\"\n data-cy=\"metadata-organization\"\n>\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-base font-medium\" translate>record.metadata.contact</p>\n </div>\n @if (shownOrganization?.logoUrl?.href) {\n <div\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grid grid-cols-1 gap-1\">\n <div class=\"flex\">\n <div\n class=\"font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name-link\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n @if (shownOrganization?.website) {\n <div>\n <
|
|
34073
|
+
], template: "<div\n class=\"py-5 px-5 rounded bg-gray-100 text-black\"\n data-cy=\"metadata-organization\"\n>\n <div class=\"grid gap-3 overflow-hidden\">\n <div>\n <p class=\"text-base font-medium\" translate>record.metadata.contact</p>\n </div>\n @if (shownOrganization?.logoUrl?.href) {\n <div\n class=\"flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden\"\n >\n <gn-ui-thumbnail\n class=\"relative h-full w-full\"\n [thumbnailUrl]=\"shownOrganization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grid grid-cols-1 gap-1\">\n <div class=\"flex\">\n <div\n class=\"font-title text-21 mr-2 cursor-pointer hover:underline\"\n (click)=\"onOrganizationClick()\"\n data-cy=\"organization-name-link\"\n >\n {{ shownOrganization?.name }}\n </div>\n </div>\n @if (shownOrganization?.website) {\n <div>\n <div class=\"flex items-center mt-1\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n <a\n [href]=\"shownOrganization.website\"\n target=\"_blank\"\n class=\"contact-website text-sm cursor-pointer hover:underline transition-all ml-2\"\n >\n {{ shownOrganization.website }}\n </a>\n </div>\n </div>\n }\n </div>\n <div class=\"grid grid-cols-1 gap-5 py-3 overflow-hidden\">\n @if (contacts[0]?.phone) {\n <div>\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matCallOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n <p class=\"text-sm\">{{ contacts[0].phone }}</p>\n </div>\n </div>\n </div>\n }\n @if (contacts[0]?.email) {\n <div>\n <div class=\"flex gap-2\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n @if (contacts.length) {\n <a\n [href]=\"'mailto:' + contacts[0].email\"\n class=\"break-all text-sm hover:underline\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ contacts[0].email }}</a\n >\n }\n </div>\n </div>\n }\n @if (contacts[0]?.firstName || contacts[0]?.lastName) {\n <div>\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matPersonOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\" data-cy=\"contact-full-name\">\n <p class=\"text-sm\">\n {{ contacts[0]?.firstName || '' }}\n {{ contacts[0]?.lastName || '' }}\n </p>\n </div>\n </div>\n </div>\n }\n @if (contacts[0]?.address) {\n <div>\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matLocationOnOutline\"\n ></ng-icon>\n <div class=\"flex flex-col ml-2\">\n @for (addressPart of address; track addressPart) {\n <p class=\"text-sm\">\n {{ addressPart }}\n </p>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n</div>\n" }]
|
|
34032
34074
|
}], propDecorators: { metadata: [{
|
|
34033
34075
|
type: Input
|
|
34034
34076
|
}], organizationClick: [{
|
|
@@ -34528,7 +34570,7 @@ class RecordApiFormComponent {
|
|
|
34528
34570
|
}
|
|
34529
34571
|
}
|
|
34530
34572
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
34531
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: RecordApiFormComponent, isStandalone: true, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary
|
|
34573
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: RecordApiFormComponent, isStandalone: true, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary/50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n placeholder=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 relative\">\n <p class=\"text-sm\" [class.text-gray-600]=\"!supportOffset\" translate>\n record.metadata.api.form.offset\n </p>\n <div class=\"flex items-center\">\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n [disabled]=\"!supportOffset\"\n (valueChange)=\"supportOffset ? setOffset($event) : null\"\n placeholder=\"\"\n >\n </gn-ui-text-input>\n @if (!supportOffset) {\n <div class=\"flex items-center gap-2 text-orange-500 z-10 ml-3\">\n <span\n class=\"material-symbols-outlined\"\n matTooltip=\"Not supported on this service\"\n >\n warning\n </span>\n </div>\n }\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"outputFormats\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button ng-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover ng-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "placeholder", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1$5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
34532
34574
|
}
|
|
34533
34575
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RecordApiFormComponent, decorators: [{
|
|
34534
34576
|
type: Component,
|
|
@@ -34539,7 +34581,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
34539
34581
|
CopyTextButtonComponent,
|
|
34540
34582
|
TranslateDirective,
|
|
34541
34583
|
MatTooltipModule,
|
|
34542
|
-
], template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary
|
|
34584
|
+
], template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary/50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n placeholder=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 relative\">\n <p class=\"text-sm\" [class.text-gray-600]=\"!supportOffset\" translate>\n record.metadata.api.form.offset\n </p>\n <div class=\"flex items-center\">\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n [disabled]=\"!supportOffset\"\n (valueChange)=\"supportOffset ? setOffset($event) : null\"\n placeholder=\"\"\n >\n </gn-ui-text-input>\n @if (!supportOffset) {\n <div class=\"flex items-center gap-2 text-orange-500 z-10 ml-3\">\n <span\n class=\"material-symbols-outlined\"\n matTooltip=\"Not supported on this service\"\n >\n warning\n </span>\n </div>\n }\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"outputFormats\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button ng-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover ng-icon{color:#d3d3d3!important}\n"] }]
|
|
34543
34585
|
}], propDecorators: { apiLink: [{
|
|
34544
34586
|
type: Input
|
|
34545
34587
|
}] } });
|
|
@@ -34642,13 +34684,12 @@ class ApplicationBannerComponent {
|
|
|
34642
34684
|
this.icon = 'matWarning';
|
|
34643
34685
|
break;
|
|
34644
34686
|
case 'light':
|
|
34645
|
-
this.msgClass =
|
|
34646
|
-
'bg-primary-opacity-10 border-primary-lightest text-black';
|
|
34687
|
+
this.msgClass = 'bg-primary/10 border-primary-lightest text-black';
|
|
34647
34688
|
this.icon = 'matInfoOutline';
|
|
34648
34689
|
break;
|
|
34649
34690
|
case 'secondary':
|
|
34650
34691
|
default:
|
|
34651
|
-
this.msgClass = 'bg-primary
|
|
34692
|
+
this.msgClass = 'bg-primary/50 border-primary-darker text-black';
|
|
34652
34693
|
this.icon = 'matWarningAmberOutline';
|
|
34653
34694
|
break;
|
|
34654
34695
|
}
|
|
@@ -34737,7 +34778,7 @@ class InternalLinkCardComponent {
|
|
|
34737
34778
|
provideNgIconsConfig({
|
|
34738
34779
|
size: '1.2em',
|
|
34739
34780
|
}),
|
|
34740
|
-
], ngImport: i0, template: "<a\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n class=\"record-card\"\n [ngClass]=\"cardClass\"\n>\n @if (shouldShowThumbnail) {\n <div class=\"record-card__thumbnail\">\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grow pt-1\" [ngClass]=\"shouldShowThumbnail ? 'sm:w-0' : ''\">\n <div class=\"flex flex-col gap-2 h-full\">\n <h4\n class=\"record-card__title\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n <!-- force max width here as long a-href urls within the markdown parser can cause layout issues -->\n <div class=\"grow max-w-[248px] sm:max-w-full\">\n <gn-ui-markdown-parser\n data-cy=\"recordAbstract\"\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n class=\"record-card__abstract\"\n [title]=\"abstract\"\n ></gn-ui-markdown-parser>\n </div>\n <div class=\"record-card__footer\">\n
|
|
34781
|
+
], ngImport: i0, template: "<a\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n class=\"record-card\"\n [ngClass]=\"cardClass\"\n>\n @if (shouldShowThumbnail) {\n <div class=\"record-card__thumbnail\">\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grow pt-1\" [ngClass]=\"shouldShowThumbnail ? 'sm:w-0' : ''\">\n <div class=\"flex flex-col gap-2\" [class.h-full]=\"size !== 'M'\">\n <h4\n class=\"record-card__title\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n <!-- force max width here as long a-href urls within the markdown parser can cause layout issues -->\n <div class=\"grow max-w-[248px] sm:max-w-full\">\n <gn-ui-markdown-parser\n data-cy=\"recordAbstract\"\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n class=\"record-card__abstract\"\n [title]=\"abstract\"\n ></gn-ui-markdown-parser>\n </div>\n @if (size !== 'M') {\n <ng-container [ngTemplateOutlet]=\"footerTpl\"></ng-container>\n }\n </div>\n </div>\n @if (size === 'M') {\n <ng-container [ngTemplateOutlet]=\"footerTpl\"></ng-container>\n }\n</a>\n\n<ng-template #footerTpl>\n <div class=\"record-card__footer\">\n @if (record.ownerOrganization?.name) {\n <div\n data-cy=\"recordOrg\"\n class=\"grow flex flex-row gap-1 items-center text-primary-lighter\"\n [ngClass]=\"displayContactIconOnly ? 'justify-center' : ''\"\n >\n <ng-icon\n name=\"iconoirBank\"\n class=\"text-primary -translate-y-[0.5px] shrink-0\"\n [title]=\"record.ownerOrganization.name\"\n ></ng-icon>\n @if (!displayContactIconOnly) {\n <span\n data-cy=\"recordOrgName\"\n class=\"line-clamp-1\"\n [title]=\"record.ownerOrganization.name\"\n >{{ record.ownerOrganization.name }}</span\n >\n }\n </div>\n }\n <div class=\"record-card__footer__other\">\n <div class=\"xs:border-r last:border-r-0 flex grow gap-4 px-4 last:pr-0\">\n <gn-ui-kind-badge\n [extraClass]=\"'text-[1.2em]'\"\n [styling]=\"'gray'\"\n [kind]=\"record?.kind\"\n [contentTemplate]=\"customTemplate\"\n class=\"pt-1\"\n >\n <ng-template #customTemplate></ng-template\n ></gn-ui-kind-badge>\n @if (metadataQualityDisplay) {\n <gn-ui-metadata-quality\n class=\"flex items-center min-w-[113px]\"\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n [popoverDisplay]=\"true\"\n ></gn-ui-metadata-quality>\n }\n </div>\n <div\n class=\"flex justify-center\"\n data-cy=\"recordFav\"\n [ngClass]=\"displayContactIconOnly ? 'px-1' : 'px-4'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".record-card{@apply rounded-md bg-white hover:cursor-pointer hover:bg-slate-50 overflow-hidden items-stretch flex flex-row md:gap-0 justify-between py-3 pl-3 pr-5;}.record-card.size-L{@apply w-full md:h-[208px] gap-5;}.record-card.size-M{@apply max-w-[940px] gap-4 flex-wrap;}.record-card.size-S{@apply max-w-[572px] md:h-[315px] gap-4;}.record-card.size-XS{@apply max-w-[280px] md:h-[315px] gap-4;}.record-card:hover .record-card__title{@apply text-primary;}.record-card__thumbnail{@apply border rounded-lg overflow-hidden shrink-0;}.size-L .record-card__thumbnail{@apply w-[184px] h-[184px];}.size-M .record-card__thumbnail{@apply w-[138px] h-[138px];}.record-card__title{@apply text-xl font-medium text-title leading-6;}.size-L .record-card__title,.size-M .record-card__title{@apply line-clamp-2;}.size-S .record-card__title,.size-XS .record-card__title{@apply line-clamp-3 ml-2;}.record-card__abstract{@apply text-gray-900 overflow-hidden;}.size-L .record-card__abstract,.size-M .record-card__abstract{@apply line-clamp-3;}.size-S .record-card__abstract,.size-XS .record-card__abstract{@apply line-clamp-4 ml-2;}.record-card__footer{@apply flex sm:flex-row flex-col flex-nowrap gap-3 justify-end items-center w-full border-t pt-1 overflow-hidden;}@media (max-width: 450px){.size-S .record-card__footer{@apply flex-col items-stretch;}}.size-XS .record-card__footer{@apply flex-col items-stretch gap-2;}.record-card__footer__other{@apply flex flex-col xs:flex-row flex-nowrap gap-3 xs:border-l first:border-l-0;}.record-card__footer__other>div{@apply py-1;}@media (max-width: 450px){.size-S .record-card__footer__other,.size-S .record-card__footer__other>div{@apply border-0 px-0 py-0;}}.size-XS .record-card__footer__other,.size-XS .record-card__footer__other>div{@apply border-0;}.size-XS .record-card__footer__other>div{@apply px-0 py-0;}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: MetadataQualityComponent, selector: "gn-ui-metadata-quality", inputs: ["metadata", "smaller", "metadataQualityDisplay", "popoverDisplay", "propsToValidate", "forceComputeScore"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: KindBadgeComponent, selector: "gn-ui-kind-badge", inputs: ["styling", "contentTemplate", "kind", "extraClass"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }] }); }
|
|
34741
34782
|
}
|
|
34742
34783
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: InternalLinkCardComponent, decorators: [{
|
|
34743
34784
|
type: Component,
|
|
@@ -34757,7 +34798,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
34757
34798
|
provideNgIconsConfig({
|
|
34758
34799
|
size: '1.2em',
|
|
34759
34800
|
}),
|
|
34760
|
-
], template: "<a\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n class=\"record-card\"\n [ngClass]=\"cardClass\"\n>\n @if (shouldShowThumbnail) {\n <div class=\"record-card__thumbnail\">\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grow pt-1\" [ngClass]=\"shouldShowThumbnail ? 'sm:w-0' : ''\">\n <div class=\"flex flex-col gap-2 h-full\">\n <h4\n class=\"record-card__title\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n <!-- force max width here as long a-href urls within the markdown parser can cause layout issues -->\n <div class=\"grow max-w-[248px] sm:max-w-full\">\n <gn-ui-markdown-parser\n data-cy=\"recordAbstract\"\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n class=\"record-card__abstract\"\n [title]=\"abstract\"\n ></gn-ui-markdown-parser>\n </div>\n <div class=\"record-card__footer\">\n
|
|
34801
|
+
], template: "<a\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n class=\"record-card\"\n [ngClass]=\"cardClass\"\n>\n @if (shouldShowThumbnail) {\n <div class=\"record-card__thumbnail\">\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n }\n <div class=\"grow pt-1\" [ngClass]=\"shouldShowThumbnail ? 'sm:w-0' : ''\">\n <div class=\"flex flex-col gap-2\" [class.h-full]=\"size !== 'M'\">\n <h4\n class=\"record-card__title\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n <!-- force max width here as long a-href urls within the markdown parser can cause layout issues -->\n <div class=\"grow max-w-[248px] sm:max-w-full\">\n <gn-ui-markdown-parser\n data-cy=\"recordAbstract\"\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n class=\"record-card__abstract\"\n [title]=\"abstract\"\n ></gn-ui-markdown-parser>\n </div>\n @if (size !== 'M') {\n <ng-container [ngTemplateOutlet]=\"footerTpl\"></ng-container>\n }\n </div>\n </div>\n @if (size === 'M') {\n <ng-container [ngTemplateOutlet]=\"footerTpl\"></ng-container>\n }\n</a>\n\n<ng-template #footerTpl>\n <div class=\"record-card__footer\">\n @if (record.ownerOrganization?.name) {\n <div\n data-cy=\"recordOrg\"\n class=\"grow flex flex-row gap-1 items-center text-primary-lighter\"\n [ngClass]=\"displayContactIconOnly ? 'justify-center' : ''\"\n >\n <ng-icon\n name=\"iconoirBank\"\n class=\"text-primary -translate-y-[0.5px] shrink-0\"\n [title]=\"record.ownerOrganization.name\"\n ></ng-icon>\n @if (!displayContactIconOnly) {\n <span\n data-cy=\"recordOrgName\"\n class=\"line-clamp-1\"\n [title]=\"record.ownerOrganization.name\"\n >{{ record.ownerOrganization.name }}</span\n >\n }\n </div>\n }\n <div class=\"record-card__footer__other\">\n <div class=\"xs:border-r last:border-r-0 flex grow gap-4 px-4 last:pr-0\">\n <gn-ui-kind-badge\n [extraClass]=\"'text-[1.2em]'\"\n [styling]=\"'gray'\"\n [kind]=\"record?.kind\"\n [contentTemplate]=\"customTemplate\"\n class=\"pt-1\"\n >\n <ng-template #customTemplate></ng-template\n ></gn-ui-kind-badge>\n @if (metadataQualityDisplay) {\n <gn-ui-metadata-quality\n class=\"flex items-center min-w-[113px]\"\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n [popoverDisplay]=\"true\"\n ></gn-ui-metadata-quality>\n }\n </div>\n <div\n class=\"flex justify-center\"\n data-cy=\"recordFav\"\n [ngClass]=\"displayContactIconOnly ? 'px-1' : 'px-4'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: [".record-card{@apply rounded-md bg-white hover:cursor-pointer hover:bg-slate-50 overflow-hidden items-stretch flex flex-row md:gap-0 justify-between py-3 pl-3 pr-5;}.record-card.size-L{@apply w-full md:h-[208px] gap-5;}.record-card.size-M{@apply max-w-[940px] gap-4 flex-wrap;}.record-card.size-S{@apply max-w-[572px] md:h-[315px] gap-4;}.record-card.size-XS{@apply max-w-[280px] md:h-[315px] gap-4;}.record-card:hover .record-card__title{@apply text-primary;}.record-card__thumbnail{@apply border rounded-lg overflow-hidden shrink-0;}.size-L .record-card__thumbnail{@apply w-[184px] h-[184px];}.size-M .record-card__thumbnail{@apply w-[138px] h-[138px];}.record-card__title{@apply text-xl font-medium text-title leading-6;}.size-L .record-card__title,.size-M .record-card__title{@apply line-clamp-2;}.size-S .record-card__title,.size-XS .record-card__title{@apply line-clamp-3 ml-2;}.record-card__abstract{@apply text-gray-900 overflow-hidden;}.size-L .record-card__abstract,.size-M .record-card__abstract{@apply line-clamp-3;}.size-S .record-card__abstract,.size-XS .record-card__abstract{@apply line-clamp-4 ml-2;}.record-card__footer{@apply flex sm:flex-row flex-col flex-nowrap gap-3 justify-end items-center w-full border-t pt-1 overflow-hidden;}@media (max-width: 450px){.size-S .record-card__footer{@apply flex-col items-stretch;}}.size-XS .record-card__footer{@apply flex-col items-stretch gap-2;}.record-card__footer__other{@apply flex flex-col xs:flex-row flex-nowrap gap-3 xs:border-l first:border-l-0;}.record-card__footer__other>div{@apply py-1;}@media (max-width: 450px){.size-S .record-card__footer__other,.size-S .record-card__footer__other>div{@apply border-0 px-0 py-0;}}.size-XS .record-card__footer__other,.size-XS .record-card__footer__other>div{@apply border-0;}.size-XS .record-card__footer__other>div{@apply px-0 py-0;}\n"] }]
|
|
34761
34802
|
}], propDecorators: { record: [{
|
|
34762
34803
|
type: Input
|
|
34763
34804
|
}], linkTarget: [{
|
|
@@ -34895,7 +34936,7 @@ class ServiceCapabilitiesComponent {
|
|
|
34895
34936
|
: `h-8 rounded-lg`;
|
|
34896
34937
|
}
|
|
34897
34938
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ServiceCapabilitiesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
34898
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ServiceCapabilitiesComponent, isStandalone: true, selector: "gn-ui-service-capabilities", inputs: { apiLinks: "apiLinks" }, ngImport: i0, template: "@if (apiLinks.length > 0) {\n <div style=\"height: 652px\" id=\"preview\">\n <div class=\"bg-primary
|
|
34939
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ServiceCapabilitiesComponent, isStandalone: true, selector: "gn-ui-service-capabilities", inputs: { apiLinks: "apiLinks" }, ngImport: i0, template: "@if (apiLinks.length > 0) {\n <div style=\"height: 652px\" id=\"preview\">\n <div class=\"bg-primary/10 overflow-visible\" style=\"height: 420px\">\n <div class=\"container-lg px-4 lg:mx-auto\">\n <div>\n <div class=\"gn-ui-section-title mb-6\" translate>\n service.metadata.capabilities\n </div>\n @if (loading) {\n <div class=\"flex justify-center w-full h-[200px] items-center\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n }\n @if (!loading) {\n <div>\n <div class=\"flex flex-row gap-5\">\n <div class=\"h-14 md:w-2/5 w-full mb-4 flex flex-row relative\">\n <gn-ui-text-input\n class=\"w-full\"\n [(value)]=\"searchQuery\"\n [extraClass]=\"getExtraInputClass()\"\n [placeholder]=\"'service.metadata.search' | translate\"\n (input)=\"onSearchChange($event)\"\n (keydown.enter)=\"onSearchEnter($event)\"\n >\n </gn-ui-text-input>\n <div\n class=\"absolute right-14 h-14 w-14 flex items-center justify-center\"\n >\n @if (searchQuery) {\n <button\n #inputBtn\n [aria-label]=\"\n 'service.metadata.search.clear' | translate\n \"\n (click)=\"clearSearch()\"\n class=\"h-12 w-12 border-0 flex items-center justify-center\"\n >\n <ng-icon name=\"matClose\"></ng-icon>\n </button>\n }\n </div>\n <div\n class=\"border-l absolute border-gray-200 right-0 h-14 w-14\"\n >\n <gn-ui-button\n #inputBtn\n type=\"outline\"\n extraClass=\"h-12 w-12 border-0 absolute right-1 top-1 bg-white\"\n (buttonClick)=\"searchLayers()\"\n >\n <ng-icon name=\"iconoirSearch\"></ng-icon>\n </gn-ui-button>\n </div>\n </div>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light\"\n class=\"w-14 h-14 border border-gray-300 rounded-lg flex justify-center items-center\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"w-6 h-6 pt-0.5\"\n ></ng-icon>\n </gn-ui-popover>\n </div>\n <div\n style=\"height: 500px\"\n class=\"bg-white shadow-xl rounded p-0 flex md:flex-row flex-col\"\n >\n <div\n class=\"flex flex-col gap-2 bg-gray-100 md:w-1/2 md:h-full w-full h-1/2 rounded-l overflow-y-auto py-5 pr-1 pl-3\"\n data-test=\"layer-list\"\n >\n @for (layerItem of filteredLayers; track layerItem) {\n <gn-ui-button\n type=\"outline\"\n [extraClass]=\"getExtraClass(layerItem)\"\n (buttonClick)=\"selectLayer(layerItem)\"\n >\n {{ layerItem.title || layerItem.name }}\n </gn-ui-button>\n }\n @if (filteredLayers.length === 0) {\n <span class=\"text-gray-800\">\n {{ 'service.metadata.filter.noLayers' | translate }}\n </span>\n }\n </div>\n <div\n data-test=\"layer-information\"\n class=\"flex flex-col gap-4 md:h-full md:w-1/2 w-full h-1/2 py-5 px-10 overflow-y-auto\"\n >\n @for (item of layerInformation; track item) {\n <div class=\"flex flex-row gap-4 border-b border-gray-200\">\n <span class=\"font-semibold w-24\">{{\n item.displayName\n }}</span>\n @if (isList(item.value)) {\n <div>\n @for (subItem of item.value; track subItem) {\n <div class=\"flex flex-row break-words max-w-72\">\n {{ subItem }}\n </div>\n }\n </div>\n }\n @if (!isList(item.value)) {\n <div class=\"break-words max-w-72\">\n {{ item.value }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n}\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div translate>service.metadata.filter</div>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "extraClass", "placeholder", "required", "disabled"], outputs: ["valueChange"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: PopoverComponent, selector: "gn-ui-popover", inputs: ["content", "theme"] }, { kind: "component", type: SpinningLoaderComponent, selector: "gn-ui-spinning-loader" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
|
|
34899
34940
|
provideIcons({
|
|
34900
34941
|
iconoirSearch,
|
|
34901
34942
|
matInfoOutline,
|
|
@@ -34919,7 +34960,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
34919
34960
|
matInfoOutline,
|
|
34920
34961
|
matClose,
|
|
34921
34962
|
}),
|
|
34922
|
-
], template: "@if (apiLinks.length > 0) {\n <div style=\"height: 652px\" id=\"preview\">\n <div class=\"bg-primary
|
|
34963
|
+
], template: "@if (apiLinks.length > 0) {\n <div style=\"height: 652px\" id=\"preview\">\n <div class=\"bg-primary/10 overflow-visible\" style=\"height: 420px\">\n <div class=\"container-lg px-4 lg:mx-auto\">\n <div>\n <div class=\"gn-ui-section-title mb-6\" translate>\n service.metadata.capabilities\n </div>\n @if (loading) {\n <div class=\"flex justify-center w-full h-[200px] items-center\">\n <gn-ui-spinning-loader></gn-ui-spinning-loader>\n </div>\n }\n @if (!loading) {\n <div>\n <div class=\"flex flex-row gap-5\">\n <div class=\"h-14 md:w-2/5 w-full mb-4 flex flex-row relative\">\n <gn-ui-text-input\n class=\"w-full\"\n [(value)]=\"searchQuery\"\n [extraClass]=\"getExtraInputClass()\"\n [placeholder]=\"'service.metadata.search' | translate\"\n (input)=\"onSearchChange($event)\"\n (keydown.enter)=\"onSearchEnter($event)\"\n >\n </gn-ui-text-input>\n <div\n class=\"absolute right-14 h-14 w-14 flex items-center justify-center\"\n >\n @if (searchQuery) {\n <button\n #inputBtn\n [aria-label]=\"\n 'service.metadata.search.clear' | translate\n \"\n (click)=\"clearSearch()\"\n class=\"h-12 w-12 border-0 flex items-center justify-center\"\n >\n <ng-icon name=\"matClose\"></ng-icon>\n </button>\n }\n </div>\n <div\n class=\"border-l absolute border-gray-200 right-0 h-14 w-14\"\n >\n <gn-ui-button\n #inputBtn\n type=\"outline\"\n extraClass=\"h-12 w-12 border-0 absolute right-1 top-1 bg-white\"\n (buttonClick)=\"searchLayers()\"\n >\n <ng-icon name=\"iconoirSearch\"></ng-icon>\n </gn-ui-button>\n </div>\n </div>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light\"\n class=\"w-14 h-14 border border-gray-300 rounded-lg flex justify-center items-center\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"w-6 h-6 pt-0.5\"\n ></ng-icon>\n </gn-ui-popover>\n </div>\n <div\n style=\"height: 500px\"\n class=\"bg-white shadow-xl rounded p-0 flex md:flex-row flex-col\"\n >\n <div\n class=\"flex flex-col gap-2 bg-gray-100 md:w-1/2 md:h-full w-full h-1/2 rounded-l overflow-y-auto py-5 pr-1 pl-3\"\n data-test=\"layer-list\"\n >\n @for (layerItem of filteredLayers; track layerItem) {\n <gn-ui-button\n type=\"outline\"\n [extraClass]=\"getExtraClass(layerItem)\"\n (buttonClick)=\"selectLayer(layerItem)\"\n >\n {{ layerItem.title || layerItem.name }}\n </gn-ui-button>\n }\n @if (filteredLayers.length === 0) {\n <span class=\"text-gray-800\">\n {{ 'service.metadata.filter.noLayers' | translate }}\n </span>\n }\n </div>\n <div\n data-test=\"layer-information\"\n class=\"flex flex-col gap-4 md:h-full md:w-1/2 w-full h-1/2 py-5 px-10 overflow-y-auto\"\n >\n @for (item of layerInformation; track item) {\n <div class=\"flex flex-row gap-4 border-b border-gray-200\">\n <span class=\"font-semibold w-24\">{{\n item.displayName\n }}</span>\n @if (isList(item.value)) {\n <div>\n @for (subItem of item.value; track subItem) {\n <div class=\"flex flex-row break-words max-w-72\">\n {{ subItem }}\n </div>\n }\n </div>\n }\n @if (!isList(item.value)) {\n <div class=\"break-words max-w-72\">\n {{ item.value }}\n </div>\n }\n </div>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n}\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div translate>service.metadata.filter</div>\n </div>\n</ng-template>\n" }]
|
|
34923
34964
|
}], propDecorators: { apiLinks: [{
|
|
34924
34965
|
type: Input
|
|
34925
34966
|
}] } });
|
|
@@ -35308,7 +35349,7 @@ class RecordPreviewFeedComponent extends RecordPreviewComponent {
|
|
|
35308
35349
|
return this.timeFormat.format(this.record.recordCreated, Date.now());
|
|
35309
35350
|
}
|
|
35310
35351
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: RecordPreviewFeedComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
35311
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: RecordPreviewFeedComponent, isStandalone: true, selector: "gn-ui-record-preview-feed", usesInheritance: true, ngImport: i0, template: "<div\n class=\"mx-[18px] pl-[18px] pb-[18px] border-solid border-l-2 border-gray-100\"\n>\n <a\n class=\"record-container block rounded-lg bg-white border border-white card-shadow\"\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n >\n <div\n class=\"record-header py-4 px-4 border-b border-gray-300 flex flex-row items-center relative transition duration-200\"\n >\n <div\n class=\"absolute w-3 h-3 bg-secondary rounded-full\"\n style=\"right: calc(100% + 14px)\"\n ></div>\n <div\n class=\"record-header-image border border-gray-300 bg-white rounded-full w-16 h-16 object-contain mr-4 overflow-hidden transition duration-200 shrink-0\"\n >\n @if (!hasLogo) {\n <ng-icon\n class=\"text-gray-200\"\n name=\"{{ hasOnlyPerson ? 'matFace' : 'matHomeWorkOutline' }}\"\n style=\"width: 42px; height: 42px; font-size: 42px; margin: 10px\"\n ></ng-icon>\n }\n @if (hasLogo) {\n <gn-ui-thumbnail\n [thumbnailUrl]=\"record.ownerOrganization?.logoUrl?.toString()\"\n [fit]=\"'contain'\"\n ></gn-ui-thumbnail>\n }\n </div>\n <div class=\"flex flex-col overflow-hidden items-start\">\n @if (hasOrganization) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ record.ownerOrganization.name }}\n </span>\n }\n @if (hasOnlyPerson) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ contact.firstName }} {{ contact.lastName }}\n </span>\n }\n <p class=\"\">\n <span translate [translateParams]=\"{ time }\"\n >record.was.created.time</span\n >\n </p>\n </div>\n
|
|
35352
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: RecordPreviewFeedComponent, isStandalone: true, selector: "gn-ui-record-preview-feed", usesInheritance: true, ngImport: i0, template: "<div\n class=\"mx-[18px] pl-[18px] pb-[18px] border-solid border-l-2 border-gray-100\"\n>\n <a\n class=\"record-container block rounded-lg bg-white border border-white card-shadow\"\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n >\n <div\n class=\"record-header py-4 px-4 border-b border-gray-300 flex flex-row items-center relative transition duration-200\"\n >\n <div\n class=\"absolute w-3 h-3 bg-secondary rounded-full\"\n style=\"right: calc(100% + 14px)\"\n ></div>\n <div\n class=\"record-header-image border border-gray-300 bg-white rounded-full w-16 h-16 object-contain mr-4 overflow-hidden transition duration-200 shrink-0\"\n >\n @if (!hasLogo) {\n <ng-icon\n class=\"text-gray-200\"\n name=\"{{ hasOnlyPerson ? 'matFace' : 'matHomeWorkOutline' }}\"\n style=\"width: 42px; height: 42px; font-size: 42px; margin: 10px\"\n ></ng-icon>\n }\n @if (hasLogo) {\n <gn-ui-thumbnail\n [thumbnailUrl]=\"record.ownerOrganization?.logoUrl?.toString()\"\n [fit]=\"'contain'\"\n ></gn-ui-thumbnail>\n }\n </div>\n <div class=\"flex flex-col overflow-hidden items-start grow\">\n @if (hasOrganization) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ record.ownerOrganization.name }}\n </span>\n }\n @if (hasOnlyPerson) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ contact.firstName }} {{ contact.lastName }}\n </span>\n }\n <p class=\"\">\n <span translate [translateParams]=\"{ time }\"\n >record.was.created.time</span\n >\n </p>\n </div>\n <div class=\"ml-3 shrink-0\">\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n <div class=\"pt-5 pb-5 px-10 relative\">\n <div class=\"flex flex-col sm:flex-row gap-4 mb-3\">\n @if (record.overviews?.[0]) {\n <gn-ui-thumbnail\n class=\"block shrink-0 w-[120px] h-[120px] border border-gray-100 rounded-lg overflow-hidden\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n }\n <h1\n class=\"font-title text-black text-[21px] font-medium\"\n data-cy=\"recordTitle\"\n >\n {{ record.title }}\n </h1>\n </div>\n <p class=\"line-clamp-3\">\n <gn-ui-markdown-parser\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n />\n </p>\n @if (isDownloadable || isViewable) {\n <div class=\"flex flex-row mt-3\">\n @if (isDownloadable) {\n <ng-icon\n class=\"text-primary opacity-45 mr-3\"\n name=\"matCloudDownloadOutline\"\n >\n </ng-icon>\n }\n @if (isViewable) {\n <ng-icon class=\"text-primary opacity-45 mr-3\" name=\"matMapOutline\">\n </ng-icon>\n }\n </div>\n }\n </div>\n </a>\n</div>\n", styles: [".record-container:hover .record-header,.record-container:hover .record-header-image{border-color:var(--color-primary-lightest)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], viewProviders: [
|
|
35312
35353
|
provideIcons({
|
|
35313
35354
|
matMapOutline,
|
|
35314
35355
|
matCloudDownloadOutline,
|
|
@@ -35338,7 +35379,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
35338
35379
|
provideNgIconsConfig({
|
|
35339
35380
|
size: '1.5em',
|
|
35340
35381
|
}),
|
|
35341
|
-
], template: "<div\n class=\"mx-[18px] pl-[18px] pb-[18px] border-solid border-l-2 border-gray-100\"\n>\n <a\n class=\"record-container block rounded-lg bg-white border border-white card-shadow\"\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n >\n <div\n class=\"record-header py-4 px-4 border-b border-gray-300 flex flex-row items-center relative transition duration-200\"\n >\n <div\n class=\"absolute w-3 h-3 bg-secondary rounded-full\"\n style=\"right: calc(100% + 14px)\"\n ></div>\n <div\n class=\"record-header-image border border-gray-300 bg-white rounded-full w-16 h-16 object-contain mr-4 overflow-hidden transition duration-200 shrink-0\"\n >\n @if (!hasLogo) {\n <ng-icon\n class=\"text-gray-200\"\n name=\"{{ hasOnlyPerson ? 'matFace' : 'matHomeWorkOutline' }}\"\n style=\"width: 42px; height: 42px; font-size: 42px; margin: 10px\"\n ></ng-icon>\n }\n @if (hasLogo) {\n <gn-ui-thumbnail\n [thumbnailUrl]=\"record.ownerOrganization?.logoUrl?.toString()\"\n [fit]=\"'contain'\"\n ></gn-ui-thumbnail>\n }\n </div>\n <div class=\"flex flex-col overflow-hidden items-start\">\n @if (hasOrganization) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ record.ownerOrganization.name }}\n </span>\n }\n @if (hasOnlyPerson) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ contact.firstName }} {{ contact.lastName }}\n </span>\n }\n <p class=\"\">\n <span translate [translateParams]=\"{ time }\"\n >record.was.created.time</span\n >\n </p>\n </div>\n
|
|
35382
|
+
], template: "<div\n class=\"mx-[18px] pl-[18px] pb-[18px] border-solid border-l-2 border-gray-100\"\n>\n <a\n class=\"record-container block rounded-lg bg-white border border-white card-shadow\"\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n >\n <div\n class=\"record-header py-4 px-4 border-b border-gray-300 flex flex-row items-center relative transition duration-200\"\n >\n <div\n class=\"absolute w-3 h-3 bg-secondary rounded-full\"\n style=\"right: calc(100% + 14px)\"\n ></div>\n <div\n class=\"record-header-image border border-gray-300 bg-white rounded-full w-16 h-16 object-contain mr-4 overflow-hidden transition duration-200 shrink-0\"\n >\n @if (!hasLogo) {\n <ng-icon\n class=\"text-gray-200\"\n name=\"{{ hasOnlyPerson ? 'matFace' : 'matHomeWorkOutline' }}\"\n style=\"width: 42px; height: 42px; font-size: 42px; margin: 10px\"\n ></ng-icon>\n }\n @if (hasLogo) {\n <gn-ui-thumbnail\n [thumbnailUrl]=\"record.ownerOrganization?.logoUrl?.toString()\"\n [fit]=\"'contain'\"\n ></gn-ui-thumbnail>\n }\n </div>\n <div class=\"flex flex-col overflow-hidden items-start grow\">\n @if (hasOrganization) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ record.ownerOrganization.name }}\n </span>\n }\n @if (hasOnlyPerson) {\n <span\n class=\"font-bold transition duration-200 text-primary truncate max-w-full\"\n >\n {{ contact.firstName }} {{ contact.lastName }}\n </span>\n }\n <p class=\"\">\n <span translate [translateParams]=\"{ time }\"\n >record.was.created.time</span\n >\n </p>\n </div>\n <div class=\"ml-3 shrink-0\">\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n <div class=\"pt-5 pb-5 px-10 relative\">\n <div class=\"flex flex-col sm:flex-row gap-4 mb-3\">\n @if (record.overviews?.[0]) {\n <gn-ui-thumbnail\n class=\"block shrink-0 w-[120px] h-[120px] border border-gray-100 rounded-lg overflow-hidden\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url.toString()\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n }\n <h1\n class=\"font-title text-black text-[21px] font-medium\"\n data-cy=\"recordTitle\"\n >\n {{ record.title }}\n </h1>\n </div>\n <p class=\"line-clamp-3\">\n <gn-ui-markdown-parser\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n />\n </p>\n @if (isDownloadable || isViewable) {\n <div class=\"flex flex-row mt-3\">\n @if (isDownloadable) {\n <ng-icon\n class=\"text-primary opacity-45 mr-3\"\n name=\"matCloudDownloadOutline\"\n >\n </ng-icon>\n }\n @if (isViewable) {\n <ng-icon class=\"text-primary opacity-45 mr-3\" name=\"matMapOutline\">\n </ng-icon>\n }\n </div>\n }\n </div>\n </a>\n</div>\n", styles: [".record-container:hover .record-header,.record-container:hover .record-header-image{border-color:var(--color-primary-lightest)}\n"] }]
|
|
35342
35383
|
}], ctorParameters: () => [] });
|
|
35343
35384
|
|
|
35344
35385
|
class RecordPreviewListComponent extends RecordPreviewComponent {
|
|
@@ -38220,6 +38261,7 @@ marker('dataset.error.forbidden');
|
|
|
38220
38261
|
marker('wfs.unreachable.unknown');
|
|
38221
38262
|
marker('wfs.featuretype.notfound');
|
|
38222
38263
|
marker('wfs.geojsongml.notsupported');
|
|
38264
|
+
marker('ogc.geojson.notsupported');
|
|
38223
38265
|
marker('ogc.unreachable.unknown');
|
|
38224
38266
|
marker('dataset.error.network');
|
|
38225
38267
|
marker('dataset.error.http');
|
|
@@ -38333,13 +38375,15 @@ class DataService {
|
|
|
38333
38375
|
}
|
|
38334
38376
|
async getDownloadLinksFromOgcApiFeatures(ogcApiLink) {
|
|
38335
38377
|
const collectionInfo = await this.getDownloadUrlsFromOgcApi(ogcApiLink.url.href);
|
|
38336
|
-
return Object.keys(collectionInfo.bulkDownloadLinks).map((
|
|
38378
|
+
return Object.keys(collectionInfo.bulkDownloadLinks).map((mimeType) => {
|
|
38379
|
+
const urlWithoutLimit = new URL(collectionInfo.bulkDownloadLinks[mimeType]);
|
|
38380
|
+
urlWithoutLimit.searchParams.delete('limit');
|
|
38337
38381
|
return {
|
|
38338
38382
|
...ogcApiLink,
|
|
38339
38383
|
name: collectionInfo.id,
|
|
38340
38384
|
type: 'download',
|
|
38341
|
-
url:
|
|
38342
|
-
mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(
|
|
38385
|
+
url: urlWithoutLimit,
|
|
38386
|
+
mimeType: getMimeTypeForFormat(getFileFormatFromServiceOutput(mimeType)),
|
|
38343
38387
|
};
|
|
38344
38388
|
});
|
|
38345
38389
|
}
|
|
@@ -38353,12 +38397,12 @@ class DataService {
|
|
|
38353
38397
|
throw new Error(`ogc.unreachable.unknown`);
|
|
38354
38398
|
});
|
|
38355
38399
|
}
|
|
38356
|
-
async getItemsFromOgcApi(url) {
|
|
38400
|
+
async getItemsFromOgcApi(url, limit) {
|
|
38357
38401
|
const endpoint = new OgcApiEndpoint(url);
|
|
38358
38402
|
return await endpoint.featureCollections
|
|
38359
38403
|
.then((collections) => {
|
|
38360
38404
|
return collections.length
|
|
38361
|
-
? endpoint.getCollectionItems(collections[0])
|
|
38405
|
+
? endpoint.getCollectionItems(collections[0], limit)
|
|
38362
38406
|
: null;
|
|
38363
38407
|
})
|
|
38364
38408
|
.catch(() => {
|
|
@@ -38447,12 +38491,16 @@ class DataService {
|
|
|
38447
38491
|
else if (link.type === 'service' &&
|
|
38448
38492
|
link.accessServiceProtocol === 'ogcFeatures') {
|
|
38449
38493
|
return from(this.getDownloadUrlsFromOgcApi(link.url.href)).pipe(switchMap$1((collectionInfo) => {
|
|
38450
|
-
const
|
|
38451
|
-
|
|
38452
|
-
|
|
38453
|
-
|
|
38454
|
-
|
|
38494
|
+
const isMimeTypeJson = (mimeType) => {
|
|
38495
|
+
return mimeType.toLowerCase().indexOf('json') > -1;
|
|
38496
|
+
};
|
|
38497
|
+
const geojsonUrl = collectionInfo.bulkDownloadLinks[Object.keys(collectionInfo.bulkDownloadLinks).find((mimeType) => isMimeTypeJson(mimeType))];
|
|
38498
|
+
if (!geojsonUrl) {
|
|
38499
|
+
return throwError(() => 'ogc.geojson.notsupported');
|
|
38455
38500
|
}
|
|
38501
|
+
const urlWithoutLimit = new URL(geojsonUrl);
|
|
38502
|
+
urlWithoutLimit.searchParams.delete('limit');
|
|
38503
|
+
return openDataset(urlWithoutLimit.toString(), 'geojson', undefined, cacheActive);
|
|
38456
38504
|
}));
|
|
38457
38505
|
}
|
|
38458
38506
|
return throwError(() => 'protocol not supported');
|
|
@@ -39129,7 +39177,7 @@ class ChartViewComponent {
|
|
|
39129
39177
|
this.changeDetector.detectChanges();
|
|
39130
39178
|
}
|
|
39131
39179
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ChartViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
39132
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ChartViewComponent, isStandalone: true, selector: "gn-ui-chart-view", inputs: { featureCatalog: "featureCatalog", cacheActive: "cacheActive", link: "link", aggregation: "aggregation", xProperty: "xProperty", yProperty: "yProperty", chartType: "chartType", userChartConfig: "userChartConfig" }, outputs: { chartConfig$: "chartConfig$" }, ngImport: i0, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n @if (yChoices$ | async; as yChoices) {\n
|
|
39180
|
+
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 flex items-center 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 aggregation-choices\"\n [choices]=\"aggregationChoices\"\n [disabled]=\"!yProperty$.value\"\n (selectValue)=\"aggregation$.next($event)\"\n [selected]=\"aggregation$.value\"\n [title]=\"'chart.dropdown.aggregation' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n <div\n class=\"relative h-full mt-2 bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n @if (!error) {\n <gn-ui-chart\n [data]=\"chartData$ | async\"\n [type]=\"chartType$.value\"\n [prettyLabel]=\"prettyLabel$ | async\"\n [labelProperty]=\"labelProperty\"\n [valueProperty]=\"valueProperty\"\n ></gn-ui-chart>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'chart.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: ChartComponent, selector: "gn-ui-chart", inputs: ["data", "labelProperty", "prettyLabel", "valueProperty", "secondaryValueProperty", "type"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
39133
39181
|
}
|
|
39134
39182
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ChartViewComponent, decorators: [{
|
|
39135
39183
|
type: Component,
|
|
@@ -39140,7 +39188,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
39140
39188
|
LoadingMaskComponent,
|
|
39141
39189
|
PopupAlertComponent,
|
|
39142
39190
|
TranslatePipe,
|
|
39143
|
-
], standalone: true, template: "<div class=\"w-full h-full flex flex-col\">\n <div\n class=\"flex flex-col space-y-2 sm:flex-row sm:space-y-0 sm:space-x-2 justify-between text-[13px]\"\n >\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"typeChoices\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"chartType$.next($event)\"\n [selected]=\"chartType$.value\"\n [title]=\"'chart.dropdown.type' | translate\"\n ></gn-ui-dropdown-selector>\n <gn-ui-dropdown-selector\n class=\"basis-1/4\"\n [choices]=\"xChoices$ | async\"\n [extraBtnClass]=\"'secondary min-w-full'\"\n (selectValue)=\"xProperty$.next($event)\"\n [selected]=\"xProperty$.value\"\n [title]=\"'chart.dropdown.xProperty' | translate\"\n ></gn-ui-dropdown-selector>\n @if (yChoices$ | async; as yChoices) {\n
|
|
39191
|
+
], 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 flex items-center 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 aggregation-choices\"\n [choices]=\"aggregationChoices\"\n [disabled]=\"!yProperty$.value\"\n (selectValue)=\"aggregation$.next($event)\"\n [selected]=\"aggregation$.value\"\n [title]=\"'chart.dropdown.aggregation' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n <div\n class=\"relative h-full mt-2 bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n @if (!error) {\n <gn-ui-chart\n [data]=\"chartData$ | async\"\n [type]=\"chartType$.value\"\n [prettyLabel]=\"prettyLabel$ | async\"\n [labelProperty]=\"labelProperty\"\n [valueProperty]=\"valueProperty\"\n ></gn-ui-chart>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'chart.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n</div>\n" }]
|
|
39144
39192
|
}], propDecorators: { featureCatalog: [{
|
|
39145
39193
|
type: Input
|
|
39146
39194
|
}], cacheActive: [{
|
|
@@ -39453,7 +39501,7 @@ class MdViewFacade {
|
|
|
39453
39501
|
if (this.linkClassifier.hasUsage(link, LinkUsage.GEODATA)) {
|
|
39454
39502
|
if (link.type === 'service' &&
|
|
39455
39503
|
link.accessServiceProtocol === 'ogcFeatures') {
|
|
39456
|
-
return from(this.dataService.getItemsFromOgcApi(link.url.href)).pipe(map$1((collectionRecords) => {
|
|
39504
|
+
return from(this.dataService.getItemsFromOgcApi(link.url.href, 1)).pipe(map$1((collectionRecords) => {
|
|
39457
39505
|
return collectionRecords &&
|
|
39458
39506
|
collectionRecords[0] &&
|
|
39459
39507
|
collectionRecords[0].geometry
|
|
@@ -39871,6 +39919,7 @@ class ExternalViewerButtonComponent {
|
|
|
39871
39919
|
this.translateService = inject(TranslateService);
|
|
39872
39920
|
this.urlTemplate = inject(EXTERNAL_VIEWER_URL_TEMPLATE, { optional: true });
|
|
39873
39921
|
this.openinNewTab = inject(EXTERNAL_VIEWER_OPEN_NEW_TAB);
|
|
39922
|
+
this.mimeType = '';
|
|
39874
39923
|
this.extraClass = '';
|
|
39875
39924
|
}
|
|
39876
39925
|
get externalViewer() {
|
|
@@ -39901,11 +39950,12 @@ class ExternalViewerButtonComponent {
|
|
|
39901
39950
|
const url = templateUrl
|
|
39902
39951
|
.replace('${layer_name}', `${layerName}`)
|
|
39903
39952
|
.replace('${service_url}', `${encodeURIComponent(this.link.url.toString())}`)
|
|
39904
|
-
.replace('${service_type}', `${this.supportedLinkLayerType}`)
|
|
39953
|
+
.replace('${service_type}', `${this.supportedLinkLayerType}`)
|
|
39954
|
+
.replace('${mime_type}', `${encodeURIComponent(this.mimeType)}`);
|
|
39905
39955
|
window.open(url, this.openinNewTab ? '_blank' : '_self').focus();
|
|
39906
39956
|
}
|
|
39907
39957
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: ExternalViewerButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
39908
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ExternalViewerButtonComponent, isStandalone: true, selector: "gn-ui-external-viewer-button", inputs: { link: "link", extraClass: "extraClass" }, ngImport: i0, template: "@if (externalViewer) {\n <gn-ui-button\n (buttonClick)=\"openInExternalViewer()\"\n type=\"primary\"\n [title]=\"'record.externalViewer.open' | translate\"\n [extraClass]=\"extraClass + 'bg-primary ms-2 !rounded-lg'\"\n >\n <ng-icon name=\"matOpenInNew\"></ng-icon>\n </gn-ui-button>\n}\n", styles: [""], dependencies: [{ kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
|
|
39958
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: ExternalViewerButtonComponent, isStandalone: true, selector: "gn-ui-external-viewer-button", inputs: { link: "link", mimeType: "mimeType", extraClass: "extraClass" }, ngImport: i0, template: "@if (externalViewer) {\n <gn-ui-button\n (buttonClick)=\"openInExternalViewer()\"\n type=\"primary\"\n [title]=\"'record.externalViewer.open' | translate\"\n [extraClass]=\"extraClass + 'bg-primary ms-2 !rounded-lg'\"\n >\n <ng-icon name=\"matOpenInNew\"></ng-icon>\n </gn-ui-button>\n}\n", styles: [""], dependencies: [{ kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
|
|
39909
39959
|
provideIcons({ matOpenInNew }),
|
|
39910
39960
|
provideNgIconsConfig({
|
|
39911
39961
|
size: '1.5em',
|
|
@@ -39922,6 +39972,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
39922
39972
|
], template: "@if (externalViewer) {\n <gn-ui-button\n (buttonClick)=\"openInExternalViewer()\"\n type=\"primary\"\n [title]=\"'record.externalViewer.open' | translate\"\n [extraClass]=\"extraClass + 'bg-primary ms-2 !rounded-lg'\"\n >\n <ng-icon name=\"matOpenInNew\"></ng-icon>\n </gn-ui-button>\n}\n" }]
|
|
39923
39973
|
}], propDecorators: { link: [{
|
|
39924
39974
|
type: Input
|
|
39975
|
+
}], mimeType: [{
|
|
39976
|
+
type: Input
|
|
39925
39977
|
}], extraClass: [{
|
|
39926
39978
|
type: Input
|
|
39927
39979
|
}] } });
|
|
@@ -40084,7 +40136,7 @@ class GpfApiDlComponent {
|
|
|
40084
40136
|
let choicesTest = undefined;
|
|
40085
40137
|
let pageCount = 1;
|
|
40086
40138
|
while (choicesTest === undefined && pageCount > page) {
|
|
40087
|
-
const response = await
|
|
40139
|
+
const response = await fetch(this.url.concat(`&limit=200&page=${page}`)).then((resp) => resp.json());
|
|
40088
40140
|
choicesTest = response.data.entry.filter((element) => element['id'] == this.apiBaseUrl)[0];
|
|
40089
40141
|
page += 1;
|
|
40090
40142
|
pageCount = response.data.pagecount;
|
|
@@ -40117,7 +40169,7 @@ class GpfApiDlComponent {
|
|
|
40117
40169
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
40118
40170
|
}
|
|
40119
40171
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: GpfApiDlComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
40120
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: GpfApiDlComponent, isStandalone: true, selector: "gn-ui-gpf-api-dl", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-6 p-8 bg-white shadow-xl rounded-lg\">\n <!-- Header with Filter Title and Reset Button -->\n <div class=\"flex items-center justify-between\">\n <h2\n class=\"text-xl font-semibold\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.filterDescription' | translate\n \"\n >\n record.metadata.api.form.filter\n </h2>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary
|
|
40172
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: GpfApiDlComponent, isStandalone: true, selector: "gn-ui-gpf-api-dl", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-6 p-8 bg-white shadow-xl rounded-lg\">\n <!-- Header with Filter Title and Reset Button -->\n <div class=\"flex items-center justify-between\">\n <h2\n class=\"text-xl font-semibold\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.filterDescription' | translate\n \"\n >\n record.metadata.api.form.filter\n </h2>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary/50 inline-flex items-center justify-center px-4 py-2 text-white rounded hover:bg-primary transition\"\n [attr.title]=\"'record.metadata.api.form.resetTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.resetTooltip' | translate\"\n >\n <span translate>record.metadata.api.form.reset</span>\n </button>\n </div>\n\n <!-- Dropdown Selectors -->\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <gn-ui-dropdown-selector\n #zone\n [title]=\"'record.metadata.api.form.zoneTitle' | translate\"\n [choices]=\"bucketPromisesZone\"\n (selectValue)=\"setZone($event)\"\n [selected]=\"zone$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.zoneTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.zoneTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n\n <gn-ui-dropdown-selector\n #format\n [title]=\"'record.metadata.api.form.formatTitle' | translate\"\n [choices]=\"bucketPromisesFormat\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.formatTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.formatTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n\n <gn-ui-dropdown-selector\n #crs\n [title]=\"'record.metadata.api.form.crsTitle' | translate\"\n [choices]=\"bucketPromisesCrs\"\n (selectValue)=\"setCrs($event)\"\n [selected]=\"crs$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.crsTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.crsTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n\n <!-- Filtered Items Section -->\n <div class=\"bg-gray-50 p-4 rounded-lg\">\n <h3\n class=\"text-lg font-medium\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.itemsDescription' | translate\n \"\n >\n record.metadata.api.form.items\n </h3>\n <div\n class=\"overflow-auto max-h-60\"\n [attr.title]=\"'record.metadata.api.form.itemsTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.itemsTooltip' | translate\"\n >\n @for (link of listFilteredProduct$ | async; track link) {\n <div class=\"mb-2 sm:mb-3\">\n <gn-ui-gpf-api-dl-list-item\n [link]=\"link\"\n color=\"rgb(124 45 18)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"true\"\n [attr.title]=\"'record.metadata.api.form.productTooltip' | translate\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.productTooltip' | translate\n \"\n ></gn-ui-gpf-api-dl-list-item>\n </div>\n }\n </div>\n </div>\n\n <!-- Pagination Section -->\n <div class=\"flex items-center justify-between\">\n <button\n (click)=\"lessResult()\"\n [class]=\"\n 'px-4 py-2 text-white rounded transition ' +\n ((page$ | async) <= 1\n ? 'bg-gray-400 cursor-not-allowed '\n : 'bg-primary/50 hover:bg-primary')\n \"\n [attr.title]=\"'record.metadata.api.form.previousPageTooltip' | translate\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.previousPageTooltip' | translate\n \"\n >\n <span translate>record.metadata.api.form.previousPage</span>\n </button>\n <div\n class=\"font-semibold place-content-center\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.paginationDescription' | translate\n \"\n >\n {{ page$ | async }}/{{ pageMax$ | async }}\n </div>\n <button\n (click)=\"moreResult()\"\n [class]=\"\n 'bg-primary/50 px-4 py-2 text-white rounded transition ' +\n ((page$ | async) >= (pageMax$ | async)\n ? 'bg-gray-400 cursor-not-allowed '\n : 'bg-primary/50 hover:bg-primary')\n \"\n [attr.title]=\"'record.metadata.api.form.nextPageTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.nextPageTooltip' | translate\"\n >\n <span translate>record.metadata.api.form.nextPage</span>\n </button>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button ng-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover ng-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: GpfApiDlListItemComponent, selector: "gn-ui-gpf-api-dl-list-item", inputs: ["link", "color", "format", "isFromWfs"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
40121
40173
|
}
|
|
40122
40174
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: GpfApiDlComponent, decorators: [{
|
|
40123
40175
|
type: Component,
|
|
@@ -40127,7 +40179,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
40127
40179
|
TranslatePipe,
|
|
40128
40180
|
DropdownSelectorComponent,
|
|
40129
40181
|
GpfApiDlListItemComponent,
|
|
40130
|
-
], template: "<div class=\"flex flex-col gap-6 p-8 bg-white shadow-xl rounded-lg\">\n <!-- Header with Filter Title and Reset Button -->\n <div class=\"flex items-center justify-between\">\n <h2\n class=\"text-xl font-semibold\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.filterDescription' | translate\n \"\n >\n record.metadata.api.form.filter\n </h2>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary
|
|
40182
|
+
], template: "<div class=\"flex flex-col gap-6 p-8 bg-white shadow-xl rounded-lg\">\n <!-- Header with Filter Title and Reset Button -->\n <div class=\"flex items-center justify-between\">\n <h2\n class=\"text-xl font-semibold\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.filterDescription' | translate\n \"\n >\n record.metadata.api.form.filter\n </h2>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary/50 inline-flex items-center justify-center px-4 py-2 text-white rounded hover:bg-primary transition\"\n [attr.title]=\"'record.metadata.api.form.resetTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.resetTooltip' | translate\"\n >\n <span translate>record.metadata.api.form.reset</span>\n </button>\n </div>\n\n <!-- Dropdown Selectors -->\n <div class=\"grid grid-cols-1 md:grid-cols-3 gap-4\">\n <gn-ui-dropdown-selector\n #zone\n [title]=\"'record.metadata.api.form.zoneTitle' | translate\"\n [choices]=\"bucketPromisesZone\"\n (selectValue)=\"setZone($event)\"\n [selected]=\"zone$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.zoneTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.zoneTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n\n <gn-ui-dropdown-selector\n #format\n [title]=\"'record.metadata.api.form.formatTitle' | translate\"\n [choices]=\"bucketPromisesFormat\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.formatTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.formatTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n\n <gn-ui-dropdown-selector\n #crs\n [title]=\"'record.metadata.api.form.crsTitle' | translate\"\n [choices]=\"bucketPromisesCrs\"\n (selectValue)=\"setCrs($event)\"\n [selected]=\"crs$ | async\"\n class=\"w-full\"\n [attr.title]=\"'record.metadata.api.form.crsTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.crsTooltip' | translate\"\n ></gn-ui-dropdown-selector>\n </div>\n\n <!-- Filtered Items Section -->\n <div class=\"bg-gray-50 p-4 rounded-lg\">\n <h3\n class=\"text-lg font-medium\"\n translate\n [attr.aria-label]=\"\n 'record.metadata.api.form.itemsDescription' | translate\n \"\n >\n record.metadata.api.form.items\n </h3>\n <div\n class=\"overflow-auto max-h-60\"\n [attr.title]=\"'record.metadata.api.form.itemsTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.itemsTooltip' | translate\"\n >\n @for (link of listFilteredProduct$ | async; track link) {\n <div class=\"mb-2 sm:mb-3\">\n <gn-ui-gpf-api-dl-list-item\n [link]=\"link\"\n color=\"rgb(124 45 18)\"\n [format]=\"getLinkFormat(link)\"\n [isFromWfs]=\"true\"\n [attr.title]=\"'record.metadata.api.form.productTooltip' | translate\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.productTooltip' | translate\n \"\n ></gn-ui-gpf-api-dl-list-item>\n </div>\n }\n </div>\n </div>\n\n <!-- Pagination Section -->\n <div class=\"flex items-center justify-between\">\n <button\n (click)=\"lessResult()\"\n [class]=\"\n 'px-4 py-2 text-white rounded transition ' +\n ((page$ | async) <= 1\n ? 'bg-gray-400 cursor-not-allowed '\n : 'bg-primary/50 hover:bg-primary')\n \"\n [attr.title]=\"'record.metadata.api.form.previousPageTooltip' | translate\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.previousPageTooltip' | translate\n \"\n >\n <span translate>record.metadata.api.form.previousPage</span>\n </button>\n <div\n class=\"font-semibold place-content-center\"\n [attr.aria-label]=\"\n 'record.metadata.api.form.paginationDescription' | translate\n \"\n >\n {{ page$ | async }}/{{ pageMax$ | async }}\n </div>\n <button\n (click)=\"moreResult()\"\n [class]=\"\n 'bg-primary/50 px-4 py-2 text-white rounded transition ' +\n ((page$ | async) >= (pageMax$ | async)\n ? 'bg-gray-400 cursor-not-allowed '\n : 'bg-primary/50 hover:bg-primary')\n \"\n [attr.title]=\"'record.metadata.api.form.nextPageTooltip' | translate\"\n [attr.aria-label]=\"'record.metadata.api.form.nextPageTooltip' | translate\"\n >\n <span translate>record.metadata.api.form.nextPage</span>\n </button>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button ng-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover ng-icon{color:#d3d3d3!important}\n"] }]
|
|
40131
40183
|
}], propDecorators: { apiLink: [{
|
|
40132
40184
|
type: Input
|
|
40133
40185
|
}] } });
|
|
@@ -40136,6 +40188,7 @@ marker('map.dropdown.placeholder');
|
|
|
40136
40188
|
marker('wfs.feature.limit');
|
|
40137
40189
|
marker('dataset.error.restrictedAccess');
|
|
40138
40190
|
marker('map.select.style');
|
|
40191
|
+
marker('map.style.default');
|
|
40139
40192
|
class MapViewComponent {
|
|
40140
40193
|
constructor() {
|
|
40141
40194
|
this.mdViewFacade = inject(MdViewFacade);
|
|
@@ -40202,7 +40255,8 @@ class MapViewComponent {
|
|
|
40202
40255
|
return compatibleLinks[0];
|
|
40203
40256
|
}
|
|
40204
40257
|
}
|
|
40205
|
-
}));
|
|
40258
|
+
}), shareReplay$1(1));
|
|
40259
|
+
this.isWmsStyleMode$ = this.selectedSourceLink$.pipe(map$1((src) => src?.type === 'service' && src?.accessServiceProtocol === 'wms'), distinctUntilChanged(), shareReplay$1(1));
|
|
40206
40260
|
this.styleLinks$ = this.selectedSourceLink$.pipe(switchMap$1((src) => {
|
|
40207
40261
|
if (src &&
|
|
40208
40262
|
src.type === 'service' &&
|
|
@@ -40219,6 +40273,17 @@ class MapViewComponent {
|
|
|
40219
40273
|
return of(src);
|
|
40220
40274
|
}));
|
|
40221
40275
|
}
|
|
40276
|
+
if (src &&
|
|
40277
|
+
src.type === 'service' &&
|
|
40278
|
+
src.accessServiceProtocol === 'wms') {
|
|
40279
|
+
return from(new WmsEndpoint(src.url.toString()).isReady()).pipe(map$1((endpoint) => {
|
|
40280
|
+
const layer = endpoint.getLayerByName(src.name);
|
|
40281
|
+
return layer?.styles || [];
|
|
40282
|
+
}), catchError((error) => {
|
|
40283
|
+
this.handleError(error);
|
|
40284
|
+
return of([]);
|
|
40285
|
+
}));
|
|
40286
|
+
}
|
|
40222
40287
|
return of([]);
|
|
40223
40288
|
}), tap$1((styles) => {
|
|
40224
40289
|
if (this._styleFromConfig && this._styleFromConfig <= styles.length) {
|
|
@@ -40228,23 +40293,60 @@ class MapViewComponent {
|
|
|
40228
40293
|
this.selectedStyleId$.next(0);
|
|
40229
40294
|
}
|
|
40230
40295
|
}), shareReplay$1(1));
|
|
40231
|
-
this.styleDropdownChoices$ =
|
|
40296
|
+
this.styleDropdownChoices$ = combineLatest([
|
|
40297
|
+
this.styleLinks$,
|
|
40298
|
+
this.isWmsStyleMode$,
|
|
40299
|
+
]).pipe(map$1(([links, isWmsStyleMode]) => links.length
|
|
40232
40300
|
? links.map((link, index) => ({
|
|
40233
|
-
label:
|
|
40301
|
+
label: isWmsStyleMode
|
|
40302
|
+
? link.title || link.name
|
|
40303
|
+
: getLinkLabel(link),
|
|
40234
40304
|
value: index,
|
|
40235
40305
|
}))
|
|
40236
40306
|
: [
|
|
40237
40307
|
{
|
|
40238
|
-
label: '
|
|
40308
|
+
label: this.translateService.instant('map.style.default'),
|
|
40239
40309
|
value: 0,
|
|
40240
40310
|
},
|
|
40241
40311
|
]));
|
|
40312
|
+
this.selectedWmsStyleName$ = combineLatest([
|
|
40313
|
+
this.styleLinks$,
|
|
40314
|
+
this.isWmsStyleMode$,
|
|
40315
|
+
this.selectedStyleId$.pipe(distinctUntilChanged()),
|
|
40316
|
+
]).pipe(map$1(([styles, isWmsStyleMode, styleIdx]) => isWmsStyleMode && Array.isArray(styles)
|
|
40317
|
+
? styles[styleIdx]?.name
|
|
40318
|
+
: undefined));
|
|
40242
40319
|
this.selectedLink$ = combineLatest([
|
|
40243
40320
|
this.selectedSourceLink$,
|
|
40244
40321
|
this.styleLinks$,
|
|
40245
40322
|
this.selectedStyleId$.pipe(distinctUntilChanged()),
|
|
40246
|
-
|
|
40247
|
-
|
|
40323
|
+
this.isWmsStyleMode$,
|
|
40324
|
+
]).pipe(map$1(([src, styles, styleIdx, isWmsStyleMode]) => !isWmsStyleMode && styles.length ? styles[styleIdx] : src), shareReplay$1(1));
|
|
40325
|
+
this.wmsMimeType$ = this.selectedSourceLink$.pipe(switchMap$1((link) => {
|
|
40326
|
+
if (link?.type === 'service' && link?.accessServiceProtocol === 'wms') {
|
|
40327
|
+
return from(new WmsEndpoint(link.url.toString())
|
|
40328
|
+
.isReady()
|
|
40329
|
+
.then((endpoint) => {
|
|
40330
|
+
return endpoint.describeLayer(link.name).then((description) => {
|
|
40331
|
+
if (description) {
|
|
40332
|
+
return description.owsType === 'wfs'
|
|
40333
|
+
? 'image/png'
|
|
40334
|
+
: 'image/jpeg';
|
|
40335
|
+
}
|
|
40336
|
+
const layer = endpoint.getLayerByName(link.name);
|
|
40337
|
+
return layer?.opaque ? 'image/jpeg' : 'image/png';
|
|
40338
|
+
});
|
|
40339
|
+
})
|
|
40340
|
+
.catch(() => 'image/png'));
|
|
40341
|
+
}
|
|
40342
|
+
return of('');
|
|
40343
|
+
}), shareReplay$1(1));
|
|
40344
|
+
this.currentLayers$ = combineLatest([
|
|
40345
|
+
this.selectedLink$,
|
|
40346
|
+
this.excludeWfs$,
|
|
40347
|
+
this.selectedWmsStyleName$,
|
|
40348
|
+
this.wmsMimeType$,
|
|
40349
|
+
]).pipe(switchMap$1(([link, excludeWfs, wmsStyleName, wmsMimeType]) => {
|
|
40248
40350
|
if (!link) {
|
|
40249
40351
|
return of([]);
|
|
40250
40352
|
}
|
|
@@ -40258,7 +40360,13 @@ class MapViewComponent {
|
|
|
40258
40360
|
this.handleError('dataset.error.restrictedAccess');
|
|
40259
40361
|
return of([]);
|
|
40260
40362
|
}
|
|
40261
|
-
return this.getLayerFromLink(link).pipe(map$1((layer) =>
|
|
40363
|
+
return this.getLayerFromLink(link).pipe(map$1((layer) => layer.type === 'wms'
|
|
40364
|
+
? {
|
|
40365
|
+
...layer,
|
|
40366
|
+
...(wmsStyleName && { style: wmsStyleName }),
|
|
40367
|
+
...(wmsMimeType && { format: wmsMimeType }),
|
|
40368
|
+
}
|
|
40369
|
+
: layer), map$1((layer) => [layer]), catchError((e) => {
|
|
40262
40370
|
this.handleError(e);
|
|
40263
40371
|
return of([]);
|
|
40264
40372
|
}), finalize(() => (this.loading = false)));
|
|
@@ -40412,7 +40520,7 @@ class MapViewComponent {
|
|
|
40412
40520
|
this.changeRef.detectChanges();
|
|
40413
40521
|
}
|
|
40414
40522
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MapViewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
40415
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: MapViewComponent, isStandalone: true, selector: "gn-ui-map-view", inputs: { exceedsLimit: "exceedsLimit", selectedView: "selectedView", datavizConfig: "datavizConfig", displaySource: "displaySource" }, outputs: { linkSelected: "linkSelected", styleSelected: "styleSelected" }, viewQueries: [{ propertyName: "mapContainer", first: true, predicate: ["mapContainer"], descendants: true }], ngImport: i0, template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n
|
|
40523
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.15", type: MapViewComponent, isStandalone: true, selector: "gn-ui-map-view", inputs: { exceedsLimit: "exceedsLimit", selectedView: "selectedView", datavizConfig: "datavizConfig", displaySource: "displaySource" }, outputs: { linkSelected: "linkSelected", styleSelected: "styleSelected" }, viewQueries: [{ propertyName: "mapContainer", first: true, predicate: ["mapContainer"], descendants: true }], ngImport: i0, template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.style' | translate\"\n [choices]=\"styleDropdownChoices$ | async\"\n [selected]=\"selectedStyleId$ | async\"\n [disabled]=\"(styleDropdownChoices$ | async)?.length <= 1\"\n (selectValue)=\"selectStyleToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n\n <div class=\"self-end md:ml-2\">\n <gn-ui-external-viewer-button\n extraClass=\"w-[44px] h-[44px]\"\n [link]=\"selectedLink$ | async\"\n [mimeType]=\"wmsMimeType$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n </div>\n @if (hidePreview) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n } @else {\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n (sourceLoadError)=\"onSourceLoadError($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail\n [featureCatalog]=\"mdViewFacade.featureCatalog$ | async\"\n [feature]=\"selection\"\n ></gn-ui-feature-detail>\n </div>\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\" translate>map.legend.title</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n @if (!showLegend && legendExists && !selection) {\n <gn-ui-button\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n translate\n >\n {{ 'map.legend.title' | translate }}\n </gn-ui-button>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick", "extentChange", "sourceLoadError", "resolvedExtentChange"] }, { kind: "component", type: FeatureDetailComponent, selector: "gn-ui-feature-detail", inputs: ["feature", "featureCatalog"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ExternalViewerButtonComponent, selector: "gn-ui-external-viewer-button", inputs: ["link", "mimeType", "extraClass"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: MapLegendComponent, selector: "gn-ui-map-legend", inputs: ["context"], outputs: ["legendStatusChange"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
|
|
40416
40524
|
provideIcons({ matClose }),
|
|
40417
40525
|
provideNgIconsConfig({
|
|
40418
40526
|
size: '1.5em',
|
|
@@ -40439,7 +40547,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
40439
40547
|
provideNgIconsConfig({
|
|
40440
40548
|
size: '1.5em',
|
|
40441
40549
|
}),
|
|
40442
|
-
], template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n
|
|
40550
|
+
], template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n @if (displaySource) {\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n [selected]=\"_selectedChoice\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n }\n\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.style' | translate\"\n [choices]=\"styleDropdownChoices$ | async\"\n [selected]=\"selectedStyleId$ | async\"\n [disabled]=\"(styleDropdownChoices$ | async)?.length <= 1\"\n (selectValue)=\"selectStyleToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n\n <div class=\"self-end md:ml-2\">\n <gn-ui-external-viewer-button\n extraClass=\"w-[44px] h-[44px]\"\n [link]=\"selectedLink$ | async\"\n [mimeType]=\"wmsMimeType$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n </div>\n @if (hidePreview) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n } @else {\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n (sourceLoadError)=\"onSourceLoadError($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail\n [featureCatalog]=\"mdViewFacade.featureCatalog$ | async\"\n [feature]=\"selection\"\n ></gn-ui-feature-detail>\n </div>\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\" translate>map.legend.title</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n @if (!showLegend && legendExists && !selection) {\n <gn-ui-button\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n translate\n >\n {{ 'map.legend.title' | translate }}\n </gn-ui-button>\n }\n @if (loading) {\n <gn-ui-loading-mask\n class=\"absolute inset-0\"\n [message]=\"'map.loading.data' | translate\"\n ></gn-ui-loading-mask>\n }\n @if (error) {\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n }\n </div>\n }\n</div>\n" }]
|
|
40443
40551
|
}], propDecorators: { exceedsLimit: [{
|
|
40444
40552
|
type: Input
|
|
40445
40553
|
}], selectedView: [{
|
|
@@ -41094,6 +41202,7 @@ const saveRecordSuccess = createAction('[Editor] Save record success');
|
|
|
41094
41202
|
const saveRecordFailure = createAction('[Editor] Save record failure', props());
|
|
41095
41203
|
const draftSaveSuccess = createAction('[Editor] Draft save success');
|
|
41096
41204
|
const undoRecordDraft = createAction('[Editor] Undo record draft');
|
|
41205
|
+
const setEditorConfiguration = createAction('[Editor] Set editor configuration', props());
|
|
41097
41206
|
const setCurrentPage = createAction('[Editor] Set current page', props());
|
|
41098
41207
|
const setFieldVisibility = createAction('[Editor] Set field visibility', props());
|
|
41099
41208
|
const hasRecordChangedSinceDraft = createAction('[Editor] Has Record Changed Since Draft', props());
|
|
@@ -41516,6 +41625,9 @@ const reducer = createReducer(initialEditorState, on(openRecord, (state, { recor
|
|
|
41516
41625
|
})), on(markRecordAsChanged, (state) => ({
|
|
41517
41626
|
...state,
|
|
41518
41627
|
changedSinceSave: true,
|
|
41628
|
+
})), on(setEditorConfiguration, (state, { configuration }) => ({
|
|
41629
|
+
...state,
|
|
41630
|
+
editorConfig: configuration,
|
|
41519
41631
|
})), on(setCurrentPage, (state, { page }) => ({
|
|
41520
41632
|
...state,
|
|
41521
41633
|
currentPage: page,
|
|
@@ -41618,6 +41730,9 @@ class EditorFacade {
|
|
|
41618
41730
|
updateRecordLanguages(defaultLanguage, otherLanguages) {
|
|
41619
41731
|
this.store.dispatch(updateRecordLanguages({ defaultLanguage, otherLanguages }));
|
|
41620
41732
|
}
|
|
41733
|
+
setConfiguration(configuration) {
|
|
41734
|
+
this.store.dispatch(setEditorConfiguration({ configuration }));
|
|
41735
|
+
}
|
|
41621
41736
|
setCurrentPage(page) {
|
|
41622
41737
|
this.store.dispatch(setCurrentPage({ page }));
|
|
41623
41738
|
}
|
|
@@ -41640,149 +41755,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
41640
41755
|
type: Injectable
|
|
41641
41756
|
}] });
|
|
41642
41757
|
|
|
41643
|
-
function evaluate(expression) {
|
|
41644
|
-
if (expression.match(/^\${.*}$/)) {
|
|
41645
|
-
return evaluate(expression.slice(2, -1));
|
|
41646
|
-
}
|
|
41647
|
-
const operator = expression.split('(')[0];
|
|
41648
|
-
switch (operator) {
|
|
41649
|
-
case 'dateNow':
|
|
41650
|
-
return () => new Date();
|
|
41651
|
-
default:
|
|
41652
|
-
throw new Error(`Unknown operator: ${operator}`);
|
|
41653
|
-
}
|
|
41654
|
-
}
|
|
41655
|
-
|
|
41656
|
-
class EditorService {
|
|
41657
|
-
constructor() {
|
|
41658
|
-
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
41659
|
-
}
|
|
41660
|
-
// returns the record as it was when saved, alongside its source
|
|
41661
|
-
saveRecord(record, recordSource, fieldsConfig) {
|
|
41662
|
-
const savedRecord = { ...record };
|
|
41663
|
-
const fields = fieldsConfig.pages.flatMap((page) => page.sections.flatMap((section) => section.fields));
|
|
41664
|
-
// run onSave processes
|
|
41665
|
-
for (const field of fields) {
|
|
41666
|
-
if (field.onSaveProcess && field.model) {
|
|
41667
|
-
const evaluator = evaluate(field.onSaveProcess);
|
|
41668
|
-
savedRecord[field.model] = evaluator({
|
|
41669
|
-
model: field.model,
|
|
41670
|
-
value: record[field.model],
|
|
41671
|
-
});
|
|
41672
|
-
}
|
|
41673
|
-
}
|
|
41674
|
-
let publishToAll = true;
|
|
41675
|
-
// if the record is new, generate a new unique identifier and pass publishToAll as false
|
|
41676
|
-
if (!record.uniqueIdentifier) {
|
|
41677
|
-
savedRecord.uniqueIdentifier = null;
|
|
41678
|
-
publishToAll = false;
|
|
41679
|
-
}
|
|
41680
|
-
return this.recordsRepository
|
|
41681
|
-
.saveRecord(savedRecord, recordSource, publishToAll)
|
|
41682
|
-
.pipe(switchMap((uniqueIdentifier) => this.recordsRepository.openRecordForEdition(uniqueIdentifier)), tap$1(() => {
|
|
41683
|
-
// if saving was successful, the original draft can be discarded
|
|
41684
|
-
this.recordsRepository.clearRecordDraft(record.uniqueIdentifier);
|
|
41685
|
-
}), map$1(([record, recordSource]) => [record, recordSource]));
|
|
41686
|
-
}
|
|
41687
|
-
// emits and completes once saving is done
|
|
41688
|
-
// note: onSave processes are not run for drafts
|
|
41689
|
-
saveRecordAsDraft(record, recordSource) {
|
|
41690
|
-
record.recordUpdated = new Date();
|
|
41691
|
-
return this.recordsRepository
|
|
41692
|
-
.saveRecordAsDraft(record, recordSource)
|
|
41693
|
-
.pipe(map$1(() => undefined));
|
|
41694
|
-
}
|
|
41695
|
-
undoRecordDraft(record) {
|
|
41696
|
-
this.recordsRepository.clearRecordDraft(record.uniqueIdentifier);
|
|
41697
|
-
return this.recordsRepository.openRecordForEdition(record.uniqueIdentifier);
|
|
41698
|
-
}
|
|
41699
|
-
hasRecordChangedSinceDraft(localRecord) {
|
|
41700
|
-
return this.recordsRepository.hasRecordChangedSinceDraft(localRecord);
|
|
41701
|
-
}
|
|
41702
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
41703
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, providedIn: 'root' }); }
|
|
41704
|
-
}
|
|
41705
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, decorators: [{
|
|
41706
|
-
type: Injectable,
|
|
41707
|
-
args: [{
|
|
41708
|
-
providedIn: 'root',
|
|
41709
|
-
}]
|
|
41710
|
-
}] });
|
|
41711
|
-
|
|
41712
|
-
class EditorEffects {
|
|
41713
|
-
constructor() {
|
|
41714
|
-
this.actions$ = inject(Actions);
|
|
41715
|
-
this.editorService = inject(EditorService);
|
|
41716
|
-
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
41717
|
-
this.plateformService = inject(PlatformServiceInterface);
|
|
41718
|
-
this.store = inject(Store);
|
|
41719
|
-
this.saveRecord$ = createEffect(() => this.actions$.pipe(ofType(saveRecord), withLatestFrom$1(this.store.select(selectRecord), this.store.select(selectRecordSource), this.store.select(selectEditorConfig)), switchMap$1(([, record, recordSource, fieldsConfig]) => this.editorService.saveRecord(record, recordSource, fieldsConfig).pipe(switchMap$1(([savedRecord, savedRecordSource]) => {
|
|
41720
|
-
const actions = [saveRecordSuccess()];
|
|
41721
|
-
if (!record?.uniqueIdentifier) {
|
|
41722
|
-
actions.push(openRecord({
|
|
41723
|
-
record: savedRecord,
|
|
41724
|
-
recordSource: savedRecordSource,
|
|
41725
|
-
}));
|
|
41726
|
-
}
|
|
41727
|
-
return of(...actions);
|
|
41728
|
-
}), catchError((error) => of(saveRecordFailure({
|
|
41729
|
-
error,
|
|
41730
|
-
})))))));
|
|
41731
|
-
this.cleanRecordAttachments$ = createEffect(() => this.actions$.pipe(ofType(saveRecordSuccess), withLatestFrom$1(this.store.select(selectRecord)), switchMap$1(([_, record]) => {
|
|
41732
|
-
if (record.uniqueIdentifier !== null) {
|
|
41733
|
-
this.plateformService.cleanRecordAttachments(record).subscribe({
|
|
41734
|
-
next: (_) => undefined,
|
|
41735
|
-
error: (err) => {
|
|
41736
|
-
console.error(err);
|
|
41737
|
-
},
|
|
41738
|
-
});
|
|
41739
|
-
}
|
|
41740
|
-
return EMPTY;
|
|
41741
|
-
}), catchError((error) => {
|
|
41742
|
-
console.error(error);
|
|
41743
|
-
return EMPTY;
|
|
41744
|
-
})), { dispatch: false });
|
|
41745
|
-
this.markAsChanged$ = createEffect(() => this.actions$.pipe(ofType(updateRecordField, updateRecordLanguages), map$1(() => markRecordAsChanged())));
|
|
41746
|
-
this.saveRecordDraft$ = createEffect(() => this.actions$.pipe(ofType(updateRecordField, updateRecordLanguages), debounceTime$1(1000), withLatestFrom$1(this.store.select(selectRecord), this.store.select(selectRecordSource)), switchMap$1(([, record, recordSource]) => this.editorService.saveRecordAsDraft(record, recordSource)), map$1(() => draftSaveSuccess())));
|
|
41747
|
-
this.undoRecordDraft$ = createEffect(() => this.actions$.pipe(ofType(undoRecordDraft), withLatestFrom$1(this.store.select(selectRecord)), switchMap$1(([, record]) => this.editorService.undoRecordDraft(record)), map$1(([record, recordSource]) => openRecord({
|
|
41748
|
-
record,
|
|
41749
|
-
recordSource,
|
|
41750
|
-
}))));
|
|
41751
|
-
this.checkHasChangesOnOpen$ = createEffect(() => this.actions$.pipe(ofType(openRecord), map$1(({ record }) => this.recordsRepository.recordHasDraft(record.uniqueIdentifier)), filter((hasDraft) => hasDraft), map$1(() => markRecordAsChanged())));
|
|
41752
|
-
this.hasRecordChangedSinceDraft$ = createEffect(() => this.actions$.pipe(ofType(hasRecordChangedSinceDraft), switchMap$1(({ record }) => this.editorService
|
|
41753
|
-
.hasRecordChangedSinceDraft(record)
|
|
41754
|
-
.pipe(map$1((changes) => hasRecordChangedSinceDraftSuccess({ changes }))))));
|
|
41755
|
-
this.checkIsRecordPublished$ = createEffect(() => this.actions$.pipe(ofType(openRecord), map$1(({ record }) => record.uniqueIdentifier), switchMap$1((uniqueIdentifier) => this.recordsRepository.getRecordPublicationStatus(uniqueIdentifier)), map$1((isPublished$1) => isPublished({
|
|
41756
|
-
isPublished: isPublished$1,
|
|
41757
|
-
}))));
|
|
41758
|
-
this.checkCanEditRecord$ = createEffect(() => this.actions$.pipe(ofType(openRecord), map$1(({ record }) => record.uniqueIdentifier), switchMap$1((uniqueIdentifier) => this.recordsRepository.canEditRecord(uniqueIdentifier)), map$1((canEditRecord$1) => canEditRecord({
|
|
41759
|
-
canEditRecord: canEditRecord$1,
|
|
41760
|
-
}))));
|
|
41761
|
-
}
|
|
41762
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
41763
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects }); }
|
|
41764
|
-
}
|
|
41765
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects, decorators: [{
|
|
41766
|
-
type: Injectable
|
|
41767
|
-
}] });
|
|
41768
|
-
|
|
41769
|
-
class FeatureEditorModule {
|
|
41770
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
41771
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, imports: [i1.StoreFeatureModule, i2$2.EffectsFeatureModule] }); }
|
|
41772
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, providers: [EditorFacade, provideHttpClient()], imports: [StoreModule.forFeature(EDITOR_FEATURE_KEY, editorReducer),
|
|
41773
|
-
EffectsModule.forFeature([EditorEffects])] }); }
|
|
41774
|
-
}
|
|
41775
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, decorators: [{
|
|
41776
|
-
type: NgModule,
|
|
41777
|
-
args: [{
|
|
41778
|
-
imports: [
|
|
41779
|
-
StoreModule.forFeature(EDITOR_FEATURE_KEY, editorReducer),
|
|
41780
|
-
EffectsModule.forFeature([EditorEffects]),
|
|
41781
|
-
],
|
|
41782
|
-
providers: [EditorFacade, provideHttpClient()],
|
|
41783
|
-
}]
|
|
41784
|
-
}] });
|
|
41785
|
-
|
|
41786
41758
|
class ImportRecordComponent {
|
|
41787
41759
|
constructor() {
|
|
41788
41760
|
this.router = inject(Router);
|
|
@@ -41878,6 +41850,328 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
41878
41850
|
type: Output
|
|
41879
41851
|
}] } });
|
|
41880
41852
|
|
|
41853
|
+
//forced translations that are not available in fields.config.ts
|
|
41854
|
+
marker('editor.record.form.field.keywords');
|
|
41855
|
+
marker('editor.record.form.field.topics');
|
|
41856
|
+
marker('editor.record.form.field.contacts');
|
|
41857
|
+
marker('editor.record.form.field.organisation');
|
|
41858
|
+
class MetadataQualityPanelComponent {
|
|
41859
|
+
constructor() {
|
|
41860
|
+
this.propsToValidate = getAllKeysValidator();
|
|
41861
|
+
this.propertiesByPage = [];
|
|
41862
|
+
}
|
|
41863
|
+
ngOnChanges() {
|
|
41864
|
+
if (this.editorConfig && this.record) {
|
|
41865
|
+
const fieldsByPage = this.editorConfig.pages.map((page) => page.sections.flatMap((section) => section.fields
|
|
41866
|
+
.filter((field) => this.propsToValidate.includes(field.model))
|
|
41867
|
+
.map((field) => field.model)));
|
|
41868
|
+
// FIXME: temporarily add topics and organisation to the first and third page
|
|
41869
|
+
// as long as they are not handled by the editor
|
|
41870
|
+
if (fieldsByPage.length > 0) {
|
|
41871
|
+
fieldsByPage[0].includes('topics') || fieldsByPage[0].push('topics');
|
|
41872
|
+
fieldsByPage[2].includes('organisation') ||
|
|
41873
|
+
fieldsByPage[2].push('organisation');
|
|
41874
|
+
}
|
|
41875
|
+
this.propertiesByPage = fieldsByPage
|
|
41876
|
+
.map((fields) => getQualityValidators(this.record, fields).map(({ name, validator }) => ({
|
|
41877
|
+
label: `editor.record.form.field.${name}`, // use same translations as in fields.config.ts
|
|
41878
|
+
value: validator(),
|
|
41879
|
+
})))
|
|
41880
|
+
.filter((arr) => arr.length > 0);
|
|
41881
|
+
}
|
|
41882
|
+
}
|
|
41883
|
+
getExtraClass(checked) {
|
|
41884
|
+
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';
|
|
41885
|
+
return checked
|
|
41886
|
+
? `${baseClasses} bg-neutral-100 hover:bg-neutral-100`
|
|
41887
|
+
: `${baseClasses} bg-transparent hover:bg-transparent`;
|
|
41888
|
+
}
|
|
41889
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MetadataQualityPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
41890
|
+
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: [
|
|
41891
|
+
provideIcons({
|
|
41892
|
+
iconoirSystemShut,
|
|
41893
|
+
iconoirBadgeCheck,
|
|
41894
|
+
}),
|
|
41895
|
+
provideNgIconsConfig({
|
|
41896
|
+
size: '1.25em',
|
|
41897
|
+
}),
|
|
41898
|
+
], 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" }] }); }
|
|
41899
|
+
}
|
|
41900
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MetadataQualityPanelComponent, decorators: [{
|
|
41901
|
+
type: Component,
|
|
41902
|
+
args: [{ selector: 'gn-ui-metadata-quality-panel', standalone: true, imports: [
|
|
41903
|
+
TranslateDirective,
|
|
41904
|
+
TranslatePipe,
|
|
41905
|
+
ButtonComponent,
|
|
41906
|
+
NgIconComponent,
|
|
41907
|
+
], providers: [
|
|
41908
|
+
provideIcons({
|
|
41909
|
+
iconoirSystemShut,
|
|
41910
|
+
iconoirBadgeCheck,
|
|
41911
|
+
}),
|
|
41912
|
+
provideNgIconsConfig({
|
|
41913
|
+
size: '1.25em',
|
|
41914
|
+
}),
|
|
41915
|
+
], 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" }]
|
|
41916
|
+
}], propDecorators: { editorConfig: [{
|
|
41917
|
+
type: Input
|
|
41918
|
+
}], record: [{
|
|
41919
|
+
type: Input
|
|
41920
|
+
}] } });
|
|
41921
|
+
|
|
41922
|
+
const extraFlagMap = {
|
|
41923
|
+
ar: 'arab',
|
|
41924
|
+
en: 'gb',
|
|
41925
|
+
ko: 'kr',
|
|
41926
|
+
cs: 'cz',
|
|
41927
|
+
zh: 'cn',
|
|
41928
|
+
ca: 'es-ct',
|
|
41929
|
+
rm: 'ch',
|
|
41930
|
+
da: 'dk',
|
|
41931
|
+
sv: 'se',
|
|
41932
|
+
cy: 'gb-wls',
|
|
41933
|
+
hy: 'am',
|
|
41934
|
+
ka: 'ge',
|
|
41935
|
+
uk: 'ua',
|
|
41936
|
+
};
|
|
41937
|
+
class MultilingualPanelComponent {
|
|
41938
|
+
constructor() {
|
|
41939
|
+
this.facade = inject(EditorFacade);
|
|
41940
|
+
this.dialog = inject(MatDialog);
|
|
41941
|
+
this.translateService = inject(TranslateService);
|
|
41942
|
+
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
41943
|
+
this.overlay = inject(Overlay);
|
|
41944
|
+
this.viewContainerRef = inject(ViewContainerRef);
|
|
41945
|
+
this.cdr = inject(ChangeDetectorRef);
|
|
41946
|
+
this.selectedLanguages = [];
|
|
41947
|
+
this.recordLanguages = [];
|
|
41948
|
+
this.formLanguage = '';
|
|
41949
|
+
this.isActionMenuOpen = false;
|
|
41950
|
+
this.subscription = new Subscription();
|
|
41951
|
+
this.supportedLanguages$ = this.recordsRepository
|
|
41952
|
+
.getApplicationLanguages()
|
|
41953
|
+
.pipe(map$2((languages) => this.sortLanguages(languages)));
|
|
41954
|
+
}
|
|
41955
|
+
set record(value) {
|
|
41956
|
+
this._record = value;
|
|
41957
|
+
this.isMultilingual = value.otherLanguages.length > 0;
|
|
41958
|
+
this.editTranslations = false;
|
|
41959
|
+
this.recordLanguages = [...value.otherLanguages, value.defaultLanguage];
|
|
41960
|
+
this.selectedLanguages = this.recordLanguages;
|
|
41961
|
+
this.formLanguage = value.defaultLanguage;
|
|
41962
|
+
}
|
|
41963
|
+
ngOnDestroy() {
|
|
41964
|
+
this.subscription.unsubscribe();
|
|
41965
|
+
}
|
|
41966
|
+
sortLanguages(languages) {
|
|
41967
|
+
return languages
|
|
41968
|
+
.map((lang) => {
|
|
41969
|
+
const label = this.translateService.instant('language.' + lang);
|
|
41970
|
+
const isTranslated = label !== 'language.' + lang;
|
|
41971
|
+
return {
|
|
41972
|
+
lang,
|
|
41973
|
+
label,
|
|
41974
|
+
isTranslated,
|
|
41975
|
+
};
|
|
41976
|
+
})
|
|
41977
|
+
.sort((a, b) => {
|
|
41978
|
+
if (a.isTranslated && !b.isTranslated)
|
|
41979
|
+
return -1;
|
|
41980
|
+
if (!a.isTranslated && b.isTranslated)
|
|
41981
|
+
return 1;
|
|
41982
|
+
return a.label.localeCompare(b.label);
|
|
41983
|
+
})
|
|
41984
|
+
.map((item) => item.lang);
|
|
41985
|
+
}
|
|
41986
|
+
toggleLanguageSelection() {
|
|
41987
|
+
this.editTranslations = !this.editTranslations;
|
|
41988
|
+
}
|
|
41989
|
+
getIconClass(lang) {
|
|
41990
|
+
return extraFlagMap[lang]
|
|
41991
|
+
? `fi fi-${extraFlagMap[lang]} w-4 h-3`
|
|
41992
|
+
: `fi fi-${lang} w-4 h-3`;
|
|
41993
|
+
}
|
|
41994
|
+
switchMultilingual() {
|
|
41995
|
+
if (this.isMultilingual && this.selectedLanguages.length > 1) {
|
|
41996
|
+
this.confirmDeleteAction();
|
|
41997
|
+
}
|
|
41998
|
+
else {
|
|
41999
|
+
this.isMultilingual = true;
|
|
42000
|
+
this.editTranslations = true;
|
|
42001
|
+
}
|
|
42002
|
+
}
|
|
42003
|
+
getExtraClass(lang) {
|
|
42004
|
+
const baseClass = 'h-[34px] w-full font-bold justify-start hover:bg-white';
|
|
42005
|
+
if (this.selectedLanguages.includes(lang)) {
|
|
42006
|
+
return `${baseClass} bg-white border border-black`;
|
|
42007
|
+
}
|
|
42008
|
+
return baseClass;
|
|
42009
|
+
}
|
|
42010
|
+
toggleLanguage(lang) {
|
|
42011
|
+
if (this.selectedLanguages.includes(lang)) {
|
|
42012
|
+
this.removeSelectedLanguage(lang);
|
|
42013
|
+
}
|
|
42014
|
+
else {
|
|
42015
|
+
this.selectedLanguages.push(lang);
|
|
42016
|
+
}
|
|
42017
|
+
}
|
|
42018
|
+
removeSelectedLanguage(lang) {
|
|
42019
|
+
this.selectedLanguages = this.selectedLanguages.filter((language) => language !== lang);
|
|
42020
|
+
}
|
|
42021
|
+
validateTranslations() {
|
|
42022
|
+
const equalLength = this.selectedLanguages.length === this.recordLanguages.length;
|
|
42023
|
+
if (this.selectedLanguages.length < this.recordLanguages.length ||
|
|
42024
|
+
(equalLength && this.selectedLanguages !== this.recordLanguages)) {
|
|
42025
|
+
this.confirmDeleteAction(this.selectedLanguages);
|
|
42026
|
+
}
|
|
42027
|
+
else {
|
|
42028
|
+
this.updateTranslations();
|
|
42029
|
+
}
|
|
42030
|
+
}
|
|
42031
|
+
updateTranslations() {
|
|
42032
|
+
const newLanguageSelection = this.selectedLanguages.filter((lang) => lang !== this.formLanguage);
|
|
42033
|
+
this.facade.updateRecordLanguages(this.formLanguage, newLanguageSelection);
|
|
42034
|
+
this.recordLanguages = newLanguageSelection;
|
|
42035
|
+
this.editTranslations = false;
|
|
42036
|
+
}
|
|
42037
|
+
switchFormLang(lang) {
|
|
42038
|
+
// TO IMPLEMENT FURTHER
|
|
42039
|
+
}
|
|
42040
|
+
switchDefaultLang(lang) {
|
|
42041
|
+
this.formLanguage = lang;
|
|
42042
|
+
this.facade.updateRecordLanguages(lang, this.selectedLanguages.filter((lang) => lang !== this.formLanguage));
|
|
42043
|
+
this.closeActionMenu();
|
|
42044
|
+
}
|
|
42045
|
+
confirmDeleteAction(lang) {
|
|
42046
|
+
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
42047
|
+
data: {
|
|
42048
|
+
title: this.translateService.instant('editor.record.multilingual.confirmation.title'),
|
|
42049
|
+
message: this.translateService.instant('editor.record.multilingual.confirmation.message'),
|
|
42050
|
+
confirmText: this.translateService.instant('editor.record.multilingual.confirmation.confirmText'),
|
|
42051
|
+
cancelText: this.translateService.instant('editor.record.multilingual.confirmation.cancelText'),
|
|
42052
|
+
focusCancel: true,
|
|
42053
|
+
},
|
|
42054
|
+
restoreFocus: true,
|
|
42055
|
+
});
|
|
42056
|
+
this.subscription.add(dialogRef.afterClosed().subscribe((confirmed) => {
|
|
42057
|
+
if (confirmed) {
|
|
42058
|
+
if (lang) {
|
|
42059
|
+
if (!Array.isArray(lang)) {
|
|
42060
|
+
this.removeSelectedLanguage(lang);
|
|
42061
|
+
this.closeActionMenu();
|
|
42062
|
+
}
|
|
42063
|
+
this.updateTranslations();
|
|
42064
|
+
}
|
|
42065
|
+
else {
|
|
42066
|
+
this.facade.updateRecordLanguages(this.formLanguage, []);
|
|
42067
|
+
this.isMultilingual = false;
|
|
42068
|
+
this.selectedLanguages = [];
|
|
42069
|
+
}
|
|
42070
|
+
}
|
|
42071
|
+
else {
|
|
42072
|
+
this.isMultilingual = true;
|
|
42073
|
+
this.selectedLanguages = this.recordLanguages;
|
|
42074
|
+
}
|
|
42075
|
+
this.editTranslations = false;
|
|
42076
|
+
}));
|
|
42077
|
+
}
|
|
42078
|
+
isFirstUnsupported(index) {
|
|
42079
|
+
const langs = this.sortLanguages(this.recordLanguages);
|
|
42080
|
+
return (langs[index].length === 3 &&
|
|
42081
|
+
langs.slice(0, index).every((lang) => lang.length !== 3));
|
|
42082
|
+
}
|
|
42083
|
+
isLangSupported(lang) {
|
|
42084
|
+
return lang.length === 2;
|
|
42085
|
+
}
|
|
42086
|
+
getToggleTitle(lang) {
|
|
42087
|
+
if (lang === this._record.defaultLanguage) {
|
|
42088
|
+
return this.translateService.instant('editor.record.form.multilingual.forbidden');
|
|
42089
|
+
}
|
|
42090
|
+
return '';
|
|
42091
|
+
}
|
|
42092
|
+
openActionMenu(item, template) {
|
|
42093
|
+
this.isActionMenuOpen = true;
|
|
42094
|
+
const index = this.sortLanguages(this.selectedLanguages).indexOf(item);
|
|
42095
|
+
const buttonElement = this.actionMenuButtons.toArray()[index];
|
|
42096
|
+
const positionStrategy = this.overlay
|
|
42097
|
+
.position()
|
|
42098
|
+
.flexibleConnectedTo(buttonElement)
|
|
42099
|
+
.withFlexibleDimensions(true)
|
|
42100
|
+
.withPush(true)
|
|
42101
|
+
.withPositions([
|
|
42102
|
+
{
|
|
42103
|
+
originX: 'end',
|
|
42104
|
+
originY: 'bottom',
|
|
42105
|
+
overlayX: 'end',
|
|
42106
|
+
overlayY: 'top',
|
|
42107
|
+
},
|
|
42108
|
+
{
|
|
42109
|
+
originX: 'end',
|
|
42110
|
+
originY: 'top',
|
|
42111
|
+
overlayX: 'end',
|
|
42112
|
+
overlayY: 'bottom',
|
|
42113
|
+
},
|
|
42114
|
+
]);
|
|
42115
|
+
this.overlayRef = this.overlay.create({
|
|
42116
|
+
hasBackdrop: true,
|
|
42117
|
+
backdropClass: 'cdk-overlay-transparent-backdrop',
|
|
42118
|
+
positionStrategy: positionStrategy,
|
|
42119
|
+
scrollStrategy: this.overlay.scrollStrategies.reposition(),
|
|
42120
|
+
});
|
|
42121
|
+
const portal = new TemplatePortal(template, this.viewContainerRef);
|
|
42122
|
+
this.overlayRef.attach(portal);
|
|
42123
|
+
this.subscription.add(this.overlayRef.backdropClick().subscribe(() => {
|
|
42124
|
+
this.closeActionMenu();
|
|
42125
|
+
}));
|
|
42126
|
+
}
|
|
42127
|
+
closeActionMenu() {
|
|
42128
|
+
if (this.overlayRef) {
|
|
42129
|
+
this.isActionMenuOpen = false;
|
|
42130
|
+
this.overlayRef.dispose();
|
|
42131
|
+
this.cdr.markForCheck();
|
|
42132
|
+
}
|
|
42133
|
+
}
|
|
42134
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MultilingualPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
42135
|
+
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: [
|
|
42136
|
+
provideIcons({
|
|
42137
|
+
iconoirSettings,
|
|
42138
|
+
matMoreHorizOutline,
|
|
42139
|
+
iconoirCheckCircle,
|
|
42140
|
+
iconoirCircle,
|
|
42141
|
+
}),
|
|
42142
|
+
provideNgIconsConfig({
|
|
42143
|
+
size: '1.25em',
|
|
42144
|
+
}),
|
|
42145
|
+
], 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" }] }); }
|
|
42146
|
+
}
|
|
42147
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: MultilingualPanelComponent, decorators: [{
|
|
42148
|
+
type: Component,
|
|
42149
|
+
args: [{ selector: 'gn-ui-multilingual-panel', standalone: true, imports: [
|
|
42150
|
+
CommonModule,
|
|
42151
|
+
CheckToggleComponent,
|
|
42152
|
+
TranslateDirective,
|
|
42153
|
+
TranslatePipe,
|
|
42154
|
+
ButtonComponent,
|
|
42155
|
+
NgIconComponent,
|
|
42156
|
+
ActionMenuComponent,
|
|
42157
|
+
], providers: [
|
|
42158
|
+
provideIcons({
|
|
42159
|
+
iconoirSettings,
|
|
42160
|
+
matMoreHorizOutline,
|
|
42161
|
+
iconoirCheckCircle,
|
|
42162
|
+
iconoirCircle,
|
|
42163
|
+
}),
|
|
42164
|
+
provideNgIconsConfig({
|
|
42165
|
+
size: '1.25em',
|
|
42166
|
+
}),
|
|
42167
|
+
], 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" }]
|
|
42168
|
+
}], propDecorators: { record: [{
|
|
42169
|
+
type: Input
|
|
42170
|
+
}], actionMenuButtons: [{
|
|
42171
|
+
type: ViewChildren,
|
|
42172
|
+
args: ['actionMenuButton', { read: ElementRef }]
|
|
42173
|
+
}] } });
|
|
42174
|
+
|
|
41881
42175
|
class GenericKeywordsComponent {
|
|
41882
42176
|
constructor() {
|
|
41883
42177
|
this.platformService = inject(PlatformServiceInterface);
|
|
@@ -43684,7 +43978,7 @@ class FormFieldComponent {
|
|
|
43684
43978
|
}
|
|
43685
43979
|
}
|
|
43686
43980
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FormFieldComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
43687
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: FormFieldComponent, isStandalone: true, selector: "gn-ui-form-field", inputs: { uniqueIdentifier: "uniqueIdentifier", model: "model", modelSpecifier: "modelSpecifier", componentName: "componentName", config: "config", value: "value" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "titleInput", first: true, predicate: ["titleInput"], descendants: true }], ngImport: i0, template: "<!-- TEMPORARY - disabling the open data switch -->\n<!-- <ng-container *ngIf=\"model === 'licenses'\">\n <gn-ui-form-field-open-data\n [value]=\"valueAsConstraints\"\n (valueChange)=\"valueChange.emit($event)\"\n (openDataChange)=\"toggleIsOpenData($event)\"\n ></gn-ui-form-field-open-data>\n</ng-container> -->\n<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container [ngSwitch]=\"model\">\n <ng-container *ngSwitchCase=\"'title'\">\n <div class=\"flex flex-row flex-start items-center gap-3 mb-[12px]\">\n <textarea\n #titleInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"1\"\n data-test=\"recordTitleInput\"\n class=\"grow font-title text-3xl font-normal overflow-hidden text-black/80\"\n (change)=\"valueChange.emit($event.target.value)\"\n [placeholder]=\"\n 'editor.record.form.field.title.placeholder' | translate\n \"\n >{{ valueAsString }}</textarea\n >\n <div class=\"flex flex-row justify-between self-start mt-0.5\">\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n *ngIf=\"config.hintKey\"\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey! | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'abstract'\">\n <gn-ui-form-field-rich\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n [value]=\"valueAsString\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngSwitchCase=\"'overviews'\">\n <gn-ui-form-field-overviews\n [metadataUuid]=\"uniqueIdentifier\"\n [value]=\"valueAsOverviews\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-overviews>\n </ng-container>\n <ng-container *ngSwitchCase=\"'resourceIdentifiers'\">\n <gn-ui-form-field-simple\n [type]=\"'text'\"\n [value]=\"valueAsResourceIdentifierCode\"\n (valueChange)=\"handleResourceIdentifierChange($event)\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngSwitchCase=\"'resourceCreated'\">\n <gn-ui-form-field-date\n [value]=\"valueAsDate\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-date>\n </ng-container>\n <ng-container *ngSwitchCase=\"'resourceUpdated'\">\n <gn-ui-form-field-date\n [value]=\"valueAsDate\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-date>\n </ng-container>\n <ng-container *ngSwitchCase=\"'updateFrequency'\">\n <gn-ui-form-field-update-frequency\n [value]=\"valueAsUpdateFrequency\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-update-frequency>\n </ng-container>\n <ng-container *ngSwitchCase=\"'temporalExtents'\">\n <gn-ui-form-field-temporal-extents\n [value]=\"valueAsTemporalExtents\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-temporal-extents>\n </ng-container>\n <ng-container *ngSwitchCase=\"'spatialExtents'\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngSwitchCase=\"'keywords'\">\n <gn-ui-form-field-keywords\n [value]=\"valueAsKeywords\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-keywords>\n </ng-container>\n <ng-container *ngSwitchCase=\"'topics'\">\n <gn-ui-form-field-topics\n [value]=\"valueAsTopics\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-topics>\n </ng-container>\n <ng-container *ngSwitchCase=\"'licenses'\">\n <gn-ui-form-field-license\n [label]=\"config.labelKey! | translate\"\n [recordLicences]=\"valueAsConstraints\"\n (recordLicencesChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-license>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'legalConstraints'\">\n <ng-container *ngTemplateOutlet=\"formFieldConstraints\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'securityConstraints'\">\n <ng-container *ngTemplateOutlet=\"formFieldConstraints\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'otherConstraints'\">\n <ng-container *ngTemplateOutlet=\"formFieldConstraints\"></ng-container\n ></ng-container>\n <ng-template #formFieldConstraints>\n <gn-ui-form-field-constraints\n [label]=\"config.labelKey\"\n [value]=\"valueAsConstraints\"\n [constraintType]=\"model\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-constraints\n ></ng-template>\n\n <ng-container *ngSwitchCase=\"'contactsForResource'\">\n <gn-ui-form-field-contacts-for-resource\n [value]=\"valueAsIndividuals\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-contacts-for-resource>\n </ng-container>\n <ng-container *ngSwitchCase=\"'contacts'\">\n <gn-ui-form-field-contacts\n [value]=\"valueAsIndividuals\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-contacts>\n </ng-container>\n <ng-container *ngSwitchCase=\"'onlineResources'\">\n <gn-ui-form-field-online-resources\n *ngIf=\"modelSpecifier === 'onlineResourceType:!link'\"\n [metadataUuid]=\"uniqueIdentifier\"\n [value]=\"valueAsOnlineResources\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-online-resources>\n </ng-container>\n <ng-container *ngSwitchCase=\"'onlineResources'\">\n <gn-ui-form-field-online-link-resources\n *ngIf=\"modelSpecifier === 'onlineResourceType:link'\"\n [metadataUuid]=\"uniqueIdentifier\"\n [value]=\"valueAsOnlineResources\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-online-link-resources>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!model\">\n <ng-container [ngSwitch]=\"componentName\">\n <ng-container *ngSwitchCase=\"'form-field-constraints-shortcuts'\">\n <gn-ui-form-field-constraints-shortcuts></gn-ui-form-field-constraints-shortcuts>\n </ng-container>\n <ng-container *ngSwitchCase=\"'form-field-spatial-toggle'\">\n <gn-ui-form-field-spatial-toggle></gn-ui-form-field-spatial-toggle>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1$5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: FormFieldWrapperComponent, selector: "gn-ui-form-field-wrapper", inputs: ["label", "hint"] }, { kind: "component", type: FormFieldLicenseComponent, selector: "gn-ui-form-field-license", inputs: ["label", "recordLicences"], outputs: ["recordLicencesChange"] }, { kind: "component", type: FormFieldDateComponent, selector: "gn-ui-form-field-date", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldUpdateFrequencyComponent, selector: "gn-ui-form-field-update-frequency", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldTemporalExtentsComponent, selector: "gn-ui-form-field-temporal-extents", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldSimpleComponent, selector: "gn-ui-form-field-simple", inputs: ["type", "readonly", "invalid", "placeholder", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldRichComponent, selector: "gn-ui-form-field-rich", inputs: ["label", "hint", "placeholder", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldSpatialExtentComponent, selector: "gn-ui-form-field-spatial-extent" }, { kind: "component", type: FormFieldKeywordsComponent, selector: "gn-ui-form-field-keywords", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldOverviewsComponent, selector: "gn-ui-form-field-overviews", inputs: ["metadataUuid", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldContactsForResourceComponent, selector: "gn-ui-form-field-contacts-for-resource", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldOnlineResourcesComponent, selector: "gn-ui-form-field-online-resources", inputs: ["metadataUuid", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldOnlineLinkResourcesComponent, selector: "gn-ui-form-field-online-link-resources", inputs: ["metadataUuid", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldContactsComponent, selector: "gn-ui-form-field-contacts", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldConstraintsComponent, selector: "gn-ui-form-field-constraints", inputs: ["label", "value", "constraintType"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldConstraintsShortcutsComponent, selector: "gn-ui-form-field-constraints-shortcuts" }, { kind: "component", type: FormFieldSpatialToggleComponent, selector: "gn-ui-form-field-spatial-toggle" }, { kind: "component", type: FormFieldTopicsComponent, selector: "gn-ui-form-field-topics", inputs: ["value"], outputs: ["valueChange"] }, { kind: "ngmodule", type: TextFieldModule }, { kind: "directive", type: i3$2.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
43981
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.15", type: FormFieldComponent, isStandalone: true, selector: "gn-ui-form-field", inputs: { uniqueIdentifier: "uniqueIdentifier", model: "model", modelSpecifier: "modelSpecifier", componentName: "componentName", config: "config", value: "value" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "titleInput", first: true, predicate: ["titleInput"], descendants: true }], ngImport: i0, template: "<!-- TEMPORARY - disabling the open data switch -->\n<!-- <ng-container *ngIf=\"model === 'licenses'\">\n <gn-ui-form-field-open-data\n [value]=\"valueAsConstraints\"\n (valueChange)=\"valueChange.emit($event)\"\n (openDataChange)=\"toggleIsOpenData($event)\"\n ></gn-ui-form-field-open-data>\n</ng-container> -->\n<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container [ngSwitch]=\"model\">\n <ng-container *ngSwitchCase=\"'title'\">\n <div class=\"flex flex-row flex-start items-center gap-3 mb-[12px]\">\n <textarea\n #titleInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"1\"\n data-test=\"recordTitleInput\"\n class=\"grow font-title text-3xl font-normal overflow-hidden text-black/80\"\n [value]=\"valueAsString\"\n (change)=\"valueChange.emit($event.target.value)\"\n [placeholder]=\"\n 'editor.record.form.field.title.placeholder' | translate\n \"\n ></textarea>\n <div class=\"flex flex-row justify-between self-start mt-0.5\">\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n *ngIf=\"config.hintKey\"\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey! | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'abstract'\">\n <gn-ui-form-field-rich\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n [value]=\"valueAsString\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngSwitchCase=\"'overviews'\">\n <gn-ui-form-field-overviews\n [metadataUuid]=\"uniqueIdentifier\"\n [value]=\"valueAsOverviews\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-overviews>\n </ng-container>\n <ng-container *ngSwitchCase=\"'resourceIdentifiers'\">\n <gn-ui-form-field-simple\n [type]=\"'text'\"\n [value]=\"valueAsResourceIdentifierCode\"\n (valueChange)=\"handleResourceIdentifierChange($event)\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngSwitchCase=\"'resourceCreated'\">\n <gn-ui-form-field-date\n [value]=\"valueAsDate\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-date>\n </ng-container>\n <ng-container *ngSwitchCase=\"'resourceUpdated'\">\n <gn-ui-form-field-date\n [value]=\"valueAsDate\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-date>\n </ng-container>\n <ng-container *ngSwitchCase=\"'updateFrequency'\">\n <gn-ui-form-field-update-frequency\n [value]=\"valueAsUpdateFrequency\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-update-frequency>\n </ng-container>\n <ng-container *ngSwitchCase=\"'temporalExtents'\">\n <gn-ui-form-field-temporal-extents\n [value]=\"valueAsTemporalExtents\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-temporal-extents>\n </ng-container>\n <ng-container *ngSwitchCase=\"'spatialExtents'\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngSwitchCase=\"'keywords'\">\n <gn-ui-form-field-keywords\n [value]=\"valueAsKeywords\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-keywords>\n </ng-container>\n <ng-container *ngSwitchCase=\"'topics'\">\n <gn-ui-form-field-topics\n [value]=\"valueAsTopics\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-topics>\n </ng-container>\n <ng-container *ngSwitchCase=\"'licenses'\">\n <gn-ui-form-field-license\n [label]=\"config.labelKey! | translate\"\n [recordLicences]=\"valueAsConstraints\"\n (recordLicencesChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-license>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'legalConstraints'\">\n <ng-container *ngTemplateOutlet=\"formFieldConstraints\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'securityConstraints'\">\n <ng-container *ngTemplateOutlet=\"formFieldConstraints\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'otherConstraints'\">\n <ng-container *ngTemplateOutlet=\"formFieldConstraints\"></ng-container\n ></ng-container>\n <ng-template #formFieldConstraints>\n <gn-ui-form-field-constraints\n [label]=\"config.labelKey\"\n [value]=\"valueAsConstraints\"\n [constraintType]=\"model\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-constraints\n ></ng-template>\n\n <ng-container *ngSwitchCase=\"'contactsForResource'\">\n <gn-ui-form-field-contacts-for-resource\n [value]=\"valueAsIndividuals\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-contacts-for-resource>\n </ng-container>\n <ng-container *ngSwitchCase=\"'contacts'\">\n <gn-ui-form-field-contacts\n [value]=\"valueAsIndividuals\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-contacts>\n </ng-container>\n <ng-container *ngSwitchCase=\"'onlineResources'\">\n <gn-ui-form-field-online-resources\n *ngIf=\"modelSpecifier === 'onlineResourceType:!link'\"\n [metadataUuid]=\"uniqueIdentifier\"\n [value]=\"valueAsOnlineResources\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-online-resources>\n </ng-container>\n <ng-container *ngSwitchCase=\"'onlineResources'\">\n <gn-ui-form-field-online-link-resources\n *ngIf=\"modelSpecifier === 'onlineResourceType:link'\"\n [metadataUuid]=\"uniqueIdentifier\"\n [value]=\"valueAsOnlineResources\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-online-link-resources>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!model\">\n <ng-container [ngSwitch]=\"componentName\">\n <ng-container *ngSwitchCase=\"'form-field-constraints-shortcuts'\">\n <gn-ui-form-field-constraints-shortcuts></gn-ui-form-field-constraints-shortcuts>\n </ng-container>\n <ng-container *ngSwitchCase=\"'form-field-spatial-toggle'\">\n <gn-ui-form-field-spatial-toggle></gn-ui-form-field-spatial-toggle>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i1$5.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: FormFieldWrapperComponent, selector: "gn-ui-form-field-wrapper", inputs: ["label", "hint"] }, { kind: "component", type: FormFieldLicenseComponent, selector: "gn-ui-form-field-license", inputs: ["label", "recordLicences"], outputs: ["recordLicencesChange"] }, { kind: "component", type: FormFieldDateComponent, selector: "gn-ui-form-field-date", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldUpdateFrequencyComponent, selector: "gn-ui-form-field-update-frequency", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldTemporalExtentsComponent, selector: "gn-ui-form-field-temporal-extents", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldSimpleComponent, selector: "gn-ui-form-field-simple", inputs: ["type", "readonly", "invalid", "placeholder", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldRichComponent, selector: "gn-ui-form-field-rich", inputs: ["label", "hint", "placeholder", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldSpatialExtentComponent, selector: "gn-ui-form-field-spatial-extent" }, { kind: "component", type: FormFieldKeywordsComponent, selector: "gn-ui-form-field-keywords", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldOverviewsComponent, selector: "gn-ui-form-field-overviews", inputs: ["metadataUuid", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldContactsForResourceComponent, selector: "gn-ui-form-field-contacts-for-resource", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldOnlineResourcesComponent, selector: "gn-ui-form-field-online-resources", inputs: ["metadataUuid", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldOnlineLinkResourcesComponent, selector: "gn-ui-form-field-online-link-resources", inputs: ["metadataUuid", "value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldContactsComponent, selector: "gn-ui-form-field-contacts", inputs: ["value"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldConstraintsComponent, selector: "gn-ui-form-field-constraints", inputs: ["label", "value", "constraintType"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldConstraintsShortcutsComponent, selector: "gn-ui-form-field-constraints-shortcuts" }, { kind: "component", type: FormFieldSpatialToggleComponent, selector: "gn-ui-form-field-spatial-toggle" }, { kind: "component", type: FormFieldTopicsComponent, selector: "gn-ui-form-field-topics", inputs: ["value"], outputs: ["valueChange"] }, { kind: "ngmodule", type: TextFieldModule }, { kind: "directive", type: i3$2.CdkTextareaAutosize, selector: "textarea[cdkTextareaAutosize]", inputs: ["cdkAutosizeMinRows", "cdkAutosizeMaxRows", "cdkTextareaAutosize", "placeholder"], exportAs: ["cdkTextareaAutosize"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
43688
43982
|
}
|
|
43689
43983
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FormFieldComponent, decorators: [{
|
|
43690
43984
|
type: Component,
|
|
@@ -43711,7 +44005,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
43711
44005
|
FormFieldSpatialToggleComponent,
|
|
43712
44006
|
FormFieldTopicsComponent,
|
|
43713
44007
|
TextFieldModule,
|
|
43714
|
-
], template: "<!-- TEMPORARY - disabling the open data switch -->\n<!-- <ng-container *ngIf=\"model === 'licenses'\">\n <gn-ui-form-field-open-data\n [value]=\"valueAsConstraints\"\n (valueChange)=\"valueChange.emit($event)\"\n (openDataChange)=\"toggleIsOpenData($event)\"\n ></gn-ui-form-field-open-data>\n</ng-container> -->\n<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container [ngSwitch]=\"model\">\n <ng-container *ngSwitchCase=\"'title'\">\n <div class=\"flex flex-row flex-start items-center gap-3 mb-[12px]\">\n <textarea\n #titleInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"1\"\n data-test=\"recordTitleInput\"\n class=\"grow font-title text-3xl font-normal overflow-hidden text-black/80\"\n (change)=\"valueChange.emit($event.target.value)\"\n [placeholder]=\"\n 'editor.record.form.field.title.placeholder' | translate\n \"\n
|
|
44008
|
+
], template: "<!-- TEMPORARY - disabling the open data switch -->\n<!-- <ng-container *ngIf=\"model === 'licenses'\">\n <gn-ui-form-field-open-data\n [value]=\"valueAsConstraints\"\n (valueChange)=\"valueChange.emit($event)\"\n (openDataChange)=\"toggleIsOpenData($event)\"\n ></gn-ui-form-field-open-data>\n</ng-container> -->\n<div class=\"flex flex-col h-full\">\n <ng-container *ngIf=\"withoutWrapper; else withGenericWrapper\">\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </ng-container>\n <ng-template #withGenericWrapper>\n <gn-ui-form-field-wrapper\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n >\n <ng-container *ngTemplateOutlet=\"fieldContent\"></ng-container>\n </gn-ui-form-field-wrapper>\n </ng-template>\n</div>\n\n<ng-template #fieldContent>\n <ng-container [ngSwitch]=\"model\">\n <ng-container *ngSwitchCase=\"'title'\">\n <div class=\"flex flex-row flex-start items-center gap-3 mb-[12px]\">\n <textarea\n #titleInput\n cdkTextareaAutosize\n #autosize=\"cdkTextareaAutosize\"\n cdkAutosizeMinRows=\"1\"\n data-test=\"recordTitleInput\"\n class=\"grow font-title text-3xl font-normal overflow-hidden text-black/80\"\n [value]=\"valueAsString\"\n (change)=\"valueChange.emit($event.target.value)\"\n [placeholder]=\"\n 'editor.record.form.field.title.placeholder' | translate\n \"\n ></textarea>\n <div class=\"flex flex-row justify-between self-start mt-0.5\">\n <span\n class=\"material-symbols-outlined gn-ui-icon-small m-2 cursor-pointer\"\n (click)=\"focusTitleInput()\"\n >edit</span\n >\n <span\n *ngIf=\"config.hintKey\"\n class=\"material-symbols-outlined gn-ui-icon-small m-2\"\n [matTooltip]=\"config.hintKey! | translate\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'abstract'\">\n <gn-ui-form-field-rich\n [label]=\"config.labelKey! | translate\"\n [hint]=\"config.hintKey! | translate\"\n [value]=\"valueAsString\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-rich>\n </ng-container>\n <ng-container *ngSwitchCase=\"'overviews'\">\n <gn-ui-form-field-overviews\n [metadataUuid]=\"uniqueIdentifier\"\n [value]=\"valueAsOverviews\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-overviews>\n </ng-container>\n <ng-container *ngSwitchCase=\"'resourceIdentifiers'\">\n <gn-ui-form-field-simple\n [type]=\"'text'\"\n [value]=\"valueAsResourceIdentifierCode\"\n (valueChange)=\"handleResourceIdentifierChange($event)\"\n ></gn-ui-form-field-simple>\n </ng-container>\n <ng-container *ngSwitchCase=\"'resourceCreated'\">\n <gn-ui-form-field-date\n [value]=\"valueAsDate\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-date>\n </ng-container>\n <ng-container *ngSwitchCase=\"'resourceUpdated'\">\n <gn-ui-form-field-date\n [value]=\"valueAsDate\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-date>\n </ng-container>\n <ng-container *ngSwitchCase=\"'updateFrequency'\">\n <gn-ui-form-field-update-frequency\n [value]=\"valueAsUpdateFrequency\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-update-frequency>\n </ng-container>\n <ng-container *ngSwitchCase=\"'temporalExtents'\">\n <gn-ui-form-field-temporal-extents\n [value]=\"valueAsTemporalExtents\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-temporal-extents>\n </ng-container>\n <ng-container *ngSwitchCase=\"'spatialExtents'\">\n <gn-ui-form-field-spatial-extent></gn-ui-form-field-spatial-extent>\n </ng-container>\n <ng-container *ngSwitchCase=\"'keywords'\">\n <gn-ui-form-field-keywords\n [value]=\"valueAsKeywords\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-keywords>\n </ng-container>\n <ng-container *ngSwitchCase=\"'topics'\">\n <gn-ui-form-field-topics\n [value]=\"valueAsTopics\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-topics>\n </ng-container>\n <ng-container *ngSwitchCase=\"'licenses'\">\n <gn-ui-form-field-license\n [label]=\"config.labelKey! | translate\"\n [recordLicences]=\"valueAsConstraints\"\n (recordLicencesChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-license>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'legalConstraints'\">\n <ng-container *ngTemplateOutlet=\"formFieldConstraints\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'securityConstraints'\">\n <ng-container *ngTemplateOutlet=\"formFieldConstraints\"></ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"'otherConstraints'\">\n <ng-container *ngTemplateOutlet=\"formFieldConstraints\"></ng-container\n ></ng-container>\n <ng-template #formFieldConstraints>\n <gn-ui-form-field-constraints\n [label]=\"config.labelKey\"\n [value]=\"valueAsConstraints\"\n [constraintType]=\"model\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-constraints\n ></ng-template>\n\n <ng-container *ngSwitchCase=\"'contactsForResource'\">\n <gn-ui-form-field-contacts-for-resource\n [value]=\"valueAsIndividuals\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-contacts-for-resource>\n </ng-container>\n <ng-container *ngSwitchCase=\"'contacts'\">\n <gn-ui-form-field-contacts\n [value]=\"valueAsIndividuals\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-contacts>\n </ng-container>\n <ng-container *ngSwitchCase=\"'onlineResources'\">\n <gn-ui-form-field-online-resources\n *ngIf=\"modelSpecifier === 'onlineResourceType:!link'\"\n [metadataUuid]=\"uniqueIdentifier\"\n [value]=\"valueAsOnlineResources\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-online-resources>\n </ng-container>\n <ng-container *ngSwitchCase=\"'onlineResources'\">\n <gn-ui-form-field-online-link-resources\n *ngIf=\"modelSpecifier === 'onlineResourceType:link'\"\n [metadataUuid]=\"uniqueIdentifier\"\n [value]=\"valueAsOnlineResources\"\n (valueChange)=\"valueChange.emit($event)\"\n ></gn-ui-form-field-online-link-resources>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"!model\">\n <ng-container [ngSwitch]=\"componentName\">\n <ng-container *ngSwitchCase=\"'form-field-constraints-shortcuts'\">\n <gn-ui-form-field-constraints-shortcuts></gn-ui-form-field-constraints-shortcuts>\n </ng-container>\n <ng-container *ngSwitchCase=\"'form-field-spatial-toggle'\">\n <gn-ui-form-field-spatial-toggle></gn-ui-form-field-spatial-toggle>\n </ng-container>\n </ng-container>\n </ng-container>\n</ng-template>\n" }]
|
|
43715
44009
|
}], propDecorators: { uniqueIdentifier: [{
|
|
43716
44010
|
type: Input
|
|
43717
44011
|
}], model: [{
|
|
@@ -43756,327 +44050,148 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
43756
44050
|
args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, FormFieldComponent, TranslateDirective], template: "<div class=\"flex flex-col gap-6\">\n @for (\n section of facade.currentSections$ | async;\n track sectionTracker($index, section)\n ) {\n @if (!section.hidden) {\n <div class=\"flex flex-col gap-6 border p-8 rounded-[8px] shadow\">\n <div class=\"flex flex-col gap-2\">\n @if (section.labelKey) {\n <div class=\"text-2xl font-title text-black\" translate>\n {{ section.labelKey }}\n </div>\n }\n @if (section.descriptionKey) {\n <div class=\"text-gray-800 text-sm\" translate>\n {{ section.descriptionKey }}\n </div>\n }\n </div>\n <div class=\"grid auto-rows-auto grid-cols-2 gap-[32px]\">\n @for (\n field of section.fieldsWithValues;\n track fieldTracker($index, field)\n ) {\n @if (!field.config.hidden) {\n <gn-ui-form-field\n [ngClass]=\"\n field.config.gridColumnSpan === 1\n ? 'col-span-1'\n : 'col-span-2'\n \"\n [uniqueIdentifier]=\"recordUniqueIdentifier$ | async\"\n [model]=\"field.config.model!\"\n [modelSpecifier]=\"field.config.modelSpecifier!\"\n [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n [componentName]=\"field.config.componentName\"\n (valueChange)=\"\n handleFieldValueChange(field.config.model!, $event)\n \"\n ></gn-ui-form-field>\n }\n }\n </div>\n </div>\n }\n }\n</div>\n" }]
|
|
43757
44051
|
}] });
|
|
43758
44052
|
|
|
43759
|
-
|
|
43760
|
-
|
|
43761
|
-
|
|
43762
|
-
ko: 'kr',
|
|
43763
|
-
cs: 'cz',
|
|
43764
|
-
zh: 'cn',
|
|
43765
|
-
ca: 'es-ct',
|
|
43766
|
-
rm: 'ch',
|
|
43767
|
-
da: 'dk',
|
|
43768
|
-
sv: 'se',
|
|
43769
|
-
cy: 'gb-wls',
|
|
43770
|
-
hy: 'am',
|
|
43771
|
-
ka: 'ge',
|
|
43772
|
-
uk: 'ua',
|
|
43773
|
-
};
|
|
43774
|
-
class MultilingualPanelComponent {
|
|
43775
|
-
constructor() {
|
|
43776
|
-
this.facade = inject(EditorFacade);
|
|
43777
|
-
this.dialog = inject(MatDialog);
|
|
43778
|
-
this.translateService = inject(TranslateService);
|
|
43779
|
-
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
43780
|
-
this.overlay = inject(Overlay);
|
|
43781
|
-
this.viewContainerRef = inject(ViewContainerRef);
|
|
43782
|
-
this.cdr = inject(ChangeDetectorRef);
|
|
43783
|
-
this.selectedLanguages = [];
|
|
43784
|
-
this.recordLanguages = [];
|
|
43785
|
-
this.formLanguage = '';
|
|
43786
|
-
this.isActionMenuOpen = false;
|
|
43787
|
-
this.subscription = new Subscription();
|
|
43788
|
-
this.supportedLanguages$ = this.recordsRepository
|
|
43789
|
-
.getApplicationLanguages()
|
|
43790
|
-
.pipe(map$2((languages) => this.sortLanguages(languages)));
|
|
43791
|
-
}
|
|
43792
|
-
set record(value) {
|
|
43793
|
-
this._record = value;
|
|
43794
|
-
this.isMultilingual = value.otherLanguages.length > 0;
|
|
43795
|
-
this.editTranslations = false;
|
|
43796
|
-
this.recordLanguages = [...value.otherLanguages, value.defaultLanguage];
|
|
43797
|
-
this.selectedLanguages = this.recordLanguages;
|
|
43798
|
-
this.formLanguage = value.defaultLanguage;
|
|
43799
|
-
}
|
|
43800
|
-
ngOnDestroy() {
|
|
43801
|
-
this.subscription.unsubscribe();
|
|
43802
|
-
}
|
|
43803
|
-
sortLanguages(languages) {
|
|
43804
|
-
return languages
|
|
43805
|
-
.map((lang) => {
|
|
43806
|
-
const label = this.translateService.instant('language.' + lang);
|
|
43807
|
-
const isTranslated = label !== 'language.' + lang;
|
|
43808
|
-
return {
|
|
43809
|
-
lang,
|
|
43810
|
-
label,
|
|
43811
|
-
isTranslated,
|
|
43812
|
-
};
|
|
43813
|
-
})
|
|
43814
|
-
.sort((a, b) => {
|
|
43815
|
-
if (a.isTranslated && !b.isTranslated)
|
|
43816
|
-
return -1;
|
|
43817
|
-
if (!a.isTranslated && b.isTranslated)
|
|
43818
|
-
return 1;
|
|
43819
|
-
return a.label.localeCompare(b.label);
|
|
43820
|
-
})
|
|
43821
|
-
.map((item) => item.lang);
|
|
43822
|
-
}
|
|
43823
|
-
toggleLanguageSelection() {
|
|
43824
|
-
this.editTranslations = !this.editTranslations;
|
|
43825
|
-
}
|
|
43826
|
-
getIconClass(lang) {
|
|
43827
|
-
return extraFlagMap[lang]
|
|
43828
|
-
? `fi fi-${extraFlagMap[lang]} w-4 h-3`
|
|
43829
|
-
: `fi fi-${lang} w-4 h-3`;
|
|
43830
|
-
}
|
|
43831
|
-
switchMultilingual() {
|
|
43832
|
-
if (this.isMultilingual && this.selectedLanguages.length > 1) {
|
|
43833
|
-
this.confirmDeleteAction();
|
|
43834
|
-
}
|
|
43835
|
-
else {
|
|
43836
|
-
this.isMultilingual = true;
|
|
43837
|
-
this.editTranslations = true;
|
|
43838
|
-
}
|
|
43839
|
-
}
|
|
43840
|
-
getExtraClass(lang) {
|
|
43841
|
-
const baseClass = 'h-[34px] w-full font-bold justify-start hover:bg-white';
|
|
43842
|
-
if (this.selectedLanguages.includes(lang)) {
|
|
43843
|
-
return `${baseClass} bg-white border border-black`;
|
|
43844
|
-
}
|
|
43845
|
-
return baseClass;
|
|
44053
|
+
function evaluate(expression) {
|
|
44054
|
+
if (expression.match(/^\${.*}$/)) {
|
|
44055
|
+
return evaluate(expression.slice(2, -1));
|
|
43846
44056
|
}
|
|
43847
|
-
|
|
43848
|
-
|
|
43849
|
-
|
|
43850
|
-
|
|
43851
|
-
|
|
43852
|
-
|
|
43853
|
-
}
|
|
44057
|
+
const operator = expression.split('(')[0];
|
|
44058
|
+
switch (operator) {
|
|
44059
|
+
case 'dateNow':
|
|
44060
|
+
return () => new Date();
|
|
44061
|
+
default:
|
|
44062
|
+
throw new Error(`Unknown operator: ${operator}`);
|
|
43854
44063
|
}
|
|
43855
|
-
|
|
43856
|
-
|
|
44064
|
+
}
|
|
44065
|
+
|
|
44066
|
+
class EditorService {
|
|
44067
|
+
constructor() {
|
|
44068
|
+
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
43857
44069
|
}
|
|
43858
|
-
|
|
43859
|
-
|
|
43860
|
-
|
|
43861
|
-
|
|
43862
|
-
|
|
44070
|
+
// returns the record as it was when saved, alongside its source
|
|
44071
|
+
saveRecord(record, recordSource, fieldsConfig) {
|
|
44072
|
+
const savedRecord = { ...record };
|
|
44073
|
+
const fields = fieldsConfig.pages.flatMap((page) => page.sections.flatMap((section) => section.fields));
|
|
44074
|
+
// run onSave processes
|
|
44075
|
+
for (const field of fields) {
|
|
44076
|
+
if (field.onSaveProcess && field.model) {
|
|
44077
|
+
const evaluator = evaluate(field.onSaveProcess);
|
|
44078
|
+
savedRecord[field.model] = evaluator({
|
|
44079
|
+
model: field.model,
|
|
44080
|
+
value: record[field.model],
|
|
44081
|
+
});
|
|
44082
|
+
}
|
|
43863
44083
|
}
|
|
43864
|
-
|
|
43865
|
-
|
|
44084
|
+
let publishToAll = true;
|
|
44085
|
+
// if the record is new, generate a new unique identifier and pass publishToAll as false
|
|
44086
|
+
if (!record.uniqueIdentifier) {
|
|
44087
|
+
savedRecord.uniqueIdentifier = null;
|
|
44088
|
+
publishToAll = false;
|
|
43866
44089
|
}
|
|
44090
|
+
return this.recordsRepository
|
|
44091
|
+
.saveRecord(savedRecord, recordSource, publishToAll)
|
|
44092
|
+
.pipe(switchMap((uniqueIdentifier) => this.recordsRepository.openRecordForEdition(uniqueIdentifier)), tap$1(() => {
|
|
44093
|
+
// if saving was successful, the original draft can be discarded
|
|
44094
|
+
this.recordsRepository.clearRecordDraft(record.uniqueIdentifier);
|
|
44095
|
+
}), map$1(([record, recordSource]) => [record, recordSource]));
|
|
43867
44096
|
}
|
|
43868
|
-
|
|
43869
|
-
|
|
43870
|
-
|
|
43871
|
-
|
|
43872
|
-
this.
|
|
43873
|
-
|
|
43874
|
-
|
|
43875
|
-
// TO IMPLEMENT FURTHER
|
|
43876
|
-
}
|
|
43877
|
-
switchDefaultLang(lang) {
|
|
43878
|
-
this.formLanguage = lang;
|
|
43879
|
-
this.facade.updateRecordLanguages(lang, this.selectedLanguages.filter((lang) => lang !== this.formLanguage));
|
|
43880
|
-
this.closeActionMenu();
|
|
43881
|
-
}
|
|
43882
|
-
confirmDeleteAction(lang) {
|
|
43883
|
-
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
43884
|
-
data: {
|
|
43885
|
-
title: this.translateService.instant('editor.record.multilingual.confirmation.title'),
|
|
43886
|
-
message: this.translateService.instant('editor.record.multilingual.confirmation.message'),
|
|
43887
|
-
confirmText: this.translateService.instant('editor.record.multilingual.confirmation.confirmText'),
|
|
43888
|
-
cancelText: this.translateService.instant('editor.record.multilingual.confirmation.cancelText'),
|
|
43889
|
-
focusCancel: true,
|
|
43890
|
-
},
|
|
43891
|
-
restoreFocus: true,
|
|
43892
|
-
});
|
|
43893
|
-
this.subscription.add(dialogRef.afterClosed().subscribe((confirmed) => {
|
|
43894
|
-
if (confirmed) {
|
|
43895
|
-
if (lang) {
|
|
43896
|
-
if (!Array.isArray(lang)) {
|
|
43897
|
-
this.removeSelectedLanguage(lang);
|
|
43898
|
-
this.closeActionMenu();
|
|
43899
|
-
}
|
|
43900
|
-
this.updateTranslations();
|
|
43901
|
-
}
|
|
43902
|
-
else {
|
|
43903
|
-
this.facade.updateRecordLanguages(this.formLanguage, []);
|
|
43904
|
-
this.isMultilingual = false;
|
|
43905
|
-
this.selectedLanguages = [];
|
|
43906
|
-
}
|
|
43907
|
-
}
|
|
43908
|
-
else {
|
|
43909
|
-
this.isMultilingual = true;
|
|
43910
|
-
this.selectedLanguages = this.recordLanguages;
|
|
43911
|
-
}
|
|
43912
|
-
this.editTranslations = false;
|
|
43913
|
-
}));
|
|
43914
|
-
}
|
|
43915
|
-
isFirstUnsupported(index) {
|
|
43916
|
-
const langs = this.sortLanguages(this.recordLanguages);
|
|
43917
|
-
return (langs[index].length === 3 &&
|
|
43918
|
-
langs.slice(0, index).every((lang) => lang.length !== 3));
|
|
43919
|
-
}
|
|
43920
|
-
isLangSupported(lang) {
|
|
43921
|
-
return lang.length === 2;
|
|
43922
|
-
}
|
|
43923
|
-
getToggleTitle(lang) {
|
|
43924
|
-
if (lang === this._record.defaultLanguage) {
|
|
43925
|
-
return this.translateService.instant('editor.record.form.multilingual.forbidden');
|
|
43926
|
-
}
|
|
43927
|
-
return '';
|
|
44097
|
+
// emits and completes once saving is done
|
|
44098
|
+
// note: onSave processes are not run for drafts
|
|
44099
|
+
saveRecordAsDraft(record, recordSource) {
|
|
44100
|
+
record.recordUpdated = new Date();
|
|
44101
|
+
return this.recordsRepository
|
|
44102
|
+
.saveRecordAsDraft(record, recordSource)
|
|
44103
|
+
.pipe(map$1(() => undefined));
|
|
43928
44104
|
}
|
|
43929
|
-
|
|
43930
|
-
this.
|
|
43931
|
-
|
|
43932
|
-
const buttonElement = this.actionMenuButtons.toArray()[index];
|
|
43933
|
-
const positionStrategy = this.overlay
|
|
43934
|
-
.position()
|
|
43935
|
-
.flexibleConnectedTo(buttonElement)
|
|
43936
|
-
.withFlexibleDimensions(true)
|
|
43937
|
-
.withPush(true)
|
|
43938
|
-
.withPositions([
|
|
43939
|
-
{
|
|
43940
|
-
originX: 'end',
|
|
43941
|
-
originY: 'bottom',
|
|
43942
|
-
overlayX: 'end',
|
|
43943
|
-
overlayY: 'top',
|
|
43944
|
-
},
|
|
43945
|
-
{
|
|
43946
|
-
originX: 'end',
|
|
43947
|
-
originY: 'top',
|
|
43948
|
-
overlayX: 'end',
|
|
43949
|
-
overlayY: 'bottom',
|
|
43950
|
-
},
|
|
43951
|
-
]);
|
|
43952
|
-
this.overlayRef = this.overlay.create({
|
|
43953
|
-
hasBackdrop: true,
|
|
43954
|
-
backdropClass: 'cdk-overlay-transparent-backdrop',
|
|
43955
|
-
positionStrategy: positionStrategy,
|
|
43956
|
-
scrollStrategy: this.overlay.scrollStrategies.reposition(),
|
|
43957
|
-
});
|
|
43958
|
-
const portal = new TemplatePortal(template, this.viewContainerRef);
|
|
43959
|
-
this.overlayRef.attach(portal);
|
|
43960
|
-
this.subscription.add(this.overlayRef.backdropClick().subscribe(() => {
|
|
43961
|
-
this.closeActionMenu();
|
|
43962
|
-
}));
|
|
44105
|
+
undoRecordDraft(record) {
|
|
44106
|
+
this.recordsRepository.clearRecordDraft(record.uniqueIdentifier);
|
|
44107
|
+
return this.recordsRepository.openRecordForEdition(record.uniqueIdentifier);
|
|
43963
44108
|
}
|
|
43964
|
-
|
|
43965
|
-
|
|
43966
|
-
this.isActionMenuOpen = false;
|
|
43967
|
-
this.overlayRef.dispose();
|
|
43968
|
-
this.cdr.markForCheck();
|
|
43969
|
-
}
|
|
44109
|
+
hasRecordChangedSinceDraft(localRecord) {
|
|
44110
|
+
return this.recordsRepository.hasRecordChangedSinceDraft(localRecord);
|
|
43970
44111
|
}
|
|
43971
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type:
|
|
43972
|
-
static { this.ɵ
|
|
43973
|
-
provideIcons({
|
|
43974
|
-
iconoirSettings,
|
|
43975
|
-
matMoreHorizOutline,
|
|
43976
|
-
iconoirCheckCircle,
|
|
43977
|
-
iconoirCircle,
|
|
43978
|
-
}),
|
|
43979
|
-
provideNgIconsConfig({
|
|
43980
|
-
size: '1.25em',
|
|
43981
|
-
}),
|
|
43982
|
-
], viewQueries: [{ propertyName: "actionMenuButtons", predicate: ["actionMenuButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n class=\"flex flex-col h-full w-[302px] border-l border-gray-300 py-8 px-3 gap-6 overflow-auto\"\n style=\"background-color: #fafaf9\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.multilingual.title</span\n >\n @if (isMultilingual) {\n <button\n [title]=\"'editor.record.form.multilingual.open' | translate\"\n (click)=\"toggleLanguageSelection()\"\n data-test=\"activateSelection\"\n >\n <ng-icon class=\"mt-1\" name=\"iconoirSettings\"></ng-icon>\n </button>\n }\n </div>\n @if (editTranslations || !isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n <gn-ui-check-toggle\n class=\"p-2\"\n [label]=\"'editor.record.form.multilingual.enable' | translate\"\n [color]=\"'primary'\"\n [(value)]=\"isMultilingual\"\n (toggled)=\"switchMultilingual($event)\"\n ></gn-ui-check-toggle>\n @if (isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n <div\n class=\"flex flex-row justify-between border-t border-gray-300 p-3\"\n >\n <span class=\"mt-2 text-sm text-gray-600\" translate\n >editor.record.form.multilingual.activate</span\n >\n <gn-ui-button\n extraClass=\"w-16 h-8 font-bold\"\n type=\"gray\"\n (buttonClick)=\"validateTranslations()\"\n data-test=\"validateSelection\"\n >{{ 'editor.record.form.multilingual.validate' | translate }}\n </gn-ui-button>\n </div>\n @if (supportedLanguages$ | async; as languages) {\n @for (lang of languages; track lang) {\n <div\n class=\"flex flex-col gap-2 w-full px-2\"\n data-test=\"langAvailable\"\n [attr.data-test-lang]=\"lang\"\n >\n <gn-ui-button\n [extraClass]=\"getExtraClass(lang)\"\n type=\"gray\"\n (buttonClick)=\"toggleLanguage(lang)\"\n [disabled]=\"lang === _record.defaultLanguage\"\n [title]=\"getToggleTitle(lang)\"\n >\n <span [class]=\"getIconClass(lang)\"></span>\n <span class=\"ml-2\">{{ 'language.' + lang | translate }}</span>\n </gn-ui-button>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n @if (!editTranslations && isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n @for (\n recordLang of sortLanguages(recordLanguages);\n track recordLang;\n let i = $index\n ) {\n <gn-ui-button\n extraClass=\"flex flex-row justify-between bg-white border border-white rounded mb-1 h-[34px] w-full\"\n [ngClass]=\"{\n 'mt-8': isFirstUnsupported(i),\n '': true,\n }\"\n (buttonClick)=\"switchFormLang(recordLang)\"\n type=\"outline\"\n data-test=\"langSwitch\"\n >\n <div class=\"flex flex-row gap-2 items-center\">\n @if (recordLang === formLanguage) {\n <ng-icon\n class=\"text-primary mt-1\"\n name=\"iconoirCheckCircle\"\n ></ng-icon>\n }\n @if (recordLang !== formLanguage) {\n <ng-icon\n class=\"text-gray-800 mt-1\"\n name=\"iconoirCircle\"\n ></ng-icon>\n }\n @if (recordLang.length === 2) {\n <span [class]=\"getIconClass(recordLang) + 'mt-1'\"></span>\n }\n <span [ngClass]=\"recordLang === formLanguage ? 'text-black' : ''\">{{\n isLangSupported(recordLang)\n ? ('language.' + recordLang | translate)\n : recordLang.toUpperCase()\n }}</span>\n </div>\n <div class=\"flex flex-row gap-2 items-center\">\n @if (recordLang === formLanguage) {\n <span class=\"text-xs text-base\" translate\n >editor.record.form.multilingual.default</span\n >\n }\n <button\n (click)=\"\n openActionMenu(recordLang, template); $event.stopPropagation()\n \"\n cdkOverlayOrigin\n #actionMenuButton\n >\n <ng-icon class=\"pb-5\" name=\"matMoreHorizOutline\"></ng-icon>\n </button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDelete]=\"recordLang !== _record.defaultLanguage\"\n page=\"record\"\n (delete)=\"confirmDeleteAction(recordLang)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (switch)=\"switchDefaultLang(recordLang)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </div>\n </gn-ui-button>\n }\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: CheckToggleComponent, selector: "gn-ui-check-toggle", inputs: ["title", "label", "value", "color"], outputs: ["toggled"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ActionMenuComponent, selector: "gn-ui-action-menu", inputs: ["canDuplicate", "isDuplicating", "canDelete", "page"], outputs: ["duplicate", "delete", "closeActionMenu", "rollback", "switch"] }, { kind: "pipe", type: i1$1.AsyncPipe, name: "async" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
|
|
44112
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
44113
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, providedIn: 'root' }); }
|
|
43983
44114
|
}
|
|
43984
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type:
|
|
43985
|
-
type:
|
|
43986
|
-
args: [{
|
|
43987
|
-
|
|
43988
|
-
|
|
43989
|
-
|
|
43990
|
-
TranslatePipe,
|
|
43991
|
-
ButtonComponent,
|
|
43992
|
-
NgIconComponent,
|
|
43993
|
-
ActionMenuComponent,
|
|
43994
|
-
], providers: [
|
|
43995
|
-
provideIcons({
|
|
43996
|
-
iconoirSettings,
|
|
43997
|
-
matMoreHorizOutline,
|
|
43998
|
-
iconoirCheckCircle,
|
|
43999
|
-
iconoirCircle,
|
|
44000
|
-
}),
|
|
44001
|
-
provideNgIconsConfig({
|
|
44002
|
-
size: '1.25em',
|
|
44003
|
-
}),
|
|
44004
|
-
], template: "<div\n class=\"flex flex-col h-full w-[302px] border-l border-gray-300 py-8 px-3 gap-6 overflow-auto\"\n style=\"background-color: #fafaf9\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.multilingual.title</span\n >\n @if (isMultilingual) {\n <button\n [title]=\"'editor.record.form.multilingual.open' | translate\"\n (click)=\"toggleLanguageSelection()\"\n data-test=\"activateSelection\"\n >\n <ng-icon class=\"mt-1\" name=\"iconoirSettings\"></ng-icon>\n </button>\n }\n </div>\n @if (editTranslations || !isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n <gn-ui-check-toggle\n class=\"p-2\"\n [label]=\"'editor.record.form.multilingual.enable' | translate\"\n [color]=\"'primary'\"\n [(value)]=\"isMultilingual\"\n (toggled)=\"switchMultilingual($event)\"\n ></gn-ui-check-toggle>\n @if (isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n <div\n class=\"flex flex-row justify-between border-t border-gray-300 p-3\"\n >\n <span class=\"mt-2 text-sm text-gray-600\" translate\n >editor.record.form.multilingual.activate</span\n >\n <gn-ui-button\n extraClass=\"w-16 h-8 font-bold\"\n type=\"gray\"\n (buttonClick)=\"validateTranslations()\"\n data-test=\"validateSelection\"\n >{{ 'editor.record.form.multilingual.validate' | translate }}\n </gn-ui-button>\n </div>\n @if (supportedLanguages$ | async; as languages) {\n @for (lang of languages; track lang) {\n <div\n class=\"flex flex-col gap-2 w-full px-2\"\n data-test=\"langAvailable\"\n [attr.data-test-lang]=\"lang\"\n >\n <gn-ui-button\n [extraClass]=\"getExtraClass(lang)\"\n type=\"gray\"\n (buttonClick)=\"toggleLanguage(lang)\"\n [disabled]=\"lang === _record.defaultLanguage\"\n [title]=\"getToggleTitle(lang)\"\n >\n <span [class]=\"getIconClass(lang)\"></span>\n <span class=\"ml-2\">{{ 'language.' + lang | translate }}</span>\n </gn-ui-button>\n </div>\n }\n }\n </div>\n }\n </div>\n }\n @if (!editTranslations && isMultilingual) {\n <div class=\"flex flex-col gap-2\">\n @for (\n recordLang of sortLanguages(recordLanguages);\n track recordLang;\n let i = $index\n ) {\n <gn-ui-button\n extraClass=\"flex flex-row justify-between bg-white border border-white rounded mb-1 h-[34px] w-full\"\n [ngClass]=\"{\n 'mt-8': isFirstUnsupported(i),\n '': true,\n }\"\n (buttonClick)=\"switchFormLang(recordLang)\"\n type=\"outline\"\n data-test=\"langSwitch\"\n >\n <div class=\"flex flex-row gap-2 items-center\">\n @if (recordLang === formLanguage) {\n <ng-icon\n class=\"text-primary mt-1\"\n name=\"iconoirCheckCircle\"\n ></ng-icon>\n }\n @if (recordLang !== formLanguage) {\n <ng-icon\n class=\"text-gray-800 mt-1\"\n name=\"iconoirCircle\"\n ></ng-icon>\n }\n @if (recordLang.length === 2) {\n <span [class]=\"getIconClass(recordLang) + 'mt-1'\"></span>\n }\n <span [ngClass]=\"recordLang === formLanguage ? 'text-black' : ''\">{{\n isLangSupported(recordLang)\n ? ('language.' + recordLang | translate)\n : recordLang.toUpperCase()\n }}</span>\n </div>\n <div class=\"flex flex-row gap-2 items-center\">\n @if (recordLang === formLanguage) {\n <span class=\"text-xs text-base\" translate\n >editor.record.form.multilingual.default</span\n >\n }\n <button\n (click)=\"\n openActionMenu(recordLang, template); $event.stopPropagation()\n \"\n cdkOverlayOrigin\n #actionMenuButton\n >\n <ng-icon class=\"pb-5\" name=\"matMoreHorizOutline\"></ng-icon>\n </button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDelete]=\"recordLang !== _record.defaultLanguage\"\n page=\"record\"\n (delete)=\"confirmDeleteAction(recordLang)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (switch)=\"switchDefaultLang(recordLang)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </div>\n </gn-ui-button>\n }\n </div>\n }\n</div>\n" }]
|
|
44005
|
-
}], propDecorators: { record: [{
|
|
44006
|
-
type: Input
|
|
44007
|
-
}], actionMenuButtons: [{
|
|
44008
|
-
type: ViewChildren,
|
|
44009
|
-
args: ['actionMenuButton', { read: ElementRef }]
|
|
44010
|
-
}] } });
|
|
44115
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorService, decorators: [{
|
|
44116
|
+
type: Injectable,
|
|
44117
|
+
args: [{
|
|
44118
|
+
providedIn: 'root',
|
|
44119
|
+
}]
|
|
44120
|
+
}] });
|
|
44011
44121
|
|
|
44012
|
-
|
|
44013
|
-
marker('editor.record.form.field.keywords');
|
|
44014
|
-
marker('editor.record.form.field.topics');
|
|
44015
|
-
marker('editor.record.form.field.contacts');
|
|
44016
|
-
marker('editor.record.form.field.organisation');
|
|
44017
|
-
class MetadataQualityPanelComponent {
|
|
44122
|
+
class EditorEffects {
|
|
44018
44123
|
constructor() {
|
|
44019
|
-
this.
|
|
44020
|
-
this.
|
|
44021
|
-
|
|
44022
|
-
|
|
44023
|
-
|
|
44024
|
-
|
|
44025
|
-
|
|
44026
|
-
|
|
44027
|
-
|
|
44028
|
-
|
|
44029
|
-
|
|
44030
|
-
|
|
44031
|
-
fieldsByPage[2].includes('organisation') ||
|
|
44032
|
-
fieldsByPage[2].push('organisation');
|
|
44124
|
+
this.actions$ = inject(Actions);
|
|
44125
|
+
this.editorService = inject(EditorService);
|
|
44126
|
+
this.recordsRepository = inject(RecordsRepositoryInterface);
|
|
44127
|
+
this.plateformService = inject(PlatformServiceInterface);
|
|
44128
|
+
this.store = inject(Store);
|
|
44129
|
+
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]) => {
|
|
44130
|
+
const actions = [saveRecordSuccess()];
|
|
44131
|
+
if (!record?.uniqueIdentifier) {
|
|
44132
|
+
actions.push(openRecord({
|
|
44133
|
+
record: savedRecord,
|
|
44134
|
+
recordSource: savedRecordSource,
|
|
44135
|
+
}));
|
|
44033
44136
|
}
|
|
44034
|
-
|
|
44035
|
-
|
|
44036
|
-
|
|
44037
|
-
|
|
44038
|
-
|
|
44039
|
-
|
|
44040
|
-
|
|
44041
|
-
|
|
44042
|
-
|
|
44043
|
-
|
|
44044
|
-
|
|
44045
|
-
|
|
44046
|
-
|
|
44137
|
+
return of(...actions);
|
|
44138
|
+
}), catchError((error) => of(saveRecordFailure({
|
|
44139
|
+
error,
|
|
44140
|
+
})))))));
|
|
44141
|
+
this.cleanRecordAttachments$ = createEffect(() => this.actions$.pipe(ofType(saveRecordSuccess), withLatestFrom$1(this.store.select(selectRecord)), switchMap$1(([_, record]) => {
|
|
44142
|
+
if (record.uniqueIdentifier !== null) {
|
|
44143
|
+
this.plateformService.cleanRecordAttachments(record).subscribe({
|
|
44144
|
+
next: (_) => undefined,
|
|
44145
|
+
error: (err) => {
|
|
44146
|
+
console.error(err);
|
|
44147
|
+
},
|
|
44148
|
+
});
|
|
44149
|
+
}
|
|
44150
|
+
return EMPTY;
|
|
44151
|
+
}), catchError((error) => {
|
|
44152
|
+
console.error(error);
|
|
44153
|
+
return EMPTY;
|
|
44154
|
+
})), { dispatch: false });
|
|
44155
|
+
this.markAsChanged$ = createEffect(() => this.actions$.pipe(ofType(updateRecordField, updateRecordLanguages), map$1(() => markRecordAsChanged())));
|
|
44156
|
+
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())));
|
|
44157
|
+
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({
|
|
44158
|
+
record,
|
|
44159
|
+
recordSource,
|
|
44160
|
+
}))));
|
|
44161
|
+
this.checkHasChangesOnOpen$ = createEffect(() => this.actions$.pipe(ofType(openRecord), map$1(({ record }) => this.recordsRepository.recordHasDraft(record.uniqueIdentifier)), filter((hasDraft) => hasDraft), map$1(() => markRecordAsChanged())));
|
|
44162
|
+
this.hasRecordChangedSinceDraft$ = createEffect(() => this.actions$.pipe(ofType(hasRecordChangedSinceDraft), switchMap$1(({ record }) => this.editorService
|
|
44163
|
+
.hasRecordChangedSinceDraft(record)
|
|
44164
|
+
.pipe(map$1((changes) => hasRecordChangedSinceDraftSuccess({ changes }))))));
|
|
44165
|
+
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({
|
|
44166
|
+
isPublished: isPublished$1,
|
|
44167
|
+
}))));
|
|
44168
|
+
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({
|
|
44169
|
+
canEditRecord: canEditRecord$1,
|
|
44170
|
+
}))));
|
|
44047
44171
|
}
|
|
44048
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type:
|
|
44049
|
-
static { this.ɵ
|
|
44050
|
-
provideIcons({
|
|
44051
|
-
iconoirSystemShut,
|
|
44052
|
-
iconoirBadgeCheck,
|
|
44053
|
-
}),
|
|
44054
|
-
provideNgIconsConfig({
|
|
44055
|
-
size: '1.25em',
|
|
44056
|
-
}),
|
|
44057
|
-
], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"flex flex-col h-full w-[302px] border-l border-gray-300 py-8 px-3 gap-3 overflow-auto\"\n style=\"background-color: #fafaf9\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.metadataQuality.title</span\n >\n </div>\n @for (properties of propertiesByPage; track properties; let i = $index) {\n <div class=\"flex flex-col gap-2\">\n @for (property of properties; track property) {\n <gn-ui-button\n [extraClass]=\"getExtraClass(property.value)\"\n type=\"outline\"\n attr.data-cy=\"md-quality-btn-{{ property.label }}\"\n >\n <span>{{ property.label | translate }}</span>\n <div class=\"flex flex-row gap-2 items-center\">\n @if (property.value) {\n <ng-icon class=\"text-primary\" name=\"iconoirBadgeCheck\"></ng-icon>\n } @else {\n <ng-icon\n class=\"text-neutral-300\"\n name=\"iconoirSystemShut\"\n ></ng-icon>\n }\n </div>\n </gn-ui-button>\n }\n @if (i !== propertiesByPage.length - 1) {\n <hr class=\"border-gray-300 w-11/12 mx-auto\" />\n }\n </div>\n }\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
|
|
44172
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
44173
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects }); }
|
|
44058
44174
|
}
|
|
44059
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type:
|
|
44060
|
-
type:
|
|
44061
|
-
|
|
44062
|
-
|
|
44063
|
-
|
|
44064
|
-
|
|
44065
|
-
|
|
44066
|
-
|
|
44067
|
-
|
|
44068
|
-
|
|
44069
|
-
|
|
44070
|
-
|
|
44071
|
-
|
|
44072
|
-
|
|
44073
|
-
|
|
44074
|
-
|
|
44075
|
-
|
|
44076
|
-
|
|
44077
|
-
|
|
44078
|
-
|
|
44079
|
-
}] } });
|
|
44175
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: EditorEffects, decorators: [{
|
|
44176
|
+
type: Injectable
|
|
44177
|
+
}] });
|
|
44178
|
+
|
|
44179
|
+
class FeatureEditorModule {
|
|
44180
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
44181
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, imports: [i1.StoreFeatureModule, i2$2.EffectsFeatureModule] }); }
|
|
44182
|
+
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),
|
|
44183
|
+
EffectsModule.forFeature([EditorEffects])] }); }
|
|
44184
|
+
}
|
|
44185
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImport: i0, type: FeatureEditorModule, decorators: [{
|
|
44186
|
+
type: NgModule,
|
|
44187
|
+
args: [{
|
|
44188
|
+
imports: [
|
|
44189
|
+
StoreModule.forFeature(EDITOR_FEATURE_KEY, editorReducer),
|
|
44190
|
+
EffectsModule.forFeature([EditorEffects]),
|
|
44191
|
+
],
|
|
44192
|
+
providers: [EditorFacade, provideHttpClient()],
|
|
44193
|
+
}]
|
|
44194
|
+
}] });
|
|
44080
44195
|
|
|
44081
44196
|
const ROUTER_STATE_KEY = 'router';
|
|
44082
44197
|
const ROUTER_ROUTE_SEARCH = 'search';
|
|
@@ -44349,6 +44464,23 @@ class RouterEffects {
|
|
|
44349
44464
|
}
|
|
44350
44465
|
return of(...actions);
|
|
44351
44466
|
})));
|
|
44467
|
+
/**
|
|
44468
|
+
* This effect is needed because on the page load, the search params from the URL are
|
|
44469
|
+
* directly applied to the underlying search facade; this means that it doesn't go
|
|
44470
|
+
* through the RouterSearchService which makes sure that a relevancy sort is applied
|
|
44471
|
+
* whenever there's a full text search criteria set.
|
|
44472
|
+
*/
|
|
44473
|
+
this.applyInitialRelevancySort$ = createEffect(() => this.facade.searchParams$.pipe(take(1), tap$1((filters) => {
|
|
44474
|
+
const relevancySort = sortByToString(SortByEnum.RELEVANCY);
|
|
44475
|
+
if (filters['q'] &&
|
|
44476
|
+
(!Array.isArray(filters['q']) || filters['q'].length > 0) &&
|
|
44477
|
+
!filters[ROUTE_PARAMS.SORT]) {
|
|
44478
|
+
this.facade.updateSearch({
|
|
44479
|
+
...filters,
|
|
44480
|
+
[ROUTE_PARAMS.SORT]: relevancySort,
|
|
44481
|
+
});
|
|
44482
|
+
}
|
|
44483
|
+
})), { dispatch: false });
|
|
44352
44484
|
/**
|
|
44353
44485
|
* This effect will load the metadata when a navigation to
|
|
44354
44486
|
* a metadata record happens
|
|
@@ -44449,8 +44581,10 @@ class RouterSearchService {
|
|
|
44449
44581
|
});
|
|
44450
44582
|
}
|
|
44451
44583
|
async setFilters(newFilters) {
|
|
44452
|
-
|
|
44584
|
+
let sortBy = await firstValueFrom(this.searchFacade.sortBy$);
|
|
44453
44585
|
const fieldSearchParams = await firstValueFrom(this.fieldsService.readFieldValuesFromFilters(newFilters));
|
|
44586
|
+
// apply relevancy sort if a full text criteria is given
|
|
44587
|
+
sortBy = newFilters['any'] ? SortByEnum.RELEVANCY : sortBy;
|
|
44454
44588
|
this.facade.setSearch({
|
|
44455
44589
|
...fieldSearchParams,
|
|
44456
44590
|
[ROUTE_PARAMS.SORT]: sortBy ? sortByToString(sortBy) : undefined,
|
|
@@ -44459,7 +44593,13 @@ class RouterSearchService {
|
|
|
44459
44593
|
async updateFilters(newFilters) {
|
|
44460
44594
|
const currentFilters = await firstValueFrom(this.searchFacade.searchFilters$);
|
|
44461
44595
|
const updatedFilters = { ...currentFilters, ...newFilters };
|
|
44462
|
-
|
|
44596
|
+
let newParams = await firstValueFrom(this.fieldsService.readFieldValuesFromFilters(updatedFilters));
|
|
44597
|
+
if (newFilters['any']) {
|
|
44598
|
+
newParams = {
|
|
44599
|
+
...newParams,
|
|
44600
|
+
[ROUTE_PARAMS.SORT]: sortByToString(SortByEnum.RELEVANCY),
|
|
44601
|
+
};
|
|
44602
|
+
}
|
|
44463
44603
|
this.facade.updateSearch(newParams);
|
|
44464
44604
|
}
|
|
44465
44605
|
setSortBy(sortBy) {
|
|
@@ -44513,11 +44653,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
44513
44653
|
args: ['gnUiSearchRouterContainer']
|
|
44514
44654
|
}] } });
|
|
44515
44655
|
|
|
44656
|
+
const CHART_TYPE_VALUES = [
|
|
44657
|
+
'bar',
|
|
44658
|
+
'bar-horizontal',
|
|
44659
|
+
'line',
|
|
44660
|
+
'line-interpolated',
|
|
44661
|
+
'scatter',
|
|
44662
|
+
'pie',
|
|
44663
|
+
];
|
|
44664
|
+
|
|
44516
44665
|
// This file contains everything that will be included in the NPM package!
|
|
44517
44666
|
|
|
44518
44667
|
/**
|
|
44519
44668
|
* Generated bundle index. Do not edit.
|
|
44520
44669
|
*/
|
|
44521
44670
|
|
|
44522
|
-
export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, ActionMenuComponent, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, ApplicationBannerComponent, AuthService, AutocompleteComponent, AvailableServicesField, AvatarComponent, AvatarServiceInterface, BASEMAP_LAYERS, BadgeComponent, BaseConverter, BaseFileReader, BaseReader, BlockListComponent, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CarouselComponent, CatalogTitleComponent, CellPopinComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ClearError, ClearResults, ColorScaleComponent, ConfirmationDialogComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_GN4_LOGIN_URL, DEFAULT_GN4_LOGOUT_URL, DEFAULT_GN4_SETTINGS_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DISABLE_AUTH, DO_NOT_USE_DEFAULT_BASEMAP, DataService, DataTableComponent, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangeDropdownComponent, DateRangeInputsComponent, DateRangePickerComponent, DateRangeSearchField, DateService, DcatApConverter, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EXTERNAL_VIEWER_OPEN_NEW_TAB, EXTERNAL_VIEWER_URL_TEMPLATE, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalLinkCardComponent, ExternalViewerButtonComponent, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FILTER_SUMMARY_IGNORE_LIST, FORMATS, FacetBlockComponent, FacetItemComponent, FacetListComponent, FacetsContainerComponent, FavoriteStarComponent, FavoritesService, FeatureCatalogListComponent, FeatureDetailComponent, FeatureEditorModule, FeatureMapModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileInputComponent, FileTranslateLoader, FilesDropDirective, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldDateComponent, FormFieldFileComponent, FormFieldKeywordsComponent, FormFieldLicenseComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentsComponent, FormFieldTopicsComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GEONETWORK_UI_TAG_NAME, GEONETWORK_UI_VERSION, GeoDataBadgeComponent, GeoTableViewComponent, GeocodingComponent, GeojsonReader, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GnUiHumanizeDateDirective, GpfApiDlComponent, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageInputComponent, ImageOverlayPreviewComponent, ImportRecordComponent, InlineFilterComponent, InteractiveTableColumnComponent, InteractiveTableComponent, InternalLinkCardComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, KindBadgeComponent, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LOGIN_URL, LOGOUT_URL, LONLAT_CRS_CODES, LanguageSwitcherComponent, LayersPanelComponent, LicenseSearchField, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_FEATURE_KEY, MAP_VIEW_CONSTRAINTS, METADATA_LANGUAGE, MapContainerComponent, MapFacade, MapLegendComponent, MapStateContainerComponent, MapStyleService, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataDoiComponent, MetadataInfoComponent, MetadataLinkType, MetadataMapperContext, MetadataQualityComponent, MetadataQualityItemComponent, MetadataQualityPanelComponent, ModalDialogComponent, MultilingualPanelComponent, MultilingualSearchField, MyOrgService, NAMESPACES, NOT_APPLICABLE_CONSTRAINT, NOT_KNOWN_CONSTRAINT, NotificationComponent, NotificationsContainerComponent, NotificationsService, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OrganizationsServiceInterface, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PaginationDotsComponent, PatchResultsAggregations, PlatformServiceInterface, PopoverComponent, PopupAlertComponent, PossibleResourceTypes, PossibleResourceTypesDefinition, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_DATASET_URL_TOKEN, RECORD_REUSE_URL_TOKEN, RECORD_SERVICE_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, ROUTER_ROUTE_REUSE, ROUTER_ROUTE_SEARCH, ROUTER_ROUTE_SERVICE, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordKindField, RecordMetaComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResourceTypeLegacyField, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsHitsSearchKindComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, ReusePresentationForms, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SETTINGS_URL, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchFeatureCatalogComponent, SearchFiltersSummaryComponent, SearchFiltersSummaryItemComponent, SearchInputComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, ServiceCapabilitiesComponent, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortableListComponent, SourceLabelComponent, SourcesService, SpatialExtentComponent, SpinningLoaderComponent, StacItemsResultGridComponent, StacViewComponent, StarToggleComponent, StickyHeaderComponent, SupportedTypes, SwitchToggleComponent, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEBUG_CONFIG, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslatedSearchField, TruncatedTextComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UpdateConfigAggregations, UpdateFilters, UrlInputComponent, UserFeedbackItemComponent, UserPreviewComponent, UserSearchField, VECTOR_STYLE_DEFAULT, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, XmlParseError, _reset, allChildrenElement, appConfigWithTranslationFixture, appendChildTree, appendChildren, assertValidXml, blockModelFixture, bytesToMegabytes, canEditRecord, checkFileFormat, clearSelectedFeatures, createChild, createDocument, createElement, createFuzzyFilter, createNestedChild, createNestedElement, currentPage, defaultMapStyleFixture, defaultMapStyleHlFixture, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, emptyBlockModelFixture, findChildElement, findChildOrCreate, findChildrenElement, findConverterForDocument, findNestedChildOrCreate, findNestedElement, findNestedElements, findParent, firstChildElement, formatDate, formatUserInfo, getAllKeysValidator, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryBoundingBox, getGeometryFromGeoJSON, getGlobalConfig, getIsMobile, getJsonDataItemsProxy, getLayers, getLinkId, getLinkLabel, getLinkPriority, getMapContext, getMapContextLayerFromConfig, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getNamespace, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getQualityValidators, getResourceType, getReusePresentationForm, getReuseType, getRootElement, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSelectedFeatures, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, handleScrollOnNavigation, hasRecordChangedSinceDraft, hasRecordChangedSinceDraftSuccess, initSearch, initialEditorState, initialMapState, initialState, isConfigLoaded, isDateRange, isFormatInQueryParam, isPublished, itemModelFixture, kindToCodeListValue, loadAppConfig, malformedConfigFixture, mapConfigFixture, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, matchesNoApplicableConstraint, matchesNoKnownConstraint, megabytesToBytes, mimeTypeToFormat, minimalAppConfigFixture, missingMandatoryConfigFixture, mouseWheelZoomCondition, noDuplicateFileName, okAppConfigFixture, openDataset, openRecord, organizationsServiceFactory, parse, parseXmlString, placeholder, prioritizePageScroll, propagateToDocumentOnly, provideGn4, provideI18n, provideRepositoryUrl, readAttribute, readDataset, readDatasetHeaders, readText, reducer$2 as reducer, reducerSearch, removeAllChildren, removeChildren, removeChildrenByName, removeSearchParams, removeWhitespace, renameElements, saveRecord, saveRecordFailure, saveRecordSuccess, selectCanEditRecord, selectCurrentPage, selectEditorConfig, selectEditorState, selectFallback, selectFallbackFields, selectField, selectHasRecordChanged, selectIsPublished, selectRecord, selectRecordChangedSinceSave, selectRecordSaveError, selectRecordSaving, selectRecordSections, selectRecordSource, selectTranslatedField, selectTranslatedValue, setContext, setCurrentPage, setFieldVisibility, setSelectedFeatures, setTextContent, someHabTableItemFixture, sortByFromString, sortByToString, sortByToStrings, stripHtml, stripNamespace, tableItemsFixture, toDate, toLang2, toLang3, totalPages, undoRecordDraft, unrecognizedKeysConfigFixture, updateLanguages, updateRecordField, updateRecordLanguages, wmsLayerFlatten, writeAttribute, wrongLanguageCodeConfigFixture, xmlToString };
|
|
44671
|
+
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, CHART_TYPE_VALUES, 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, RecordStatusValues, RecordsMetricsComponent, RecordsRepositoryInterface, RecordsService, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResourceTypeLegacyField, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsHitsSearchKindComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, ReusePresentationForms, RoleLabels, RoleValues, 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, SortByEnum, 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, updateFrequencyCodeValues, updateLanguages, updateRecordField, updateRecordLanguages, wmsLayerFlatten, writeAttribute, wrongLanguageCodeConfigFixture, xmlToString };
|
|
44523
44672
|
//# sourceMappingURL=geonetwork-ui.mjs.map
|