geonetwork-ui 2.8.0-dev.398701d7f → 2.8.0-dev.5745b522e

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 (92) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/common/distribution.mapper.mjs +5 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +3 -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 +3 -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 +5 -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 +7 -2
  23. package/esm2022/translations/en.json +8 -4
  24. package/esm2022/translations/es.json +7 -2
  25. package/esm2022/translations/fr.json +8 -3
  26. package/esm2022/translations/it.json +8 -3
  27. package/esm2022/translations/nl.json +7 -2
  28. package/esm2022/translations/pt.json +7 -2
  29. package/esm2022/translations/sk.json +7 -2
  30. package/fesm2022/geonetwork-ui.mjs +147 -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 +2 -0
  62. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +2 -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 +4 -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/elasticsearch/metadata-links.fixtures.ts +5 -0
  70. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +19 -0
  71. package/src/libs/data-access/gn4/src/openapi/model/user.api.model.ts +1 -1
  72. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +1 -0
  73. package/src/libs/feature/router/src/lib/default/router.service.ts +8 -0
  74. package/src/libs/feature/router/src/lib/default/state/router.effects.ts +6 -7
  75. package/src/libs/feature/search/src/lib/sort-by/sort-by.component.ts +8 -12
  76. package/src/libs/ui/elements/src/lib/error/error.component.html +5 -1
  77. package/src/libs/ui/elements/src/lib/external-link-card/external-link-card.component.html +43 -22
  78. package/src/libs/ui/elements/src/lib/external-link-card/external-link-card.component.ts +12 -3
  79. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +2 -2
  80. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +4 -2
  81. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +4 -0
  82. package/src/libs/util/shared/src/lib/links/link-utils.ts +11 -0
  83. package/src/libs/util/shared/src/lib/services/proxy.service.ts +6 -2
  84. package/src/libs/util/shared/src/lib/utils/sort-by.ts +8 -5
  85. package/translations/de.json +7 -2
  86. package/translations/en.json +8 -4
  87. package/translations/es.json +7 -2
  88. package/translations/fr.json +8 -3
  89. package/translations/it.json +8 -3
  90. package/translations/nl.json +7 -2
  91. package/translations/pt.json +7 -2
  92. package/translations/sk.json +7 -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,10 @@ 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';
671
+ if (/stac\W*items/i.test(protocol))
672
+ return 'stac';
669
673
  return 'other';
670
674
  }
671
675
  function matchMimeType(format) {
@@ -914,6 +918,8 @@ marker('record.metadata.api.accessServiceProtocol.ogcFeatures');
914
918
  marker('record.metadata.api.accessServiceProtocol.GPFDL');
915
919
  marker('record.metadata.api.accessServiceProtocol.tms');
916
920
  marker('record.metadata.api.accessServiceProtocol.maplibre-style');
921
+ marker('record.metadata.api.accessServiceProtocol.postgis');
922
+ marker('record.metadata.api.accessServiceProtocol.stac');
917
923
  marker('record.metadata.api.accessServiceProtocol.other');
918
924
 
919
925
  function getUpdateFrequencyFromFrequencyCode(frequencyCode) {
@@ -19159,6 +19165,8 @@ var de = {
19159
19165
  "record.metadata.api.accessServiceProtocol.maplibre-style": "",
19160
19166
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "",
19161
19167
  "record.metadata.api.accessServiceProtocol.other": "",
19168
+ "record.metadata.api.accessServiceProtocol.postgis": "",
19169
+ "record.metadata.api.accessServiceProtocol.stac": "",
19162
19170
  "record.metadata.api.accessServiceProtocol.tms": "",
19163
19171
  "record.metadata.api.accessServiceProtocol.wfs": "",
19164
19172
  "record.metadata.api.accessServiceProtocol.wms": "",
@@ -19206,7 +19214,8 @@ var de = {
19206
19214
  "record.metadata.isGeographical": "Geographischer Datensatz",
19207
19215
  "record.metadata.keywords": "Stichworte",
19208
19216
  "record.metadata.languages": "Sprachen",
19209
- "record.metadata.lastUpdate": "Zuletzt aktualisiert am {date}",
19217
+ "record.metadata.link.postgis.table": "",
19218
+ "record.metadata.link.postgis.tooltip": "",
19210
19219
  "record.metadata.linked.datasets": "Verknüpfte Datensätze",
19211
19220
  "record.metadata.linked.records": "Verknüpfte Inhalte",
19212
19221
  "record.metadata.linked.reuses": "Verknüpfte Wiederverwendungen",
@@ -19247,6 +19256,9 @@ var de = {
19247
19256
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
19248
19257
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
19249
19258
  "record.metadata.related": "Entdecken Sie den Katalog",
19259
+ "record.metadata.resourceCreated": "Erstellt am {date}",
19260
+ "record.metadata.resourcePublished": "Veröffentlicht am {date}",
19261
+ "record.metadata.resourceUpdated": "Zuletzt aktualisiert am {date}",
19250
19262
  "record.metadata.ressources.and.links": "Ressourcen und Links",
19251
19263
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
19252
19264
  "record.metadata.status": "Status",
@@ -19283,7 +19295,6 @@ var de = {
19283
19295
  "results.records.hits.found": "{hits, plural, =0{Keine Ressource entsprechen der angegebenen Suche.} one{1 Ressource gefunden.} other{{hits} Ressourcen gefunden.}}",
19284
19296
  "results.records.hits.selected": "{ amount } ausgewählt",
19285
19297
  "results.showMore": "Mehr Ergebnisse anzeigen...",
19286
- "results.sortBy.changeDate": "",
19287
19298
  "results.sortBy.dateStamp": "Neueste",
19288
19299
  "results.sortBy.popularity": "Beliebtheit",
19289
19300
  "results.sortBy.qualityScore": "Fertigstellungsanzeige",
@@ -19634,7 +19645,6 @@ var en = {
19634
19645
  "editor.record.form.topics.inspire.intelligence": "Intelligence / Military",
19635
19646
  "editor.record.form.topics.inspire.location": "Location",
19636
19647
  "editor.record.form.topics.inspire.oceans": "Oceans",
19637
- "editor.record.form.topics.inspire.placeholder": "Select an INSPIRE theme",
19638
19648
  "editor.record.form.topics.inspire.planning": "Planning / Cadastre",
19639
19649
  "editor.record.form.topics.inspire.society": "Society",
19640
19650
  "editor.record.form.topics.inspire.structure": "Structure",
@@ -19812,6 +19822,8 @@ var en = {
19812
19822
  "record.metadata.api.accessServiceProtocol.maplibre-style": "maplibre-style",
19813
19823
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "ogcFeatures",
19814
19824
  "record.metadata.api.accessServiceProtocol.other": "other",
19825
+ "record.metadata.api.accessServiceProtocol.postgis": "PostGIS",
19826
+ "record.metadata.api.accessServiceProtocol.stac": "STAC",
19815
19827
  "record.metadata.api.accessServiceProtocol.tms": "tms",
19816
19828
  "record.metadata.api.accessServiceProtocol.wfs": "wfs",
19817
19829
  "record.metadata.api.accessServiceProtocol.wms": "wms",
@@ -19859,7 +19871,8 @@ var en = {
19859
19871
  "record.metadata.isGeographical": "Geographical dataset",
19860
19872
  "record.metadata.keywords": "Keywords",
19861
19873
  "record.metadata.languages": "Languages",
19862
- "record.metadata.lastUpdate": "Last updated on {date}",
19874
+ "record.metadata.link.postgis.table": "table :",
19875
+ "record.metadata.link.postgis.tooltip": "PostGIS resources do not have access links",
19863
19876
  "record.metadata.linked.datasets": "Associated datasets",
19864
19877
  "record.metadata.linked.records": "Associated content",
19865
19878
  "record.metadata.linked.reuses": "Associated reuses",
@@ -19900,6 +19913,9 @@ var en = {
19900
19913
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
19901
19914
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
19902
19915
  "record.metadata.related": "Explore the catalog",
19916
+ "record.metadata.resourceCreated": "Created on {date}",
19917
+ "record.metadata.resourcePublished": "Published on {date}",
19918
+ "record.metadata.resourceUpdated": "Last updated on {date}",
19903
19919
  "record.metadata.ressources.and.links": "Resources and links",
19904
19920
  "record.metadata.sheet": "Original metadata",
19905
19921
  "record.metadata.status": "Status",
@@ -19936,7 +19952,6 @@ var en = {
19936
19952
  "results.records.hits.found": "{hits, plural, =0{No record match the specified search.} one{1 record found.} other{{hits} records found.}}",
19937
19953
  "results.records.hits.selected": "{ amount } selected",
19938
19954
  "results.showMore": "Show more results...",
19939
- "results.sortBy.changeDate": "Last modification",
19940
19955
  "results.sortBy.dateStamp": "Newest",
19941
19956
  "results.sortBy.popularity": "Popularity",
19942
19957
  "results.sortBy.qualityScore": "Completion score",
@@ -19947,7 +19962,7 @@ var en = {
19947
19962
  "search.error.organizationHasNoDataset": "This organization has no records yet.",
19948
19963
  "search.error.organizationNotFound": "This organization could not be found.",
19949
19964
  "search.error.receivedError": "An error was received",
19950
- "search.error.recordHasnolink": "This record currently has no link yet, please come back later.",
19965
+ "search.error.recordHasnolink": "This record currently has no link.",
19951
19966
  "search.error.recordNotFound": "The record with identifier \"{ id }\" could not be found.",
19952
19967
  "search.field.any.placeholder": "Search in the catalog ...",
19953
19968
  "search.field.sortBy": "Sort by:",
@@ -20464,6 +20479,8 @@ var es = {
20464
20479
  "record.metadata.api.accessServiceProtocol.maplibre-style": "",
20465
20480
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "",
20466
20481
  "record.metadata.api.accessServiceProtocol.other": "",
20482
+ "record.metadata.api.accessServiceProtocol.postgis": "",
20483
+ "record.metadata.api.accessServiceProtocol.stac": "",
20467
20484
  "record.metadata.api.accessServiceProtocol.tms": "",
20468
20485
  "record.metadata.api.accessServiceProtocol.wfs": "",
20469
20486
  "record.metadata.api.accessServiceProtocol.wms": "",
@@ -20511,7 +20528,8 @@ var es = {
20511
20528
  "record.metadata.isGeographical": "",
20512
20529
  "record.metadata.keywords": "",
20513
20530
  "record.metadata.languages": "",
20514
- "record.metadata.lastUpdate": "",
20531
+ "record.metadata.link.postgis.table": "",
20532
+ "record.metadata.link.postgis.tooltip": "",
20515
20533
  "record.metadata.linked.datasets": "",
20516
20534
  "record.metadata.linked.records": "",
20517
20535
  "record.metadata.linked.reuses": "",
@@ -20552,6 +20570,9 @@ var es = {
20552
20570
  "record.metadata.quality.updateFrequency.failed": "",
20553
20571
  "record.metadata.quality.updateFrequency.success": "",
20554
20572
  "record.metadata.related": "",
20573
+ "record.metadata.resourceCreated": "",
20574
+ "record.metadata.resourcePublished": "",
20575
+ "record.metadata.resourceUpdated": "",
20555
20576
  "record.metadata.ressources.and.links": "Recursos y enlaces",
20556
20577
  "record.metadata.sheet": "",
20557
20578
  "record.metadata.status": "",
@@ -20588,7 +20609,6 @@ var es = {
20588
20609
  "results.records.hits.found": "",
20589
20610
  "results.records.hits.selected": "",
20590
20611
  "results.showMore": "",
20591
- "results.sortBy.changeDate": "",
20592
20612
  "results.sortBy.dateStamp": "",
20593
20613
  "results.sortBy.popularity": "",
20594
20614
  "results.sortBy.qualityScore": "",
@@ -21116,6 +21136,8 @@ var fr = {
21116
21136
  "record.metadata.api.accessServiceProtocol.maplibre-style": "",
21117
21137
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "",
21118
21138
  "record.metadata.api.accessServiceProtocol.other": "autre",
21139
+ "record.metadata.api.accessServiceProtocol.postgis": "PostGIS",
21140
+ "record.metadata.api.accessServiceProtocol.stac": "STAC",
21119
21141
  "record.metadata.api.accessServiceProtocol.tms": "",
21120
21142
  "record.metadata.api.accessServiceProtocol.wfs": "",
21121
21143
  "record.metadata.api.accessServiceProtocol.wms": "",
@@ -21163,7 +21185,8 @@ var fr = {
21163
21185
  "record.metadata.isGeographical": "Donnée géographique",
21164
21186
  "record.metadata.keywords": "Mots-clés",
21165
21187
  "record.metadata.languages": "Langues",
21166
- "record.metadata.lastUpdate": "Mis à jour le {date}",
21188
+ "record.metadata.link.postgis.table": "table :",
21189
+ "record.metadata.link.postgis.tooltip": "Les ressources de type PostGIS n'ont pas de lien d'accès",
21167
21190
  "record.metadata.linked.datasets": "Jeux de données associés",
21168
21191
  "record.metadata.linked.records": "Contenus associés",
21169
21192
  "record.metadata.linked.reuses": "Réutilisations associées",
@@ -21204,6 +21227,9 @@ var fr = {
21204
21227
  "record.metadata.quality.updateFrequency.failed": "La fréquence de mise à jour n'est pas renseignée",
21205
21228
  "record.metadata.quality.updateFrequency.success": "La fréquence de mise à jour est renseignée",
21206
21229
  "record.metadata.related": "Explorez le catalogue",
21230
+ "record.metadata.resourceCreated": "Créé le {date}",
21231
+ "record.metadata.resourcePublished": "Publié le {date}",
21232
+ "record.metadata.resourceUpdated": "Mis à jour le {date}",
21207
21233
  "record.metadata.ressources.and.links": "Ressources et liens",
21208
21234
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
21209
21235
  "record.metadata.status": "Statut",
@@ -21240,7 +21266,6 @@ var fr = {
21240
21266
  "results.records.hits.found": "{hits, plural, =0{Aucune correspondance.} one{1 ressource trouvée.} other{{hits} ressources.}}",
21241
21267
  "results.records.hits.selected": "{amount, plural, one{1 selectionné} other{{ amount } sélectionnés}}",
21242
21268
  "results.showMore": "Plus de résultats...",
21243
- "results.sortBy.changeDate": "Dernière modification",
21244
21269
  "results.sortBy.dateStamp": "Plus récent",
21245
21270
  "results.sortBy.popularity": "Popularité",
21246
21271
  "results.sortBy.qualityScore": "Indicateur de complétion",
@@ -21251,7 +21276,7 @@ var fr = {
21251
21276
  "search.error.organizationHasNoDataset": "Cette organisation n'a pas encore de ressources.",
21252
21277
  "search.error.organizationNotFound": "L'organisation n'a pas pu être trouvée.",
21253
21278
  "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.",
21279
+ "search.error.recordHasnolink": "Cette ressource n'a actuellement aucun lien.",
21255
21280
  "search.error.recordNotFound": "La ressource dont l'identifiant est \"{ id }\" n'a pas pu être trouvée.",
21256
21281
  "search.field.any.placeholder": "Rechercher dans le catalogue...",
21257
21282
  "search.field.sortBy": "Trier par :",
@@ -21768,6 +21793,8 @@ var it = {
21768
21793
  "record.metadata.api.accessServiceProtocol.maplibre-style": "",
21769
21794
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "",
21770
21795
  "record.metadata.api.accessServiceProtocol.other": "",
21796
+ "record.metadata.api.accessServiceProtocol.postgis": "",
21797
+ "record.metadata.api.accessServiceProtocol.stac": "",
21771
21798
  "record.metadata.api.accessServiceProtocol.tms": "",
21772
21799
  "record.metadata.api.accessServiceProtocol.wfs": "",
21773
21800
  "record.metadata.api.accessServiceProtocol.wms": "",
@@ -21815,7 +21842,8 @@ var it = {
21815
21842
  "record.metadata.isGeographical": "Dati geografici",
21816
21843
  "record.metadata.keywords": "Parole chiave",
21817
21844
  "record.metadata.languages": "Lingue",
21818
- "record.metadata.lastUpdate": "Ultimo aggiornamento il {date}",
21845
+ "record.metadata.link.postgis.table": "",
21846
+ "record.metadata.link.postgis.tooltip": "",
21819
21847
  "record.metadata.linked.datasets": "",
21820
21848
  "record.metadata.linked.records": "",
21821
21849
  "record.metadata.linked.reuses": "",
@@ -21856,6 +21884,9 @@ var it = {
21856
21884
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
21857
21885
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
21858
21886
  "record.metadata.related": "Vedi anche",
21887
+ "record.metadata.resourceCreated": "Creato il {date}",
21888
+ "record.metadata.resourcePublished": "Pubblicato il {date}",
21889
+ "record.metadata.resourceUpdated": "Ultimo aggiornamento il {date}",
21859
21890
  "record.metadata.ressources.and.links": "Risorse e collegamenti",
21860
21891
  "record.metadata.sheet": "Origine del metadata",
21861
21892
  "record.metadata.status": "Stato",
@@ -21892,7 +21923,6 @@ var it = {
21892
21923
  "results.records.hits.found": "{hits, plural, =0{Nessuna corrispondenza.} one{1 record trovato.} other{{hits} risultati.}}",
21893
21924
  "results.records.hits.selected": "{amount, plural, one{1 selezionato} other{{ amount } selezionati}}",
21894
21925
  "results.showMore": "Altri risultati...",
21895
- "results.sortBy.changeDate": "Ultima modifica",
21896
21926
  "results.sortBy.dateStamp": "Più recente",
21897
21927
  "results.sortBy.popularity": "Popolarità",
21898
21928
  "results.sortBy.qualityScore": "Indicatore di completamento",
@@ -21903,7 +21933,7 @@ var it = {
21903
21933
  "search.error.organizationHasNoDataset": "Questa organizzazione non ha ancora records.",
21904
21934
  "search.error.organizationNotFound": "Impossibile trovare l'organizzazione.",
21905
21935
  "search.error.receivedError": "Errore restituito",
21906
- "search.error.recordHasnolink": "Questo record non ha ancora alcun collegamento, riprova più tardi.",
21936
+ "search.error.recordHasnolink": "Questo record non ha attualmente alcun collegamento.",
21907
21937
  "search.error.recordNotFound": "Impossibile trovare questi record.",
21908
21938
  "search.field.any.placeholder": "Cerca del catalogo...",
21909
21939
  "search.field.sortBy": "Ordina per:",
@@ -22420,6 +22450,8 @@ var nl = {
22420
22450
  "record.metadata.api.accessServiceProtocol.maplibre-style": "",
22421
22451
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "",
22422
22452
  "record.metadata.api.accessServiceProtocol.other": "",
22453
+ "record.metadata.api.accessServiceProtocol.postgis": "",
22454
+ "record.metadata.api.accessServiceProtocol.stac": "",
22423
22455
  "record.metadata.api.accessServiceProtocol.tms": "",
22424
22456
  "record.metadata.api.accessServiceProtocol.wfs": "",
22425
22457
  "record.metadata.api.accessServiceProtocol.wms": "",
@@ -22467,7 +22499,8 @@ var nl = {
22467
22499
  "record.metadata.isGeographical": "",
22468
22500
  "record.metadata.keywords": "",
22469
22501
  "record.metadata.languages": "",
22470
- "record.metadata.lastUpdate": "",
22502
+ "record.metadata.link.postgis.table": "",
22503
+ "record.metadata.link.postgis.tooltip": "",
22471
22504
  "record.metadata.linked.datasets": "",
22472
22505
  "record.metadata.linked.records": "",
22473
22506
  "record.metadata.linked.reuses": "",
@@ -22508,6 +22541,9 @@ var nl = {
22508
22541
  "record.metadata.quality.updateFrequency.failed": "",
22509
22542
  "record.metadata.quality.updateFrequency.success": "",
22510
22543
  "record.metadata.related": "",
22544
+ "record.metadata.resourceCreated": "",
22545
+ "record.metadata.resourcePublished": "",
22546
+ "record.metadata.resourceUpdated": "",
22511
22547
  "record.metadata.ressources.and.links": "Bronnen en links",
22512
22548
  "record.metadata.sheet": "",
22513
22549
  "record.metadata.status": "",
@@ -22544,7 +22580,6 @@ var nl = {
22544
22580
  "results.records.hits.found": "",
22545
22581
  "results.records.hits.selected": "",
22546
22582
  "results.showMore": "",
22547
- "results.sortBy.changeDate": "",
22548
22583
  "results.sortBy.dateStamp": "",
22549
22584
  "results.sortBy.popularity": "",
22550
22585
  "results.sortBy.qualityScore": "",
@@ -23072,6 +23107,8 @@ var pt = {
23072
23107
  "record.metadata.api.accessServiceProtocol.maplibre-style": "",
23073
23108
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "",
23074
23109
  "record.metadata.api.accessServiceProtocol.other": "",
23110
+ "record.metadata.api.accessServiceProtocol.postgis": "",
23111
+ "record.metadata.api.accessServiceProtocol.stac": "",
23075
23112
  "record.metadata.api.accessServiceProtocol.tms": "",
23076
23113
  "record.metadata.api.accessServiceProtocol.wfs": "",
23077
23114
  "record.metadata.api.accessServiceProtocol.wms": "",
@@ -23119,7 +23156,8 @@ var pt = {
23119
23156
  "record.metadata.isGeographical": "",
23120
23157
  "record.metadata.keywords": "",
23121
23158
  "record.metadata.languages": "",
23122
- "record.metadata.lastUpdate": "",
23159
+ "record.metadata.link.postgis.table": "",
23160
+ "record.metadata.link.postgis.tooltip": "",
23123
23161
  "record.metadata.linked.datasets": "",
23124
23162
  "record.metadata.linked.records": "",
23125
23163
  "record.metadata.linked.reuses": "",
@@ -23160,6 +23198,9 @@ var pt = {
23160
23198
  "record.metadata.quality.updateFrequency.failed": "",
23161
23199
  "record.metadata.quality.updateFrequency.success": "",
23162
23200
  "record.metadata.related": "",
23201
+ "record.metadata.resourceCreated": "",
23202
+ "record.metadata.resourcePublished": "",
23203
+ "record.metadata.resourceUpdated": "",
23163
23204
  "record.metadata.ressources.and.links": "Recursos e links",
23164
23205
  "record.metadata.sheet": "",
23165
23206
  "record.metadata.status": "",
@@ -23196,7 +23237,6 @@ var pt = {
23196
23237
  "results.records.hits.found": "",
23197
23238
  "results.records.hits.selected": "",
23198
23239
  "results.showMore": "",
23199
- "results.sortBy.changeDate": "",
23200
23240
  "results.sortBy.dateStamp": "",
23201
23241
  "results.sortBy.popularity": "",
23202
23242
  "results.sortBy.qualityScore": "",
@@ -23724,6 +23764,8 @@ var sk = {
23724
23764
  "record.metadata.api.accessServiceProtocol.maplibre-style": "",
23725
23765
  "record.metadata.api.accessServiceProtocol.ogcFeatures": "",
23726
23766
  "record.metadata.api.accessServiceProtocol.other": "",
23767
+ "record.metadata.api.accessServiceProtocol.postgis": "",
23768
+ "record.metadata.api.accessServiceProtocol.stac": "",
23727
23769
  "record.metadata.api.accessServiceProtocol.tms": "",
23728
23770
  "record.metadata.api.accessServiceProtocol.wfs": "",
23729
23771
  "record.metadata.api.accessServiceProtocol.wms": "",
@@ -23771,7 +23813,8 @@ var sk = {
23771
23813
  "record.metadata.isGeographical": "Súbor geografických údajov",
23772
23814
  "record.metadata.keywords": "Kľúčové slová",
23773
23815
  "record.metadata.languages": "",
23774
- "record.metadata.lastUpdate": "Posledná aktualizácia",
23816
+ "record.metadata.link.postgis.table": "",
23817
+ "record.metadata.link.postgis.tooltip": "",
23775
23818
  "record.metadata.linked.datasets": "",
23776
23819
  "record.metadata.linked.records": "",
23777
23820
  "record.metadata.linked.reuses": "",
@@ -23812,6 +23855,9 @@ var sk = {
23812
23855
  "record.metadata.quality.updateFrequency.failed": "Frekvencia aktualizácie nie je určená",
23813
23856
  "record.metadata.quality.updateFrequency.success": "Frekvencia aktualizácie je určená",
23814
23857
  "record.metadata.related": "Súvisiace záznamy",
23858
+ "record.metadata.resourceCreated": "",
23859
+ "record.metadata.resourcePublished": "",
23860
+ "record.metadata.resourceUpdated": "",
23815
23861
  "record.metadata.ressources.and.links": "Prostředky a odkazy",
23816
23862
  "record.metadata.sheet": "Ďalšie metadáta sú k dispozícii na:",
23817
23863
  "record.metadata.status": "Stav",
@@ -23848,7 +23894,6 @@ var sk = {
23848
23894
  "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
23895
  "results.records.hits.selected": "{ amount } označených",
23850
23896
  "results.showMore": "Zobraziť viac výsledkov...",
23851
- "results.sortBy.changeDate": "",
23852
23897
  "results.sortBy.dateStamp": "Najnovšie",
23853
23898
  "results.sortBy.popularity": "Popularita",
23854
23899
  "results.sortBy.qualityScore": "Indikátor dokončenia",
@@ -24337,6 +24382,8 @@ class Gn4FieldMapper {
24337
24382
  /^OGC:WMTS/.test(protocol) ||
24338
24383
  /TMS/i.test(protocol) ||
24339
24384
  /ogc\W*api\W*features/i.test(protocol) ||
24385
+ /^DB:POSTGIS/i.test(protocol) ||
24386
+ /stac\W*items/i.test(protocol) ||
24340
24387
  (/^WWW:DOWNLOAD-/.test(protocol) && /data.geopf.fr/.test(url)) // TO DO : change with the good protocol when decided
24341
24388
  ) {
24342
24389
  return 'service';
@@ -24607,8 +24654,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
24607
24654
 
24608
24655
  const PROXY_PATH = new InjectionToken('proxyPath');
24609
24656
  class ProxyService {
24610
- constructor(proxyPath, location) {
24611
- this.proxyPath = proxyPath;
24657
+ get proxyPath() {
24658
+ return this.injector.get(PROXY_PATH, null);
24659
+ }
24660
+ constructor(injector, location) {
24661
+ this.injector = injector;
24612
24662
  this.location = location;
24613
24663
  }
24614
24664
  /**
@@ -24631,7 +24681,7 @@ class ProxyService {
24631
24681
  return url;
24632
24682
  return new URL(`${this.proxyPath}${encodeURIComponent(url)}`, window.location.href).toString();
24633
24683
  }
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 }); }
24684
+ 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
24685
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProxyService, providedIn: 'root' }); }
24636
24686
  }
24637
24687
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ProxyService, decorators: [{
@@ -24639,12 +24689,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
24639
24689
  args: [{
24640
24690
  providedIn: 'root',
24641
24691
  }]
24642
- }], ctorParameters: () => [{ type: undefined, decorators: [{
24643
- type: Optional
24644
- }, {
24645
- type: Inject,
24646
- args: [PROXY_PATH]
24647
- }] }, { type: i1$2.Location }] });
24692
+ }], ctorParameters: () => [{ type: i0.Injector }, { type: i1$2.Location }] });
24648
24693
 
24649
24694
  class DateService {
24650
24695
  constructor(translateService) {
@@ -24983,13 +25028,16 @@ function sortByToStrings(sortBy) {
24983
25028
  return array.map((param) => `${param[0] === 'desc' ? '-' : ''}${param[1]}`);
24984
25029
  }
24985
25030
  function sortByToString(sortBy) {
24986
- return sortByToStrings(sortBy)[0];
25031
+ return sortByToStrings(sortBy).join(',');
24987
25032
  }
24988
25033
  function sortByFromString(sortByString) {
24989
- return [
24990
- sortByString.startsWith('-') ? 'desc' : 'asc',
24991
- sortByString.startsWith('-') ? sortByString.substring(1) : sortByString,
24992
- ];
25034
+ const fields = sortByString
25035
+ .split(',')
25036
+ .map((field) => [
25037
+ field.startsWith('-') ? 'desc' : 'asc',
25038
+ field.startsWith('-') ? field.substring(1) : field,
25039
+ ]);
25040
+ return fields.length > 1 ? fields : fields[0];
24993
25041
  }
24994
25042
 
24995
25043
  const stripHtml = function (html) {
@@ -25187,6 +25235,12 @@ const FORMATS = {
25187
25235
  color: '#5A9E6F',
25188
25236
  mimeTypes: ['image/webp'],
25189
25237
  },
25238
+ postgis: {
25239
+ extensions: ['postgis'],
25240
+ priority: 18,
25241
+ color: '#336791',
25242
+ mimeTypes: [],
25243
+ },
25190
25244
  };
25191
25245
  function getFormatPriority(linkFormat) {
25192
25246
  for (const format in FORMATS) {
@@ -25217,6 +25271,11 @@ function getFileFormatFromServiceOutput(serviceOutput) {
25217
25271
  return null;
25218
25272
  }
25219
25273
  function getFileFormat(link) {
25274
+ if ('accessServiceProtocol' in link) {
25275
+ if (link.accessServiceProtocol in FORMATS) {
25276
+ return link.accessServiceProtocol;
25277
+ }
25278
+ }
25220
25279
  if ('mimeType' in link) {
25221
25280
  const mimeTypeFormat = mimeTypeToFormat(link.mimeType);
25222
25281
  if (mimeTypeFormat !== null) {
@@ -25382,6 +25441,10 @@ class LinkClassifierService {
25382
25441
  return [LinkUsage.API, LinkUsage.DOWNLOAD, LinkUsage.GEODATA];
25383
25442
  case 'GPFDL':
25384
25443
  return [LinkUsage.API];
25444
+ case 'postgis':
25445
+ return [LinkUsage.UNKNOWN];
25446
+ case 'stac':
25447
+ return [LinkUsage.API];
25385
25448
  default:
25386
25449
  return [LinkUsage.UNKNOWN];
25387
25450
  }
@@ -25445,7 +25508,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25445
25508
  }] } });
25446
25509
 
25447
25510
  var name = "geonetwork-ui";
25448
- var version = "2.8.0-dev.398701d7f";
25511
+ var version = "2.8.0-dev.5745b522e";
25449
25512
  var engines = {
25450
25513
  node: ">=20"
25451
25514
  };
@@ -25485,7 +25548,7 @@ var peerDependencies = {
25485
25548
  };
25486
25549
  var dependencies = {
25487
25550
  "@biesbjerg/ngx-translate-extract-marker": "~1.0.0",
25488
- "@camptocamp/ogc-client": "^1.3.0",
25551
+ "@camptocamp/ogc-client": "1.3.1-dev.edb3244",
25489
25552
  "@geospatial-sdk/core": "0.0.5-dev.37",
25490
25553
  "@geospatial-sdk/geocoding": "0.0.5-dev.37",
25491
25554
  "@geospatial-sdk/legend": "0.0.5-dev.37",
@@ -26197,7 +26260,7 @@ class Gn4SettingsService {
26197
26260
  this.apiVersion$ = this.getSettingsSetValueByKey('system/platform/version');
26198
26261
  }
26199
26262
  getSettingsSetValueByKey(key) {
26200
- return this.siteApiService.getSettingsSet(null, [key]).pipe(map$1((v) => v[key]), shareReplay$1({ bufferSize: 1, refCount: true }));
26263
+ return of(true).pipe(switchMap(() => this.siteApiService.getSettingsSet(null, [key])), map$1((v) => v[key]), shareReplay$1({ bufferSize: 1, refCount: true }));
26201
26264
  }
26202
26265
  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
26266
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, providedIn: 'root' }); }
@@ -26824,7 +26887,7 @@ class AuthService {
26824
26887
  baseUrl = baseUrl.replace('?', '&');
26825
26888
  }
26826
26889
  return baseUrl
26827
- .replace('${current_url}', new URL(this.location.path(), window.location.href).toString())
26890
+ .replace('${current_url}', new URL(this.location.prepareExternalUrl(this.location.path()), window.location.href).toString())
26828
26891
  .replace('${lang2}', toLang2(this.translateService.currentLang))
26829
26892
  .replace('${lang3}', toLang3(this.translateService.currentLang));
26830
26893
  }
@@ -27025,8 +27088,12 @@ class Gn4PlatformMapper {
27025
27088
  userFromApi(apiUser) {
27026
27089
  if (!apiUser)
27027
27090
  return null;
27028
- const { enabled, emailAddresses, organization, kind, lastLoginDate, accountNonExpired, accountNonLocked, id, credentialsNonExpired, ...user } = apiUser;
27029
- return { ...apiUser, id: id.toString() };
27091
+ const { addresses, emailAddresses, enabled, id, kind, lastLoginDate, security, primaryAddress, authorities, accountNonExpired, accountNonLocked, credentialsNonExpired, ...user } = apiUser;
27092
+ return {
27093
+ ...user,
27094
+ id: id.toString(),
27095
+ email: emailAddresses ? emailAddresses[0] || '' : '',
27096
+ };
27030
27097
  }
27031
27098
  keywordsFromApi(keywords, thesaurus, lang3) {
27032
27099
  return keywords.map((keyword) => {
@@ -27132,6 +27199,9 @@ class Gn4PlatformService {
27132
27199
  console.warn('Error while loading gnui language package');
27133
27200
  return of({});
27134
27201
  }), shareReplay$1(1));
27202
+ this.me$ = this.disableAuth
27203
+ ? of(null)
27204
+ : of(true).pipe(switchMap(() => this.meApi.getMe()), switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)), shareReplay$1({ bufferSize: 1, refCount: true }));
27135
27205
  /**
27136
27206
  * A map of already loaded thesauri (groups of keywords); the key is a URI
27137
27207
  * @private
@@ -27142,9 +27212,6 @@ class Gn4PlatformService {
27142
27212
  .pipe(map$1((thesaurus) => {
27143
27213
  return thesaurus[0];
27144
27214
  }), 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
27215
  this.isUserAnonymous$ = this.me$.pipe(map$1((user) => !user || !('id' in user)));
27149
27216
  this.users$ = this.usersApi.getUsers().pipe(map$1((users) => users.map((user) => this.mapper.userFromApi(user))), shareReplay$1());
27150
27217
  }
@@ -29757,8 +29824,7 @@ class DropdownSelectorComponent {
29757
29824
  ];
29758
29825
  }
29759
29826
  get selectedChoice() {
29760
- return (this.choices.find((choice) => choice.value === this.selected) ??
29761
- this.choices[0]);
29827
+ return (this.choices.find((choice) => JSON.stringify(choice.value) === JSON.stringify(this.selected)) ?? this.choices[0]);
29762
29828
  }
29763
29829
  get id() {
29764
29830
  return this.title.toLowerCase().replace(/[^a-z]+/g, '-');
@@ -33238,7 +33304,7 @@ class ErrorComponent {
33238
33304
  this.types = ErrorType;
33239
33305
  }
33240
33306
  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: [
33307
+ 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
33308
  provideIcons({
33243
33309
  matFace,
33244
33310
  matQuestionMark,
@@ -33256,7 +33322,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
33256
33322
  matMoodBad,
33257
33323
  matComputerOutline,
33258
33324
  }),
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"] }]
33325
+ ], 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
33326
  }], propDecorators: { type: [{
33261
33327
  type: Input
33262
33328
  }], error: [{
@@ -33735,7 +33801,7 @@ class ExternalLinkCardComponent {
33735
33801
  }
33736
33802
  set size(value) {
33737
33803
  this._size = value;
33738
- this.cardClass = this.sizeClassMap[value];
33804
+ this.cardClass = `group flex flex-row justify-between card-shadow rounded overflow-hidden ${this.sizeClassMap[value]}`;
33739
33805
  }
33740
33806
  get size() {
33741
33807
  return this._size;
@@ -33746,6 +33812,10 @@ class ExternalLinkCardComponent {
33746
33812
  }
33747
33813
  return this.link.name || this.link.description || '';
33748
33814
  }
33815
+ get isDatabase() {
33816
+ return (this.link.type === 'service' &&
33817
+ this.link.accessServiceProtocol === 'postgis');
33818
+ }
33749
33819
  getLinkFormat(link) {
33750
33820
  return getFileFormat(link);
33751
33821
  }
@@ -33756,18 +33826,20 @@ class ExternalLinkCardComponent {
33756
33826
  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
33827
  provideIcons({
33758
33828
  matOpenInNew,
33829
+ iconoirDatabase,
33759
33830
  }),
33760
33831
  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 }); }
33832
+ ], 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
33833
  }
33763
33834
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExternalLinkCardComponent, decorators: [{
33764
33835
  type: Component,
33765
33836
  args: [{ selector: 'gn-ui-external-link-card', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIconComponent, TranslatePipe], providers: [
33766
33837
  provideIcons({
33767
33838
  matOpenInNew,
33839
+ iconoirDatabase,
33768
33840
  }),
33769
33841
  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" }]
33842
+ ], 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
33843
  }], propDecorators: { link: [{
33772
33844
  type: Input
33773
33845
  }], size: [{
@@ -34037,7 +34109,7 @@ class MetadataInfoComponent {
34037
34109
  return this.dateService.formatDateTime(date);
34038
34110
  }
34039
34111
  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: [
34112
+ 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
34113
  provideIcons({
34042
34114
  matOpenInNew,
34043
34115
  matMailOutline: matMailOutline$1,
@@ -34065,7 +34137,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
34065
34137
  matOpenInNew,
34066
34138
  matMailOutline: matMailOutline$1,
34067
34139
  }),
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"] }]
34140
+ ], 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
34141
  }], ctorParameters: () => [{ type: DateService }], propDecorators: { metadata: [{
34070
34142
  type: Input
34071
34143
  }], incomplete: [{
@@ -36453,6 +36525,11 @@ const SortByEnum = {
36453
36525
  RELEVANCY: ['desc', '_score'],
36454
36526
  QUALITY_SCORE: ['desc', 'qualityScore'],
36455
36527
  CHANGE_DATE: ['desc', 'changeDate'],
36528
+ RESOURCE_DATES: [
36529
+ ['desc', 'revisionDateForResource'],
36530
+ ['desc', 'publicationDateForResource'],
36531
+ ['desc', 'creationDateForResource'],
36532
+ ],
36456
36533
  };
36457
36534
 
36458
36535
  class SortByComponent {
@@ -36462,33 +36539,29 @@ class SortByComponent {
36462
36539
  this.choices = [
36463
36540
  {
36464
36541
  label: marker('results.sortBy.relevancy'),
36465
- value: SortByEnum.RELEVANCY.join(','),
36542
+ value: SortByEnum.RELEVANCY,
36466
36543
  },
36467
36544
  {
36468
36545
  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(','),
36546
+ value: SortByEnum.RESOURCE_DATES,
36474
36547
  },
36475
36548
  {
36476
36549
  label: marker('results.sortBy.popularity'),
36477
- value: SortByEnum.POPULARITY.join(','),
36550
+ value: SortByEnum.POPULARITY,
36478
36551
  },
36479
36552
  ];
36480
- this.currentSortBy$ = this.facade.sortBy$.pipe(filter$1((sortBy) => !!sortBy), map$1((sortBy) => sortBy.join(',')));
36553
+ this.currentSortBy$ = this.facade.sortBy$.pipe(filter$1((sortBy) => !!sortBy), map$1((sortBy) => sortBy));
36481
36554
  }
36482
36555
  ngOnInit() {
36483
36556
  if (this.isQualitySortable) {
36484
36557
  this.choices.push({
36485
36558
  label: marker('results.sortBy.qualityScore'),
36486
- value: SortByEnum.QUALITY_SCORE.join(','),
36559
+ value: SortByEnum.QUALITY_SCORE,
36487
36560
  });
36488
36561
  }
36489
36562
  }
36490
- changeSortBy(criteriaAsString) {
36491
- this.searchService.setSortBy(criteriaAsString.split(','));
36563
+ changeSortBy(criteria) {
36564
+ this.searchService.setSortBy(criteria);
36492
36565
  }
36493
36566
  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
36567
  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 +40095,7 @@ class MapViewComponent {
40022
40095
  set exceedsLimit(value) {
40023
40096
  this.excludeWfs$.next(value);
40024
40097
  }
40098
+ // FIXME the map view component should not need a selectedView
40025
40099
  set selectedView(value) {
40026
40100
  this.selectedView$.next(value);
40027
40101
  }
@@ -43788,6 +43862,9 @@ class RouterService {
43788
43862
  getOrganizationPageRoute() {
43789
43863
  return ROUTER_ROUTE_ORGANIZATION;
43790
43864
  }
43865
+ getDefaultSort() {
43866
+ return SortByEnum.RESOURCE_DATES;
43867
+ }
43791
43868
  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
43869
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterService, providedIn: 'root' }); }
43793
43870
  }
@@ -43948,13 +44025,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
43948
44025
  }], ctorParameters: () => [{ type: i1$3.Store }, { type: RouterService }] });
43949
44026
 
43950
44027
  class RouterEffects {
43951
- constructor(_actions$, _router, _location, facade, routerConfig, fieldsService) {
44028
+ constructor(_actions$, _router, _location, facade, routerConfig, fieldsService, routerService) {
43952
44029
  this._actions$ = _actions$;
43953
44030
  this._router = _router;
43954
44031
  this._location = _location;
43955
44032
  this.facade = facade;
43956
44033
  this.routerConfig = routerConfig;
43957
44034
  this.fieldsService = fieldsService;
44035
+ this.routerService = routerService;
43958
44036
  this.navigate$ = createEffect(() => this._actions$.pipe(ofType(goAction), tap$1(({ path, query: queryParams, queryParamsHandling }) => {
43959
44037
  this._router.navigate([path], {
43960
44038
  queryParams,
@@ -43966,14 +44044,14 @@ class RouterEffects {
43966
44044
  .pipe(map$1((filters) => [searchParams, filters]))), startWith([null, {}]), pairwise(), map$1(([[oldParams, oldFilters], [newParams, newFilters]]) => {
43967
44045
  let sortBy = ROUTE_PARAMS.SORT in newParams
43968
44046
  ? sortByFromString(newParams[ROUTE_PARAMS.SORT])
43969
- : SortByEnum.CHANGE_DATE;
44047
+ : this.routerService.getDefaultSort();
43970
44048
  let pageNumber = ROUTE_PARAMS.PAGE in newParams
43971
44049
  ? parseInt(newParams[ROUTE_PARAMS.PAGE])
43972
44050
  : 1;
43973
44051
  if (oldParams !== null) {
43974
44052
  const oldSort = ROUTE_PARAMS.SORT in oldParams
43975
44053
  ? sortByFromString(oldParams[ROUTE_PARAMS.SORT])
43976
- : SortByEnum.CHANGE_DATE;
44054
+ : this.routerService.getDefaultSort();
43977
44055
  if (JSON.stringify(sortBy) === JSON.stringify(oldSort)) {
43978
44056
  sortBy = null;
43979
44057
  }
@@ -44030,7 +44108,7 @@ class RouterEffects {
44030
44108
  this.navigateBack$ = createEffect(() => this._actions$.pipe(ofType(backAction), tap$1(() => this._location.back())), { dispatch: false });
44031
44109
  this.navigateForward$ = createEffect(() => this._actions$.pipe(ofType(forwardAction), tap$1(() => this._location.forward())), { dispatch: false });
44032
44110
  }
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 }); }
44111
+ 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
44112
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects }); }
44035
44113
  }
44036
44114
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RouterEffects, decorators: [{
@@ -44038,7 +44116,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
44038
44116
  }], ctorParameters: () => [{ type: i1$c.Actions }, { type: i1$d.Router }, { type: i1$2.Location }, { type: RouterFacade }, { type: undefined, decorators: [{
44039
44117
  type: Inject,
44040
44118
  args: [ROUTER_CONFIG]
44041
- }] }, { type: FieldsService }] });
44119
+ }] }, { type: FieldsService }, { type: RouterService }] });
44042
44120
 
44043
44121
  class DefaultRouterModule {
44044
44122
  constructor(routerService) {