geonetwork-ui 2.8.0-dev.398701d7f → 2.8.0-dev.6ea037ab6

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.
Files changed (91) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/common/distribution.mapper.mjs +3 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +2 -1
  3. package/esm2022/libs/api/repository/src/lib/gn4/auth/auth.service.mjs +2 -2
  4. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +7 -3
  5. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +10 -10
  6. package/esm2022/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.mjs +3 -2
  7. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +2 -1
  8. package/esm2022/libs/common/domain/src/lib/model/search/sort-by.model.mjs +6 -1
  9. package/esm2022/libs/data-access/gn4/src/openapi/model/user.api.model.mjs +1 -1
  10. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +2 -1
  11. package/esm2022/libs/feature/router/src/lib/default/router.service.mjs +5 -1
  12. package/esm2022/libs/feature/router/src/lib/default/state/router.effects.mjs +9 -7
  13. package/esm2022/libs/feature/search/src/lib/sort-by/sort-by.component.mjs +8 -12
  14. package/esm2022/libs/ui/elements/src/lib/error/error.component.mjs +3 -3
  15. package/esm2022/libs/ui/elements/src/lib/external-link-card/external-link-card.component.mjs +11 -4
  16. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +3 -3
  17. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +2 -3
  18. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +3 -1
  19. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +12 -1
  20. package/esm2022/libs/util/shared/src/lib/services/proxy.service.mjs +9 -11
  21. package/esm2022/libs/util/shared/src/lib/utils/sort-by.mjs +9 -6
  22. package/esm2022/translations/de.json +6 -2
  23. package/esm2022/translations/en.json +7 -4
  24. package/esm2022/translations/es.json +6 -2
  25. package/esm2022/translations/fr.json +7 -3
  26. package/esm2022/translations/it.json +7 -3
  27. package/esm2022/translations/nl.json +6 -2
  28. package/esm2022/translations/pt.json +6 -2
  29. package/esm2022/translations/sk.json +6 -2
  30. package/fesm2022/geonetwork-ui.mjs +133 -69
  31. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  32. package/libs/api/metadata-converter/src/lib/common/distribution.mapper.d.ts.map +1 -1
  33. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  34. package/libs/api/repository/src/lib/gn4/auth/auth.service.d.ts.map +1 -1
  35. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  36. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +7 -7
  37. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  38. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts.map +1 -1
  39. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +1 -1
  40. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  41. package/libs/common/domain/src/lib/model/search/sort-by.model.d.ts.map +1 -1
  42. package/libs/data-access/gn4/src/openapi/model/user.api.model.d.ts +1 -1
  43. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  44. package/libs/feature/router/src/lib/default/router.service.d.ts +2 -0
  45. package/libs/feature/router/src/lib/default/router.service.d.ts.map +1 -1
  46. package/libs/feature/router/src/lib/default/state/router.effects.d.ts +3 -1
  47. package/libs/feature/router/src/lib/default/state/router.effects.d.ts.map +1 -1
  48. package/libs/feature/search/src/lib/sort-by/sort-by.component.d.ts +4 -3
  49. package/libs/feature/search/src/lib/sort-by/sort-by.component.d.ts.map +1 -1
  50. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  51. package/libs/ui/elements/src/lib/external-link-card/external-link-card.component.d.ts +3 -2
  52. package/libs/ui/elements/src/lib/external-link-card/external-link-card.component.d.ts.map +1 -1
  53. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
  54. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
  55. package/libs/util/shared/src/lib/links/link-utils.d.ts +6 -0
  56. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  57. package/libs/util/shared/src/lib/services/proxy.service.d.ts +5 -4
  58. package/libs/util/shared/src/lib/services/proxy.service.d.ts.map +1 -1
  59. package/libs/util/shared/src/lib/utils/sort-by.d.ts.map +1 -1
  60. package/package.json +2 -2
  61. package/src/libs/api/metadata-converter/src/lib/common/distribution.mapper.ts +1 -0
  62. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +1 -0
  63. package/src/libs/api/repository/src/lib/gn4/auth/auth.service.ts +4 -1
  64. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +12 -4
  65. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +37 -36
  66. package/src/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.ts +3 -2
  67. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +2 -0
  68. package/src/libs/common/domain/src/lib/model/search/sort-by.model.ts +5 -0
  69. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +9 -0
  70. package/src/libs/data-access/gn4/src/openapi/model/user.api.model.ts +1 -1
  71. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +1 -0
  72. package/src/libs/feature/router/src/lib/default/router.service.ts +8 -0
  73. package/src/libs/feature/router/src/lib/default/state/router.effects.ts +6 -7
  74. package/src/libs/feature/search/src/lib/sort-by/sort-by.component.ts +8 -12
  75. package/src/libs/ui/elements/src/lib/error/error.component.html +5 -1
  76. package/src/libs/ui/elements/src/lib/external-link-card/external-link-card.component.html +43 -22
  77. package/src/libs/ui/elements/src/lib/external-link-card/external-link-card.component.ts +12 -3
  78. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +2 -2
  79. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +4 -2
  80. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +2 -0
  81. package/src/libs/util/shared/src/lib/links/link-utils.ts +11 -0
  82. package/src/libs/util/shared/src/lib/services/proxy.service.ts +6 -2
  83. package/src/libs/util/shared/src/lib/utils/sort-by.ts +8 -5
  84. package/translations/de.json +6 -2
  85. package/translations/en.json +7 -4
  86. package/translations/es.json +6 -2
  87. package/translations/fr.json +7 -3
  88. package/translations/it.json +7 -3
  89. package/translations/nl.json +6 -2
  90. package/translations/pt.json +6 -2
  91. package/translations/sk.json +6 -2
@@ -15,7 +15,7 @@ import { TranslateCompiler, TranslateLoader, TranslateDefaultParser, TranslatePa
15
15
  import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler';
16
16
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
17
17
  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, distinctUntilChanged, debounceTime, finalize, throttleTime, first as first$1, pairwise as pairwise$1, share, defaultIfEmpty, toArray } from 'rxjs/operators';
18
- import { of, map as map$2, lastValueFrom, fromEvent, startWith, shareReplay, filter, pairwise, Subject, switchMap, 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
+ 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';
19
19
  import { lt, valid, coerce, satisfies, ltr } from 'semver';
20
20
  import chroma from 'chroma-js';
21
21
  import * as i1$2 from '@angular/common';
@@ -666,6 +666,8 @@ function matchProtocol(protocol) {
666
666
  return 'esriRest';
667
667
  if (/DOWNLOAD-1/i.test(protocol))
668
668
  return 'GPFDL';
669
+ if (/DB:POSTGIS/i.test(protocol))
670
+ return 'postgis';
669
671
  return 'other';
670
672
  }
671
673
  function matchMimeType(format) {
@@ -914,6 +916,7 @@ marker('record.metadata.api.accessServiceProtocol.ogcFeatures');
914
916
  marker('record.metadata.api.accessServiceProtocol.GPFDL');
915
917
  marker('record.metadata.api.accessServiceProtocol.tms');
916
918
  marker('record.metadata.api.accessServiceProtocol.maplibre-style');
919
+ marker('record.metadata.api.accessServiceProtocol.postgis');
917
920
  marker('record.metadata.api.accessServiceProtocol.other');
918
921
 
919
922
  function getUpdateFrequencyFromFrequencyCode(frequencyCode) {
@@ -19159,6 +19162,7 @@ var de = {
19159
19162
  "record.metadata.api.accessServiceProtocol.maplibre-style": "",
19160
19163
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "",
19161
19164
  "record.metadata.api.accessServiceProtocol.other": "",
19165
+ "record.metadata.api.accessServiceProtocol.postgis": "",
19162
19166
  "record.metadata.api.accessServiceProtocol.tms": "",
19163
19167
  "record.metadata.api.accessServiceProtocol.wfs": "",
19164
19168
  "record.metadata.api.accessServiceProtocol.wms": "",
@@ -19206,7 +19210,8 @@ var de = {
19206
19210
  "record.metadata.isGeographical": "Geographischer Datensatz",
19207
19211
  "record.metadata.keywords": "Stichworte",
19208
19212
  "record.metadata.languages": "Sprachen",
19209
- "record.metadata.lastUpdate": "Zuletzt aktualisiert am {date}",
19213
+ "record.metadata.link.postgis.table": "",
19214
+ "record.metadata.link.postgis.tooltip": "",
19210
19215
  "record.metadata.linked.datasets": "Verknüpfte Datensätze",
19211
19216
  "record.metadata.linked.records": "Verknüpfte Inhalte",
19212
19217
  "record.metadata.linked.reuses": "Verknüpfte Wiederverwendungen",
@@ -19247,6 +19252,9 @@ var de = {
19247
19252
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
19248
19253
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
19249
19254
  "record.metadata.related": "Entdecken Sie den Katalog",
19255
+ "record.metadata.resourceCreated": "Erstellt am {date}",
19256
+ "record.metadata.resourcePublished": "Veröffentlicht am {date}",
19257
+ "record.metadata.resourceUpdated": "Zuletzt aktualisiert am {date}",
19250
19258
  "record.metadata.ressources.and.links": "Ressourcen und Links",
19251
19259
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
19252
19260
  "record.metadata.status": "Status",
@@ -19283,7 +19291,6 @@ var de = {
19283
19291
  "results.records.hits.found": "{hits, plural, =0{Keine Ressource entsprechen der angegebenen Suche.} one{1 Ressource gefunden.} other{{hits} Ressourcen gefunden.}}",
19284
19292
  "results.records.hits.selected": "{ amount } ausgewählt",
19285
19293
  "results.showMore": "Mehr Ergebnisse anzeigen...",
19286
- "results.sortBy.changeDate": "",
19287
19294
  "results.sortBy.dateStamp": "Neueste",
19288
19295
  "results.sortBy.popularity": "Beliebtheit",
19289
19296
  "results.sortBy.qualityScore": "Fertigstellungsanzeige",
@@ -19634,7 +19641,6 @@ var en = {
19634
19641
  "editor.record.form.topics.inspire.intelligence": "Intelligence / Military",
19635
19642
  "editor.record.form.topics.inspire.location": "Location",
19636
19643
  "editor.record.form.topics.inspire.oceans": "Oceans",
19637
- "editor.record.form.topics.inspire.placeholder": "Select an INSPIRE theme",
19638
19644
  "editor.record.form.topics.inspire.planning": "Planning / Cadastre",
19639
19645
  "editor.record.form.topics.inspire.society": "Society",
19640
19646
  "editor.record.form.topics.inspire.structure": "Structure",
@@ -19812,6 +19818,7 @@ var en = {
19812
19818
  "record.metadata.api.accessServiceProtocol.maplibre-style": "maplibre-style",
19813
19819
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "ogcFeatures",
19814
19820
  "record.metadata.api.accessServiceProtocol.other": "other",
19821
+ "record.metadata.api.accessServiceProtocol.postgis": "PostGIS",
19815
19822
  "record.metadata.api.accessServiceProtocol.tms": "tms",
19816
19823
  "record.metadata.api.accessServiceProtocol.wfs": "wfs",
19817
19824
  "record.metadata.api.accessServiceProtocol.wms": "wms",
@@ -19859,7 +19866,8 @@ var en = {
19859
19866
  "record.metadata.isGeographical": "Geographical dataset",
19860
19867
  "record.metadata.keywords": "Keywords",
19861
19868
  "record.metadata.languages": "Languages",
19862
- "record.metadata.lastUpdate": "Last updated on {date}",
19869
+ "record.metadata.link.postgis.table": "table :",
19870
+ "record.metadata.link.postgis.tooltip": "PostGIS resources do not have access links",
19863
19871
  "record.metadata.linked.datasets": "Associated datasets",
19864
19872
  "record.metadata.linked.records": "Associated content",
19865
19873
  "record.metadata.linked.reuses": "Associated reuses",
@@ -19900,6 +19908,9 @@ var en = {
19900
19908
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
19901
19909
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
19902
19910
  "record.metadata.related": "Explore the catalog",
19911
+ "record.metadata.resourceCreated": "Created on {date}",
19912
+ "record.metadata.resourcePublished": "Published on {date}",
19913
+ "record.metadata.resourceUpdated": "Last updated on {date}",
19903
19914
  "record.metadata.ressources.and.links": "Resources and links",
19904
19915
  "record.metadata.sheet": "Original metadata",
19905
19916
  "record.metadata.status": "Status",
@@ -19936,7 +19947,6 @@ var en = {
19936
19947
  "results.records.hits.found": "{hits, plural, =0{No record match the specified search.} one{1 record found.} other{{hits} records found.}}",
19937
19948
  "results.records.hits.selected": "{ amount } selected",
19938
19949
  "results.showMore": "Show more results...",
19939
- "results.sortBy.changeDate": "Last modification",
19940
19950
  "results.sortBy.dateStamp": "Newest",
19941
19951
  "results.sortBy.popularity": "Popularity",
19942
19952
  "results.sortBy.qualityScore": "Completion score",
@@ -19947,7 +19957,7 @@ var en = {
19947
19957
  "search.error.organizationHasNoDataset": "This organization has no records yet.",
19948
19958
  "search.error.organizationNotFound": "This organization could not be found.",
19949
19959
  "search.error.receivedError": "An error was received",
19950
- "search.error.recordHasnolink": "This record currently has no link yet, please come back later.",
19960
+ "search.error.recordHasnolink": "This record currently has no link.",
19951
19961
  "search.error.recordNotFound": "The record with identifier \"{ id }\" could not be found.",
19952
19962
  "search.field.any.placeholder": "Search in the catalog ...",
19953
19963
  "search.field.sortBy": "Sort by:",
@@ -20464,6 +20474,7 @@ var es = {
20464
20474
  "record.metadata.api.accessServiceProtocol.maplibre-style": "",
20465
20475
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "",
20466
20476
  "record.metadata.api.accessServiceProtocol.other": "",
20477
+ "record.metadata.api.accessServiceProtocol.postgis": "",
20467
20478
  "record.metadata.api.accessServiceProtocol.tms": "",
20468
20479
  "record.metadata.api.accessServiceProtocol.wfs": "",
20469
20480
  "record.metadata.api.accessServiceProtocol.wms": "",
@@ -20511,7 +20522,8 @@ var es = {
20511
20522
  "record.metadata.isGeographical": "",
20512
20523
  "record.metadata.keywords": "",
20513
20524
  "record.metadata.languages": "",
20514
- "record.metadata.lastUpdate": "",
20525
+ "record.metadata.link.postgis.table": "",
20526
+ "record.metadata.link.postgis.tooltip": "",
20515
20527
  "record.metadata.linked.datasets": "",
20516
20528
  "record.metadata.linked.records": "",
20517
20529
  "record.metadata.linked.reuses": "",
@@ -20552,6 +20564,9 @@ var es = {
20552
20564
  "record.metadata.quality.updateFrequency.failed": "",
20553
20565
  "record.metadata.quality.updateFrequency.success": "",
20554
20566
  "record.metadata.related": "",
20567
+ "record.metadata.resourceCreated": "",
20568
+ "record.metadata.resourcePublished": "",
20569
+ "record.metadata.resourceUpdated": "",
20555
20570
  "record.metadata.ressources.and.links": "Recursos y enlaces",
20556
20571
  "record.metadata.sheet": "",
20557
20572
  "record.metadata.status": "",
@@ -20588,7 +20603,6 @@ var es = {
20588
20603
  "results.records.hits.found": "",
20589
20604
  "results.records.hits.selected": "",
20590
20605
  "results.showMore": "",
20591
- "results.sortBy.changeDate": "",
20592
20606
  "results.sortBy.dateStamp": "",
20593
20607
  "results.sortBy.popularity": "",
20594
20608
  "results.sortBy.qualityScore": "",
@@ -21116,6 +21130,7 @@ var fr = {
21116
21130
  "record.metadata.api.accessServiceProtocol.maplibre-style": "",
21117
21131
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "",
21118
21132
  "record.metadata.api.accessServiceProtocol.other": "autre",
21133
+ "record.metadata.api.accessServiceProtocol.postgis": "PostGIS",
21119
21134
  "record.metadata.api.accessServiceProtocol.tms": "",
21120
21135
  "record.metadata.api.accessServiceProtocol.wfs": "",
21121
21136
  "record.metadata.api.accessServiceProtocol.wms": "",
@@ -21163,7 +21178,8 @@ var fr = {
21163
21178
  "record.metadata.isGeographical": "Donnée géographique",
21164
21179
  "record.metadata.keywords": "Mots-clés",
21165
21180
  "record.metadata.languages": "Langues",
21166
- "record.metadata.lastUpdate": "Mis à jour le {date}",
21181
+ "record.metadata.link.postgis.table": "table :",
21182
+ "record.metadata.link.postgis.tooltip": "Les ressources de type PostGIS n'ont pas de lien d'accès",
21167
21183
  "record.metadata.linked.datasets": "Jeux de données associés",
21168
21184
  "record.metadata.linked.records": "Contenus associés",
21169
21185
  "record.metadata.linked.reuses": "Réutilisations associées",
@@ -21204,6 +21220,9 @@ var fr = {
21204
21220
  "record.metadata.quality.updateFrequency.failed": "La fréquence de mise à jour n'est pas renseignée",
21205
21221
  "record.metadata.quality.updateFrequency.success": "La fréquence de mise à jour est renseignée",
21206
21222
  "record.metadata.related": "Explorez le catalogue",
21223
+ "record.metadata.resourceCreated": "Créé le {date}",
21224
+ "record.metadata.resourcePublished": "Publié le {date}",
21225
+ "record.metadata.resourceUpdated": "Mis à jour le {date}",
21207
21226
  "record.metadata.ressources.and.links": "Ressources et liens",
21208
21227
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
21209
21228
  "record.metadata.status": "Statut",
@@ -21240,7 +21259,6 @@ var fr = {
21240
21259
  "results.records.hits.found": "{hits, plural, =0{Aucune correspondance.} one{1 ressource trouvée.} other{{hits} ressources.}}",
21241
21260
  "results.records.hits.selected": "{amount, plural, one{1 selectionné} other{{ amount } sélectionnés}}",
21242
21261
  "results.showMore": "Plus de résultats...",
21243
- "results.sortBy.changeDate": "Dernière modification",
21244
21262
  "results.sortBy.dateStamp": "Plus récent",
21245
21263
  "results.sortBy.popularity": "Popularité",
21246
21264
  "results.sortBy.qualityScore": "Indicateur de complétion",
@@ -21251,7 +21269,7 @@ var fr = {
21251
21269
  "search.error.organizationHasNoDataset": "Cette organisation n'a pas encore de ressources.",
21252
21270
  "search.error.organizationNotFound": "L'organisation n'a pas pu être trouvée.",
21253
21271
  "search.error.receivedError": "Erreur retournée",
21254
- "search.error.recordHasnolink": "Cette ressource n'a pas encore de lien, réessayez plus tard s'il vous plaît.",
21272
+ "search.error.recordHasnolink": "Cette ressource n'a actuellement aucun lien.",
21255
21273
  "search.error.recordNotFound": "La ressource dont l'identifiant est \"{ id }\" n'a pas pu être trouvée.",
21256
21274
  "search.field.any.placeholder": "Rechercher dans le catalogue...",
21257
21275
  "search.field.sortBy": "Trier par :",
@@ -21768,6 +21786,7 @@ var it = {
21768
21786
  "record.metadata.api.accessServiceProtocol.maplibre-style": "",
21769
21787
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "",
21770
21788
  "record.metadata.api.accessServiceProtocol.other": "",
21789
+ "record.metadata.api.accessServiceProtocol.postgis": "",
21771
21790
  "record.metadata.api.accessServiceProtocol.tms": "",
21772
21791
  "record.metadata.api.accessServiceProtocol.wfs": "",
21773
21792
  "record.metadata.api.accessServiceProtocol.wms": "",
@@ -21815,7 +21834,8 @@ var it = {
21815
21834
  "record.metadata.isGeographical": "Dati geografici",
21816
21835
  "record.metadata.keywords": "Parole chiave",
21817
21836
  "record.metadata.languages": "Lingue",
21818
- "record.metadata.lastUpdate": "Ultimo aggiornamento il {date}",
21837
+ "record.metadata.link.postgis.table": "",
21838
+ "record.metadata.link.postgis.tooltip": "",
21819
21839
  "record.metadata.linked.datasets": "",
21820
21840
  "record.metadata.linked.records": "",
21821
21841
  "record.metadata.linked.reuses": "",
@@ -21856,6 +21876,9 @@ var it = {
21856
21876
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
21857
21877
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
21858
21878
  "record.metadata.related": "Vedi anche",
21879
+ "record.metadata.resourceCreated": "Creato il {date}",
21880
+ "record.metadata.resourcePublished": "Pubblicato il {date}",
21881
+ "record.metadata.resourceUpdated": "Ultimo aggiornamento il {date}",
21859
21882
  "record.metadata.ressources.and.links": "Risorse e collegamenti",
21860
21883
  "record.metadata.sheet": "Origine del metadata",
21861
21884
  "record.metadata.status": "Stato",
@@ -21892,7 +21915,6 @@ var it = {
21892
21915
  "results.records.hits.found": "{hits, plural, =0{Nessuna corrispondenza.} one{1 record trovato.} other{{hits} risultati.}}",
21893
21916
  "results.records.hits.selected": "{amount, plural, one{1 selezionato} other{{ amount } selezionati}}",
21894
21917
  "results.showMore": "Altri risultati...",
21895
- "results.sortBy.changeDate": "Ultima modifica",
21896
21918
  "results.sortBy.dateStamp": "Più recente",
21897
21919
  "results.sortBy.popularity": "Popolarità",
21898
21920
  "results.sortBy.qualityScore": "Indicatore di completamento",
@@ -21903,7 +21925,7 @@ var it = {
21903
21925
  "search.error.organizationHasNoDataset": "Questa organizzazione non ha ancora records.",
21904
21926
  "search.error.organizationNotFound": "Impossibile trovare l'organizzazione.",
21905
21927
  "search.error.receivedError": "Errore restituito",
21906
- "search.error.recordHasnolink": "Questo record non ha ancora alcun collegamento, riprova più tardi.",
21928
+ "search.error.recordHasnolink": "Questo record non ha attualmente alcun collegamento.",
21907
21929
  "search.error.recordNotFound": "Impossibile trovare questi record.",
21908
21930
  "search.field.any.placeholder": "Cerca del catalogo...",
21909
21931
  "search.field.sortBy": "Ordina per:",
@@ -22420,6 +22442,7 @@ var nl = {
22420
22442
  "record.metadata.api.accessServiceProtocol.maplibre-style": "",
22421
22443
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "",
22422
22444
  "record.metadata.api.accessServiceProtocol.other": "",
22445
+ "record.metadata.api.accessServiceProtocol.postgis": "",
22423
22446
  "record.metadata.api.accessServiceProtocol.tms": "",
22424
22447
  "record.metadata.api.accessServiceProtocol.wfs": "",
22425
22448
  "record.metadata.api.accessServiceProtocol.wms": "",
@@ -22467,7 +22490,8 @@ var nl = {
22467
22490
  "record.metadata.isGeographical": "",
22468
22491
  "record.metadata.keywords": "",
22469
22492
  "record.metadata.languages": "",
22470
- "record.metadata.lastUpdate": "",
22493
+ "record.metadata.link.postgis.table": "",
22494
+ "record.metadata.link.postgis.tooltip": "",
22471
22495
  "record.metadata.linked.datasets": "",
22472
22496
  "record.metadata.linked.records": "",
22473
22497
  "record.metadata.linked.reuses": "",
@@ -22508,6 +22532,9 @@ var nl = {
22508
22532
  "record.metadata.quality.updateFrequency.failed": "",
22509
22533
  "record.metadata.quality.updateFrequency.success": "",
22510
22534
  "record.metadata.related": "",
22535
+ "record.metadata.resourceCreated": "",
22536
+ "record.metadata.resourcePublished": "",
22537
+ "record.metadata.resourceUpdated": "",
22511
22538
  "record.metadata.ressources.and.links": "Bronnen en links",
22512
22539
  "record.metadata.sheet": "",
22513
22540
  "record.metadata.status": "",
@@ -22544,7 +22571,6 @@ var nl = {
22544
22571
  "results.records.hits.found": "",
22545
22572
  "results.records.hits.selected": "",
22546
22573
  "results.showMore": "",
22547
- "results.sortBy.changeDate": "",
22548
22574
  "results.sortBy.dateStamp": "",
22549
22575
  "results.sortBy.popularity": "",
22550
22576
  "results.sortBy.qualityScore": "",
@@ -23072,6 +23098,7 @@ var pt = {
23072
23098
  "record.metadata.api.accessServiceProtocol.maplibre-style": "",
23073
23099
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "",
23074
23100
  "record.metadata.api.accessServiceProtocol.other": "",
23101
+ "record.metadata.api.accessServiceProtocol.postgis": "",
23075
23102
  "record.metadata.api.accessServiceProtocol.tms": "",
23076
23103
  "record.metadata.api.accessServiceProtocol.wfs": "",
23077
23104
  "record.metadata.api.accessServiceProtocol.wms": "",
@@ -23119,7 +23146,8 @@ var pt = {
23119
23146
  "record.metadata.isGeographical": "",
23120
23147
  "record.metadata.keywords": "",
23121
23148
  "record.metadata.languages": "",
23122
- "record.metadata.lastUpdate": "",
23149
+ "record.metadata.link.postgis.table": "",
23150
+ "record.metadata.link.postgis.tooltip": "",
23123
23151
  "record.metadata.linked.datasets": "",
23124
23152
  "record.metadata.linked.records": "",
23125
23153
  "record.metadata.linked.reuses": "",
@@ -23160,6 +23188,9 @@ var pt = {
23160
23188
  "record.metadata.quality.updateFrequency.failed": "",
23161
23189
  "record.metadata.quality.updateFrequency.success": "",
23162
23190
  "record.metadata.related": "",
23191
+ "record.metadata.resourceCreated": "",
23192
+ "record.metadata.resourcePublished": "",
23193
+ "record.metadata.resourceUpdated": "",
23163
23194
  "record.metadata.ressources.and.links": "Recursos e links",
23164
23195
  "record.metadata.sheet": "",
23165
23196
  "record.metadata.status": "",
@@ -23196,7 +23227,6 @@ var pt = {
23196
23227
  "results.records.hits.found": "",
23197
23228
  "results.records.hits.selected": "",
23198
23229
  "results.showMore": "",
23199
- "results.sortBy.changeDate": "",
23200
23230
  "results.sortBy.dateStamp": "",
23201
23231
  "results.sortBy.popularity": "",
23202
23232
  "results.sortBy.qualityScore": "",
@@ -23724,6 +23754,7 @@ var sk = {
23724
23754
  "record.metadata.api.accessServiceProtocol.maplibre-style": "",
23725
23755
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "",
23726
23756
  "record.metadata.api.accessServiceProtocol.other": "",
23757
+ "record.metadata.api.accessServiceProtocol.postgis": "",
23727
23758
  "record.metadata.api.accessServiceProtocol.tms": "",
23728
23759
  "record.metadata.api.accessServiceProtocol.wfs": "",
23729
23760
  "record.metadata.api.accessServiceProtocol.wms": "",
@@ -23771,7 +23802,8 @@ var sk = {
23771
23802
  "record.metadata.isGeographical": "Súbor geografických údajov",
23772
23803
  "record.metadata.keywords": "Kľúčové slová",
23773
23804
  "record.metadata.languages": "",
23774
- "record.metadata.lastUpdate": "Posledná aktualizácia",
23805
+ "record.metadata.link.postgis.table": "",
23806
+ "record.metadata.link.postgis.tooltip": "",
23775
23807
  "record.metadata.linked.datasets": "",
23776
23808
  "record.metadata.linked.records": "",
23777
23809
  "record.metadata.linked.reuses": "",
@@ -23812,6 +23844,9 @@ var sk = {
23812
23844
  "record.metadata.quality.updateFrequency.failed": "Frekvencia aktualizácie nie je určená",
23813
23845
  "record.metadata.quality.updateFrequency.success": "Frekvencia aktualizácie je určená",
23814
23846
  "record.metadata.related": "Súvisiace záznamy",
23847
+ "record.metadata.resourceCreated": "",
23848
+ "record.metadata.resourcePublished": "",
23849
+ "record.metadata.resourceUpdated": "",
23815
23850
  "record.metadata.ressources.and.links": "Prostředky a odkazy",
23816
23851
  "record.metadata.sheet": "Ďalšie metadáta sú k dispozícii na:",
23817
23852
  "record.metadata.status": "Stav",
@@ -23848,7 +23883,6 @@ var sk = {
23848
23883
  "results.records.hits.found": "{hits, plural, =0{Žiadne dokumenty nezodpovedajú zadanému vyhľadávaniu.} one{1 záznam nájdený.} other{{hits} záznamov nájdených.}}",
23849
23884
  "results.records.hits.selected": "{ amount } označených",
23850
23885
  "results.showMore": "Zobraziť viac výsledkov...",
23851
- "results.sortBy.changeDate": "",
23852
23886
  "results.sortBy.dateStamp": "Najnovšie",
23853
23887
  "results.sortBy.popularity": "Popularita",
23854
23888
  "results.sortBy.qualityScore": "Indikátor dokončenia",
@@ -24337,6 +24371,7 @@ class Gn4FieldMapper {
24337
24371
  /^OGC:WMTS/.test(protocol) ||
24338
24372
  /TMS/i.test(protocol) ||
24339
24373
  /ogc\W*api\W*features/i.test(protocol) ||
24374
+ /^DB:POSTGIS/i.test(protocol) ||
24340
24375
  (/^WWW:DOWNLOAD-/.test(protocol) && /data.geopf.fr/.test(url)) // TO DO : change with the good protocol when decided
24341
24376
  ) {
24342
24377
  return 'service';
@@ -24607,8 +24642,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
24607
24642
 
24608
24643
  const PROXY_PATH = new InjectionToken('proxyPath');
24609
24644
  class ProxyService {
24610
- constructor(proxyPath, location) {
24611
- this.proxyPath = proxyPath;
24645
+ get proxyPath() {
24646
+ return this.injector.get(PROXY_PATH, null);
24647
+ }
24648
+ constructor(injector, location) {
24649
+ this.injector = injector;
24612
24650
  this.location = location;
24613
24651
  }
24614
24652
  /**
@@ -24631,7 +24669,7 @@ class ProxyService {
24631
24669
  return url;
24632
24670
  return new URL(`${this.proxyPath}${encodeURIComponent(url)}`, window.location.href).toString();
24633
24671
  }
24634
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProxyService, deps: [{ token: PROXY_PATH, optional: true }, { token: i1$2.Location }], target: i0.ɵɵFactoryTarget.Injectable }); }
24672
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProxyService, deps: [{ token: i0.Injector }, { token: i1$2.Location }], target: i0.ɵɵFactoryTarget.Injectable }); }
24635
24673
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProxyService, providedIn: 'root' }); }
24636
24674
  }
24637
24675
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProxyService, decorators: [{
@@ -24639,12 +24677,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
24639
24677
  args: [{
24640
24678
  providedIn: 'root',
24641
24679
  }]
24642
- }], ctorParameters: () => [{ type: undefined, decorators: [{
24643
- type: Optional
24644
- }, {
24645
- type: Inject,
24646
- args: [PROXY_PATH]
24647
- }] }, { type: i1$2.Location }] });
24680
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: i1$2.Location }] });
24648
24681
 
24649
24682
  class DateService {
24650
24683
  constructor(translateService) {
@@ -24983,13 +25016,16 @@ function sortByToStrings(sortBy) {
24983
25016
  return array.map((param) => `${param[0] === 'desc' ? '-' : ''}${param[1]}`);
24984
25017
  }
24985
25018
  function sortByToString(sortBy) {
24986
- return sortByToStrings(sortBy)[0];
25019
+ return sortByToStrings(sortBy).join(',');
24987
25020
  }
24988
25021
  function sortByFromString(sortByString) {
24989
- return [
24990
- sortByString.startsWith('-') ? 'desc' : 'asc',
24991
- sortByString.startsWith('-') ? sortByString.substring(1) : sortByString,
24992
- ];
25022
+ const fields = sortByString
25023
+ .split(',')
25024
+ .map((field) => [
25025
+ field.startsWith('-') ? 'desc' : 'asc',
25026
+ field.startsWith('-') ? field.substring(1) : field,
25027
+ ]);
25028
+ return fields.length > 1 ? fields : fields[0];
24993
25029
  }
24994
25030
 
24995
25031
  const stripHtml = function (html) {
@@ -25187,6 +25223,12 @@ const FORMATS = {
25187
25223
  color: '#5A9E6F',
25188
25224
  mimeTypes: ['image/webp'],
25189
25225
  },
25226
+ postgis: {
25227
+ extensions: ['postgis'],
25228
+ priority: 18,
25229
+ color: '#336791',
25230
+ mimeTypes: [],
25231
+ },
25190
25232
  };
25191
25233
  function getFormatPriority(linkFormat) {
25192
25234
  for (const format in FORMATS) {
@@ -25217,6 +25259,11 @@ function getFileFormatFromServiceOutput(serviceOutput) {
25217
25259
  return null;
25218
25260
  }
25219
25261
  function getFileFormat(link) {
25262
+ if ('accessServiceProtocol' in link) {
25263
+ if (link.accessServiceProtocol in FORMATS) {
25264
+ return link.accessServiceProtocol;
25265
+ }
25266
+ }
25220
25267
  if ('mimeType' in link) {
25221
25268
  const mimeTypeFormat = mimeTypeToFormat(link.mimeType);
25222
25269
  if (mimeTypeFormat !== null) {
@@ -25382,6 +25429,8 @@ class LinkClassifierService {
25382
25429
  return [LinkUsage.API, LinkUsage.DOWNLOAD, LinkUsage.GEODATA];
25383
25430
  case 'GPFDL':
25384
25431
  return [LinkUsage.API];
25432
+ case 'postgis':
25433
+ return [LinkUsage.UNKNOWN];
25385
25434
  default:
25386
25435
  return [LinkUsage.UNKNOWN];
25387
25436
  }
@@ -25445,7 +25494,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25445
25494
  }] } });
25446
25495
 
25447
25496
  var name = "geonetwork-ui";
25448
- var version = "2.8.0-dev.398701d7f";
25497
+ var version = "2.8.0-dev.6ea037ab6";
25449
25498
  var engines = {
25450
25499
  node: ">=20"
25451
25500
  };
@@ -25485,7 +25534,7 @@ var peerDependencies = {
25485
25534
  };
25486
25535
  var dependencies = {
25487
25536
  "@biesbjerg/ngx-translate-extract-marker": "~1.0.0",
25488
- "@camptocamp/ogc-client": "^1.3.0",
25537
+ "@camptocamp/ogc-client": "1.3.1-dev.edb3244",
25489
25538
  "@geospatial-sdk/core": "0.0.5-dev.37",
25490
25539
  "@geospatial-sdk/geocoding": "0.0.5-dev.37",
25491
25540
  "@geospatial-sdk/legend": "0.0.5-dev.37",
@@ -26197,7 +26246,7 @@ class Gn4SettingsService {
26197
26246
  this.apiVersion$ = this.getSettingsSetValueByKey('system/platform/version');
26198
26247
  }
26199
26248
  getSettingsSetValueByKey(key) {
26200
- return this.siteApiService.getSettingsSet(null, [key]).pipe(map$1((v) => v[key]), shareReplay$1({ bufferSize: 1, refCount: true }));
26249
+ return of(true).pipe(switchMap(() => this.siteApiService.getSettingsSet(null, [key])), map$1((v) => v[key]), shareReplay$1({ bufferSize: 1, refCount: true }));
26201
26250
  }
26202
26251
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, deps: [{ token: SiteApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
26203
26252
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, providedIn: 'root' }); }
@@ -26824,7 +26873,7 @@ class AuthService {
26824
26873
  baseUrl = baseUrl.replace('?', '&');
26825
26874
  }
26826
26875
  return baseUrl
26827
- .replace('${current_url}', new URL(this.location.path(), window.location.href).toString())
26876
+ .replace('${current_url}', new URL(this.location.prepareExternalUrl(this.location.path()), window.location.href).toString())
26828
26877
  .replace('${lang2}', toLang2(this.translateService.currentLang))
26829
26878
  .replace('${lang3}', toLang3(this.translateService.currentLang));
26830
26879
  }
@@ -27025,8 +27074,12 @@ class Gn4PlatformMapper {
27025
27074
  userFromApi(apiUser) {
27026
27075
  if (!apiUser)
27027
27076
  return null;
27028
- const { enabled, emailAddresses, organization, kind, lastLoginDate, accountNonExpired, accountNonLocked, id, credentialsNonExpired, ...user } = apiUser;
27029
- return { ...apiUser, id: id.toString() };
27077
+ const { addresses, emailAddresses, enabled, id, kind, lastLoginDate, security, primaryAddress, authorities, accountNonExpired, accountNonLocked, credentialsNonExpired, ...user } = apiUser;
27078
+ return {
27079
+ ...user,
27080
+ id: id.toString(),
27081
+ email: emailAddresses ? emailAddresses[0] || '' : '',
27082
+ };
27030
27083
  }
27031
27084
  keywordsFromApi(keywords, thesaurus, lang3) {
27032
27085
  return keywords.map((keyword) => {
@@ -27132,6 +27185,9 @@ class Gn4PlatformService {
27132
27185
  console.warn('Error while loading gnui language package');
27133
27186
  return of({});
27134
27187
  }), shareReplay$1(1));
27188
+ this.me$ = this.disableAuth
27189
+ ? of(null)
27190
+ : of(true).pipe(switchMap(() => this.meApi.getMe()), switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)), shareReplay$1({ bufferSize: 1, refCount: true }));
27135
27191
  /**
27136
27192
  * A map of already loaded thesauri (groups of keywords); the key is a URI
27137
27193
  * @private
@@ -27142,9 +27198,6 @@ class Gn4PlatformService {
27142
27198
  .pipe(map$1((thesaurus) => {
27143
27199
  return thesaurus[0];
27144
27200
  }), shareReplay$1(1));
27145
- this.me$ = this.disableAuth
27146
- ? of(null)
27147
- : this.meApi.getMe().pipe(switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)), shareReplay$1({ bufferSize: 1, refCount: true }));
27148
27201
  this.isUserAnonymous$ = this.me$.pipe(map$1((user) => !user || !('id' in user)));
27149
27202
  this.users$ = this.usersApi.getUsers().pipe(map$1((users) => users.map((user) => this.mapper.userFromApi(user))), shareReplay$1());
27150
27203
  }
@@ -29757,8 +29810,7 @@ class DropdownSelectorComponent {
29757
29810
  ];
29758
29811
  }
29759
29812
  get selectedChoice() {
29760
- return (this.choices.find((choice) => choice.value === this.selected) ??
29761
- this.choices[0]);
29813
+ return (this.choices.find((choice) => JSON.stringify(choice.value) === JSON.stringify(this.selected)) ?? this.choices[0]);
29762
29814
  }
29763
29815
  get id() {
29764
29816
  return this.title.toLowerCase().replace(/[^a-z]+/g, '-');
@@ -33238,7 +33290,7 @@ class ErrorComponent {
33238
33290
  this.types = ErrorType;
33239
33291
  }
33240
33292
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ErrorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
33241
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ErrorComponent, isStandalone: true, selector: "gn-ui-error", inputs: { type: "type", error: "error", recordId: "recordId" }, ngImport: i0, template: "<div\n class=\"p-[1.7em] bg-red-50 text-red-800 text-[1.5em] text-center rounded-lg\"\n>\n <div\n *ngIf=\"type === types.COULD_NOT_REACH_API\"\n data-test=\"could-not-reach-api-error\"\n >\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matFace\" class=\"face\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"question-mark1\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"question-mark2\"></ng-icon>\n </div>\n <div translate>search.error.couldNotReachApi</div>\n </div>\n <div\n *ngIf=\"type === types.DATASET_HAS_NO_LINK\"\n data-test=\"dataset-has-no-link-error\"\n >\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matComputerOutline\"></ng-icon>\n </div>\n <div translate>search.error.recordHasnolink</div>\n </div>\n <div *ngIf=\"type === types.RECEIVED_ERROR\" data-test=\"received-error-error\">\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matMoodBad\" class=\"face\"></ng-icon>\n </div>\n <div translate>search.error.receivedError</div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n <div *ngIf=\"type === types.ORGANIZATION_HAS_NO_DATASET\">\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matComputerOutline\" class=\"computer\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"computer-question-mark\"> </ng-icon>\n </div>\n <div translate>search.error.organizationHasNoDataset</div>\n </div>\n <div\n *ngIf=\"type === types.RECORD_NOT_FOUND\"\n data-test=\"record-not-found-error\"\n >\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matComputerOutline\" class=\"computer\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"computer-question-mark\"> </ng-icon>\n </div>\n <div translate [translateParams]=\"{ id: recordId }\">\n search.error.recordNotFound\n </div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n <div\n *ngIf=\"type === types.ORGANIZATION_NOT_FOUND\"\n data-test=\"org-not-found-error\"\n >\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matComputerOutline\" class=\"computer\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"computer-question-mark\"> </ng-icon>\n </div>\n <div translate [translateParams]=\"{ id: recordId }\">\n search.error.organizationNotFound\n </div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n</div>\n", styles: ["ng-icon{width:5rem;height:5rem}ng-icon.face{width:3em;height:3em}ng-icon.question-mark1{position:absolute;bottom:1.9em;left:calc(50% + 1.2em);width:1.7em;height:1.7em}ng-icon.question-mark2{position:absolute;bottom:2.3em;left:calc(50% + 2.3em);width:1.4em;height:1.4em}ng-icon.computer{width:3em;height:3em}ng-icon.computer-question-mark{position:absolute;top:.7em;left:calc(50% - .6em);width:1.2em;height:1.2em}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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: [
33293
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ErrorComponent, isStandalone: true, selector: "gn-ui-error", inputs: { type: "type", error: "error", recordId: "recordId" }, ngImport: i0, template: "<div\n class=\"p-[1.7em] text-[1.5em] text-center rounded-lg\"\n [ngClass]=\"{\n 'bg-red-50 text-red-800': type !== types.DATASET_HAS_NO_LINK,\n 'bg-gray-100 text-black': type === types.DATASET_HAS_NO_LINK,\n }\"\n>\n <div\n *ngIf=\"type === types.COULD_NOT_REACH_API\"\n data-test=\"could-not-reach-api-error\"\n >\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matFace\" class=\"face\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"question-mark1\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"question-mark2\"></ng-icon>\n </div>\n <div translate>search.error.couldNotReachApi</div>\n </div>\n <div\n *ngIf=\"type === types.DATASET_HAS_NO_LINK\"\n data-test=\"dataset-has-no-link-error\"\n >\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matComputerOutline\"></ng-icon>\n </div>\n <div translate>search.error.recordHasnolink</div>\n </div>\n <div *ngIf=\"type === types.RECEIVED_ERROR\" data-test=\"received-error-error\">\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matMoodBad\" class=\"face\"></ng-icon>\n </div>\n <div translate>search.error.receivedError</div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n <div *ngIf=\"type === types.ORGANIZATION_HAS_NO_DATASET\">\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matComputerOutline\" class=\"computer\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"computer-question-mark\"> </ng-icon>\n </div>\n <div translate>search.error.organizationHasNoDataset</div>\n </div>\n <div\n *ngIf=\"type === types.RECORD_NOT_FOUND\"\n data-test=\"record-not-found-error\"\n >\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matComputerOutline\" class=\"computer\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"computer-question-mark\"> </ng-icon>\n </div>\n <div translate [translateParams]=\"{ id: recordId }\">\n search.error.recordNotFound\n </div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n <div\n *ngIf=\"type === types.ORGANIZATION_NOT_FOUND\"\n data-test=\"org-not-found-error\"\n >\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matComputerOutline\" class=\"computer\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"computer-question-mark\"> </ng-icon>\n </div>\n <div translate [translateParams]=\"{ id: recordId }\">\n search.error.organizationNotFound\n </div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n</div>\n", styles: ["ng-icon{width:5rem;height:5rem}ng-icon.face{width:3em;height:3em}ng-icon.question-mark1{position:absolute;bottom:1.9em;left:calc(50% + 1.2em);width:1.7em;height:1.7em}ng-icon.question-mark2{position:absolute;bottom:2.3em;left:calc(50% + 2.3em);width:1.4em;height:1.4em}ng-icon.computer{width:3em;height:3em}ng-icon.computer-question-mark{position:absolute;top:.7em;left:calc(50% - .6em);width:1.2em;height:1.2em}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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: [
33242
33294
  provideIcons({
33243
33295
  matFace,
33244
33296
  matQuestionMark,
@@ -33256,7 +33308,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
33256
33308
  matMoodBad,
33257
33309
  matComputerOutline,
33258
33310
  }),
33259
- ], template: "<div\n class=\"p-[1.7em] bg-red-50 text-red-800 text-[1.5em] text-center rounded-lg\"\n>\n <div\n *ngIf=\"type === types.COULD_NOT_REACH_API\"\n data-test=\"could-not-reach-api-error\"\n >\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matFace\" class=\"face\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"question-mark1\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"question-mark2\"></ng-icon>\n </div>\n <div translate>search.error.couldNotReachApi</div>\n </div>\n <div\n *ngIf=\"type === types.DATASET_HAS_NO_LINK\"\n data-test=\"dataset-has-no-link-error\"\n >\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matComputerOutline\"></ng-icon>\n </div>\n <div translate>search.error.recordHasnolink</div>\n </div>\n <div *ngIf=\"type === types.RECEIVED_ERROR\" data-test=\"received-error-error\">\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matMoodBad\" class=\"face\"></ng-icon>\n </div>\n <div translate>search.error.receivedError</div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n <div *ngIf=\"type === types.ORGANIZATION_HAS_NO_DATASET\">\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matComputerOutline\" class=\"computer\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"computer-question-mark\"> </ng-icon>\n </div>\n <div translate>search.error.organizationHasNoDataset</div>\n </div>\n <div\n *ngIf=\"type === types.RECORD_NOT_FOUND\"\n data-test=\"record-not-found-error\"\n >\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matComputerOutline\" class=\"computer\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"computer-question-mark\"> </ng-icon>\n </div>\n <div translate [translateParams]=\"{ id: recordId }\">\n search.error.recordNotFound\n </div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n <div\n *ngIf=\"type === types.ORGANIZATION_NOT_FOUND\"\n data-test=\"org-not-found-error\"\n >\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matComputerOutline\" class=\"computer\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"computer-question-mark\"> </ng-icon>\n </div>\n <div translate [translateParams]=\"{ id: recordId }\">\n search.error.organizationNotFound\n </div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n</div>\n", styles: ["ng-icon{width:5rem;height:5rem}ng-icon.face{width:3em;height:3em}ng-icon.question-mark1{position:absolute;bottom:1.9em;left:calc(50% + 1.2em);width:1.7em;height:1.7em}ng-icon.question-mark2{position:absolute;bottom:2.3em;left:calc(50% + 2.3em);width:1.4em;height:1.4em}ng-icon.computer{width:3em;height:3em}ng-icon.computer-question-mark{position:absolute;top:.7em;left:calc(50% - .6em);width:1.2em;height:1.2em}\n"] }]
33311
+ ], template: "<div\n class=\"p-[1.7em] text-[1.5em] text-center rounded-lg\"\n [ngClass]=\"{\n 'bg-red-50 text-red-800': type !== types.DATASET_HAS_NO_LINK,\n 'bg-gray-100 text-black': type === types.DATASET_HAS_NO_LINK,\n }\"\n>\n <div\n *ngIf=\"type === types.COULD_NOT_REACH_API\"\n data-test=\"could-not-reach-api-error\"\n >\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matFace\" class=\"face\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"question-mark1\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"question-mark2\"></ng-icon>\n </div>\n <div translate>search.error.couldNotReachApi</div>\n </div>\n <div\n *ngIf=\"type === types.DATASET_HAS_NO_LINK\"\n data-test=\"dataset-has-no-link-error\"\n >\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matComputerOutline\"></ng-icon>\n </div>\n <div translate>search.error.recordHasnolink</div>\n </div>\n <div *ngIf=\"type === types.RECEIVED_ERROR\" data-test=\"received-error-error\">\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matMoodBad\" class=\"face\"></ng-icon>\n </div>\n <div translate>search.error.receivedError</div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n <div *ngIf=\"type === types.ORGANIZATION_HAS_NO_DATASET\">\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matComputerOutline\" class=\"computer\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"computer-question-mark\"> </ng-icon>\n </div>\n <div translate>search.error.organizationHasNoDataset</div>\n </div>\n <div\n *ngIf=\"type === types.RECORD_NOT_FOUND\"\n data-test=\"record-not-found-error\"\n >\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matComputerOutline\" class=\"computer\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"computer-question-mark\"> </ng-icon>\n </div>\n <div translate [translateParams]=\"{ id: recordId }\">\n search.error.recordNotFound\n </div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n <div\n *ngIf=\"type === types.ORGANIZATION_NOT_FOUND\"\n data-test=\"org-not-found-error\"\n >\n <div class=\"relative opacity-40\">\n <ng-icon name=\"matComputerOutline\" class=\"computer\"></ng-icon>\n <ng-icon name=\"matQuestionMark\" class=\"computer-question-mark\"> </ng-icon>\n </div>\n <div translate [translateParams]=\"{ id: recordId }\">\n search.error.organizationNotFound\n </div>\n <div *ngIf=\"error\">{{ error }}</div>\n </div>\n</div>\n", styles: ["ng-icon{width:5rem;height:5rem}ng-icon.face{width:3em;height:3em}ng-icon.question-mark1{position:absolute;bottom:1.9em;left:calc(50% + 1.2em);width:1.7em;height:1.7em}ng-icon.question-mark2{position:absolute;bottom:2.3em;left:calc(50% + 2.3em);width:1.4em;height:1.4em}ng-icon.computer{width:3em;height:3em}ng-icon.computer-question-mark{position:absolute;top:.7em;left:calc(50% - .6em);width:1.2em;height:1.2em}\n"] }]
33260
33312
  }], propDecorators: { type: [{
33261
33313
  type: Input
33262
33314
  }], error: [{
@@ -33735,7 +33787,7 @@ class ExternalLinkCardComponent {
33735
33787
  }
33736
33788
  set size(value) {
33737
33789
  this._size = value;
33738
- this.cardClass = this.sizeClassMap[value];
33790
+ this.cardClass = `group flex flex-row justify-between card-shadow rounded overflow-hidden ${this.sizeClassMap[value]}`;
33739
33791
  }
33740
33792
  get size() {
33741
33793
  return this._size;
@@ -33746,6 +33798,10 @@ class ExternalLinkCardComponent {
33746
33798
  }
33747
33799
  return this.link.name || this.link.description || '';
33748
33800
  }
33801
+ get isDatabase() {
33802
+ return (this.link.type === 'service' &&
33803
+ this.link.accessServiceProtocol === 'postgis');
33804
+ }
33749
33805
  getLinkFormat(link) {
33750
33806
  return getFileFormat(link);
33751
33807
  }
@@ -33756,18 +33812,20 @@ class ExternalLinkCardComponent {
33756
33812
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ExternalLinkCardComponent, isStandalone: true, selector: "gn-ui-external-link-card", inputs: { link: "link", size: "size" }, providers: [
33757
33813
  provideIcons({
33758
33814
  matOpenInNew,
33815
+ iconoirDatabase,
33759
33816
  }),
33760
33817
  provideNgIconsConfig({ size: '1.5em' }),
33761
- ], ngImport: i0, template: "<a\n [href]=\"link.url\"\n target=\"_blank\"\n class=\"group flex flex-row justify-between card-shadow cursor-pointer rounded overflow-hidden\"\n [ngClass]=\"cardClass\"\n [title]=\"title\"\n>\n <div class=\"flex flex-col justify-between 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 <p *ngIf=\"!link.name && !link.description\" class=\"gn-ui-card-title\">\n {{ link.url }}\n </p>\n <div class=\"pt-1\">\n <span\n class=\"inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded transition-opacity opacity-70 group-hover:opacity-100\"\n [style.background-color]=\"getLinkColor(link)\"\n data-cy=\"download-format\"\n >{{\n getLinkFormat(link) || ('downloads.format.unknown' | translate)\n }}</span\n >\n </div>\n </div>\n <div\n class=\"flex min-w-[32px]\"\n [ngClass]=\"size === 'S' ? 'items-end' : 'items-center'\"\n >\n <div class=\"gn-ui-card-icon\">\n <ng-icon\n class=\"inline-block card-icon align-middle\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </div>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33818
+ ], ngImport: i0, template: "<ng-container *ngIf=\"isDatabase; else clickableLink\">\n <div [ngClass]=\"cardClass\" [title]=\"title\">\n <ng-container *ngTemplateOutlet=\"cardContent\"></ng-container>\n <div\n class=\"flex min-w-[32px]\"\n [ngClass]=\"size === 'S' ? 'items-end' : 'items-center'\"\n >\n <div\n class=\"gn-ui-card-icon\"\n [title]=\"'record.metadata.link.postgis.tooltip' | translate\"\n >\n <ng-icon\n class=\"inline-block card-icon align-middle\"\n name=\"iconoirDatabase\"\n ></ng-icon>\n </div>\n </div>\n </div>\n</ng-container>\n\n<ng-template #clickableLink>\n <a [href]=\"link.url\" target=\"_blank\" [ngClass]=\"cardClass\" [title]=\"title\">\n <ng-container *ngTemplateOutlet=\"cardContent\"></ng-container>\n <div\n class=\"flex min-w-[32px]\"\n [ngClass]=\"size === 'S' ? 'items-end' : 'items-center'\"\n >\n <div class=\"gn-ui-card-icon\">\n <ng-icon\n class=\"inline-block card-icon align-middle\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </div>\n </div>\n </a>\n</ng-template>\n<ng-template #cardContent>\n <div class=\"flex flex-col justify-between 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 <ng-container *ngIf=\"isDatabase\">\n {{ 'record.metadata.link.postgis.table' | translate }}\n </ng-container>\n {{ link.name }}\n </div>\n <p *ngIf=\"!link.name && !link.description\" class=\"gn-ui-card-title\">\n {{ link.url }}\n </p>\n <div class=\"pt-1\">\n <span\n class=\"inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded transition-opacity opacity-70 group-hover:opacity-100\"\n [style.background-color]=\"getLinkColor(link)\"\n data-cy=\"download-format\"\n >\n {{ getLinkFormat(link) || ('downloads.format.unknown' | translate) }}\n </span>\n </div>\n </div>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33762
33819
  }
33763
33820
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExternalLinkCardComponent, decorators: [{
33764
33821
  type: Component,
33765
33822
  args: [{ selector: 'gn-ui-external-link-card', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIconComponent, TranslatePipe], providers: [
33766
33823
  provideIcons({
33767
33824
  matOpenInNew,
33825
+ iconoirDatabase,
33768
33826
  }),
33769
33827
  provideNgIconsConfig({ size: '1.5em' }),
33770
- ], template: "<a\n [href]=\"link.url\"\n target=\"_blank\"\n class=\"group flex flex-row justify-between card-shadow cursor-pointer rounded overflow-hidden\"\n [ngClass]=\"cardClass\"\n [title]=\"title\"\n>\n <div class=\"flex flex-col justify-between 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 <p *ngIf=\"!link.name && !link.description\" class=\"gn-ui-card-title\">\n {{ link.url }}\n </p>\n <div class=\"pt-1\">\n <span\n class=\"inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded transition-opacity opacity-70 group-hover:opacity-100\"\n [style.background-color]=\"getLinkColor(link)\"\n data-cy=\"download-format\"\n >{{\n getLinkFormat(link) || ('downloads.format.unknown' | translate)\n }}</span\n >\n </div>\n </div>\n <div\n class=\"flex min-w-[32px]\"\n [ngClass]=\"size === 'S' ? 'items-end' : 'items-center'\"\n >\n <div class=\"gn-ui-card-icon\">\n <ng-icon\n class=\"inline-block card-icon align-middle\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </div>\n </div>\n</a>\n" }]
33828
+ ], template: "<ng-container *ngIf=\"isDatabase; else clickableLink\">\n <div [ngClass]=\"cardClass\" [title]=\"title\">\n <ng-container *ngTemplateOutlet=\"cardContent\"></ng-container>\n <div\n class=\"flex min-w-[32px]\"\n [ngClass]=\"size === 'S' ? 'items-end' : 'items-center'\"\n >\n <div\n class=\"gn-ui-card-icon\"\n [title]=\"'record.metadata.link.postgis.tooltip' | translate\"\n >\n <ng-icon\n class=\"inline-block card-icon align-middle\"\n name=\"iconoirDatabase\"\n ></ng-icon>\n </div>\n </div>\n </div>\n</ng-container>\n\n<ng-template #clickableLink>\n <a [href]=\"link.url\" target=\"_blank\" [ngClass]=\"cardClass\" [title]=\"title\">\n <ng-container *ngTemplateOutlet=\"cardContent\"></ng-container>\n <div\n class=\"flex min-w-[32px]\"\n [ngClass]=\"size === 'S' ? 'items-end' : 'items-center'\"\n >\n <div class=\"gn-ui-card-icon\">\n <ng-icon\n class=\"inline-block card-icon align-middle\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </div>\n </div>\n </a>\n</ng-template>\n<ng-template #cardContent>\n <div class=\"flex flex-col justify-between 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 <ng-container *ngIf=\"isDatabase\">\n {{ 'record.metadata.link.postgis.table' | translate }}\n </ng-container>\n {{ link.name }}\n </div>\n <p *ngIf=\"!link.name && !link.description\" class=\"gn-ui-card-title\">\n {{ link.url }}\n </p>\n <div class=\"pt-1\">\n <span\n class=\"inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded transition-opacity opacity-70 group-hover:opacity-100\"\n [style.background-color]=\"getLinkColor(link)\"\n data-cy=\"download-format\"\n >\n {{ getLinkFormat(link) || ('downloads.format.unknown' | translate) }}\n </span>\n </div>\n </div>\n</ng-template>\n" }]
33771
33829
  }], propDecorators: { link: [{
33772
33830
  type: Input
33773
33831
  }], size: [{
@@ -34037,7 +34095,7 @@ class MetadataInfoComponent {
34037
34095
  return this.dateService.formatDateTime(date);
34038
34096
  }
34039
34097
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataInfoComponent, deps: [{ token: DateService }], target: i0.ɵɵFactoryTarget.Component }); }
34040
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MetadataInfoComponent, isStandalone: true, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost\n ghostClass=\"h-[178px]\"\n [showContent]=\"fieldReady('abstract')\"\n >\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n\n <p\n class=\"mt-6 mb-3 font-medium text-black text-sm\"\n translate\n *ngIf=\"!fieldReady('keywords') || metadata.keywords?.length\"\n >\n record.metadata.keywords\n </p>\n\n <gn-ui-content-ghost\n ghostClass=\"h-[31px] w-3/4\"\n [showContent]=\"fieldReady('keywords')\"\n >\n <div *ngIf=\"metadata.keywords?.length\">\n <div class=\"metadata-info-keywords sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.licenses ||\n metadata.legalConstraints ||\n metadata.securityConstraints ||\n metadata.otherConstraints\n \"\n [title]=\"'record.metadata.usage' | translate\"\n data-test=\"usage-panel\"\n>\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <span\n translate\n class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\"\n >\n record.metadata.otherConstraints\n </span>\n <div class=\"mb-6\">\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n (metadata.kind === 'dataset' && metadata.lineage) ||\n metadata.resourceUpdated ||\n metadata.updateFrequency ||\n (metadata.kind === 'dataset' && metadata.status)\n \"\n [title]=\"'record.metadata.details' | translate\"\n data-test=\"details-panel\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\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]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.resourceCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourceCreated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.resourcePublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourcePublished) }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.otherLanguages?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.otherLanguages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end,\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.kind !== 'dataset' &&\n metadata.spatialExtents &&\n metadata.spatialExtents.length\n \"\n [title]=\"'service.metadata.spatialExtent' | translate\"\n data-test=\"spatial-extent-panel\"\n>\n <gn-ui-spatial-extent\n class=\"flex h-[271px] w-full rounded-lg border border-gray-100 mt-3 mb-6\"\n [spatialExtents]=\"metadata.spatialExtents\"\n ></gn-ui-spatial-extent>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'service.metadata.other' | translate\"\n data-test=\"other-panel\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && formatDateTime(metadata.recordUpdated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n [clickable]=\"false\"\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button ng-icon{transform:scale(.8)}:host{--gn-ui-badge-background-color: var(--color-primary-white);--gn-ui-badge-text-color: var(--color-primary-darkest)}:host .metadata-info-keywords ::ng-deep gn-ui-badge:hover{--gn-ui-badge-text-color: white}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "iconColor", "collapsed"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: SpatialExtentComponent, selector: "gn-ui-spatial-extent", inputs: ["spatialExtents"] }], viewProviders: [
34098
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MetadataInfoComponent, isStandalone: true, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost\n ghostClass=\"h-[178px]\"\n [showContent]=\"fieldReady('abstract')\"\n >\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n\n <p\n class=\"mt-6 mb-3 font-medium text-black text-sm\"\n translate\n *ngIf=\"!fieldReady('keywords') || metadata.keywords?.length\"\n >\n record.metadata.keywords\n </p>\n\n <gn-ui-content-ghost\n ghostClass=\"h-[31px] w-3/4\"\n [showContent]=\"fieldReady('keywords')\"\n >\n <gn-ui-max-lines [maxLines]=\"7\" *ngIf=\"metadata.keywords?.length\">\n <div class=\"metadata-info-keywords sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.licenses ||\n metadata.legalConstraints ||\n metadata.securityConstraints ||\n metadata.otherConstraints\n \"\n [title]=\"'record.metadata.usage' | translate\"\n data-test=\"usage-panel\"\n>\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <span\n translate\n class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\"\n >\n record.metadata.otherConstraints\n </span>\n <div class=\"mb-6\">\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n (metadata.kind === 'dataset' && metadata.lineage) ||\n metadata.resourceUpdated ||\n metadata.updateFrequency ||\n (metadata.kind === 'dataset' && metadata.status)\n \"\n [title]=\"'record.metadata.details' | translate\"\n data-test=\"details-panel\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\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]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.resourceCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourceCreated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.resourcePublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourcePublished) }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.otherLanguages?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.otherLanguages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end,\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.kind !== 'dataset' &&\n metadata.spatialExtents &&\n metadata.spatialExtents.length\n \"\n [title]=\"'service.metadata.spatialExtent' | translate\"\n data-test=\"spatial-extent-panel\"\n>\n <gn-ui-spatial-extent\n class=\"flex h-[271px] w-full rounded-lg border border-gray-100 mt-3 mb-6\"\n [spatialExtents]=\"metadata.spatialExtents\"\n ></gn-ui-spatial-extent>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'service.metadata.other' | translate\"\n data-test=\"other-panel\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && formatDateTime(metadata.recordUpdated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n [clickable]=\"false\"\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button ng-icon{transform:scale(.8)}:host{--gn-ui-badge-background-color: var(--color-primary-white);--gn-ui-badge-text-color: var(--color-primary-darkest)}:host .metadata-info-keywords ::ng-deep gn-ui-badge:hover{--gn-ui-badge-text-color: white}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "iconColor", "collapsed"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: SpatialExtentComponent, selector: "gn-ui-spatial-extent", inputs: ["spatialExtents"] }], viewProviders: [
34041
34099
  provideIcons({
34042
34100
  matOpenInNew,
34043
34101
  matMailOutline: matMailOutline$1,
@@ -34065,7 +34123,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
34065
34123
  matOpenInNew,
34066
34124
  matMailOutline: matMailOutline$1,
34067
34125
  }),
34068
- ], template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost\n ghostClass=\"h-[178px]\"\n [showContent]=\"fieldReady('abstract')\"\n >\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n\n <p\n class=\"mt-6 mb-3 font-medium text-black text-sm\"\n translate\n *ngIf=\"!fieldReady('keywords') || metadata.keywords?.length\"\n >\n record.metadata.keywords\n </p>\n\n <gn-ui-content-ghost\n ghostClass=\"h-[31px] w-3/4\"\n [showContent]=\"fieldReady('keywords')\"\n >\n <div *ngIf=\"metadata.keywords?.length\">\n <div class=\"metadata-info-keywords sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.licenses ||\n metadata.legalConstraints ||\n metadata.securityConstraints ||\n metadata.otherConstraints\n \"\n [title]=\"'record.metadata.usage' | translate\"\n data-test=\"usage-panel\"\n>\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <span\n translate\n class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\"\n >\n record.metadata.otherConstraints\n </span>\n <div class=\"mb-6\">\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n (metadata.kind === 'dataset' && metadata.lineage) ||\n metadata.resourceUpdated ||\n metadata.updateFrequency ||\n (metadata.kind === 'dataset' && metadata.status)\n \"\n [title]=\"'record.metadata.details' | translate\"\n data-test=\"details-panel\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\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]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.resourceCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourceCreated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.resourcePublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourcePublished) }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.otherLanguages?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.otherLanguages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end,\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.kind !== 'dataset' &&\n metadata.spatialExtents &&\n metadata.spatialExtents.length\n \"\n [title]=\"'service.metadata.spatialExtent' | translate\"\n data-test=\"spatial-extent-panel\"\n>\n <gn-ui-spatial-extent\n class=\"flex h-[271px] w-full rounded-lg border border-gray-100 mt-3 mb-6\"\n [spatialExtents]=\"metadata.spatialExtents\"\n ></gn-ui-spatial-extent>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'service.metadata.other' | translate\"\n data-test=\"other-panel\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && formatDateTime(metadata.recordUpdated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n [clickable]=\"false\"\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button ng-icon{transform:scale(.8)}:host{--gn-ui-badge-background-color: var(--color-primary-white);--gn-ui-badge-text-color: var(--color-primary-darkest)}:host .metadata-info-keywords ::ng-deep gn-ui-badge:hover{--gn-ui-badge-text-color: white}\n"] }]
34126
+ ], template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost\n ghostClass=\"h-[178px]\"\n [showContent]=\"fieldReady('abstract')\"\n >\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n\n <p\n class=\"mt-6 mb-3 font-medium text-black text-sm\"\n translate\n *ngIf=\"!fieldReady('keywords') || metadata.keywords?.length\"\n >\n record.metadata.keywords\n </p>\n\n <gn-ui-content-ghost\n ghostClass=\"h-[31px] w-3/4\"\n [showContent]=\"fieldReady('keywords')\"\n >\n <gn-ui-max-lines [maxLines]=\"7\" *ngIf=\"metadata.keywords?.length\">\n <div class=\"metadata-info-keywords sm:pb-4 flex flex-wrap gap-2\">\n <gn-ui-badge\n class=\"inline-block lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.licenses ||\n metadata.legalConstraints ||\n metadata.securityConstraints ||\n metadata.otherConstraints\n \"\n [title]=\"'record.metadata.usage' | translate\"\n data-test=\"usage-panel\"\n>\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <div class=\"mb-6\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <span\n translate\n class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\"\n >\n record.metadata.otherConstraints\n </span>\n <div class=\"mb-6\">\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n (metadata.kind === 'dataset' && metadata.lineage) ||\n metadata.resourceUpdated ||\n metadata.updateFrequency ||\n (metadata.kind === 'dataset' && metadata.status)\n \"\n [title]=\"'record.metadata.details' | translate\"\n data-test=\"details-panel\"\n>\n <div *ngIf=\"metadata.lineage\" class=\"text-gray-900 flex flex-col mt-4 gap-2\">\n <p class=\"whitespace-pre-line break-words text-gray-900\" gnUiLinkify>\n {{ metadata.lineage }}\n </p>\n </div>\n <div class=\"flex flex-row gap-6 mt-5 mb-8\" *ngIf=\"resourceContact\">\n <div\n *ngIf=\"resourceContact.organization?.logoUrl?.href\"\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]=\"resourceContact.organization.logoUrl.href\"\n fit=\"contain\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"flex flex-col gap-1\">\n <p class=\"text-sm font-medium\" translate>record.metadata.producer</p>\n <div\n class=\"text-primary font-title text-21 mr-2 cursor-pointer hover:underline\"\n data-cy=\"organization-name\"\n >\n {{ resourceContact.organization?.name }}\n </div>\n <div *ngIf=\"resourceContact.organization?.website\">\n <a\n [href]=\"resourceContact.organization.website\"\n target=\"_blank\"\n class=\"contact-website text-primary text-sm cursor-pointer hover:underline transition-all\"\n >{{ resourceContact.organization.website }}\n <ng-icon\n class=\"!w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n name=\"matOpenInNew\"\n ></ng-icon>\n </a>\n </div>\n <div class=\"mt-4\" *ngIf=\"resourceContact.email\">\n <div class=\"flex\">\n <ng-icon\n class=\"!w-5 !h-5 !text-[20px] opacity-75 shrink-0\"\n name=\"matMailOutline\"\n ></ng-icon>\n <a\n *ngIf=\"resourceContact.email\"\n [href]=\"'mailto:' + resourceContact.email\"\n class=\"text-sm hover:underline ml-2\"\n target=\"_blank\"\n data-cy=\"contact-email\"\n >{{ resourceContact?.email }}</a\n >\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700\"\n >\n <div *ngIf=\"metadata.resourceCreated\">\n <p class=\"text-sm\" translate>record.metadata.creation</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourceCreated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.resourcePublished\">\n <p class=\"text-sm\" translate>record.metadata.publication</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ formatDate(metadata.resourcePublished) }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.otherLanguages?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.languages</p>\n <div class=\"flex flex-row gap-1 flex-wrap\">\n <p\n class=\"text-primary font-medium\"\n translate\n *ngFor=\"let language of metadata.otherLanguages\"\n >\n language.{{ language }}\n </p>\n </div>\n </div>\n <div *ngIf=\"temporalExtent\">\n <p class=\"text-sm\" translate>record.metadata.temporalExtent</p>\n <div class=\"flex flex-row gap-1 mb-1 text-primary font-medium\">\n <p\n *ngIf=\"temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{\n start: temporalExtent.start,\n end: temporalExtent.end,\n }\"\n >\n record.metadata.temporalExtent.fromDateToDate\n </p>\n <p\n *ngIf=\"temporalExtent.start && !temporalExtent.end\"\n translate\n [translateParams]=\"{ start: temporalExtent.start }\"\n >\n record.metadata.temporalExtent.sinceDate\n </p>\n <p\n *ngIf=\"!temporalExtent.start && temporalExtent.end\"\n translate\n [translateParams]=\"{ end: temporalExtent.end }\"\n >\n record.metadata.temporalExtent.untilDate\n </p>\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"\n metadata.kind !== 'dataset' &&\n metadata.spatialExtents &&\n metadata.spatialExtents.length\n \"\n [title]=\"'service.metadata.spatialExtent' | translate\"\n data-test=\"spatial-extent-panel\"\n>\n <gn-ui-spatial-extent\n class=\"flex h-[271px] w-full rounded-lg border border-gray-100 mt-3 mb-6\"\n [spatialExtents]=\"metadata.spatialExtents\"\n ></gn-ui-spatial-extent>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'service.metadata.other' | translate\"\n data-test=\"other-panel\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && formatDateTime(metadata.recordUpdated) }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n [clickable]=\"false\"\n class=\"inline-block mr-2 mb-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button ng-icon{transform:scale(.8)}:host{--gn-ui-badge-background-color: var(--color-primary-white);--gn-ui-badge-text-color: var(--color-primary-darkest)}:host .metadata-info-keywords ::ng-deep gn-ui-badge:hover{--gn-ui-badge-text-color: white}\n"] }]
34069
34127
  }], ctorParameters: () => [{ type: DateService }], propDecorators: { metadata: [{
34070
34128
  type: Input
34071
34129
  }], incomplete: [{
@@ -36453,6 +36511,11 @@ const SortByEnum = {
36453
36511
  RELEVANCY: ['desc', '_score'],
36454
36512
  QUALITY_SCORE: ['desc', 'qualityScore'],
36455
36513
  CHANGE_DATE: ['desc', 'changeDate'],
36514
+ RESOURCE_DATES: [
36515
+ ['desc', 'revisionDateForResource'],
36516
+ ['desc', 'publicationDateForResource'],
36517
+ ['desc', 'creationDateForResource'],
36518
+ ],
36456
36519
  };
36457
36520
 
36458
36521
  class SortByComponent {
@@ -36462,33 +36525,29 @@ class SortByComponent {
36462
36525
  this.choices = [
36463
36526
  {
36464
36527
  label: marker('results.sortBy.relevancy'),
36465
- value: SortByEnum.RELEVANCY.join(','),
36528
+ value: SortByEnum.RELEVANCY,
36466
36529
  },
36467
36530
  {
36468
36531
  label: marker('results.sortBy.dateStamp'),
36469
- value: SortByEnum.CREATE_DATE.join(','),
36470
- },
36471
- {
36472
- label: marker('results.sortBy.changeDate'),
36473
- value: SortByEnum.CHANGE_DATE.join(','),
36532
+ value: SortByEnum.RESOURCE_DATES,
36474
36533
  },
36475
36534
  {
36476
36535
  label: marker('results.sortBy.popularity'),
36477
- value: SortByEnum.POPULARITY.join(','),
36536
+ value: SortByEnum.POPULARITY,
36478
36537
  },
36479
36538
  ];
36480
- this.currentSortBy$ = this.facade.sortBy$.pipe(filter$1((sortBy) => !!sortBy), map$1((sortBy) => sortBy.join(',')));
36539
+ this.currentSortBy$ = this.facade.sortBy$.pipe(filter$1((sortBy) => !!sortBy), map$1((sortBy) => sortBy));
36481
36540
  }
36482
36541
  ngOnInit() {
36483
36542
  if (this.isQualitySortable) {
36484
36543
  this.choices.push({
36485
36544
  label: marker('results.sortBy.qualityScore'),
36486
- value: SortByEnum.QUALITY_SCORE.join(','),
36545
+ value: SortByEnum.QUALITY_SCORE,
36487
36546
  });
36488
36547
  }
36489
36548
  }
36490
- changeSortBy(criteriaAsString) {
36491
- this.searchService.setSortBy(criteriaAsString.split(','));
36549
+ changeSortBy(criteria) {
36550
+ this.searchService.setSortBy(criteria);
36492
36551
  }
36493
36552
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SortByComponent, deps: [{ token: SearchFacade }, { token: SearchService }], target: i0.ɵɵFactoryTarget.Component }); }
36494
36553
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SortByComponent, isStandalone: true, selector: "gn-ui-sort-by", inputs: { isQualitySortable: "isQualitySortable" }, ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'search.field.sortBy' | translate\"\n [choices]=\"choices\"\n (selectValue)=\"changeSortBy($event)\"\n [selected]=\"currentSortBy$ | async\"\n ariaName=\"search-sort-by\"\n></gn-ui-dropdown-selector>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] }); }
@@ -40022,6 +40081,7 @@ class MapViewComponent {
40022
40081
  set exceedsLimit(value) {
40023
40082
  this.excludeWfs$.next(value);
40024
40083
  }
40084
+ // FIXME the map view component should not need a selectedView
40025
40085
  set selectedView(value) {
40026
40086
  this.selectedView$.next(value);
40027
40087
  }
@@ -43788,6 +43848,9 @@ class RouterService {
43788
43848
  getOrganizationPageRoute() {
43789
43849
  return ROUTER_ROUTE_ORGANIZATION;
43790
43850
  }
43851
+ getDefaultSort() {
43852
+ return SortByEnum.RESOURCE_DATES;
43853
+ }
43791
43854
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, deps: [{ token: ROUTER_CONFIG }, { token: i1$d.Router }], target: i0.ɵɵFactoryTarget.Injectable }); }
43792
43855
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, providedIn: 'root' }); }
43793
43856
  }
@@ -43948,13 +44011,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
43948
44011
  }], ctorParameters: () => [{ type: i1$3.Store }, { type: RouterService }] });
43949
44012
 
43950
44013
  class RouterEffects {
43951
- constructor(_actions$, _router, _location, facade, routerConfig, fieldsService) {
44014
+ constructor(_actions$, _router, _location, facade, routerConfig, fieldsService, routerService) {
43952
44015
  this._actions$ = _actions$;
43953
44016
  this._router = _router;
43954
44017
  this._location = _location;
43955
44018
  this.facade = facade;
43956
44019
  this.routerConfig = routerConfig;
43957
44020
  this.fieldsService = fieldsService;
44021
+ this.routerService = routerService;
43958
44022
  this.navigate$ = createEffect(() => this._actions$.pipe(ofType(goAction), tap$1(({ path, query: queryParams, queryParamsHandling }) => {
43959
44023
  this._router.navigate([path], {
43960
44024
  queryParams,
@@ -43966,14 +44030,14 @@ class RouterEffects {
43966
44030
  .pipe(map$1((filters) => [searchParams, filters]))), startWith([null, {}]), pairwise(), map$1(([[oldParams, oldFilters], [newParams, newFilters]]) => {
43967
44031
  let sortBy = ROUTE_PARAMS.SORT in newParams
43968
44032
  ? sortByFromString(newParams[ROUTE_PARAMS.SORT])
43969
- : SortByEnum.CHANGE_DATE;
44033
+ : this.routerService.getDefaultSort();
43970
44034
  let pageNumber = ROUTE_PARAMS.PAGE in newParams
43971
44035
  ? parseInt(newParams[ROUTE_PARAMS.PAGE])
43972
44036
  : 1;
43973
44037
  if (oldParams !== null) {
43974
44038
  const oldSort = ROUTE_PARAMS.SORT in oldParams
43975
44039
  ? sortByFromString(oldParams[ROUTE_PARAMS.SORT])
43976
- : SortByEnum.CHANGE_DATE;
44040
+ : this.routerService.getDefaultSort();
43977
44041
  if (JSON.stringify(sortBy) === JSON.stringify(oldSort)) {
43978
44042
  sortBy = null;
43979
44043
  }
@@ -44030,7 +44094,7 @@ class RouterEffects {
44030
44094
  this.navigateBack$ = createEffect(() => this._actions$.pipe(ofType(backAction), tap$1(() => this._location.back())), { dispatch: false });
44031
44095
  this.navigateForward$ = createEffect(() => this._actions$.pipe(ofType(forwardAction), tap$1(() => this._location.forward())), { dispatch: false });
44032
44096
  }
44033
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects, deps: [{ token: i1$c.Actions }, { token: i1$d.Router }, { token: i1$2.Location }, { token: RouterFacade }, { token: ROUTER_CONFIG }, { token: FieldsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
44097
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects, deps: [{ token: i1$c.Actions }, { token: i1$d.Router }, { token: i1$2.Location }, { token: RouterFacade }, { token: ROUTER_CONFIG }, { token: FieldsService }, { token: RouterService }], target: i0.ɵɵFactoryTarget.Injectable }); }
44034
44098
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects }); }
44035
44099
  }
44036
44100
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects, decorators: [{
@@ -44038,7 +44102,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
44038
44102
  }], ctorParameters: () => [{ type: i1$c.Actions }, { type: i1$d.Router }, { type: i1$2.Location }, { type: RouterFacade }, { type: undefined, decorators: [{
44039
44103
  type: Inject,
44040
44104
  args: [ROUTER_CONFIG]
44041
- }] }, { type: FieldsService }] });
44105
+ }] }, { type: FieldsService }, { type: RouterService }] });
44042
44106
 
44043
44107
  class DefaultRouterModule {
44044
44108
  constructor(routerService) {