geonetwork-ui 2.7.0-dev.0d8b7bca9 → 2.7.0-dev.1feef407a

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 (123) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.mjs +4 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +5 -1
  3. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/constant.mjs +4 -6
  4. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +18 -4
  5. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +5 -1
  6. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +2 -2
  7. package/esm2022/libs/feature/editor/src/index.mjs +2 -1
  8. package/esm2022/libs/feature/editor/src/lib/components/metadata-quality-panel/metadata-quality-panel.component.mjs +80 -0
  9. package/esm2022/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.mjs +3 -3
  10. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +1 -3
  11. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +4 -2
  12. package/esm2022/libs/feature/search/src/lib/state/reducer.mjs +5 -2
  13. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +5 -4
  14. package/esm2022/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.mjs +5 -4
  15. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +4 -4
  16. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +21 -43
  17. package/esm2022/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.mjs +5 -4
  18. package/esm2022/libs/util/app-config/src/lib/app-config.mjs +3 -1
  19. package/esm2022/libs/util/app-config/src/lib/model.mjs +1 -1
  20. package/esm2022/libs/util/shared/src/index.mjs +2 -2
  21. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +4 -2
  22. package/esm2022/libs/util/shared/src/lib/record/index.mjs +3 -0
  23. package/esm2022/libs/util/shared/src/lib/record/quality-score.util.mjs +45 -0
  24. package/esm2022/libs/util/shared/src/lib/record/record.util.mjs +56 -0
  25. package/esm2022/libs/util/shared/src/lib/utils/index.mjs +2 -1
  26. package/esm2022/libs/util/shared/src/lib/utils/mobile-screen.mjs +9 -0
  27. package/esm2022/translations/de.json +7 -0
  28. package/esm2022/translations/en.json +7 -0
  29. package/esm2022/translations/es.json +7 -0
  30. package/esm2022/translations/fr.json +8 -1
  31. package/esm2022/translations/it.json +7 -0
  32. package/esm2022/translations/nl.json +7 -0
  33. package/esm2022/translations/pt.json +7 -0
  34. package/esm2022/translations/sk.json +7 -0
  35. package/fesm2022/geonetwork-ui.mjs +259 -71
  36. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  37. package/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.d.ts.map +1 -1
  38. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  39. package/libs/api/repository/src/lib/gn4/elasticsearch/constant.d.ts.map +1 -1
  40. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +2 -0
  41. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  42. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  43. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  44. package/libs/feature/editor/src/index.d.ts +1 -0
  45. package/libs/feature/editor/src/index.d.ts.map +1 -1
  46. package/libs/feature/editor/src/lib/components/metadata-quality-panel/metadata-quality-panel.component.d.ts +19 -0
  47. package/libs/feature/editor/src/lib/components/metadata-quality-panel/metadata-quality-panel.component.d.ts.map +1 -0
  48. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  49. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  50. package/libs/feature/search/src/lib/state/reducer.d.ts.map +1 -1
  51. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -0
  52. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts.map +1 -1
  53. package/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.d.ts +1 -0
  54. package/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.d.ts.map +1 -1
  55. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts.map +1 -1
  56. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts +7 -6
  57. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  58. package/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.d.ts +1 -0
  59. package/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.d.ts.map +1 -1
  60. package/libs/util/app-config/src/lib/app-config.d.ts.map +1 -1
  61. package/libs/util/app-config/src/lib/model.d.ts +1 -0
  62. package/libs/util/app-config/src/lib/model.d.ts.map +1 -1
  63. package/libs/util/shared/src/index.d.ts +1 -1
  64. package/libs/util/shared/src/index.d.ts.map +1 -1
  65. package/libs/util/shared/src/lib/links/link-utils.d.ts +1 -1
  66. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  67. package/libs/util/shared/src/lib/record/index.d.ts +3 -0
  68. package/libs/util/shared/src/lib/record/index.d.ts.map +1 -0
  69. package/libs/util/shared/src/lib/record/quality-score.util.d.ts +13 -0
  70. package/libs/util/shared/src/lib/record/quality-score.util.d.ts.map +1 -0
  71. package/libs/util/shared/src/lib/record/record.util.d.ts +3 -0
  72. package/libs/util/shared/src/lib/record/record.util.d.ts.map +1 -0
  73. package/libs/util/shared/src/lib/utils/index.d.ts +1 -0
  74. package/libs/util/shared/src/lib/utils/index.d.ts.map +1 -1
  75. package/libs/util/shared/src/lib/utils/mobile-screen.d.ts +2 -0
  76. package/libs/util/shared/src/lib/utils/mobile-screen.d.ts.map +1 -0
  77. package/package.json +1 -1
  78. package/src/libs/api/metadata-converter/src/lib/dcat-ap/utils/status.mapper.ts +3 -0
  79. package/src/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.ts +3 -0
  80. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +4 -0
  81. package/src/libs/api/repository/src/lib/gn4/elasticsearch/constant.ts +3 -5
  82. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +19 -6
  83. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +4 -0
  84. package/src/libs/common/fixtures/src/lib/editor/editor.fixtures.ts +0 -3
  85. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +3 -1
  86. package/src/libs/feature/editor/src/index.ts +1 -0
  87. package/src/libs/feature/editor/src/lib/components/metadata-quality-panel/metadata-quality-panel.component.css +0 -0
  88. package/src/libs/feature/editor/src/lib/components/metadata-quality-panel/metadata-quality-panel.component.html +37 -0
  89. package/src/libs/feature/editor/src/lib/components/metadata-quality-panel/metadata-quality-panel.component.ts +90 -0
  90. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.html +2 -1
  91. package/src/libs/feature/editor/src/lib/fields.config.ts +0 -2
  92. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +3 -1
  93. package/src/libs/feature/search/src/lib/state/reducer.ts +4 -1
  94. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +12 -11
  95. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +7 -1
  96. package/src/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.html +4 -1
  97. package/src/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.ts +7 -1
  98. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +1 -0
  99. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +5 -1
  100. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.html +1 -0
  101. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +21 -54
  102. package/src/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.html +7 -1
  103. package/src/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.ts +3 -1
  104. package/src/libs/util/app-config/src/lib/app-config.ts +2 -0
  105. package/src/libs/util/app-config/src/lib/model.ts +1 -0
  106. package/src/libs/util/shared/src/index.ts +1 -1
  107. package/src/libs/util/shared/src/lib/links/link-utils.ts +2 -1
  108. package/src/libs/util/shared/src/lib/record/index.ts +2 -0
  109. package/src/libs/util/shared/src/lib/record/quality-score.util.ts +69 -0
  110. package/src/libs/util/shared/src/lib/{record.util.ts → record/record.util.ts} +1 -1
  111. package/src/libs/util/shared/src/lib/utils/index.ts +1 -0
  112. package/src/libs/util/shared/src/lib/utils/mobile-screen.ts +14 -0
  113. package/translations/de.json +7 -0
  114. package/translations/en.json +7 -0
  115. package/translations/es.json +7 -0
  116. package/translations/fr.json +8 -1
  117. package/translations/it.json +7 -0
  118. package/translations/nl.json +7 -0
  119. package/translations/pt.json +7 -0
  120. package/translations/sk.json +7 -0
  121. package/esm2022/libs/util/shared/src/lib/record.util.mjs +0 -56
  122. package/libs/util/shared/src/lib/record.util.d.ts +0 -3
  123. package/libs/util/shared/src/lib/record.util.d.ts.map +0 -1
@@ -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, catchError, tap as tap$1, filter, startWith, withLatestFrom, switchMap as switchMap$1, take, mergeMap, delay, distinctUntilChanged, debounceTime, finalize, throttleTime, share, pairwise, first as first$1, defaultIfEmpty, toArray } from 'rxjs/operators';
18
- import { of, map as map$2, lastValueFrom, Subject, switchMap, combineLatest, from, exhaustMap, throwError, forkJoin, takeLast, firstValueFrom, merge, BehaviorSubject, fromEvent, timer, ReplaySubject, Subscription, first, distinctUntilChanged as distinctUntilChanged$1, animationFrameScheduler, debounceTime as debounceTime$1, filter as filter$1, take as take$1, tap as tap$2, Observable, buffer, combineLatestWith, startWith as startWith$1, catchError as catchError$1, takeUntil, EMPTY, mergeMap as mergeMap$1, withLatestFrom as withLatestFrom$1, shareReplay as shareReplay$1, pairwise as pairwise$1 } from 'rxjs';
18
+ import { of, map as map$2, lastValueFrom, Subject, switchMap, combineLatest, from, exhaustMap, throwError, forkJoin, takeLast, firstValueFrom, merge, BehaviorSubject, fromEvent, startWith as startWith$1, shareReplay as shareReplay$1, timer, ReplaySubject, Subscription, first, distinctUntilChanged as distinctUntilChanged$1, animationFrameScheduler, debounceTime as debounceTime$1, filter as filter$1, take as take$1, tap as tap$2, Observable, buffer, combineLatestWith, catchError as catchError$1, takeUntil, EMPTY, mergeMap as mergeMap$1, withLatestFrom as withLatestFrom$1, pairwise as pairwise$1 } from 'rxjs';
19
19
  import { lt, valid, coerce, satisfies, ltr } from 'semver';
20
20
  import * as i1$2 from '@angular/common';
21
21
  import { CommonModule, NgIf, NgSwitch, NgSwitchCase, NgSwitchDefault, NgClass, NgTemplateOutlet, DatePipe } from '@angular/common';
@@ -38,7 +38,7 @@ import * as TOML from '@ltd/j-toml';
38
38
  import { Style, Fill, Stroke, Circle } from 'ol/style';
39
39
  import CircleStyle from 'ol/style/Circle';
40
40
  import EmblaCarousel from 'embla-carousel';
41
- import { iconoirNavArrowRight, iconoirNavArrowLeft, iconoirSearch, iconoirLongArrowDownLeft, iconoirCalendar, iconoirLink, iconoirArrowUp, iconoirCloudUpload, iconoirFramePlusIn, iconoirReduce, iconoirNavArrowDown, iconoirNavArrowUp, iconoirExpand, iconoirAppleWallet, iconoirDatabase, iconoirCode, iconoirAppWindow, iconoirBank, iconoirSettings, iconoirDownload, iconoirMediaImage, iconoirMediaImageXmark, iconoirBin, iconoirPlus, iconoirList, iconoirUser, iconoirLock, iconoirTranslate, iconoirImport, iconoirLightBulbOn, iconoirArrowLeft, iconoirAttachment, iconoirRefresh, iconoirCheckCircle, iconoirCircle } from '@ng-icons/iconoir';
41
+ import { iconoirNavArrowRight, iconoirNavArrowLeft, iconoirSearch, iconoirLongArrowDownLeft, iconoirCalendar, iconoirLink, iconoirArrowUp, iconoirCloudUpload, iconoirFramePlusIn, iconoirReduce, iconoirNavArrowDown, iconoirNavArrowUp, iconoirExpand, iconoirAppleWallet, iconoirDatabase, iconoirCode, iconoirAppWindow, iconoirBank, iconoirSettings, iconoirDownload, iconoirMediaImage, iconoirMediaImageXmark, iconoirBin, iconoirPlus, iconoirList, iconoirUser, iconoirLock, iconoirTranslate, iconoirImport, iconoirLightBulbOn, iconoirArrowLeft, iconoirAttachment, iconoirRefresh, iconoirCheckCircle, iconoirCircle, iconoirSystemShut, iconoirBadgeCheck } from '@ng-icons/iconoir';
42
42
  import { MatButtonModule } from '@angular/material/button';
43
43
  import * as i1$8 from '@angular/cdk/overlay';
44
44
  import { CdkConnectedOverlay, OverlayModule, CdkOverlayOrigin } from '@angular/cdk/overlay';
@@ -795,8 +795,11 @@ function getStatusFromStatusCode(statusCode) {
795
795
  case 'onGoing':
796
796
  return 'ongoing';
797
797
  case 'planned':
798
+ return 'planned';
798
799
  case 'required':
800
+ return 'required';
799
801
  case 'underDevelopment':
802
+ return 'under_development';
800
803
  default:
801
804
  return 'under_development';
802
805
  }
@@ -893,12 +896,16 @@ marker('domain.record.status.ongoing');
893
896
  marker('domain.record.status.under_development');
894
897
  marker('domain.record.status.deprecated');
895
898
  marker('domain.record.status.removed');
899
+ marker('domain.record.status.planned');
900
+ marker('domain.record.status.required');
896
901
  const RecordStatusValues = [
897
902
  'completed',
898
903
  'ongoing',
899
904
  'under_development',
900
905
  'deprecated',
901
906
  'removed',
907
+ 'planned',
908
+ 'required',
902
909
  ];
903
910
 
904
911
  function getUpdateFrequencyFromFrequencyCode(frequencyCode) {
@@ -1565,6 +1572,10 @@ function getProgressCode(status) {
1565
1572
  return 'removed';
1566
1573
  case 'under_development':
1567
1574
  return 'underDevelopment';
1575
+ case 'planned':
1576
+ return 'planned';
1577
+ case 'required':
1578
+ return 'required';
1568
1579
  default:
1569
1580
  throw new Error(`Could not determine progress code from status: ${status}`);
1570
1581
  }
@@ -18770,7 +18781,9 @@ var de = {
18770
18781
  "domain.record.status.completed": "Abgeschlossen",
18771
18782
  "domain.record.status.deprecated": "Veraltet",
18772
18783
  "domain.record.status.ongoing": "Kontinuierliche Aktualisierung",
18784
+ "domain.record.status.planned": "",
18773
18785
  "domain.record.status.removed": "Entfernt",
18786
+ "domain.record.status.required": "",
18774
18787
  "domain.record.status.under_development": "In Erstellung",
18775
18788
  "domain.record.updateFrequency.annually": "Daten werden jedes Jahr aktualisiert",
18776
18789
  "domain.record.updateFrequency.asNeeded": "Daten werden nach Bedarf aktualisiert",
@@ -18826,6 +18839,7 @@ var de = {
18826
18839
  "editor.record.form.draft.updateAlert": "",
18827
18840
  "editor.record.form.field.abstract": "Kurzbeschreibung",
18828
18841
  "editor.record.form.field.constraintsShortcuts": "",
18842
+ "editor.record.form.field.contacts": "Ansprechpartner - Email",
18829
18843
  "editor.record.form.field.contacts.noContact": "",
18830
18844
  "editor.record.form.field.contacts.placeholder": "",
18831
18845
  "editor.record.form.field.contactsForResource.noContact": "",
@@ -18850,6 +18864,7 @@ var de = {
18850
18864
  "editor.record.form.field.onlineResource.toggle.dataset": "",
18851
18865
  "editor.record.form.field.onlineResource.toggle.service": "",
18852
18866
  "editor.record.form.field.onlineResources": "",
18867
+ "editor.record.form.field.organisation": "Ansprechpartner - Organisation",
18853
18868
  "editor.record.form.field.otherConstraints": "Allgemeine Einschränkung",
18854
18869
  "editor.record.form.field.overviews": "",
18855
18870
  "editor.record.form.field.recordUpdated": "Datensatz zuletzt aktualisiert",
@@ -18861,6 +18876,7 @@ var de = {
18861
18876
  "editor.record.form.field.temporalExtents": "Zeitlicher Umfang",
18862
18877
  "editor.record.form.field.title": "Metadaten-Titel",
18863
18878
  "editor.record.form.field.title.placeholder": "Geben Sie einen Titel ein",
18879
+ "editor.record.form.field.topics": "Kategorien",
18864
18880
  "editor.record.form.field.uniqueIdentifier": "Eindeutige Kennung (ID)",
18865
18881
  "editor.record.form.field.updateFrequency": "Aktualisierungshäufigkeit",
18866
18882
  "editor.record.form.keywords.place.placeholder": "",
@@ -18875,6 +18891,8 @@ var de = {
18875
18891
  "editor.record.form.license.odc-by": "",
18876
18892
  "editor.record.form.license.pddl": "",
18877
18893
  "editor.record.form.license.unknown": "",
18894
+ "editor.record.form.metadataQuality.open": "Öffnen Sie das Panel zur Metadatenqualität",
18895
+ "editor.record.form.metadataQuality.title": "Vollständigkeit",
18878
18896
  "editor.record.form.multilingual.activate": "",
18879
18897
  "editor.record.form.multilingual.default": "",
18880
18898
  "editor.record.form.multilingual.enable": "",
@@ -19381,7 +19399,9 @@ var en = {
19381
19399
  "domain.record.status.completed": "Completed",
19382
19400
  "domain.record.status.deprecated": "Deprecated",
19383
19401
  "domain.record.status.ongoing": "Ongoing",
19402
+ "domain.record.status.planned": "Planned",
19384
19403
  "domain.record.status.removed": "Removed",
19404
+ "domain.record.status.required": "Required",
19385
19405
  "domain.record.status.under_development": "Under development",
19386
19406
  "domain.record.updateFrequency.annually": "Data is updated every year",
19387
19407
  "domain.record.updateFrequency.asNeeded": "Data is updated as deemed necessary",
@@ -19437,6 +19457,7 @@ var en = {
19437
19457
  "editor.record.form.draft.updateAlert": "Since you created this draft, the dataset has been updated on { date } by { user }. Publishing your draft might erase their edits. To avoid this, you need to either cancel your changes or knowingly publish your own version.",
19438
19458
  "editor.record.form.field.abstract": "Abstract",
19439
19459
  "editor.record.form.field.constraintsShortcuts": "",
19460
+ "editor.record.form.field.contacts": "Point of contact - Email",
19440
19461
  "editor.record.form.field.contacts.noContact": "Please provide at least one point of contact.",
19441
19462
  "editor.record.form.field.contacts.placeholder": "Choose a contact",
19442
19463
  "editor.record.form.field.contactsForResource.noContact": "Please provide at least one point of contact responsible for the data.",
@@ -19461,6 +19482,7 @@ var en = {
19461
19482
  "editor.record.form.field.onlineResource.toggle.dataset": "Link to a file",
19462
19483
  "editor.record.form.field.onlineResource.toggle.service": "Link to a service",
19463
19484
  "editor.record.form.field.onlineResources": "Distribution",
19485
+ "editor.record.form.field.organisation": "Point of contact - Organization",
19464
19486
  "editor.record.form.field.otherConstraints": "Other constraint",
19465
19487
  "editor.record.form.field.overviews": "Overview",
19466
19488
  "editor.record.form.field.recordUpdated": "Record updated",
@@ -19472,6 +19494,7 @@ var en = {
19472
19494
  "editor.record.form.field.temporalExtents": "Temporal extents",
19473
19495
  "editor.record.form.field.title": "Metadata title",
19474
19496
  "editor.record.form.field.title.placeholder": "Enter a title",
19497
+ "editor.record.form.field.topics": "Categories",
19475
19498
  "editor.record.form.field.uniqueIdentifier": "Unique identifier",
19476
19499
  "editor.record.form.field.updateFrequency": "Update frequency",
19477
19500
  "editor.record.form.keywords.place.placeholder": "Search for place keywords",
@@ -19486,6 +19509,8 @@ var en = {
19486
19509
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
19487
19510
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
19488
19511
  "editor.record.form.license.unknown": "Unknown or absent",
19512
+ "editor.record.form.metadataQuality.open": "Open the metadata quality panel",
19513
+ "editor.record.form.metadataQuality.title": "Completeness",
19489
19514
  "editor.record.form.multilingual.activate": "Activate the languages",
19490
19515
  "editor.record.form.multilingual.default": "Default",
19491
19516
  "editor.record.form.multilingual.enable": "Multilingual Mode",
@@ -19992,7 +20017,9 @@ var es = {
19992
20017
  "domain.record.status.completed": "",
19993
20018
  "domain.record.status.deprecated": "",
19994
20019
  "domain.record.status.ongoing": "",
20020
+ "domain.record.status.planned": "",
19995
20021
  "domain.record.status.removed": "",
20022
+ "domain.record.status.required": "",
19996
20023
  "domain.record.status.under_development": "",
19997
20024
  "domain.record.updateFrequency.annually": "Los datos se actualizan cada año",
19998
20025
  "domain.record.updateFrequency.asNeeded": "Los datos se actualizan según sea necesario",
@@ -20048,6 +20075,7 @@ var es = {
20048
20075
  "editor.record.form.draft.updateAlert": "",
20049
20076
  "editor.record.form.field.abstract": "",
20050
20077
  "editor.record.form.field.constraintsShortcuts": "",
20078
+ "editor.record.form.field.contacts": "Punto de contacto - Correo ",
20051
20079
  "editor.record.form.field.contacts.noContact": "",
20052
20080
  "editor.record.form.field.contacts.placeholder": "",
20053
20081
  "editor.record.form.field.contactsForResource.noContact": "",
@@ -20072,6 +20100,7 @@ var es = {
20072
20100
  "editor.record.form.field.onlineResource.toggle.dataset": "",
20073
20101
  "editor.record.form.field.onlineResource.toggle.service": "",
20074
20102
  "editor.record.form.field.onlineResources": "",
20103
+ "editor.record.form.field.organisation": "Punto de contacto - Organización",
20075
20104
  "editor.record.form.field.otherConstraints": "",
20076
20105
  "editor.record.form.field.overviews": "",
20077
20106
  "editor.record.form.field.recordUpdated": "",
@@ -20083,6 +20112,7 @@ var es = {
20083
20112
  "editor.record.form.field.temporalExtents": "",
20084
20113
  "editor.record.form.field.title": "",
20085
20114
  "editor.record.form.field.title.placeholder": "Introduzca un título",
20115
+ "editor.record.form.field.topics": "Categorías",
20086
20116
  "editor.record.form.field.uniqueIdentifier": "",
20087
20117
  "editor.record.form.field.updateFrequency": "",
20088
20118
  "editor.record.form.keywords.place.placeholder": "",
@@ -20097,6 +20127,8 @@ var es = {
20097
20127
  "editor.record.form.license.odc-by": "",
20098
20128
  "editor.record.form.license.pddl": "",
20099
20129
  "editor.record.form.license.unknown": "",
20130
+ "editor.record.form.metadataQuality.open": "Abrir el panel de calidad de los metadatos",
20131
+ "editor.record.form.metadataQuality.title": "Completitud",
20100
20132
  "editor.record.form.multilingual.activate": "",
20101
20133
  "editor.record.form.multilingual.default": "",
20102
20134
  "editor.record.form.multilingual.enable": "",
@@ -20603,7 +20635,9 @@ var fr = {
20603
20635
  "domain.record.status.completed": "Finalisé",
20604
20636
  "domain.record.status.deprecated": "Obsolète",
20605
20637
  "domain.record.status.ongoing": "Mise à jour continue",
20638
+ "domain.record.status.planned": "Planifié",
20606
20639
  "domain.record.status.removed": "Supprimé",
20640
+ "domain.record.status.required": "Obligatoire",
20607
20641
  "domain.record.status.under_development": "En cours de création",
20608
20642
  "domain.record.updateFrequency.annually": "Les données sont mises à jour chaque année",
20609
20643
  "domain.record.updateFrequency.asNeeded": "Les données sont mises à jour selon les besoins",
@@ -20616,7 +20650,7 @@ var fr = {
20616
20650
  "domain.record.updateFrequency.irregular": "Les données sont mises à jour à intervalles irréguliers",
20617
20651
  "domain.record.updateFrequency.month": "{count, plural, =0{0 fois} one{Une fois} other{{count} fois}} par mois",
20618
20652
  "domain.record.updateFrequency.monthly": "Les données sont mises à jour chaque mois",
20619
- "domain.record.updateFrequency.notPlanned": "Il n'y a pas de plan pour mettre à jour les données",
20653
+ "domain.record.updateFrequency.notPlanned": "La mise à jour des données n’est pas planifiée",
20620
20654
  "domain.record.updateFrequency.periodic": "Les données sont mises à jour à intervalles réguliers",
20621
20655
  "domain.record.updateFrequency.quarterly": "Les données sont mises à jour tous les trois mois",
20622
20656
  "domain.record.updateFrequency.semimonthly": "Les données sont mises à jour deux fois par mois",
@@ -20659,6 +20693,7 @@ var fr = {
20659
20693
  "editor.record.form.draft.updateAlert": "Depuis la création de ce brouillon, ce jeu de données a été modifié le { date } par { user }. Publier votre version peut supprimer ses modifications. Pour éviter cela, vous pouvez annuler vos changements, ou publier votre version en connaissance de cause.",
20660
20694
  "editor.record.form.field.abstract": "Description",
20661
20695
  "editor.record.form.field.constraintsShortcuts": "",
20696
+ "editor.record.form.field.contacts": "Point de contact - Email",
20662
20697
  "editor.record.form.field.contacts.noContact": "Veuillez renseigner au moins un point de contact.",
20663
20698
  "editor.record.form.field.contacts.placeholder": "Choisissez un contact",
20664
20699
  "editor.record.form.field.contactsForResource.noContact": "Veuillez renseigner au moins un point de contact responsable de la donnée.",
@@ -20683,6 +20718,7 @@ var fr = {
20683
20718
  "editor.record.form.field.onlineResource.toggle.dataset": "Lier un fichier",
20684
20719
  "editor.record.form.field.onlineResource.toggle.service": "Lier un service",
20685
20720
  "editor.record.form.field.onlineResources": "Distribution",
20721
+ "editor.record.form.field.organisation": "Point de contact - Organisation",
20686
20722
  "editor.record.form.field.otherConstraints": "Contrainte générale",
20687
20723
  "editor.record.form.field.overviews": "Aperçu",
20688
20724
  "editor.record.form.field.recordUpdated": "Date de mise à jour",
@@ -20694,6 +20730,7 @@ var fr = {
20694
20730
  "editor.record.form.field.temporalExtents": "Étendue temporelle",
20695
20731
  "editor.record.form.field.title": "Titre",
20696
20732
  "editor.record.form.field.title.placeholder": "Saisir un titre",
20733
+ "editor.record.form.field.topics": "Thèmes",
20697
20734
  "editor.record.form.field.uniqueIdentifier": "Identifiant unique",
20698
20735
  "editor.record.form.field.updateFrequency": "Fréquence de mise à jour",
20699
20736
  "editor.record.form.keywords.place.placeholder": "Rechercher une localisation par mot-clé",
@@ -20708,6 +20745,8 @@ var fr = {
20708
20745
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
20709
20746
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
20710
20747
  "editor.record.form.license.unknown": "Inconnue ou absente",
20748
+ "editor.record.form.metadataQuality.open": "Ouvrir le menu de qualité des métadonnées",
20749
+ "editor.record.form.metadataQuality.title": "Complétion",
20711
20750
  "editor.record.form.multilingual.activate": "Activez les langues",
20712
20751
  "editor.record.form.multilingual.default": "Par défaut",
20713
20752
  "editor.record.form.multilingual.enable": "Mode Multilingue",
@@ -21214,7 +21253,9 @@ var it = {
21214
21253
  "domain.record.status.completed": "Completato",
21215
21254
  "domain.record.status.deprecated": "Deprecato",
21216
21255
  "domain.record.status.ongoing": "Aggiornamento continuo",
21256
+ "domain.record.status.planned": "",
21217
21257
  "domain.record.status.removed": "Rimosso",
21258
+ "domain.record.status.required": "",
21218
21259
  "domain.record.status.under_development": "In fase di creazione",
21219
21260
  "domain.record.updateFrequency.annually": "I dati vengono aggiornati ogni anno",
21220
21261
  "domain.record.updateFrequency.asNeeded": "I dati vengono aggiornati secondo necessità",
@@ -21270,6 +21311,7 @@ var it = {
21270
21311
  "editor.record.form.draft.updateAlert": "Da quando è stata creata questa bozza, questo dataset è stato modificato il { date } da { user }. La pubblicazione della sua versione potrebbe rimuovere le loro modifiche. Per evitarlo, puoi annullare le sue modifiche o pubblicare la sua versione consapevolmente.",
21271
21312
  "editor.record.form.field.abstract": "Riassunto",
21272
21313
  "editor.record.form.field.constraintsShortcuts": "",
21314
+ "editor.record.form.field.contacts": "",
21273
21315
  "editor.record.form.field.contacts.noContact": "Inserisci almeno un punto di contatto.",
21274
21316
  "editor.record.form.field.contacts.placeholder": "Scegli un contatto",
21275
21317
  "editor.record.form.field.contactsForResource.noContact": "Inserisci almeno un punto di contatto responsabile dei dati.",
@@ -21294,6 +21336,7 @@ var it = {
21294
21336
  "editor.record.form.field.onlineResource.toggle.dataset": "Collega un file",
21295
21337
  "editor.record.form.field.onlineResource.toggle.service": "Collega un servizio",
21296
21338
  "editor.record.form.field.onlineResources": "Distribuzione",
21339
+ "editor.record.form.field.organisation": "",
21297
21340
  "editor.record.form.field.otherConstraints": "Vincolo generale",
21298
21341
  "editor.record.form.field.overviews": "Panoramica",
21299
21342
  "editor.record.form.field.recordUpdated": "Data di aggiornamento",
@@ -21305,6 +21348,7 @@ var it = {
21305
21348
  "editor.record.form.field.temporalExtents": "Estensioni temporali",
21306
21349
  "editor.record.form.field.title": "Titolo",
21307
21350
  "editor.record.form.field.title.placeholder": "Inserisci un titolo",
21351
+ "editor.record.form.field.topics": "",
21308
21352
  "editor.record.form.field.uniqueIdentifier": "Identificatore univoco",
21309
21353
  "editor.record.form.field.updateFrequency": "Frequenza di aggiornamento",
21310
21354
  "editor.record.form.keywords.place.placeholder": "Cerca una posizione per parola chiave",
@@ -21319,6 +21363,8 @@ var it = {
21319
21363
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
21320
21364
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
21321
21365
  "editor.record.form.license.unknown": "Sconosciuto o assente",
21366
+ "editor.record.form.metadataQuality.open": "",
21367
+ "editor.record.form.metadataQuality.title": "",
21322
21368
  "editor.record.form.multilingual.activate": "",
21323
21369
  "editor.record.form.multilingual.default": "",
21324
21370
  "editor.record.form.multilingual.enable": "Aprire il pannello multilingue",
@@ -21825,7 +21871,9 @@ var nl = {
21825
21871
  "domain.record.status.completed": "",
21826
21872
  "domain.record.status.deprecated": "",
21827
21873
  "domain.record.status.ongoing": "",
21874
+ "domain.record.status.planned": "",
21828
21875
  "domain.record.status.removed": "",
21876
+ "domain.record.status.required": "",
21829
21877
  "domain.record.status.under_development": "",
21830
21878
  "domain.record.updateFrequency.annually": "Gegevens worden elk jaar bijgewerkt",
21831
21879
  "domain.record.updateFrequency.asNeeded": "Gegevens worden bijgewerkt naar behoefte",
@@ -21881,6 +21929,7 @@ var nl = {
21881
21929
  "editor.record.form.draft.updateAlert": "",
21882
21930
  "editor.record.form.field.abstract": "",
21883
21931
  "editor.record.form.field.constraintsShortcuts": "",
21932
+ "editor.record.form.field.contacts": "",
21884
21933
  "editor.record.form.field.contacts.noContact": "",
21885
21934
  "editor.record.form.field.contacts.placeholder": "",
21886
21935
  "editor.record.form.field.contactsForResource.noContact": "",
@@ -21905,6 +21954,7 @@ var nl = {
21905
21954
  "editor.record.form.field.onlineResource.toggle.dataset": "",
21906
21955
  "editor.record.form.field.onlineResource.toggle.service": "",
21907
21956
  "editor.record.form.field.onlineResources": "",
21957
+ "editor.record.form.field.organisation": "",
21908
21958
  "editor.record.form.field.otherConstraints": "",
21909
21959
  "editor.record.form.field.overviews": "",
21910
21960
  "editor.record.form.field.recordUpdated": "",
@@ -21916,6 +21966,7 @@ var nl = {
21916
21966
  "editor.record.form.field.temporalExtents": "",
21917
21967
  "editor.record.form.field.title": "",
21918
21968
  "editor.record.form.field.title.placeholder": "Voer een titel in",
21969
+ "editor.record.form.field.topics": "",
21919
21970
  "editor.record.form.field.uniqueIdentifier": "",
21920
21971
  "editor.record.form.field.updateFrequency": "",
21921
21972
  "editor.record.form.keywords.place.placeholder": "",
@@ -21930,6 +21981,8 @@ var nl = {
21930
21981
  "editor.record.form.license.odc-by": "",
21931
21982
  "editor.record.form.license.pddl": "",
21932
21983
  "editor.record.form.license.unknown": "",
21984
+ "editor.record.form.metadataQuality.open": "",
21985
+ "editor.record.form.metadataQuality.title": "",
21933
21986
  "editor.record.form.multilingual.activate": "",
21934
21987
  "editor.record.form.multilingual.default": "",
21935
21988
  "editor.record.form.multilingual.enable": "",
@@ -22436,7 +22489,9 @@ var pt = {
22436
22489
  "domain.record.status.completed": "",
22437
22490
  "domain.record.status.deprecated": "",
22438
22491
  "domain.record.status.ongoing": "",
22492
+ "domain.record.status.planned": "",
22439
22493
  "domain.record.status.removed": "",
22494
+ "domain.record.status.required": "",
22440
22495
  "domain.record.status.under_development": "",
22441
22496
  "domain.record.updateFrequency.annually": "Os dados são atualizados anualmente",
22442
22497
  "domain.record.updateFrequency.asNeeded": "Os dados são atualizados conforme necessário",
@@ -22492,6 +22547,7 @@ var pt = {
22492
22547
  "editor.record.form.draft.updateAlert": "",
22493
22548
  "editor.record.form.field.abstract": "",
22494
22549
  "editor.record.form.field.constraintsShortcuts": "",
22550
+ "editor.record.form.field.contacts": "",
22495
22551
  "editor.record.form.field.contacts.noContact": "",
22496
22552
  "editor.record.form.field.contacts.placeholder": "",
22497
22553
  "editor.record.form.field.contactsForResource.noContact": "",
@@ -22516,6 +22572,7 @@ var pt = {
22516
22572
  "editor.record.form.field.onlineResource.toggle.dataset": "",
22517
22573
  "editor.record.form.field.onlineResource.toggle.service": "",
22518
22574
  "editor.record.form.field.onlineResources": "",
22575
+ "editor.record.form.field.organisation": "",
22519
22576
  "editor.record.form.field.otherConstraints": "",
22520
22577
  "editor.record.form.field.overviews": "",
22521
22578
  "editor.record.form.field.recordUpdated": "",
@@ -22527,6 +22584,7 @@ var pt = {
22527
22584
  "editor.record.form.field.temporalExtents": "",
22528
22585
  "editor.record.form.field.title": "",
22529
22586
  "editor.record.form.field.title.placeholder": "Insira um título",
22587
+ "editor.record.form.field.topics": "",
22530
22588
  "editor.record.form.field.uniqueIdentifier": "",
22531
22589
  "editor.record.form.field.updateFrequency": "",
22532
22590
  "editor.record.form.keywords.place.placeholder": "",
@@ -22541,6 +22599,8 @@ var pt = {
22541
22599
  "editor.record.form.license.odc-by": "",
22542
22600
  "editor.record.form.license.pddl": "",
22543
22601
  "editor.record.form.license.unknown": "",
22602
+ "editor.record.form.metadataQuality.open": "",
22603
+ "editor.record.form.metadataQuality.title": "",
22544
22604
  "editor.record.form.multilingual.activate": "",
22545
22605
  "editor.record.form.multilingual.default": "",
22546
22606
  "editor.record.form.multilingual.enable": "",
@@ -23047,7 +23107,9 @@ var sk = {
23047
23107
  "domain.record.status.completed": "Dokončené",
23048
23108
  "domain.record.status.deprecated": "Zastarané",
23049
23109
  "domain.record.status.ongoing": "Prebiehajúce",
23110
+ "domain.record.status.planned": "",
23050
23111
  "domain.record.status.removed": "Odstránené",
23112
+ "domain.record.status.required": "",
23051
23113
  "domain.record.status.under_development": "Vo vývoji",
23052
23114
  "domain.record.updateFrequency.annually": "Údaje sa aktualizujú každý rok",
23053
23115
  "domain.record.updateFrequency.asNeeded": "Údaje sa aktualizujú podľa potreby",
@@ -23103,6 +23165,7 @@ var sk = {
23103
23165
  "editor.record.form.draft.updateAlert": "",
23104
23166
  "editor.record.form.field.abstract": "",
23105
23167
  "editor.record.form.field.constraintsShortcuts": "",
23168
+ "editor.record.form.field.contacts": "",
23106
23169
  "editor.record.form.field.contacts.noContact": "",
23107
23170
  "editor.record.form.field.contacts.placeholder": "",
23108
23171
  "editor.record.form.field.contactsForResource.noContact": "",
@@ -23127,6 +23190,7 @@ var sk = {
23127
23190
  "editor.record.form.field.onlineResource.toggle.dataset": "",
23128
23191
  "editor.record.form.field.onlineResource.toggle.service": "",
23129
23192
  "editor.record.form.field.onlineResources": "",
23193
+ "editor.record.form.field.organisation": "",
23130
23194
  "editor.record.form.field.otherConstraints": "",
23131
23195
  "editor.record.form.field.overviews": "",
23132
23196
  "editor.record.form.field.recordUpdated": "",
@@ -23138,6 +23202,7 @@ var sk = {
23138
23202
  "editor.record.form.field.temporalExtents": "",
23139
23203
  "editor.record.form.field.title": "",
23140
23204
  "editor.record.form.field.title.placeholder": "Zadajte názov",
23205
+ "editor.record.form.field.topics": "",
23141
23206
  "editor.record.form.field.uniqueIdentifier": "",
23142
23207
  "editor.record.form.field.updateFrequency": "",
23143
23208
  "editor.record.form.keywords.place.placeholder": "",
@@ -23152,6 +23217,8 @@ var sk = {
23152
23217
  "editor.record.form.license.odc-by": "",
23153
23218
  "editor.record.form.license.pddl": "",
23154
23219
  "editor.record.form.license.unknown": "",
23220
+ "editor.record.form.metadataQuality.open": "",
23221
+ "editor.record.form.metadataQuality.title": "",
23155
23222
  "editor.record.form.multilingual.activate": "",
23156
23223
  "editor.record.form.multilingual.default": "",
23157
23224
  "editor.record.form.multilingual.enable": "",
@@ -24076,14 +24143,12 @@ const ES_SOURCE_SUMMARY = [
24076
24143
  'codelist_status_text',
24077
24144
  'link',
24078
24145
  'linkProtocol',
24079
- 'contactForResource.organisation',
24080
- 'contact.organisation',
24081
- 'contact.email',
24146
+ 'contactForResource*.organisation*',
24147
+ 'contact*.organisation*',
24148
+ 'contact*.email',
24082
24149
  'userSavedCount',
24083
- 'updateFrequency',
24084
24150
  'cl_topic',
24085
24151
  'cl_maintenanceAndUpdateFrequency',
24086
- 'tag',
24087
24152
  'MD_LegalConstraints*Object',
24088
24153
  'qualityScore',
24089
24154
  'allKeywords',
@@ -25846,6 +25911,14 @@ function downgradeImage(blob, maxSizeBytes) {
25846
25911
  });
25847
25912
  }
25848
25913
 
25914
+ /**
25915
+ * This returns true when the screen size is under 768px, which is the mobile threshold.
25916
+ */
25917
+ const MOBILE_MAX_WIDTH = 768;
25918
+ function getIsMobile() {
25919
+ return fromEvent(window, 'resize').pipe(startWith$1(window.innerWidth), map$2(() => window.innerWidth < MOBILE_MAX_WIDTH), shareReplay$1({ bufferSize: 1, refCount: true }));
25920
+ }
25921
+
25849
25922
  function noDuplicateFileName(fileName, fileNameList) {
25850
25923
  if (fileNameList.includes(fileName)) {
25851
25924
  const fileNameParts = fileName.split('.');
@@ -25984,8 +26057,8 @@ const FORMATS = {
25984
26057
  excel: {
25985
26058
  extensions: [
25986
26059
  'excel',
25987
- 'xls',
25988
26060
  'xlsx',
26061
+ 'xls',
25989
26062
  'ms-excel',
25990
26063
  'openxmlformats-officedocument',
25991
26064
  ],
@@ -26134,6 +26207,8 @@ function getFileFormat(link) {
26134
26207
  }
26135
26208
  function isFormatInQueryParam(link, alias) {
26136
26209
  const queryParams = link.url.searchParams;
26210
+ if (!queryParams)
26211
+ return false;
26137
26212
  for (const [key, value] of queryParams.entries()) {
26138
26213
  if (key === 'format' || key === 'f') {
26139
26214
  return value === alias;
@@ -26342,7 +26417,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
26342
26417
  }] } });
26343
26418
 
26344
26419
  var name = "geonetwork-ui";
26345
- var version = "2.7.0-dev.0d8b7bca9";
26420
+ var version = "2.7.0-dev.1feef407a";
26346
26421
  var engines = {
26347
26422
  node: ">=20"
26348
26423
  };
@@ -26441,6 +26516,51 @@ const GEONETWORK_UI_TAG_NAME = GEONETWORK_UI_VERSION.split('-')[1] === 'dev'
26441
26516
  ? 'main'
26442
26517
  : `v${packageJson.version}`;
26443
26518
 
26519
+ const ValidatorMapper = {
26520
+ title: (record) => !!record?.title,
26521
+ abstract: (record) => !!record?.abstract,
26522
+ keywords: (record) => (record?.keywords?.length ?? 0) > 0,
26523
+ legalConstraints: (record) => (record?.legalConstraints?.length ?? 0) > 0,
26524
+ contacts: (record) => !!record?.contacts?.[0]?.email,
26525
+ updateFrequency: (record) => !!record?.updateFrequency,
26526
+ topics: (record) => (record?.topics?.length ?? 0) > 0,
26527
+ organisation: (record) => !!record?.contacts?.[0]?.organization?.name,
26528
+ capabilities: (record) => record?.onlineResources?.some((resource) => resource?.url?.href.toLowerCase().includes('capabilities')),
26529
+ source: (record) => !!record?.extras?.sourcesIdentifiers,
26530
+ };
26531
+ function getAllKeysValidator() {
26532
+ return Object.keys(ValidatorMapper);
26533
+ }
26534
+ function getMappersFromKind(kind) {
26535
+ let kindKeys = [];
26536
+ const commonsKeys = [
26537
+ 'title',
26538
+ 'abstract',
26539
+ 'keywords',
26540
+ 'legalConstraints',
26541
+ 'contacts',
26542
+ ];
26543
+ switch (kind) {
26544
+ case 'service':
26545
+ kindKeys = ['capabilities'];
26546
+ break;
26547
+ case 'reuse':
26548
+ kindKeys = ['topics', 'organisation', 'source'];
26549
+ break;
26550
+ case 'dataset':
26551
+ default:
26552
+ kindKeys = ['updateFrequency', 'topics', 'organisation'];
26553
+ }
26554
+ return [...commonsKeys, ...kindKeys];
26555
+ }
26556
+ function getQualityValidators(record, propsToValidate) {
26557
+ const filteredProps = propsToValidate.filter((prop) => getMappersFromKind(record.kind).includes(prop));
26558
+ return filteredProps.map((name) => ({
26559
+ name,
26560
+ validator: () => ValidatorMapper[name](record),
26561
+ }));
26562
+ }
26563
+
26444
26564
  function updateLanguages(record, defaultLanguage, otherLanguages) {
26445
26565
  function updateFieldTranslations(target, fieldName) {
26446
26566
  const fieldTranslations = {};
@@ -26514,6 +26634,7 @@ class Gn4PlatformService {
26514
26634
  this.httpClient = httpClient;
26515
26635
  this.recordsApiService = recordsApiService;
26516
26636
  this.type = 'GeoNetwork';
26637
+ this.gnParseVersion = '4.2.5';
26517
26638
  this.keyTranslations$ = this.toolsApiService
26518
26639
  .getTranslationsPackage1('gnui')
26519
26640
  .pipe(catchError(() => {
@@ -26692,15 +26813,28 @@ class Gn4PlatformService {
26692
26813
  }));
26693
26814
  }
26694
26815
  getFileContent(url) {
26695
- return this.httpClient.get(url.toString(), { responseType: 'text' }).pipe(map$1((text) => {
26816
+ return combineLatest([
26817
+ this.httpClient.get(url.toString(), { responseType: 'text' }),
26818
+ this.getApiVersion(),
26819
+ ]).pipe(map$1(([text, version]) => {
26696
26820
  const parsed = JSON.parse(text);
26697
- if (typeof parsed === 'object') {
26821
+ if (version > this.gnParseVersion) {
26698
26822
  return parsed;
26699
26823
  }
26700
- const decoded = atob(parsed);
26824
+ const decoded = this.decodeBase64(parsed);
26701
26825
  return JSON.parse(decoded);
26702
26826
  }));
26703
26827
  }
26828
+ decodeBase64(base64) {
26829
+ const text = atob(base64);
26830
+ const length = text.length;
26831
+ const bytes = new Uint8Array(length);
26832
+ for (let i = 0; i < length; i++) {
26833
+ bytes[i] = text.charCodeAt(i);
26834
+ }
26835
+ const decoder = new TextDecoder();
26836
+ return decoder.decode(bytes);
26837
+ }
26704
26838
  attachFileToRecord(recordUuid, file, removeDuplicate = false) {
26705
26839
  return this.getRecordAttachments(recordUuid).pipe(map$1((recordAttachments) => recordAttachments.map((r) => r.fileName)), switchMap((fileNames) => {
26706
26840
  const fileName = file.name;
@@ -27948,6 +28082,7 @@ function loadAppConfig() {
27948
28082
  'filter_geometry_url',
27949
28083
  'search_preset',
27950
28084
  'advanced_filters',
28085
+ 'limit',
27951
28086
  ], warnings, errors);
27952
28087
  const parsedSearchParams = parseMultiConfigSection(parsed, 'search_preset', ['name'], ['sort', 'filters'], warnings, errors);
27953
28088
  searchConfig =
@@ -27963,6 +28098,7 @@ function loadAppConfig() {
27963
28098
  filters: param.filters,
27964
28099
  })),
27965
28100
  ADVANCED_FILTERS: parsedSearchSection.advanced_filters,
28101
+ LIMIT: parsedSearchSection.limit,
27966
28102
  };
27967
28103
  const parsedMetadataQualitySection = parseConfigSection(parsed, 'metadata-quality', [], ['enabled'], warnings, errors);
27968
28104
  metadataQualityConfig =
@@ -30271,6 +30407,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30271
30407
 
30272
30408
  class SearchFeatureCatalogComponent {
30273
30409
  constructor() {
30410
+ this.isMobile$ = getIsMobile();
30274
30411
  this.filteredFeatureCatalogChange = new EventEmitter();
30275
30412
  this.filterAction = (searchTerm) => {
30276
30413
  of(searchTerm)
@@ -30303,7 +30440,7 @@ class SearchFeatureCatalogComponent {
30303
30440
  return (this.filteredFeatureCatalog?.featureTypes?.reduce((total, featureType) => total + (featureType.attributes?.length || 0), 0) || 0);
30304
30441
  }
30305
30442
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SearchFeatureCatalogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
30306
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SearchFeatureCatalogComponent, isStandalone: true, selector: "gn-ui-search-feature-catalog", inputs: { featureCatalog: "featureCatalog" }, outputs: { filteredFeatureCatalogChange: "filteredFeatureCatalogChange" }, ngImport: i0, template: "<div\n class=\"flex items-center justify-between p-3 mt-8 bg-white rounded-lg border-b solid border-gray-300\"\n>\n <div\n class=\"relative shrink-0\"\n *ngIf=\"featureCatalog?.featureTypes?.length > 1\"\n >\n <input\n type=\"text\"\n [placeholder]=\"'search.filter.into.feature.catalog' | translate\"\n class=\"w-[220px] h-8 pl-3 pr-10 py-2 border rounded-md\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"filterAction(searchTerm)\"\n />\n <ng-icon\n class=\"absolute right-2.5 top-1 w-6 h-6 text-black\"\n name=\"iconoirSearch\"\n ></ng-icon>\n </div>\n <div class=\"text-sm px-1 ml-auto hidden sm:inline\">\n <ng-container *ngIf=\"featureCatalog?.featureTypes?.length > 1\">\n <span\n class=\"text-sm font-medium text-gray-900\"\n data-cy=\"total-objects-label\"\n translate\n >record.feature.catalog.number.total.object</span\n ><span\n class=\"text-sm font-bold px-1 text-gray-900\"\n data-cy=\"total-objects\"\n >{{ totalObjects }}</span\n >\n <span class=\"px-1.5\">|</span>\n </ng-container>\n <span\n class=\"text-sm font-medium px-1 text-gray-900\"\n data-cy=\"total-attributes-label\"\n translate\n >record.feature.catalog.number.total.attribute</span\n ><span class=\"text-sm font-bold text-gray-900\" data-cy=\"total-attributes\">{{\n totalAttributes\n }}</span>\n </div>\n</div>\n", styles: [""], 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"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], viewProviders: [
30443
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SearchFeatureCatalogComponent, isStandalone: true, selector: "gn-ui-search-feature-catalog", inputs: { featureCatalog: "featureCatalog" }, outputs: { filteredFeatureCatalogChange: "filteredFeatureCatalogChange" }, ngImport: i0, template: "<div\n class=\"flex items-center justify-between p-3 mt-8 bg-white rounded-lg border-b solid border-gray-300\"\n *ngIf=\"\n (isMobile$ | async) === false || featureCatalog?.featureTypes?.length > 1\n \"\n>\n <div\n class=\"relative shrink-0\"\n *ngIf=\"featureCatalog?.featureTypes?.length > 1\"\n >\n <input\n type=\"text\"\n [placeholder]=\"'search.filter.into.feature.catalog' | translate\"\n class=\"w-[220px] h-8 pl-3 pr-10 py-2 border rounded-md\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"filterAction(searchTerm)\"\n />\n <ng-icon\n class=\"absolute right-2.5 top-1 w-6 h-6 text-black\"\n name=\"iconoirSearch\"\n ></ng-icon>\n </div>\n <div\n *ngIf=\"(isMobile$ | async) === false\"\n class=\"text-sm px-1 ml-auto inline\"\n >\n <ng-container *ngIf=\"featureCatalog?.featureTypes?.length > 1\">\n <span\n class=\"text-sm font-medium text-gray-900\"\n data-cy=\"total-objects-label\"\n translate\n >record.feature.catalog.number.total.object</span\n ><span\n class=\"text-sm font-bold px-1 text-gray-900\"\n data-cy=\"total-objects\"\n >{{ totalObjects }}</span\n >\n <span class=\"px-1.5\">|</span>\n </ng-container>\n <span\n class=\"text-sm font-medium px-1 text-gray-900\"\n data-cy=\"total-attributes-label\"\n translate\n >record.feature.catalog.number.total.attribute</span\n ><span class=\"text-sm font-bold text-gray-900\" data-cy=\"total-attributes\">{{\n totalAttributes\n }}</span>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], viewProviders: [
30307
30444
  provideIcons({ iconoirSearch }),
30308
30445
  provideNgIconsConfig({
30309
30446
  size: '1.5rem',
@@ -30323,7 +30460,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
30323
30460
  provideNgIconsConfig({
30324
30461
  size: '1.5rem',
30325
30462
  }),
30326
- ], template: "<div\n class=\"flex items-center justify-between p-3 mt-8 bg-white rounded-lg border-b solid border-gray-300\"\n>\n <div\n class=\"relative shrink-0\"\n *ngIf=\"featureCatalog?.featureTypes?.length > 1\"\n >\n <input\n type=\"text\"\n [placeholder]=\"'search.filter.into.feature.catalog' | translate\"\n class=\"w-[220px] h-8 pl-3 pr-10 py-2 border rounded-md\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"filterAction(searchTerm)\"\n />\n <ng-icon\n class=\"absolute right-2.5 top-1 w-6 h-6 text-black\"\n name=\"iconoirSearch\"\n ></ng-icon>\n </div>\n <div class=\"text-sm px-1 ml-auto hidden sm:inline\">\n <ng-container *ngIf=\"featureCatalog?.featureTypes?.length > 1\">\n <span\n class=\"text-sm font-medium text-gray-900\"\n data-cy=\"total-objects-label\"\n translate\n >record.feature.catalog.number.total.object</span\n ><span\n class=\"text-sm font-bold px-1 text-gray-900\"\n data-cy=\"total-objects\"\n >{{ totalObjects }}</span\n >\n <span class=\"px-1.5\">|</span>\n </ng-container>\n <span\n class=\"text-sm font-medium px-1 text-gray-900\"\n data-cy=\"total-attributes-label\"\n translate\n >record.feature.catalog.number.total.attribute</span\n ><span class=\"text-sm font-bold text-gray-900\" data-cy=\"total-attributes\">{{\n totalAttributes\n }}</span>\n </div>\n</div>\n" }]
30463
+ ], template: "<div\n class=\"flex items-center justify-between p-3 mt-8 bg-white rounded-lg border-b solid border-gray-300\"\n *ngIf=\"\n (isMobile$ | async) === false || featureCatalog?.featureTypes?.length > 1\n \"\n>\n <div\n class=\"relative shrink-0\"\n *ngIf=\"featureCatalog?.featureTypes?.length > 1\"\n >\n <input\n type=\"text\"\n [placeholder]=\"'search.filter.into.feature.catalog' | translate\"\n class=\"w-[220px] h-8 pl-3 pr-10 py-2 border rounded-md\"\n [(ngModel)]=\"searchTerm\"\n (ngModelChange)=\"filterAction(searchTerm)\"\n />\n <ng-icon\n class=\"absolute right-2.5 top-1 w-6 h-6 text-black\"\n name=\"iconoirSearch\"\n ></ng-icon>\n </div>\n <div\n *ngIf=\"(isMobile$ | async) === false\"\n class=\"text-sm px-1 ml-auto inline\"\n >\n <ng-container *ngIf=\"featureCatalog?.featureTypes?.length > 1\">\n <span\n class=\"text-sm font-medium text-gray-900\"\n data-cy=\"total-objects-label\"\n translate\n >record.feature.catalog.number.total.object</span\n ><span\n class=\"text-sm font-bold px-1 text-gray-900\"\n data-cy=\"total-objects\"\n >{{ totalObjects }}</span\n >\n <span class=\"px-1.5\">|</span>\n </ng-container>\n <span\n class=\"text-sm font-medium px-1 text-gray-900\"\n data-cy=\"total-attributes-label\"\n translate\n >record.feature.catalog.number.total.attribute</span\n ><span class=\"text-sm font-bold text-gray-900\" data-cy=\"total-attributes\">{{\n totalAttributes\n }}</span>\n </div>\n</div>\n" }]
30327
30464
  }], propDecorators: { featureCatalog: [{
30328
30465
  type: Input
30329
30466
  }], filteredFeatureCatalogChange: [{
@@ -31921,58 +32058,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31921
32058
  class MetadataQualityComponent {
31922
32059
  constructor() {
31923
32060
  this.smaller = false;
32061
+ this.popoverDisplay = true;
32062
+ this.forceComputeScore = false; // Instead of returning es' quality score
31924
32063
  this.items = [];
31925
- this.COMMON_CHECKS = {
31926
- title: (metadata) => !!metadata?.title,
31927
- description: (metadata) => !!metadata?.abstract,
31928
- keywords: (metadata) => (metadata?.keywords?.length ?? 0) > 0,
31929
- legalConstraints: (metadata) => (metadata?.legalConstraints?.length ?? 0) > 0,
31930
- contact: (metadata) => !!metadata?.contacts?.[0]?.email,
31931
- };
31932
- this.SPECIFIC_CHECKS = {
31933
- dataset: {
31934
- updateFrequency: (metadata) => !!metadata?.updateFrequency,
31935
- topic: (metadata) => (metadata?.topics?.length ?? 0) > 0,
31936
- organisation: (metadata) => !!metadata?.contacts?.[0]?.organization?.name,
31937
- },
31938
- service: {
31939
- capabilities: (metadata) => (metadata?.onlineResources ?? []).some((resource) => this.hasGetCapabilities(resource?.url?.href ?? '')),
31940
- },
31941
- reuse: {
31942
- topic: (metadata) => (metadata?.topics?.length ?? 0) > 0,
31943
- organisation: (metadata) => !!metadata?.contacts?.[0]?.organization?.name,
31944
- source: (metadata) => !!metadata?.extras?.sourcesIdentifiers,
31945
- },
31946
- };
31947
32064
  }
31948
32065
  get qualityScore() {
31949
- const qualityScore = this.metadata?.extras?.qualityScore;
32066
+ const qualityScore = !this.forceComputeScore
32067
+ ? this.metadata?.extras?.qualityScore
32068
+ : this.computedQualityScore;
31950
32069
  return typeof qualityScore === 'number'
31951
32070
  ? qualityScore
31952
- : this.calculatedQualityScore;
32071
+ : this.computedQualityScore;
31953
32072
  }
31954
- get calculatedQualityScore() {
32073
+ get computedQualityScore() {
31955
32074
  return Math.round((this.items.filter(({ value }) => value).length * 100) / this.items.length);
31956
32075
  }
31957
- add(name, value) {
31958
- if (this.metadataQualityDisplay?.[name] !== false) {
31959
- this.items.push({ name, value });
31960
- }
31961
- }
31962
32076
  hasGetCapabilities(url) {
31963
32077
  return url.toLowerCase().includes('capabilities');
31964
32078
  }
31965
32079
  initialize() {
31966
- this.items = [];
31967
- Object.entries(this.COMMON_CHECKS).forEach(([name, check]) => {
31968
- this.add(name, check(this.metadata));
31969
- });
31970
- const datasetType = this.metadata?.kind;
31971
- if (datasetType && this.SPECIFIC_CHECKS[datasetType]) {
31972
- Object.entries(this.SPECIFIC_CHECKS[datasetType]).forEach(([name, check]) => {
31973
- this.add(name, check(this.metadata));
31974
- });
32080
+ if (!this.propsToValidate) {
32081
+ this.propsToValidate = getAllKeysValidator();
31975
32082
  }
32083
+ this.items = getQualityValidators(this.metadata, this.propsToValidate).map(({ name, validator }) => ({ name, value: validator() }));
31976
32084
  }
31977
32085
  ngOnChanges(changes) {
31978
32086
  if (changes['metadata'] || changes['metadataQualityDisplay']) {
@@ -31980,7 +32088,7 @@ class MetadataQualityComponent {
31980
32088
  }
31981
32089
  }
31982
32090
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataQualityComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
31983
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MetadataQualityComponent, isStandalone: true, selector: "gn-ui-metadata-quality", inputs: { metadata: "metadata", smaller: "smaller", metadataQualityDisplay: "metadataQualityDisplay" }, providers: [
32091
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MetadataQualityComponent, isStandalone: true, selector: "gn-ui-metadata-quality", inputs: { metadata: "metadata", smaller: "smaller", metadataQualityDisplay: "metadataQualityDisplay", popoverDisplay: "popoverDisplay", propsToValidate: "propsToValidate", forceComputeScore: "forceComputeScore" }, providers: [
31984
32092
  provideIcons({
31985
32093
  matInfoOutline,
31986
32094
  }),
@@ -31988,7 +32096,7 @@ class MetadataQualityComponent {
31988
32096
  size: '1.2em',
31989
32097
  strokeWidth: '1.5px',
31990
32098
  }),
31991
- ], usesOnChanges: true, ngImport: i0, template: "<div\n *ngIf=\"metadataQualityDisplay\"\n class=\"flex items-center metadata-quality min-w-0\"\n [ngClass]=\"{ 'text-xs leading-[8px] m-h-[120px]': smaller }\"\n>\n <gn-ui-progress-bar\n tabindex=\"0\"\n [value]=\"qualityScore\"\n [type]=\"'light'\"\n class=\"flex-grow\"\n ></gn-ui-progress-bar>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light-border\"\n [class]=\"smaller ? 'ml-2' : 'ml-2 mt-1'\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"flex-shrink-0 text-gray-600\"\n ></ng-icon>\n </gn-ui-popover>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</ng-template>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: "component", type: PopoverComponent, selector: "gn-ui-popover", inputs: ["content", "theme"] }, { kind: "component", type: ProgressBarComponent, selector: "gn-ui-progress-bar", inputs: ["value", "type"] }, { kind: "component", type: MetadataQualityItemComponent, selector: "gn-ui-metadata-quality-item", inputs: ["name", "value"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32099
+ ], usesOnChanges: true, ngImport: i0, template: "<div\n *ngIf=\"metadataQualityDisplay\"\n class=\"flex items-center metadata-quality min-w-0\"\n [ngClass]=\"{ 'text-xs leading-[8px] m-h-[120px]': smaller }\"\n>\n <gn-ui-progress-bar\n tabindex=\"0\"\n [value]=\"qualityScore\"\n [type]=\"'light'\"\n class=\"flex-grow\"\n ></gn-ui-progress-bar>\n <gn-ui-popover\n *ngIf=\"popoverDisplay\"\n [content]=\"popoverItems\"\n theme=\"light-border\"\n [class]=\"smaller ? 'ml-2' : 'ml-2 mt-1'\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"flex-shrink-0 text-gray-600\"\n ></ng-icon>\n </gn-ui-popover>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</ng-template>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: "component", type: PopoverComponent, selector: "gn-ui-popover", inputs: ["content", "theme"] }, { kind: "component", type: ProgressBarComponent, selector: "gn-ui-progress-bar", inputs: ["value", "type"] }, { kind: "component", type: MetadataQualityItemComponent, selector: "gn-ui-metadata-quality-item", inputs: ["name", "value"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31992
32100
  }
31993
32101
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataQualityComponent, decorators: [{
31994
32102
  type: Component,
@@ -32007,13 +32115,19 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
32007
32115
  size: '1.2em',
32008
32116
  strokeWidth: '1.5px',
32009
32117
  }),
32010
- ], template: "<div\n *ngIf=\"metadataQualityDisplay\"\n class=\"flex items-center metadata-quality min-w-0\"\n [ngClass]=\"{ 'text-xs leading-[8px] m-h-[120px]': smaller }\"\n>\n <gn-ui-progress-bar\n tabindex=\"0\"\n [value]=\"qualityScore\"\n [type]=\"'light'\"\n class=\"flex-grow\"\n ></gn-ui-progress-bar>\n <gn-ui-popover\n [content]=\"popoverItems\"\n theme=\"light-border\"\n [class]=\"smaller ? 'ml-2' : 'ml-2 mt-1'\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"flex-shrink-0 text-gray-600\"\n ></ng-icon>\n </gn-ui-popover>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</ng-template>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\n"] }]
32118
+ ], template: "<div\n *ngIf=\"metadataQualityDisplay\"\n class=\"flex items-center metadata-quality min-w-0\"\n [ngClass]=\"{ 'text-xs leading-[8px] m-h-[120px]': smaller }\"\n>\n <gn-ui-progress-bar\n tabindex=\"0\"\n [value]=\"qualityScore\"\n [type]=\"'light'\"\n class=\"flex-grow\"\n ></gn-ui-progress-bar>\n <gn-ui-popover\n *ngIf=\"popoverDisplay\"\n [content]=\"popoverItems\"\n theme=\"light-border\"\n [class]=\"smaller ? 'ml-2' : 'ml-2 mt-1'\"\n >\n <ng-icon\n name=\"matInfoOutline\"\n class=\"flex-shrink-0 text-gray-600\"\n ></ng-icon>\n </gn-ui-popover>\n</div>\n<ng-template #popoverItems>\n <div class=\"p-2 py-4\">\n <div class=\"mb-4 font-bold\" translate>record.metadata.quality.details</div>\n <gn-ui-metadata-quality-item\n *ngFor=\"let e of items\"\n [name]=\"e.name\"\n [value]=\"e.value\"\n ></gn-ui-metadata-quality-item>\n </div>\n</ng-template>\n", styles: [":host gn-ui-progress-bar{--progress-bar-font-weight: \"normal\"}\n"] }]
32011
32119
  }], propDecorators: { metadata: [{
32012
32120
  type: Input
32013
32121
  }], smaller: [{
32014
32122
  type: Input
32015
32123
  }], metadataQualityDisplay: [{
32016
32124
  type: Input
32125
+ }], popoverDisplay: [{
32126
+ type: Input
32127
+ }], propsToValidate: [{
32128
+ type: Input
32129
+ }], forceComputeScore: [{
32130
+ type: Input
32017
32131
  }] } });
32018
32132
 
32019
32133
  class InternalLinkCardComponent {
@@ -32055,7 +32169,7 @@ class InternalLinkCardComponent {
32055
32169
  provideNgIconsConfig({
32056
32170
  size: '1.2em',
32057
32171
  }),
32058
- ], ngImport: i0, template: "<a\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n class=\"record-card\"\n [ngClass]=\"cardClass\"\n>\n <div *ngIf=\"shouldShowThumbnail\" class=\"record-card__thumbnail\">\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grow pt-1\" [ngClass]=\"shouldShowThumbnail ? 'sm:w-0' : ''\">\n <div class=\"flex flex-col gap-2 h-full\">\n <h4\n class=\"record-card__title\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n <div class=\"grow\">\n <gn-ui-markdown-parser\n data-cy=\"recordAbstract\"\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n class=\"record-card__abstract\"\n [title]=\"abstract\"\n ></gn-ui-markdown-parser>\n </div>\n <div class=\"record-card__footer\">\n <div\n data-cy=\"recordOrg\"\n *ngIf=\"record.ownerOrganization?.name\"\n class=\"grow flex flex-row gap-1 items-center text-primary-lighter\"\n [ngClass]=\"displayContactIconOnly ? 'justify-center' : ''\"\n >\n <ng-icon\n name=\"iconoirBank\"\n class=\"text-primary -translate-y-[0.5px] shrink-0\"\n [title]=\"record.ownerOrganization.name\"\n ></ng-icon>\n <span\n *ngIf=\"!displayContactIconOnly\"\n data-cy=\"recordOrgName\"\n class=\"line-clamp-1\"\n [title]=\"record.ownerOrganization.name\"\n >{{ record.ownerOrganization.name }}</span\n >\n </div>\n <div class=\"record-card__footer__other\">\n <div\n class=\"xs:border-r last:border-r-0 flex grow gap-4 px-4 last:pr-0\"\n >\n <gn-ui-kind-badge\n [extraClass]=\"'text-[1.2em]'\"\n [styling]=\"'gray'\"\n [kind]=\"record?.kind\"\n [contentTemplate]=\"customTemplate\"\n class=\"pt-1\"\n >\n <ng-template #customTemplate></ng-template\n ></gn-ui-kind-badge>\n <gn-ui-metadata-quality\n *ngIf=\"metadataQualityDisplay\"\n class=\"flex items-center min-w-[113px]\"\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n ></gn-ui-metadata-quality>\n </div>\n <div\n class=\"flex justify-center\"\n data-cy=\"recordFav\"\n [ngClass]=\"displayContactIconOnly ? 'px-1' : 'px-4'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n</a>\n", styles: [".record-card{@apply rounded-md bg-white hover:cursor-pointer hover:bg-slate-50 overflow-hidden items-stretch flex flex-row md:gap-0 justify-between py-3 pl-3 pr-5;}.record-card.size-L{@apply w-full md:h-[208px] gap-5;}.record-card.size-M{@apply max-w-[940px] md:h-[231px] gap-4;}.record-card.size-S{@apply max-w-[572px] md:h-[315px] gap-4;}.record-card.size-XS{@apply max-w-[280px] md:h-[315px] gap-4;}.record-card:hover .record-card__title{@apply text-primary;}.record-card__thumbnail{@apply border rounded-lg overflow-hidden shrink-0;}.size-L .record-card__thumbnail{@apply w-full w-[190px] h-[184px];}.size-M .record-card__thumbnail{@apply w-full w-[138px] h-[207px];}.record-card__title{@apply text-xl font-medium text-title leading-6;}.size-L .record-card__title{@apply line-clamp-2;}.size-M .record-card__title{@apply line-clamp-2 ml-2;}.size-S .record-card__title,.size-XS .record-card__title{@apply line-clamp-3 ml-2;}.record-card__abstract{@apply text-gray-900 overflow-hidden;}.size-L .record-card__abstract{@apply line-clamp-3;}.size-M .record-card__abstract{@apply line-clamp-3 ml-2;}.size-S .record-card__abstract,.size-XS .record-card__abstract{@apply line-clamp-4 ml-2;}.record-card__footer{@apply flex sm:flex-row flex-col flex-nowrap gap-3 justify-end items-center w-full border-t pt-1 overflow-hidden;}@media (max-width: 450px){.size-S .record-card__footer{@apply flex-col items-stretch;}}.size-XS .record-card__footer{@apply flex-col items-stretch gap-2;}.record-card__footer__other{@apply flex flex-col xs:flex-row flex-nowrap gap-3 xs:border-l first:border-l-0;}.record-card__footer__other>div{@apply py-1;}@media (max-width: 450px){.size-S .record-card__footer__other,.size-S .record-card__footer__other>div{@apply border-0 px-0 py-0;}}.size-XS .record-card__footer__other,.size-XS .record-card__footer__other>div{@apply border-0;}.size-XS .record-card__footer__other>div{@apply px-0 py-0;}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: MetadataQualityComponent, selector: "gn-ui-metadata-quality", inputs: ["metadata", "smaller", "metadataQualityDisplay"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: KindBadgeComponent, selector: "gn-ui-kind-badge", inputs: ["styling", "contentTemplate", "kind", "extraClass"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }] }); }
32172
+ ], ngImport: i0, template: "<a\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n class=\"record-card\"\n [ngClass]=\"cardClass\"\n>\n <div *ngIf=\"shouldShowThumbnail\" class=\"record-card__thumbnail\">\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grow pt-1\" [ngClass]=\"shouldShowThumbnail ? 'sm:w-0' : ''\">\n <div class=\"flex flex-col gap-2 h-full\">\n <h4\n class=\"record-card__title\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n <div class=\"grow\">\n <gn-ui-markdown-parser\n data-cy=\"recordAbstract\"\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n class=\"record-card__abstract\"\n [title]=\"abstract\"\n ></gn-ui-markdown-parser>\n </div>\n <div class=\"record-card__footer\">\n <div\n data-cy=\"recordOrg\"\n *ngIf=\"record.ownerOrganization?.name\"\n class=\"grow flex flex-row gap-1 items-center text-primary-lighter\"\n [ngClass]=\"displayContactIconOnly ? 'justify-center' : ''\"\n >\n <ng-icon\n name=\"iconoirBank\"\n class=\"text-primary -translate-y-[0.5px] shrink-0\"\n [title]=\"record.ownerOrganization.name\"\n ></ng-icon>\n <span\n *ngIf=\"!displayContactIconOnly\"\n data-cy=\"recordOrgName\"\n class=\"line-clamp-1\"\n [title]=\"record.ownerOrganization.name\"\n >{{ record.ownerOrganization.name }}</span\n >\n </div>\n <div class=\"record-card__footer__other\">\n <div\n class=\"xs:border-r last:border-r-0 flex grow gap-4 px-4 last:pr-0\"\n >\n <gn-ui-kind-badge\n [extraClass]=\"'text-[1.2em]'\"\n [styling]=\"'gray'\"\n [kind]=\"record?.kind\"\n [contentTemplate]=\"customTemplate\"\n class=\"pt-1\"\n >\n <ng-template #customTemplate></ng-template\n ></gn-ui-kind-badge>\n <gn-ui-metadata-quality\n *ngIf=\"metadataQualityDisplay\"\n class=\"flex items-center min-w-[113px]\"\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n [popoverDisplay]=\"true\"\n ></gn-ui-metadata-quality>\n </div>\n <div\n class=\"flex justify-center\"\n data-cy=\"recordFav\"\n [ngClass]=\"displayContactIconOnly ? 'px-1' : 'px-4'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n</a>\n", styles: [".record-card{@apply rounded-md bg-white hover:cursor-pointer hover:bg-slate-50 overflow-hidden items-stretch flex flex-row md:gap-0 justify-between py-3 pl-3 pr-5;}.record-card.size-L{@apply w-full md:h-[208px] gap-5;}.record-card.size-M{@apply max-w-[940px] md:h-[231px] gap-4;}.record-card.size-S{@apply max-w-[572px] md:h-[315px] gap-4;}.record-card.size-XS{@apply max-w-[280px] md:h-[315px] gap-4;}.record-card:hover .record-card__title{@apply text-primary;}.record-card__thumbnail{@apply border rounded-lg overflow-hidden shrink-0;}.size-L .record-card__thumbnail{@apply w-full w-[190px] h-[184px];}.size-M .record-card__thumbnail{@apply w-full w-[138px] h-[207px];}.record-card__title{@apply text-xl font-medium text-title leading-6;}.size-L .record-card__title{@apply line-clamp-2;}.size-M .record-card__title{@apply line-clamp-2 ml-2;}.size-S .record-card__title,.size-XS .record-card__title{@apply line-clamp-3 ml-2;}.record-card__abstract{@apply text-gray-900 overflow-hidden;}.size-L .record-card__abstract{@apply line-clamp-3;}.size-M .record-card__abstract{@apply line-clamp-3 ml-2;}.size-S .record-card__abstract,.size-XS .record-card__abstract{@apply line-clamp-4 ml-2;}.record-card__footer{@apply flex sm:flex-row flex-col flex-nowrap gap-3 justify-end items-center w-full border-t pt-1 overflow-hidden;}@media (max-width: 450px){.size-S .record-card__footer{@apply flex-col items-stretch;}}.size-XS .record-card__footer{@apply flex-col items-stretch gap-2;}.record-card__footer__other{@apply flex flex-col xs:flex-row flex-nowrap gap-3 xs:border-l first:border-l-0;}.record-card__footer__other>div{@apply py-1;}@media (max-width: 450px){.size-S .record-card__footer__other,.size-S .record-card__footer__other>div{@apply border-0 px-0 py-0;}}.size-XS .record-card__footer__other,.size-XS .record-card__footer__other>div{@apply border-0;}.size-XS .record-card__footer__other>div{@apply px-0 py-0;}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: MetadataQualityComponent, selector: "gn-ui-metadata-quality", inputs: ["metadata", "smaller", "metadataQualityDisplay", "popoverDisplay", "propsToValidate", "forceComputeScore"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: KindBadgeComponent, selector: "gn-ui-kind-badge", inputs: ["styling", "contentTemplate", "kind", "extraClass"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }] }); }
32059
32173
  }
32060
32174
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InternalLinkCardComponent, decorators: [{
32061
32175
  type: Component,
@@ -32076,7 +32190,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
32076
32190
  provideNgIconsConfig({
32077
32191
  size: '1.2em',
32078
32192
  }),
32079
- ], template: "<a\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n class=\"record-card\"\n [ngClass]=\"cardClass\"\n>\n <div *ngIf=\"shouldShowThumbnail\" class=\"record-card__thumbnail\">\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grow pt-1\" [ngClass]=\"shouldShowThumbnail ? 'sm:w-0' : ''\">\n <div class=\"flex flex-col gap-2 h-full\">\n <h4\n class=\"record-card__title\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n <div class=\"grow\">\n <gn-ui-markdown-parser\n data-cy=\"recordAbstract\"\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n class=\"record-card__abstract\"\n [title]=\"abstract\"\n ></gn-ui-markdown-parser>\n </div>\n <div class=\"record-card__footer\">\n <div\n data-cy=\"recordOrg\"\n *ngIf=\"record.ownerOrganization?.name\"\n class=\"grow flex flex-row gap-1 items-center text-primary-lighter\"\n [ngClass]=\"displayContactIconOnly ? 'justify-center' : ''\"\n >\n <ng-icon\n name=\"iconoirBank\"\n class=\"text-primary -translate-y-[0.5px] shrink-0\"\n [title]=\"record.ownerOrganization.name\"\n ></ng-icon>\n <span\n *ngIf=\"!displayContactIconOnly\"\n data-cy=\"recordOrgName\"\n class=\"line-clamp-1\"\n [title]=\"record.ownerOrganization.name\"\n >{{ record.ownerOrganization.name }}</span\n >\n </div>\n <div class=\"record-card__footer__other\">\n <div\n class=\"xs:border-r last:border-r-0 flex grow gap-4 px-4 last:pr-0\"\n >\n <gn-ui-kind-badge\n [extraClass]=\"'text-[1.2em]'\"\n [styling]=\"'gray'\"\n [kind]=\"record?.kind\"\n [contentTemplate]=\"customTemplate\"\n class=\"pt-1\"\n >\n <ng-template #customTemplate></ng-template\n ></gn-ui-kind-badge>\n <gn-ui-metadata-quality\n *ngIf=\"metadataQualityDisplay\"\n class=\"flex items-center min-w-[113px]\"\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n ></gn-ui-metadata-quality>\n </div>\n <div\n class=\"flex justify-center\"\n data-cy=\"recordFav\"\n [ngClass]=\"displayContactIconOnly ? 'px-1' : 'px-4'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n</a>\n", styles: [".record-card{@apply rounded-md bg-white hover:cursor-pointer hover:bg-slate-50 overflow-hidden items-stretch flex flex-row md:gap-0 justify-between py-3 pl-3 pr-5;}.record-card.size-L{@apply w-full md:h-[208px] gap-5;}.record-card.size-M{@apply max-w-[940px] md:h-[231px] gap-4;}.record-card.size-S{@apply max-w-[572px] md:h-[315px] gap-4;}.record-card.size-XS{@apply max-w-[280px] md:h-[315px] gap-4;}.record-card:hover .record-card__title{@apply text-primary;}.record-card__thumbnail{@apply border rounded-lg overflow-hidden shrink-0;}.size-L .record-card__thumbnail{@apply w-full w-[190px] h-[184px];}.size-M .record-card__thumbnail{@apply w-full w-[138px] h-[207px];}.record-card__title{@apply text-xl font-medium text-title leading-6;}.size-L .record-card__title{@apply line-clamp-2;}.size-M .record-card__title{@apply line-clamp-2 ml-2;}.size-S .record-card__title,.size-XS .record-card__title{@apply line-clamp-3 ml-2;}.record-card__abstract{@apply text-gray-900 overflow-hidden;}.size-L .record-card__abstract{@apply line-clamp-3;}.size-M .record-card__abstract{@apply line-clamp-3 ml-2;}.size-S .record-card__abstract,.size-XS .record-card__abstract{@apply line-clamp-4 ml-2;}.record-card__footer{@apply flex sm:flex-row flex-col flex-nowrap gap-3 justify-end items-center w-full border-t pt-1 overflow-hidden;}@media (max-width: 450px){.size-S .record-card__footer{@apply flex-col items-stretch;}}.size-XS .record-card__footer{@apply flex-col items-stretch gap-2;}.record-card__footer__other{@apply flex flex-col xs:flex-row flex-nowrap gap-3 xs:border-l first:border-l-0;}.record-card__footer__other>div{@apply py-1;}@media (max-width: 450px){.size-S .record-card__footer__other,.size-S .record-card__footer__other>div{@apply border-0 px-0 py-0;}}.size-XS .record-card__footer__other,.size-XS .record-card__footer__other>div{@apply border-0;}.size-XS .record-card__footer__other>div{@apply px-0 py-0;}\n"] }]
32193
+ ], template: "<a\n [attr.href]=\"linkHref\"\n [target]=\"linkTarget\"\n class=\"record-card\"\n [ngClass]=\"cardClass\"\n>\n <div *ngIf=\"shouldShowThumbnail\" class=\"record-card__thumbnail\">\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grow pt-1\" [ngClass]=\"shouldShowThumbnail ? 'sm:w-0' : ''\">\n <div class=\"flex flex-col gap-2 h-full\">\n <h4\n class=\"record-card__title\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n <div class=\"grow\">\n <gn-ui-markdown-parser\n data-cy=\"recordAbstract\"\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n class=\"record-card__abstract\"\n [title]=\"abstract\"\n ></gn-ui-markdown-parser>\n </div>\n <div class=\"record-card__footer\">\n <div\n data-cy=\"recordOrg\"\n *ngIf=\"record.ownerOrganization?.name\"\n class=\"grow flex flex-row gap-1 items-center text-primary-lighter\"\n [ngClass]=\"displayContactIconOnly ? 'justify-center' : ''\"\n >\n <ng-icon\n name=\"iconoirBank\"\n class=\"text-primary -translate-y-[0.5px] shrink-0\"\n [title]=\"record.ownerOrganization.name\"\n ></ng-icon>\n <span\n *ngIf=\"!displayContactIconOnly\"\n data-cy=\"recordOrgName\"\n class=\"line-clamp-1\"\n [title]=\"record.ownerOrganization.name\"\n >{{ record.ownerOrganization.name }}</span\n >\n </div>\n <div class=\"record-card__footer__other\">\n <div\n class=\"xs:border-r last:border-r-0 flex grow gap-4 px-4 last:pr-0\"\n >\n <gn-ui-kind-badge\n [extraClass]=\"'text-[1.2em]'\"\n [styling]=\"'gray'\"\n [kind]=\"record?.kind\"\n [contentTemplate]=\"customTemplate\"\n class=\"pt-1\"\n >\n <ng-template #customTemplate></ng-template\n ></gn-ui-kind-badge>\n <gn-ui-metadata-quality\n *ngIf=\"metadataQualityDisplay\"\n class=\"flex items-center min-w-[113px]\"\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n [popoverDisplay]=\"true\"\n ></gn-ui-metadata-quality>\n </div>\n <div\n class=\"flex justify-center\"\n data-cy=\"recordFav\"\n [ngClass]=\"displayContactIconOnly ? 'px-1' : 'px-4'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n</a>\n", styles: [".record-card{@apply rounded-md bg-white hover:cursor-pointer hover:bg-slate-50 overflow-hidden items-stretch flex flex-row md:gap-0 justify-between py-3 pl-3 pr-5;}.record-card.size-L{@apply w-full md:h-[208px] gap-5;}.record-card.size-M{@apply max-w-[940px] md:h-[231px] gap-4;}.record-card.size-S{@apply max-w-[572px] md:h-[315px] gap-4;}.record-card.size-XS{@apply max-w-[280px] md:h-[315px] gap-4;}.record-card:hover .record-card__title{@apply text-primary;}.record-card__thumbnail{@apply border rounded-lg overflow-hidden shrink-0;}.size-L .record-card__thumbnail{@apply w-full w-[190px] h-[184px];}.size-M .record-card__thumbnail{@apply w-full w-[138px] h-[207px];}.record-card__title{@apply text-xl font-medium text-title leading-6;}.size-L .record-card__title{@apply line-clamp-2;}.size-M .record-card__title{@apply line-clamp-2 ml-2;}.size-S .record-card__title,.size-XS .record-card__title{@apply line-clamp-3 ml-2;}.record-card__abstract{@apply text-gray-900 overflow-hidden;}.size-L .record-card__abstract{@apply line-clamp-3;}.size-M .record-card__abstract{@apply line-clamp-3 ml-2;}.size-S .record-card__abstract,.size-XS .record-card__abstract{@apply line-clamp-4 ml-2;}.record-card__footer{@apply flex sm:flex-row flex-col flex-nowrap gap-3 justify-end items-center w-full border-t pt-1 overflow-hidden;}@media (max-width: 450px){.size-S .record-card__footer{@apply flex-col items-stretch;}}.size-XS .record-card__footer{@apply flex-col items-stretch gap-2;}.record-card__footer__other{@apply flex flex-col xs:flex-row flex-nowrap gap-3 xs:border-l first:border-l-0;}.record-card__footer__other>div{@apply py-1;}@media (max-width: 450px){.size-S .record-card__footer__other,.size-S .record-card__footer__other>div{@apply border-0 px-0 py-0;}}.size-XS .record-card__footer__other,.size-XS .record-card__footer__other>div{@apply border-0;}.size-XS .record-card__footer__other>div{@apply px-0 py-0;}\n"] }]
32080
32194
  }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { record: [{
32081
32195
  type: Input
32082
32196
  }], linkTarget: [{
@@ -32500,6 +32614,7 @@ class DownloadsListComponent {
32500
32614
  constructor(translateService, changeDetector) {
32501
32615
  this.translateService = translateService;
32502
32616
  this.changeDetector = changeDetector;
32617
+ this.isMobile$ = getIsMobile();
32503
32618
  this.activeFilterFormats = ['all'];
32504
32619
  }
32505
32620
  get linksCount() {
@@ -32587,7 +32702,7 @@ class DownloadsListComponent {
32587
32702
  link.accessServiceProtocol === 'ogcFeatures'));
32588
32703
  }
32589
32704
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DownloadsListComponent, deps: [{ token: i1$1.TranslateService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
32590
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DownloadsListComponent, isStandalone: true, selector: "gn-ui-downloads-list", inputs: { links: "links" }, ngImport: i0, template: "<div\n class=\"flex flex-wrap justify-between items-center pb-4\"\n *ngIf=\"links && links.length > 0\"\n>\n <div class=\"flex flex-row items-center gap-x-4\">\n <div>\n <h3\n class=\"inline-block font-title text-xl text-title font-medium mr-4\"\n translate\n >\n record.metadata.download\n </h3>\n <span class=\"px-3\">({{ linksCount }})</span>\n </div>\n <gn-ui-previous-next-buttons\n class=\"md:block hidden\"\n *ngIf=\"_list?.pagesCount > 1\"\n [listComponent]=\"_list\"\n ></gn-ui-previous-next-buttons>\n </div>\n\n <div\n class=\"flex flex-wrap justify-start sm:justify-end\"\n data-cy=\"download-format-filters\"\n >\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-60')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n\n<ng-container>\n <gn-ui-block-list\n class=\"md:block hidden\"\n #blockList\n (listChanges)=\"updateList($event)\"\n containerClass=\"gap-4 pt-5 pb-7\"\n >\n <gn-ui-download-item\n #block\n *ngFor=\"let link of filteredLinks\"\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromApi]=\"isFromApi(link)\"\n [size]=\"blockList.subComponentSize\"\n ></gn-ui-download-item>\n </gn-ui-block-list>\n</ng-container>\n\n<div class=\"mb-5 md:hidden block\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n size=\"M\"\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromApi]=\"isFromApi(link)\"\n ></gn-ui-download-item>\n</div>\n", styles: [""], 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: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: BlockListComponent, selector: "gn-ui-block-list", inputs: ["containerClass", "paginationContainerClass"], outputs: ["listChanges"] }, { kind: "component", type: DownloadItemComponent, selector: "gn-ui-download-item", inputs: ["link", "color", "format", "isFromApi", "size"], outputs: ["exportUrl"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: PreviousNextButtonsComponent, selector: "gn-ui-previous-next-buttons", inputs: ["listComponent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32705
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DownloadsListComponent, isStandalone: true, selector: "gn-ui-downloads-list", inputs: { links: "links" }, ngImport: i0, template: "<div\n class=\"flex flex-wrap justify-between items-center pb-4\"\n *ngIf=\"links && links.length > 0\"\n>\n <div class=\"flex flex-row items-center gap-x-4\">\n <div>\n <h3\n class=\"inline-block font-title text-xl text-title font-medium mr-4\"\n translate\n >\n record.metadata.download\n </h3>\n <span class=\"px-3\">({{ linksCount }})</span>\n </div>\n <gn-ui-previous-next-buttons\n *ngIf=\"(isMobile$ | async) === false && _list?.pagesCount > 1\"\n [listComponent]=\"_list\"\n ></gn-ui-previous-next-buttons>\n </div>\n\n <div\n class=\"flex flex-wrap justify-start sm:justify-end\"\n data-cy=\"download-format-filters\"\n >\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-60')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n\n<ng-container>\n <gn-ui-block-list\n *ngIf=\"(isMobile$ | async) === false\"\n #blockList\n (listChanges)=\"updateList($event)\"\n containerClass=\"gap-4 pt-5 pb-7\"\n >\n <gn-ui-download-item\n #block\n *ngFor=\"let link of filteredLinks\"\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromApi]=\"isFromApi(link)\"\n [size]=\"blockList.subComponentSize\"\n ></gn-ui-download-item>\n </gn-ui-block-list>\n</ng-container>\n\n<div class=\"mb-5\" *ngFor=\"let link of filteredLinks\">\n <ng-container *ngIf=\"(isMobile$ | async) === true\">\n <gn-ui-download-item\n size=\"M\"\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromApi]=\"isFromApi(link)\"\n ></gn-ui-download-item>\n </ng-container>\n</div>\n", styles: [""], 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: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: BlockListComponent, selector: "gn-ui-block-list", inputs: ["containerClass", "paginationContainerClass"], outputs: ["listChanges"] }, { kind: "component", type: DownloadItemComponent, selector: "gn-ui-download-item", inputs: ["link", "color", "format", "isFromApi", "size"], outputs: ["exportUrl"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: PreviousNextButtonsComponent, selector: "gn-ui-previous-next-buttons", inputs: ["listComponent"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
32591
32706
  }
32592
32707
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DownloadsListComponent, decorators: [{
32593
32708
  type: Component,
@@ -32598,7 +32713,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
32598
32713
  DownloadItemComponent,
32599
32714
  TranslateDirective,
32600
32715
  PreviousNextButtonsComponent,
32601
- ], template: "<div\n class=\"flex flex-wrap justify-between items-center pb-4\"\n *ngIf=\"links && links.length > 0\"\n>\n <div class=\"flex flex-row items-center gap-x-4\">\n <div>\n <h3\n class=\"inline-block font-title text-xl text-title font-medium mr-4\"\n translate\n >\n record.metadata.download\n </h3>\n <span class=\"px-3\">({{ linksCount }})</span>\n </div>\n <gn-ui-previous-next-buttons\n class=\"md:block hidden\"\n *ngIf=\"_list?.pagesCount > 1\"\n [listComponent]=\"_list\"\n ></gn-ui-previous-next-buttons>\n </div>\n\n <div\n class=\"flex flex-wrap justify-start sm:justify-end\"\n data-cy=\"download-format-filters\"\n >\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-60')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n\n<ng-container>\n <gn-ui-block-list\n class=\"md:block hidden\"\n #blockList\n (listChanges)=\"updateList($event)\"\n containerClass=\"gap-4 pt-5 pb-7\"\n >\n <gn-ui-download-item\n #block\n *ngFor=\"let link of filteredLinks\"\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromApi]=\"isFromApi(link)\"\n [size]=\"blockList.subComponentSize\"\n ></gn-ui-download-item>\n </gn-ui-block-list>\n</ng-container>\n\n<div class=\"mb-5 md:hidden block\" *ngFor=\"let link of filteredLinks\">\n <gn-ui-download-item\n size=\"M\"\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromApi]=\"isFromApi(link)\"\n ></gn-ui-download-item>\n</div>\n" }]
32716
+ ], template: "<div\n class=\"flex flex-wrap justify-between items-center pb-4\"\n *ngIf=\"links && links.length > 0\"\n>\n <div class=\"flex flex-row items-center gap-x-4\">\n <div>\n <h3\n class=\"inline-block font-title text-xl text-title font-medium mr-4\"\n translate\n >\n record.metadata.download\n </h3>\n <span class=\"px-3\">({{ linksCount }})</span>\n </div>\n <gn-ui-previous-next-buttons\n *ngIf=\"(isMobile$ | async) === false && _list?.pagesCount > 1\"\n [listComponent]=\"_list\"\n ></gn-ui-previous-next-buttons>\n </div>\n\n <div\n class=\"flex flex-wrap justify-start sm:justify-end\"\n data-cy=\"download-format-filters\"\n >\n <gn-ui-button\n class=\"m-1 format-filter\"\n [extraClass]=\"\n '!px-[12px] !py-[8px] !text-[15px]' +\n (isFilterActive(format) ? ' opacity-100' : ' opacity-60')\n \"\n (buttonClick)=\"toggleFilterFormat(format)\"\n [attr.data-format]=\"format\"\n *ngFor=\"let format of visibleFormats\"\n >\n {{ getFilterFormatTitle(format) }}\n </gn-ui-button>\n </div>\n</div>\n\n<ng-container>\n <gn-ui-block-list\n *ngIf=\"(isMobile$ | async) === false\"\n #blockList\n (listChanges)=\"updateList($event)\"\n containerClass=\"gap-4 pt-5 pb-7\"\n >\n <gn-ui-download-item\n #block\n *ngFor=\"let link of filteredLinks\"\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromApi]=\"isFromApi(link)\"\n [size]=\"blockList.subComponentSize\"\n ></gn-ui-download-item>\n </gn-ui-block-list>\n</ng-container>\n\n<div class=\"mb-5\" *ngFor=\"let link of filteredLinks\">\n <ng-container *ngIf=\"(isMobile$ | async) === true\">\n <gn-ui-download-item\n size=\"M\"\n [link]=\"link\"\n [color]=\"getLinkColor(link)\"\n [format]=\"getLinkFormat(link)\"\n [isFromApi]=\"isFromApi(link)\"\n ></gn-ui-download-item>\n </ng-container>\n</div>\n" }]
32602
32717
  }], ctorParameters: () => [{ type: i1$1.TranslateService }, { type: i0.ChangeDetectorRef }], propDecorators: { links: [{
32603
32718
  type: Input
32604
32719
  }] } });
@@ -32666,9 +32781,10 @@ class GeoDataBadgeComponent {
32666
32781
  this.linkClassifier = linkClassifier;
32667
32782
  this.showLabel = true;
32668
32783
  this.styling = 'default';
32784
+ this.isMobile$ = getIsMobile();
32669
32785
  }
32670
32786
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: GeoDataBadgeComponent, deps: [{ token: LinkClassifierService }], target: i0.ɵɵFactoryTarget.Component }); }
32671
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: GeoDataBadgeComponent, isStandalone: true, selector: "gn-ui-geo-data-badge", inputs: { showLabel: "showLabel", styling: "styling", record: "record" }, ngImport: i0, template: "<div\n [class]=\"badgeClasses\"\n [title]=\"'record.metadata.isGeographical' | translate\"\n *ngIf=\"isGeodata()\"\n>\n <ng-icon\n class=\"shrink-0 text-[0.75em]\"\n name=\"matLocationSearchingOutline\"\n ></ng-icon>\n <span class=\"ml-1 hidden sm:inline-block shrink-0\" *ngIf=\"showLabel\" translate\n >record.metadata.isGeographical</span\n >\n</div>\n", styles: [":host{--gn-ui-geo-data-badge-background-color: var(--color-primary-white);--gn-ui-geo-data-badge-text-color: var(--color-primary-darkest)}\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"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
32787
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: GeoDataBadgeComponent, isStandalone: true, selector: "gn-ui-geo-data-badge", inputs: { showLabel: "showLabel", styling: "styling", record: "record" }, ngImport: i0, template: "<div\n [class]=\"badgeClasses\"\n [title]=\"'record.metadata.isGeographical' | translate\"\n *ngIf=\"isGeodata()\"\n>\n <ng-icon\n class=\"shrink-0 text-[0.75em]\"\n name=\"matLocationSearchingOutline\"\n ></ng-icon>\n <span\n class=\"ml-1 inline-block shrink-0\"\n *ngIf=\"(isMobile$ | async) === false && showLabel\"\n translate\n >record.metadata.isGeographical</span\n >\n</div>\n", styles: [":host{--gn-ui-geo-data-badge-background-color: var(--color-primary-white);--gn-ui-geo-data-badge-text-color: var(--color-primary-darkest)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }], viewProviders: [
32672
32788
  provideIcons({
32673
32789
  matLocationSearchingOutline,
32674
32790
  }),
@@ -32680,7 +32796,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
32680
32796
  provideIcons({
32681
32797
  matLocationSearchingOutline,
32682
32798
  }),
32683
- ], template: "<div\n [class]=\"badgeClasses\"\n [title]=\"'record.metadata.isGeographical' | translate\"\n *ngIf=\"isGeodata()\"\n>\n <ng-icon\n class=\"shrink-0 text-[0.75em]\"\n name=\"matLocationSearchingOutline\"\n ></ng-icon>\n <span class=\"ml-1 hidden sm:inline-block shrink-0\" *ngIf=\"showLabel\" translate\n >record.metadata.isGeographical</span\n >\n</div>\n", styles: [":host{--gn-ui-geo-data-badge-background-color: var(--color-primary-white);--gn-ui-geo-data-badge-text-color: var(--color-primary-darkest)}\n"] }]
32799
+ ], template: "<div\n [class]=\"badgeClasses\"\n [title]=\"'record.metadata.isGeographical' | translate\"\n *ngIf=\"isGeodata()\"\n>\n <ng-icon\n class=\"shrink-0 text-[0.75em]\"\n name=\"matLocationSearchingOutline\"\n ></ng-icon>\n <span\n class=\"ml-1 inline-block shrink-0\"\n *ngIf=\"(isMobile$ | async) === false && showLabel\"\n translate\n >record.metadata.isGeographical</span\n >\n</div>\n", styles: [":host{--gn-ui-geo-data-badge-background-color: var(--color-primary-white);--gn-ui-geo-data-badge-text-color: var(--color-primary-darkest)}\n"] }]
32684
32800
  }], ctorParameters: () => [{ type: LinkClassifierService }], propDecorators: { showLabel: [{
32685
32801
  type: Input
32686
32802
  }], styling: [{
@@ -34530,7 +34646,9 @@ const initSearch = () => {
34530
34646
  },
34531
34647
  params: {
34532
34648
  filters: {},
34533
- pageSize: DEFAULT_PAGE_SIZE,
34649
+ pageSize: getOptionalSearchConfig()?.LIMIT
34650
+ ? getOptionalSearchConfig().LIMIT
34651
+ : DEFAULT_PAGE_SIZE,
34534
34652
  currentPage: 0,
34535
34653
  favoritesOnly: false,
34536
34654
  useSpatialFilter: true,
@@ -38251,7 +38369,7 @@ class DataService {
38251
38369
  });
38252
38370
  }
38253
38371
  async getGeodataLinksFromTms(tmsLink, keepOriginalLink = false) {
38254
- const endpoint = new TmsEndpoint(tmsLink.url.toString());
38372
+ const endpoint = new TmsEndpoint(tmsLink.url.toString().replace(/\/?$/, `/${tmsLink.name}`));
38255
38373
  const tileMaps = await endpoint.allTileMaps.catch(() => {
38256
38374
  throw new Error(`ogc.unreachable.unknown`);
38257
38375
  });
@@ -40636,7 +40754,9 @@ class MapViewComponent {
40636
40754
  link.accessServiceProtocol === 'tms') {
40637
40755
  // FIXME: here we're assuming that the TMS serves vector tiles only; should be checked with ogc-client first
40638
40756
  return of({
40639
- url: link.url.toString().replace(/\/?$/, '/{z}/{x}/{y}.pbf'),
40757
+ url: link.url
40758
+ .toString()
40759
+ .replace(/\/?$/, `/${link.name}/{z}/{x}/{y}.pbf`),
40640
40760
  type: 'xyz',
40641
40761
  tileFormat: 'application/vnd.mapbox-vector-tile',
40642
40762
  name: link.name,
@@ -40833,8 +40953,6 @@ const RECORD_KEYWORDS_FIELD = {
40833
40953
  model: 'keywords',
40834
40954
  formFieldConfig: {},
40835
40955
  };
40836
- // keeping track of the label to not lose existing translation
40837
- marker('editor.record.form.field.keywords');
40838
40956
  const RECORD_RESOURCE_CREATED_FIELD = {
40839
40957
  model: 'resourceCreated',
40840
40958
  formFieldConfig: {
@@ -43542,7 +43660,7 @@ class MultilingualPanelComponent {
43542
43660
  provideNgIconsConfig({
43543
43661
  size: '1.25em',
43544
43662
  }),
43545
- ], viewQueries: [{ propertyName: "actionMenuButtons", predicate: ["actionMenuButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n class=\"flex flex-col h-full w-[302px] bg-neutral-100 border-l border-gray-300 py-8 px-3 gap-6 overflow-auto\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.multilingual.title</span\n >\n <button\n [title]=\"'editor.record.form.multilingual.open' | translate\"\n (click)=\"toggleLanguageSelection()\"\n *ngIf=\"isMultilingual\"\n data-test=\"activateSelection\"\n >\n <ng-icon class=\"mt-1\" name=\"iconoirSettings\"></ng-icon>\n </button>\n </div>\n <div class=\"flex flex-col gap-2\" *ngIf=\"editTranslations || !isMultilingual\">\n <gn-ui-check-toggle\n class=\"p-2\"\n [label]=\"'editor.record.form.multilingual.enable' | translate\"\n [color]=\"'primary'\"\n [(value)]=\"isMultilingual\"\n (toggled)=\"switchMultilingual($event)\"\n ></gn-ui-check-toggle>\n <div *ngIf=\"isMultilingual\" class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row justify-between border-t border-gray-300 p-3\">\n <span class=\"mt-2 text-sm text-gray-600\" translate\n >editor.record.form.multilingual.activate</span\n >\n <gn-ui-button\n extraClass=\"w-16 h-8 font-bold\"\n type=\"gray\"\n (buttonClick)=\"validateTranslations()\"\n data-test=\"validateSelection\"\n >{{ 'editor.record.form.multilingual.validate' | translate }}\n </gn-ui-button>\n </div>\n <ng-container *ngIf=\"supportedLanguages$ | async as languages\">\n <div\n class=\"flex flex-col gap-2 w-full px-2\"\n data-test=\"langAvailable\"\n *ngFor=\"let lang of languages\"\n >\n <gn-ui-button\n [extraClass]=\"getExtraClass(lang)\"\n type=\"gray\"\n (buttonClick)=\"toggleLanguage(lang)\"\n [disabled]=\"lang === _record.defaultLanguage\"\n [title]=\"getToggleTitle(lang)\"\n >\n <span [class]=\"getIconClass(lang)\"></span>\n <span class=\"ml-2\">{{ 'language.' + lang | translate }}</span>\n </gn-ui-button>\n </div>\n </ng-container>\n </div>\n </div>\n <div *ngIf=\"!editTranslations && isMultilingual\" class=\"flex flex-col gap-2\">\n <gn-ui-button\n *ngFor=\"let recordLang of sortLanguages(recordLanguages); let i = index\"\n extraClass=\"flex flex-row justify-between bg-white border border-white rounded mb-1 h-[34px] w-full\"\n [ngClass]=\"{\n 'mt-8': isFirstUnsupported(i),\n '': true,\n }\"\n (buttonClick)=\"switchFormLang(recordLang)\"\n type=\"outline\"\n data-test=\"langSwitch\"\n >\n <div class=\"flex flex-row gap-2 items-center\">\n <ng-icon\n *ngIf=\"recordLang === formLanguage\"\n class=\"text-primary mt-1\"\n name=\"iconoirCheckCircle\"\n ></ng-icon>\n <ng-icon\n *ngIf=\"recordLang !== formLanguage\"\n class=\"text-gray-800 mt-1\"\n name=\"iconoirCircle\"\n ></ng-icon>\n <span\n *ngIf=\"recordLang.length === 2\"\n [class]=\"getIconClass(recordLang) + 'mt-1'\"\n ></span>\n <span [ngClass]=\"recordLang === formLanguage ? 'text-black' : ''\">{{\n isLangSupported(recordLang)\n ? ('language.' + recordLang | translate)\n : recordLang.toUpperCase()\n }}</span>\n </div>\n <div class=\"flex flex-row gap-2 items-center\">\n <span\n *ngIf=\"recordLang === formLanguage\"\n class=\"text-xs text-base\"\n translate\n >editor.record.form.multilingual.default</span\n >\n <button\n (click)=\"\n openActionMenu(recordLang, template); $event.stopPropagation()\n \"\n cdkOverlayOrigin\n #actionMenuButton\n >\n <ng-icon class=\"pb-5\" name=\"matMoreHorizOutline\"></ng-icon>\n </button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDelete]=\"recordLang !== _record.defaultLanguage\"\n page=\"record\"\n (delete)=\"confirmDeleteAction(recordLang)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (switch)=\"switchDefaultLang(recordLang)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </div>\n </gn-ui-button>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: CheckToggleComponent, selector: "gn-ui-check-toggle", inputs: ["title", "label", "value", "color"], outputs: ["toggled"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ActionMenuComponent, selector: "gn-ui-action-menu", inputs: ["canDuplicate", "isDuplicating", "canDelete", "page"], outputs: ["duplicate", "delete", "closeActionMenu", "rollback", "switch"] }] }); }
43663
+ ], viewQueries: [{ propertyName: "actionMenuButtons", predicate: ["actionMenuButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n class=\"flex flex-col h-full w-[302px] border-l border-gray-300 py-8 px-3 gap-6 overflow-auto\"\n style=\"background-color: #fafaf9\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.multilingual.title</span\n >\n <button\n [title]=\"'editor.record.form.multilingual.open' | translate\"\n (click)=\"toggleLanguageSelection()\"\n *ngIf=\"isMultilingual\"\n data-test=\"activateSelection\"\n >\n <ng-icon class=\"mt-1\" name=\"iconoirSettings\"></ng-icon>\n </button>\n </div>\n <div class=\"flex flex-col gap-2\" *ngIf=\"editTranslations || !isMultilingual\">\n <gn-ui-check-toggle\n class=\"p-2\"\n [label]=\"'editor.record.form.multilingual.enable' | translate\"\n [color]=\"'primary'\"\n [(value)]=\"isMultilingual\"\n (toggled)=\"switchMultilingual($event)\"\n ></gn-ui-check-toggle>\n <div *ngIf=\"isMultilingual\" class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row justify-between border-t border-gray-300 p-3\">\n <span class=\"mt-2 text-sm text-gray-600\" translate\n >editor.record.form.multilingual.activate</span\n >\n <gn-ui-button\n extraClass=\"w-16 h-8 font-bold\"\n type=\"gray\"\n (buttonClick)=\"validateTranslations()\"\n data-test=\"validateSelection\"\n >{{ 'editor.record.form.multilingual.validate' | translate }}\n </gn-ui-button>\n </div>\n <ng-container *ngIf=\"supportedLanguages$ | async as languages\">\n <div\n class=\"flex flex-col gap-2 w-full px-2\"\n data-test=\"langAvailable\"\n *ngFor=\"let lang of languages\"\n >\n <gn-ui-button\n [extraClass]=\"getExtraClass(lang)\"\n type=\"gray\"\n (buttonClick)=\"toggleLanguage(lang)\"\n [disabled]=\"lang === _record.defaultLanguage\"\n [title]=\"getToggleTitle(lang)\"\n >\n <span [class]=\"getIconClass(lang)\"></span>\n <span class=\"ml-2\">{{ 'language.' + lang | translate }}</span>\n </gn-ui-button>\n </div>\n </ng-container>\n </div>\n </div>\n <div *ngIf=\"!editTranslations && isMultilingual\" class=\"flex flex-col gap-2\">\n <gn-ui-button\n *ngFor=\"let recordLang of sortLanguages(recordLanguages); let i = index\"\n extraClass=\"flex flex-row justify-between bg-white border border-white rounded mb-1 h-[34px] w-full\"\n [ngClass]=\"{\n 'mt-8': isFirstUnsupported(i),\n '': true,\n }\"\n (buttonClick)=\"switchFormLang(recordLang)\"\n type=\"outline\"\n data-test=\"langSwitch\"\n >\n <div class=\"flex flex-row gap-2 items-center\">\n <ng-icon\n *ngIf=\"recordLang === formLanguage\"\n class=\"text-primary mt-1\"\n name=\"iconoirCheckCircle\"\n ></ng-icon>\n <ng-icon\n *ngIf=\"recordLang !== formLanguage\"\n class=\"text-gray-800 mt-1\"\n name=\"iconoirCircle\"\n ></ng-icon>\n <span\n *ngIf=\"recordLang.length === 2\"\n [class]=\"getIconClass(recordLang) + 'mt-1'\"\n ></span>\n <span [ngClass]=\"recordLang === formLanguage ? 'text-black' : ''\">{{\n isLangSupported(recordLang)\n ? ('language.' + recordLang | translate)\n : recordLang.toUpperCase()\n }}</span>\n </div>\n <div class=\"flex flex-row gap-2 items-center\">\n <span\n *ngIf=\"recordLang === formLanguage\"\n class=\"text-xs text-base\"\n translate\n >editor.record.form.multilingual.default</span\n >\n <button\n (click)=\"\n openActionMenu(recordLang, template); $event.stopPropagation()\n \"\n cdkOverlayOrigin\n #actionMenuButton\n >\n <ng-icon class=\"pb-5\" name=\"matMoreHorizOutline\"></ng-icon>\n </button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDelete]=\"recordLang !== _record.defaultLanguage\"\n page=\"record\"\n (delete)=\"confirmDeleteAction(recordLang)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (switch)=\"switchDefaultLang(recordLang)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </div>\n </gn-ui-button>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { 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: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: CheckToggleComponent, selector: "gn-ui-check-toggle", inputs: ["title", "label", "value", "color"], outputs: ["toggled"] }, { kind: "directive", type: TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ActionMenuComponent, selector: "gn-ui-action-menu", inputs: ["canDuplicate", "isDuplicating", "canDelete", "page"], outputs: ["duplicate", "delete", "closeActionMenu", "rollback", "switch"] }] }); }
43546
43664
  }
43547
43665
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MultilingualPanelComponent, decorators: [{
43548
43666
  type: Component,
@@ -43564,7 +43682,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
43564
43682
  provideNgIconsConfig({
43565
43683
  size: '1.25em',
43566
43684
  }),
43567
- ], template: "<div\n class=\"flex flex-col h-full w-[302px] bg-neutral-100 border-l border-gray-300 py-8 px-3 gap-6 overflow-auto\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.multilingual.title</span\n >\n <button\n [title]=\"'editor.record.form.multilingual.open' | translate\"\n (click)=\"toggleLanguageSelection()\"\n *ngIf=\"isMultilingual\"\n data-test=\"activateSelection\"\n >\n <ng-icon class=\"mt-1\" name=\"iconoirSettings\"></ng-icon>\n </button>\n </div>\n <div class=\"flex flex-col gap-2\" *ngIf=\"editTranslations || !isMultilingual\">\n <gn-ui-check-toggle\n class=\"p-2\"\n [label]=\"'editor.record.form.multilingual.enable' | translate\"\n [color]=\"'primary'\"\n [(value)]=\"isMultilingual\"\n (toggled)=\"switchMultilingual($event)\"\n ></gn-ui-check-toggle>\n <div *ngIf=\"isMultilingual\" class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row justify-between border-t border-gray-300 p-3\">\n <span class=\"mt-2 text-sm text-gray-600\" translate\n >editor.record.form.multilingual.activate</span\n >\n <gn-ui-button\n extraClass=\"w-16 h-8 font-bold\"\n type=\"gray\"\n (buttonClick)=\"validateTranslations()\"\n data-test=\"validateSelection\"\n >{{ 'editor.record.form.multilingual.validate' | translate }}\n </gn-ui-button>\n </div>\n <ng-container *ngIf=\"supportedLanguages$ | async as languages\">\n <div\n class=\"flex flex-col gap-2 w-full px-2\"\n data-test=\"langAvailable\"\n *ngFor=\"let lang of languages\"\n >\n <gn-ui-button\n [extraClass]=\"getExtraClass(lang)\"\n type=\"gray\"\n (buttonClick)=\"toggleLanguage(lang)\"\n [disabled]=\"lang === _record.defaultLanguage\"\n [title]=\"getToggleTitle(lang)\"\n >\n <span [class]=\"getIconClass(lang)\"></span>\n <span class=\"ml-2\">{{ 'language.' + lang | translate }}</span>\n </gn-ui-button>\n </div>\n </ng-container>\n </div>\n </div>\n <div *ngIf=\"!editTranslations && isMultilingual\" class=\"flex flex-col gap-2\">\n <gn-ui-button\n *ngFor=\"let recordLang of sortLanguages(recordLanguages); let i = index\"\n extraClass=\"flex flex-row justify-between bg-white border border-white rounded mb-1 h-[34px] w-full\"\n [ngClass]=\"{\n 'mt-8': isFirstUnsupported(i),\n '': true,\n }\"\n (buttonClick)=\"switchFormLang(recordLang)\"\n type=\"outline\"\n data-test=\"langSwitch\"\n >\n <div class=\"flex flex-row gap-2 items-center\">\n <ng-icon\n *ngIf=\"recordLang === formLanguage\"\n class=\"text-primary mt-1\"\n name=\"iconoirCheckCircle\"\n ></ng-icon>\n <ng-icon\n *ngIf=\"recordLang !== formLanguage\"\n class=\"text-gray-800 mt-1\"\n name=\"iconoirCircle\"\n ></ng-icon>\n <span\n *ngIf=\"recordLang.length === 2\"\n [class]=\"getIconClass(recordLang) + 'mt-1'\"\n ></span>\n <span [ngClass]=\"recordLang === formLanguage ? 'text-black' : ''\">{{\n isLangSupported(recordLang)\n ? ('language.' + recordLang | translate)\n : recordLang.toUpperCase()\n }}</span>\n </div>\n <div class=\"flex flex-row gap-2 items-center\">\n <span\n *ngIf=\"recordLang === formLanguage\"\n class=\"text-xs text-base\"\n translate\n >editor.record.form.multilingual.default</span\n >\n <button\n (click)=\"\n openActionMenu(recordLang, template); $event.stopPropagation()\n \"\n cdkOverlayOrigin\n #actionMenuButton\n >\n <ng-icon class=\"pb-5\" name=\"matMoreHorizOutline\"></ng-icon>\n </button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDelete]=\"recordLang !== _record.defaultLanguage\"\n page=\"record\"\n (delete)=\"confirmDeleteAction(recordLang)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (switch)=\"switchDefaultLang(recordLang)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </div>\n </gn-ui-button>\n </div>\n</div>\n" }]
43685
+ ], template: "<div\n class=\"flex flex-col h-full w-[302px] border-l border-gray-300 py-8 px-3 gap-6 overflow-auto\"\n style=\"background-color: #fafaf9\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.multilingual.title</span\n >\n <button\n [title]=\"'editor.record.form.multilingual.open' | translate\"\n (click)=\"toggleLanguageSelection()\"\n *ngIf=\"isMultilingual\"\n data-test=\"activateSelection\"\n >\n <ng-icon class=\"mt-1\" name=\"iconoirSettings\"></ng-icon>\n </button>\n </div>\n <div class=\"flex flex-col gap-2\" *ngIf=\"editTranslations || !isMultilingual\">\n <gn-ui-check-toggle\n class=\"p-2\"\n [label]=\"'editor.record.form.multilingual.enable' | translate\"\n [color]=\"'primary'\"\n [(value)]=\"isMultilingual\"\n (toggled)=\"switchMultilingual($event)\"\n ></gn-ui-check-toggle>\n <div *ngIf=\"isMultilingual\" class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row justify-between border-t border-gray-300 p-3\">\n <span class=\"mt-2 text-sm text-gray-600\" translate\n >editor.record.form.multilingual.activate</span\n >\n <gn-ui-button\n extraClass=\"w-16 h-8 font-bold\"\n type=\"gray\"\n (buttonClick)=\"validateTranslations()\"\n data-test=\"validateSelection\"\n >{{ 'editor.record.form.multilingual.validate' | translate }}\n </gn-ui-button>\n </div>\n <ng-container *ngIf=\"supportedLanguages$ | async as languages\">\n <div\n class=\"flex flex-col gap-2 w-full px-2\"\n data-test=\"langAvailable\"\n *ngFor=\"let lang of languages\"\n >\n <gn-ui-button\n [extraClass]=\"getExtraClass(lang)\"\n type=\"gray\"\n (buttonClick)=\"toggleLanguage(lang)\"\n [disabled]=\"lang === _record.defaultLanguage\"\n [title]=\"getToggleTitle(lang)\"\n >\n <span [class]=\"getIconClass(lang)\"></span>\n <span class=\"ml-2\">{{ 'language.' + lang | translate }}</span>\n </gn-ui-button>\n </div>\n </ng-container>\n </div>\n </div>\n <div *ngIf=\"!editTranslations && isMultilingual\" class=\"flex flex-col gap-2\">\n <gn-ui-button\n *ngFor=\"let recordLang of sortLanguages(recordLanguages); let i = index\"\n extraClass=\"flex flex-row justify-between bg-white border border-white rounded mb-1 h-[34px] w-full\"\n [ngClass]=\"{\n 'mt-8': isFirstUnsupported(i),\n '': true,\n }\"\n (buttonClick)=\"switchFormLang(recordLang)\"\n type=\"outline\"\n data-test=\"langSwitch\"\n >\n <div class=\"flex flex-row gap-2 items-center\">\n <ng-icon\n *ngIf=\"recordLang === formLanguage\"\n class=\"text-primary mt-1\"\n name=\"iconoirCheckCircle\"\n ></ng-icon>\n <ng-icon\n *ngIf=\"recordLang !== formLanguage\"\n class=\"text-gray-800 mt-1\"\n name=\"iconoirCircle\"\n ></ng-icon>\n <span\n *ngIf=\"recordLang.length === 2\"\n [class]=\"getIconClass(recordLang) + 'mt-1'\"\n ></span>\n <span [ngClass]=\"recordLang === formLanguage ? 'text-black' : ''\">{{\n isLangSupported(recordLang)\n ? ('language.' + recordLang | translate)\n : recordLang.toUpperCase()\n }}</span>\n </div>\n <div class=\"flex flex-row gap-2 items-center\">\n <span\n *ngIf=\"recordLang === formLanguage\"\n class=\"text-xs text-base\"\n translate\n >editor.record.form.multilingual.default</span\n >\n <button\n (click)=\"\n openActionMenu(recordLang, template); $event.stopPropagation()\n \"\n cdkOverlayOrigin\n #actionMenuButton\n >\n <ng-icon class=\"pb-5\" name=\"matMoreHorizOutline\"></ng-icon>\n </button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDelete]=\"recordLang !== _record.defaultLanguage\"\n page=\"record\"\n (delete)=\"confirmDeleteAction(recordLang)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (switch)=\"switchDefaultLang(recordLang)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </div>\n </gn-ui-button>\n </div>\n</div>\n" }]
43568
43686
  }], ctorParameters: () => [{ type: EditorFacade }, { type: i1$b.MatDialog }, { type: i1$1.TranslateService }, { type: RecordsRepositoryInterface }, { type: i1$8.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }], propDecorators: { record: [{
43569
43687
  type: Input
43570
43688
  }], actionMenuButtons: [{
@@ -43572,6 +43690,76 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
43572
43690
  args: ['actionMenuButton', { read: ElementRef }]
43573
43691
  }] } });
43574
43692
 
43693
+ //forced translations that are not available in fields.config.ts
43694
+ marker('editor.record.form.field.keywords');
43695
+ marker('editor.record.form.field.topics');
43696
+ marker('editor.record.form.field.contacts');
43697
+ marker('editor.record.form.field.organisation');
43698
+ class MetadataQualityPanelComponent {
43699
+ constructor() {
43700
+ this.propsToValidate = getAllKeysValidator();
43701
+ this.propertiesByPage = [];
43702
+ }
43703
+ ngOnChanges() {
43704
+ if (this.editorConfig && this.record) {
43705
+ const fieldsByPage = this.editorConfig.pages.map((page) => page.sections.flatMap((section) => section.fields
43706
+ .filter((field) => this.propsToValidate.includes(field.model))
43707
+ .map((field) => field.model)));
43708
+ // FIXME: temporarily add topics and organisation to the first and third page
43709
+ // as long as they are not handled by the editor
43710
+ if (fieldsByPage.length > 0) {
43711
+ fieldsByPage[0].includes('topics') || fieldsByPage[0].push('topics');
43712
+ fieldsByPage[2].includes('organisation') ||
43713
+ fieldsByPage[2].push('organisation');
43714
+ }
43715
+ this.propertiesByPage = fieldsByPage
43716
+ .map((fields) => getQualityValidators(this.record, fields).map(({ name, validator }) => ({
43717
+ label: `editor.record.form.field.${name}`, // use same translations as in fields.config.ts
43718
+ value: validator(),
43719
+ })))
43720
+ .filter((arr) => arr.length > 0);
43721
+ }
43722
+ }
43723
+ getExtraClass(checked) {
43724
+ const baseClasses = 'flex flex-row justify-between rounded mb-1 h-[34px] w-full focus:ring-0 hover:border-none border-none hover:text-black text-black cursor-default';
43725
+ return checked
43726
+ ? `${baseClasses} bg-neutral-100 hover:bg-neutral-100`
43727
+ : `${baseClasses} bg-transparent hover:bg-transparent`;
43728
+ }
43729
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataQualityPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
43730
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MetadataQualityPanelComponent, isStandalone: true, selector: "gn-ui-metadata-quality-panel", inputs: { editorConfig: "editorConfig", record: "record" }, providers: [
43731
+ provideIcons({
43732
+ iconoirSystemShut,
43733
+ iconoirBadgeCheck,
43734
+ }),
43735
+ provideNgIconsConfig({
43736
+ size: '1.25em',
43737
+ }),
43738
+ ], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"flex flex-col h-full w-[302px] border-l border-gray-300 py-8 px-3 gap-3 overflow-auto\"\n style=\"background-color: #fafaf9\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.metadataQuality.title</span\n >\n </div>\n <div\n *ngFor=\"let properties of propertiesByPage; let i = index\"\n class=\"flex flex-col gap-2\"\n >\n <gn-ui-button\n *ngFor=\"let property of properties\"\n [extraClass]=\"getExtraClass(property.value)\"\n type=\"outline\"\n attr.data-cy=\"md-quality-btn-{{ property.label }}\"\n >\n <span>{{ property.label | translate }}</span>\n <div class=\"flex flex-row gap-2 items-center\">\n <ng-icon\n *ngIf=\"property.value; else notChecked\"\n class=\"text-primary\"\n name=\"iconoirBadgeCheck\"\n ></ng-icon>\n <ng-template #notChecked>\n <ng-icon class=\"text-neutral-300\" name=\"iconoirSystemShut\"></ng-icon>\n </ng-template>\n </div>\n </gn-ui-button>\n <hr\n *ngIf=\"i !== propertiesByPage.length - 1\"\n class=\"border-gray-300 w-11/12 mx-auto\"\n />\n </div>\n</div>\n", styles: [""], 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: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }] }); }
43739
+ }
43740
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MetadataQualityPanelComponent, decorators: [{
43741
+ type: Component,
43742
+ args: [{ selector: 'gn-ui-metadata-quality-panel', standalone: true, imports: [
43743
+ CommonModule,
43744
+ TranslateDirective,
43745
+ TranslatePipe,
43746
+ ButtonComponent,
43747
+ NgIconComponent,
43748
+ ], providers: [
43749
+ provideIcons({
43750
+ iconoirSystemShut,
43751
+ iconoirBadgeCheck,
43752
+ }),
43753
+ provideNgIconsConfig({
43754
+ size: '1.25em',
43755
+ }),
43756
+ ], template: "<div\n class=\"flex flex-col h-full w-[302px] border-l border-gray-300 py-8 px-3 gap-3 overflow-auto\"\n style=\"background-color: #fafaf9\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.metadataQuality.title</span\n >\n </div>\n <div\n *ngFor=\"let properties of propertiesByPage; let i = index\"\n class=\"flex flex-col gap-2\"\n >\n <gn-ui-button\n *ngFor=\"let property of properties\"\n [extraClass]=\"getExtraClass(property.value)\"\n type=\"outline\"\n attr.data-cy=\"md-quality-btn-{{ property.label }}\"\n >\n <span>{{ property.label | translate }}</span>\n <div class=\"flex flex-row gap-2 items-center\">\n <ng-icon\n *ngIf=\"property.value; else notChecked\"\n class=\"text-primary\"\n name=\"iconoirBadgeCheck\"\n ></ng-icon>\n <ng-template #notChecked>\n <ng-icon class=\"text-neutral-300\" name=\"iconoirSystemShut\"></ng-icon>\n </ng-template>\n </div>\n </gn-ui-button>\n <hr\n *ngIf=\"i !== propertiesByPage.length - 1\"\n class=\"border-gray-300 w-11/12 mx-auto\"\n />\n </div>\n</div>\n" }]
43757
+ }], propDecorators: { editorConfig: [{
43758
+ type: Input
43759
+ }], record: [{
43760
+ type: Input
43761
+ }] } });
43762
+
43575
43763
  const ROUTER_STATE_KEY = 'router';
43576
43764
  const ROUTER_ROUTE_SEARCH = 'search';
43577
43765
  const ROUTER_ROUTE_DATASET = 'dataset';
@@ -44016,5 +44204,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
44016
44204
  * Generated bundle index. Do not edit.
44017
44205
  */
44018
44206
 
44019
- export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, ActionMenuComponent, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, ApplicationBannerComponent, AuthService, AutocompleteComponent, AvailableServicesField, AvatarComponent, AvatarServiceInterface, BASEMAP_LAYERS, BadgeComponent, BaseConverter, BaseFileReader, BaseReader, BlockListComponent, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CarouselComponent, CatalogTitleComponent, CellPopinComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ClearError, ClearResults, ColorScaleComponent, ConfirmationDialogComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_GN4_LOGIN_URL, DEFAULT_GN4_LOGOUT_URL, DEFAULT_GN4_SETTINGS_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DO_NOT_USE_DEFAULT_BASEMAP, DataService, DataTableComponent, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangeDropdownComponent, DateRangePickerComponent, DateRangeSearchField, DateService, DcatApConverter, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EXTERNAL_VIEWER_OPEN_NEW_TAB, EXTERNAL_VIEWER_URL_TEMPLATE, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalLinkCardComponent, ExternalViewerButtonComponent, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FILTER_SUMMARY_IGNORE_LIST, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogListComponent, FeatureCatalogModule, FeatureDetailComponent, FeatureEditorModule, FeatureMapModule, FeatureNotificationsModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileInputComponent, FileTranslateLoader, FilesDropDirective, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldDateComponent, FormFieldFileComponent, FormFieldKeywordsComponent, FormFieldLicenseComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentsComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GEONETWORK_UI_TAG_NAME, GEONETWORK_UI_VERSION, GeoDataBadgeComponent, GeoTableViewComponent, GeocodingComponent, GeojsonReader, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GpfApiDlComponent, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageInputComponent, ImageOverlayPreviewComponent, ImportRecordComponent, InlineFilterComponent, InteractiveTableColumnComponent, InteractiveTableComponent, InternalLinkCardComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, KindBadgeComponent, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LOGIN_URL, LOGOUT_URL, LONLAT_CRS_CODES, LanguageSwitcherComponent, LayersPanelComponent, LicenseSearchField, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_FEATURE_KEY, MAP_VIEW_CONSTRAINTS, METADATA_LANGUAGE, MapContainerComponent, MapFacade, MapLegendComponent, MapStateContainerComponent, MapStyleService, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataMapperContext, MetadataQualityComponent, MetadataQualityItemComponent, ModalDialogComponent, MultilingualPanelComponent, MultilingualSearchField, MyOrgService, NAMESPACES, NOT_APPLICABLE_CONSTRAINT, NOT_KNOWN_CONSTRAINT, NotificationComponent, NotificationsContainerComponent, NotificationsService, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PaginationDotsComponent, PatchResultsAggregations, PopoverComponent, PopupAlertComponent, PossibleResourceTypes, PossibleResourceTypesDefinition, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_DATASET_URL_TOKEN, RECORD_REUSE_URL_TOKEN, RECORD_SERVICE_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, ROUTER_ROUTE_REUSE, ROUTER_ROUTE_SEARCH, ROUTER_ROUTE_SERVICE, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordKindField, RecordMetaComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResourceTypeLegacyField, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsHitsSearchKindComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SETTINGS_URL, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchFeatureCatalogComponent, SearchFiltersSummaryComponent, SearchFiltersSummaryItemComponent, SearchInputComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, ServiceCapabilitiesComponent, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortableListComponent, SourceLabelComponent, SourcesService, SpatialExtentComponent, SpinningLoaderComponent, StarToggleComponent, StickyHeaderComponent, SupportedTypes, SwitchToggleComponent, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEBUG_CONFIG, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslatedSearchField, TruncatedTextComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, FacetsModule$1 as UiFacetsModule, UiSearchModule, UpdateConfigAggregations, UpdateFilters, UrlInputComponent, UserFeedbackItemComponent, UserPreviewComponent, UserSearchField, VECTOR_STYLE_DEFAULT, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, XmlParseError, _reset, allChildrenElement, appConfigWithTranslationFixture, appendChildTree, appendChildren, assertValidXml, blockModelFixture, bytesToMegabytes, canEditRecord, checkFileFormat, clearSelectedFeatures, createChild, createDocument, createElement, createFuzzyFilter, createNestedChild, createNestedElement, currentPage, defaultMapStyleFixture, defaultMapStyleHlFixture, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, emptyBlockModelFixture, findChildElement, findChildOrCreate, findChildrenElement, findConverterForDocument, findNestedChildOrCreate, findNestedElement, findNestedElements, findParent, firstChildElement, formatDate, formatUserInfo, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLang2FromLang3, getLang3FromLang2, getLayers, getLinkId, getLinkLabel, getLinkPriority, getLocalizedIndexKey, getMapContext, getMapContextLayerFromConfig, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getNamespace, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getResourceType, getReuseType, getRootElement, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSelectedFeatures, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, hasRecordChangedSinceDraft, hasRecordChangedSinceDraftSuccess, initSearch, initialEditorState, initialMapState, initialState, isConfigLoaded, isDateRange, isFormatInQueryParam, isPublished, itemModelFixture, kindToCodeListValue, loadAppConfig, malformedConfigFixture, mapConfigFixture, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, matchesNoApplicableConstraint, matchesNoKnownConstraint, megabytesToBytes, mimeTypeToFormat, minimalAppConfigFixture, missingMandatoryConfigFixture, mouseWheelZoomCondition, noDuplicateFileName, okAppConfigFixture, openDataset, openRecord, parse, parseXmlString, placeholder, prioritizePageScroll, propagateToDocumentOnly, provideGn4, provideI18n, provideRepositoryUrl, readAttribute, readDataset, readDatasetHeaders, readText, reducer$2 as reducer, reducerSearch, removeAllChildren, removeChildren, removeChildrenByName, removeSearchParams, removeWhitespace, renameElements, saveRecord, saveRecordFailure, saveRecordSuccess, selectCanEditRecord, selectCurrentPage, selectEditorConfig, selectEditorState, selectFallback, selectFallbackFields, selectField, selectHasRecordChanged, selectIsPublished, selectRecord, selectRecordChangedSinceSave, selectRecordSaveError, selectRecordSaving, selectRecordSections, selectRecordSource, selectTranslatedField, selectTranslatedValue, setContext, setCurrentPage, setFieldVisibility, setSelectedFeatures, setTextContent, someHabTableItemFixture, sortByFromString, sortByToString, sortByToStrings, stripHtml, stripNamespace, tableItemsFixture, toDate, totalPages, undoRecordDraft, unrecognizedKeysConfigFixture, updateLanguages, updateRecordField, updateRecordLanguages, wmsLayerFlatten, writeAttribute, wrongLanguageCodeConfigFixture, xmlToString };
44207
+ export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, ActionMenuComponent, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, ApplicationBannerComponent, AuthService, AutocompleteComponent, AvailableServicesField, AvatarComponent, AvatarServiceInterface, BASEMAP_LAYERS, BadgeComponent, BaseConverter, BaseFileReader, BaseReader, BlockListComponent, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CarouselComponent, CatalogTitleComponent, CellPopinComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ClearError, ClearResults, ColorScaleComponent, ConfirmationDialogComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_GN4_LOGIN_URL, DEFAULT_GN4_LOGOUT_URL, DEFAULT_GN4_SETTINGS_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DO_NOT_USE_DEFAULT_BASEMAP, DataService, DataTableComponent, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangeDropdownComponent, DateRangePickerComponent, DateRangeSearchField, DateService, DcatApConverter, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EXTERNAL_VIEWER_OPEN_NEW_TAB, EXTERNAL_VIEWER_URL_TEMPLATE, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalLinkCardComponent, ExternalViewerButtonComponent, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FILTER_SUMMARY_IGNORE_LIST, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogListComponent, FeatureCatalogModule, FeatureDetailComponent, FeatureEditorModule, FeatureMapModule, FeatureNotificationsModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileInputComponent, FileTranslateLoader, FilesDropDirective, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldDateComponent, FormFieldFileComponent, FormFieldKeywordsComponent, FormFieldLicenseComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentsComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GEONETWORK_UI_TAG_NAME, GEONETWORK_UI_VERSION, GeoDataBadgeComponent, GeoTableViewComponent, GeocodingComponent, GeojsonReader, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GpfApiDlComponent, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageInputComponent, ImageOverlayPreviewComponent, ImportRecordComponent, InlineFilterComponent, InteractiveTableColumnComponent, InteractiveTableComponent, InternalLinkCardComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, KindBadgeComponent, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LOGIN_URL, LOGOUT_URL, LONLAT_CRS_CODES, LanguageSwitcherComponent, LayersPanelComponent, LicenseSearchField, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_FEATURE_KEY, MAP_VIEW_CONSTRAINTS, METADATA_LANGUAGE, MapContainerComponent, MapFacade, MapLegendComponent, MapStateContainerComponent, MapStyleService, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataMapperContext, MetadataQualityComponent, MetadataQualityItemComponent, MetadataQualityPanelComponent, ModalDialogComponent, MultilingualPanelComponent, MultilingualSearchField, MyOrgService, NAMESPACES, NOT_APPLICABLE_CONSTRAINT, NOT_KNOWN_CONSTRAINT, NotificationComponent, NotificationsContainerComponent, NotificationsService, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PaginationDotsComponent, PatchResultsAggregations, PopoverComponent, PopupAlertComponent, PossibleResourceTypes, PossibleResourceTypesDefinition, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_DATASET_URL_TOKEN, RECORD_REUSE_URL_TOKEN, RECORD_SERVICE_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, ROUTER_ROUTE_REUSE, ROUTER_ROUTE_SEARCH, ROUTER_ROUTE_SERVICE, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordKindField, RecordMetaComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResourceTypeLegacyField, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsHitsSearchKindComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SETTINGS_URL, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchFeatureCatalogComponent, SearchFiltersSummaryComponent, SearchFiltersSummaryItemComponent, SearchInputComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, ServiceCapabilitiesComponent, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortableListComponent, SourceLabelComponent, SourcesService, SpatialExtentComponent, SpinningLoaderComponent, StarToggleComponent, StickyHeaderComponent, SupportedTypes, SwitchToggleComponent, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEBUG_CONFIG, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslatedSearchField, TruncatedTextComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, FacetsModule$1 as UiFacetsModule, UiSearchModule, UpdateConfigAggregations, UpdateFilters, UrlInputComponent, UserFeedbackItemComponent, UserPreviewComponent, UserSearchField, VECTOR_STYLE_DEFAULT, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, XmlParseError, _reset, allChildrenElement, appConfigWithTranslationFixture, appendChildTree, appendChildren, assertValidXml, blockModelFixture, bytesToMegabytes, canEditRecord, checkFileFormat, clearSelectedFeatures, createChild, createDocument, createElement, createFuzzyFilter, createNestedChild, createNestedElement, currentPage, defaultMapStyleFixture, defaultMapStyleHlFixture, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, emptyBlockModelFixture, findChildElement, findChildOrCreate, findChildrenElement, findConverterForDocument, findNestedChildOrCreate, findNestedElement, findNestedElements, findParent, firstChildElement, formatDate, formatUserInfo, getAllKeysValidator, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getIsMobile, getJsonDataItemsProxy, getLang2FromLang3, getLang3FromLang2, getLayers, getLinkId, getLinkLabel, getLinkPriority, getLocalizedIndexKey, getMapContext, getMapContextLayerFromConfig, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getNamespace, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getQualityValidators, getResourceType, getReuseType, getRootElement, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSelectedFeatures, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, hasRecordChangedSinceDraft, hasRecordChangedSinceDraftSuccess, initSearch, initialEditorState, initialMapState, initialState, isConfigLoaded, isDateRange, isFormatInQueryParam, isPublished, itemModelFixture, kindToCodeListValue, loadAppConfig, malformedConfigFixture, mapConfigFixture, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, matchesNoApplicableConstraint, matchesNoKnownConstraint, megabytesToBytes, mimeTypeToFormat, minimalAppConfigFixture, missingMandatoryConfigFixture, mouseWheelZoomCondition, noDuplicateFileName, okAppConfigFixture, openDataset, openRecord, parse, parseXmlString, placeholder, prioritizePageScroll, propagateToDocumentOnly, provideGn4, provideI18n, provideRepositoryUrl, readAttribute, readDataset, readDatasetHeaders, readText, reducer$2 as reducer, reducerSearch, removeAllChildren, removeChildren, removeChildrenByName, removeSearchParams, removeWhitespace, renameElements, saveRecord, saveRecordFailure, saveRecordSuccess, selectCanEditRecord, selectCurrentPage, selectEditorConfig, selectEditorState, selectFallback, selectFallbackFields, selectField, selectHasRecordChanged, selectIsPublished, selectRecord, selectRecordChangedSinceSave, selectRecordSaveError, selectRecordSaving, selectRecordSections, selectRecordSource, selectTranslatedField, selectTranslatedValue, setContext, setCurrentPage, setFieldVisibility, setSelectedFeatures, setTextContent, someHabTableItemFixture, sortByFromString, sortByToString, sortByToStrings, stripHtml, stripNamespace, tableItemsFixture, toDate, totalPages, undoRecordDraft, unrecognizedKeysConfigFixture, updateLanguages, updateRecordField, updateRecordLanguages, wmsLayerFlatten, writeAttribute, wrongLanguageCodeConfigFixture, xmlToString };
44020
44208
  //# sourceMappingURL=geonetwork-ui.mjs.map