geonetwork-ui 2.2.0-dev.4db0b597 → 2.2.0-dev.54d2ced0

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 (130) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +27 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +49 -58
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +5 -4
  4. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.mjs +14 -0
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +20 -17
  7. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +52 -23
  8. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +52 -32
  9. package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.mjs +10 -3
  10. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +14 -5
  11. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +33 -8
  12. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  13. package/esm2022/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.mjs +1 -1
  14. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  15. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +9 -1
  16. package/esm2022/libs/feature/search/src/lib/utils/service/fields.mjs +41 -26
  17. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +11 -9
  18. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +3 -3
  19. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +3 -3
  20. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +35 -22
  21. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +3 -4
  22. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +8 -5
  23. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +4 -4
  24. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +3 -3
  25. package/esm2022/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.mjs +3 -3
  26. package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +3 -3
  27. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +6 -6
  28. package/esm2022/translations/de.json +3 -2
  29. package/esm2022/translations/en.json +5 -4
  30. package/esm2022/translations/es.json +3 -2
  31. package/esm2022/translations/fr.json +5 -4
  32. package/esm2022/translations/it.json +5 -4
  33. package/esm2022/translations/nl.json +3 -2
  34. package/esm2022/translations/pt.json +3 -2
  35. package/fesm2022/geonetwork-ui.mjs +406 -239
  36. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  37. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts +2 -0
  38. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  39. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts +0 -1
  40. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  41. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -1
  42. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +3 -5
  43. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  44. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts +3 -0
  45. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts.map +1 -0
  46. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +1 -1
  47. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +6 -6
  48. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  49. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +4 -3
  50. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  51. package/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.d.ts.map +1 -1
  52. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +1 -1
  53. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  54. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -2
  55. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  56. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +18 -12
  57. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  58. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts +1 -0
  59. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts.map +1 -1
  60. package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -1
  61. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  62. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +1 -0
  63. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  64. package/libs/feature/search/src/lib/utils/service/fields.d.ts +21 -8
  65. package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
  66. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  67. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts +1 -1
  68. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts.map +1 -1
  69. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +10 -6
  70. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  71. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  72. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +3 -1
  73. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  74. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +13 -13
  75. package/libs/ui/inputs/src/lib/button/button.component.d.ts +1 -1
  76. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  77. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +1 -1
  78. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  79. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +40 -40
  80. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +1 -1
  81. package/package.json +1 -1
  82. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +61 -8
  83. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +55 -9
  84. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +225 -24
  85. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +29 -0
  86. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +80 -73
  87. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +4 -3
  88. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +3 -5
  89. package/src/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.ts +16 -0
  90. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +24 -21
  91. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +115 -62
  92. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +169 -95
  93. package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts +22 -2
  94. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +15 -4
  95. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +47 -8
  96. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +21 -14
  97. package/src/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.ts +1 -0
  98. package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -4
  99. package/src/libs/common/fixtures/src/lib/gn4/groups.fixtures.ts +1 -1
  100. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +50 -10
  101. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +10 -0
  102. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +21 -16
  103. package/src/libs/feature/search/src/lib/utils/service/fields.ts +43 -34
  104. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -1
  105. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.css +5 -0
  106. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +39 -0
  107. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.ts +58 -0
  108. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +2 -2
  109. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.ts +1 -0
  110. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +50 -23
  111. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +37 -15
  112. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +2 -3
  113. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +4 -4
  114. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +11 -3
  115. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +1 -1
  116. package/src/libs/ui/inputs/src/lib/button/button.component.ts +1 -0
  117. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.css +3 -0
  118. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +1 -1
  119. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +1 -0
  120. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +2 -2
  121. package/tailwind.base.config.js +3 -0
  122. package/tailwind.base.css +2 -2
  123. package/translations/de.json +3 -2
  124. package/translations/en.json +5 -4
  125. package/translations/es.json +3 -2
  126. package/translations/fr.json +5 -4
  127. package/translations/it.json +5 -4
  128. package/translations/nl.json +3 -2
  129. package/translations/pt.json +3 -2
  130. package/translations/sk.json +3 -2
@@ -8,7 +8,7 @@ import * as i1$1 from '@ngx-translate/core';
8
8
  import { TranslateCompiler, TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core';
9
9
  import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler';
10
10
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
11
- import { map as map$1, shareReplay, filter, tap as tap$1, startWith, switchMap as switchMap$1, catchError, take, withLatestFrom, delay, debounceTime, throttleTime, distinctUntilChanged, finalize, first, share, pairwise, mergeMap } from 'rxjs/operators';
11
+ import { map as map$1, shareReplay, filter, tap as tap$1, startWith, withLatestFrom, switchMap as switchMap$1, catchError, take, delay, debounceTime, throttleTime, distinctUntilChanged, finalize, first, share, pairwise, mergeMap } from 'rxjs/operators';
12
12
  import { marker } from '@biesbjerg/ngx-translate-extract-marker';
13
13
  import * as i1$3 from '@angular/common';
14
14
  import { CommonModule, NgOptimizedImage, NgForOf } from '@angular/common';
@@ -587,6 +587,20 @@ function matchMimeType(format) {
587
587
  return format || null;
588
588
  }
589
589
 
590
+ function getKeywordTypeFromKeywordTypeCode(typeCode) {
591
+ if (!typeCode)
592
+ return 'other';
593
+ switch (typeCode) {
594
+ case 'theme':
595
+ case 'place':
596
+ case 'temporal':
597
+ case 'other':
598
+ return typeCode;
599
+ default:
600
+ return 'other';
601
+ }
602
+ }
603
+
590
604
  function extractCharacterString() {
591
605
  return pipe(fallback(findChildElement('gco:CharacterString', false), findChildElement('gmx:Anchor', false)), readText());
592
606
  }
@@ -649,28 +663,32 @@ function extractStatus() {
649
663
  return pipe(findChildElement('gmd:MD_ProgressCode'), readAttribute('codeListValue'), map(getStatusFromStatusCode));
650
664
  }
651
665
  // from gmd:resourceConstraints
652
- function extractAccessConstraints() {
653
- const getOtherConstraints = pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') === -1 &&
654
- values.indexOf('otherRestrictions') > -1))), mapArray(findChildrenElement('gmd:otherConstraints')), flattenArray(), mapArray(extractCharacterString()), mapArray((text) => ({
666
+ function extractLegalConstraints() {
667
+ return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') === -1))), mapArray(combine(findChildrenElement('gmd:otherConstraints'), findChildrenElement('gmd:useLimitation'))), flattenArray(), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
668
+ ...(url && { url }),
655
669
  text,
656
- type: 'other',
657
670
  })));
658
- const getSecurityConstraints = pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), mapArray(extractCharacterString()), mapArray((text) => ({
671
+ }
672
+ // from gmd:resourceConstraints
673
+ function extractSecurityConstraints() {
674
+ return pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
675
+ ...(url && { url }),
659
676
  text,
660
- type: 'security',
661
677
  })));
662
- return pipe(combine(getOtherConstraints, getSecurityConstraints), flattenArray());
663
678
  }
664
679
  // from gmd:resourceConstraints
665
- function extractUseLimitations() {
666
- return pipe(combine(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), findNestedElements('gmd:MD_LegalConstraints', 'gmd:useLimitation')), flattenArray(), mapArray(extractCharacterString()));
680
+ function extractOtherConstraints() {
681
+ return pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
682
+ ...(url && { url }),
683
+ text,
684
+ })));
667
685
  }
668
686
  // from gmd:resourceConstraints
669
687
  function extractLicenses() {
670
- return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') > -1))), mapArray(pipe(findChildElement('gmd:otherConstraints'), combine(extractCharacterString(), extractUrl()), map(([text, url]) => ({
688
+ return pipe(findChildrenElement('gmd:MD_LegalConstraints', false), filterArray(pipe(findChildrenElement('gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), map((values) => values.indexOf('license') > -1))), mapArray(combine(findChildrenElement('gmd:otherConstraints'), findChildrenElement('gmd:useLimitation'))), flattenArray(), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
671
689
  ...(url && { url }),
672
690
  text,
673
- })))));
691
+ })));
674
692
  }
675
693
  // from gmd:MD_Distribution
676
694
  function extractDatasetDistributions() {
@@ -829,31 +847,55 @@ function readDatasetUpdated(rootEl) {
829
847
  function readContacts(rootEl) {
830
848
  return pipe(findIdentification(), combine(findChildrenElement('gmd:contact'), findChildrenElement('gmd:pointOfContact')), flattenArray(), mapArray(findChildElement('gmd:CI_ResponsibleParty', false)), mapArray(extractIndividuals()), flattenArray())(rootEl);
831
849
  }
832
- function readKeywordsOfType(isTheme) {
833
- return pipe(findIdentification(), findNestedElements('gmd:descriptiveKeywords', 'gmd:MD_Keywords'), filterArray(pipe(findChildrenElement('gmd:MD_KeywordTypeCode'), mapArray(readAttribute('codeListValue')), map((values) => isTheme === values.indexOf('theme') > -1))), mapArray(findChildrenElement('gmd:keyword')), flattenArray(), mapArray(extractCharacterString()));
850
+ // from gmd:thesaurusName
851
+ function readThesaurus(rootEl) {
852
+ if (!rootEl)
853
+ return null;
854
+ const findIdentifier = findNestedElement('gmd:CI_Citation', 'gmd:identifier', 'gmd:MD_Identifier', 'gmd:code');
855
+ const id = pipe(findIdentifier, extractCharacterString())(rootEl);
856
+ const url = pipe(findIdentifier, extractUrl())(rootEl);
857
+ const name = pipe(findNestedElement('gmd:CI_Citation', 'gmd:title'), extractCharacterString())(rootEl);
858
+ return {
859
+ id,
860
+ ...(name && { name }),
861
+ ...(url && { url }),
862
+ };
834
863
  }
835
- function readKeywords(rootEl) {
836
- return readKeywordsOfType(false)(rootEl);
864
+ // from gmd:MD_Keywords
865
+ function readKeywordGroup(rootEl) {
866
+ const type = pipe(findChildrenElement('gmd:MD_KeywordTypeCode'), mapArray(readAttribute('codeListValue')), map((values) => getKeywordTypeFromKeywordTypeCode(values[0])))(rootEl);
867
+ const thesaurus = pipe(findNestedElement('gmd:thesaurusName'), readThesaurus)(rootEl);
868
+ return pipe(findChildrenElement('gmd:keyword'), mapArray((el) => {
869
+ const label = extractCharacterString()(el);
870
+ return {
871
+ ...(thesaurus ? { thesaurus } : {}),
872
+ label,
873
+ type,
874
+ };
875
+ }))(rootEl);
837
876
  }
838
- function readThemes(rootEl) {
839
- return readKeywordsOfType(true)(rootEl);
877
+ function readKeywords(rootEl) {
878
+ return pipe(findIdentification(), findNestedElements('gmd:descriptiveKeywords', 'gmd:MD_Keywords'), mapArray(readKeywordGroup), flattenArray())(rootEl);
840
879
  }
841
880
  function readStatus(rootEl) {
842
881
  return pipe(findIdentification(), findChildElement('gmd:status', false), extractStatus())(rootEl);
843
882
  }
844
883
  const getConstraints = pipe(findIdentification(), findChildrenElement('gmd:resourceConstraints', false));
845
- function readAccessConstraints(rootEl) {
846
- return pipe(getConstraints, mapArray(extractAccessConstraints()), flattenArray(), flattenArray())(rootEl);
884
+ function readLegalConstraints(rootEl) {
885
+ return pipe(getConstraints, mapArray(extractLegalConstraints()), flattenArray(), flattenArray())(rootEl);
886
+ }
887
+ function readSecurityConstraints(rootEl) {
888
+ return pipe(getConstraints, mapArray(extractSecurityConstraints()), flattenArray())(rootEl);
847
889
  }
848
- function readUseLimitations(rootEl) {
849
- return pipe(getConstraints, mapArray(extractUseLimitations()), flattenArray())(rootEl);
890
+ function readOtherConstraints(rootEl) {
891
+ return pipe(getConstraints, mapArray(extractOtherConstraints()), flattenArray())(rootEl);
850
892
  }
851
893
  function readLicenses(rootEl) {
852
894
  return pipe(getConstraints, mapArray(extractLicenses()), flattenArray())(rootEl);
853
895
  }
854
896
  // not used yet
855
897
  function readIsoTopics(rootEl) {
856
- return pipe(findIdentification(), findChildrenElement('gmd:MD_TopicCategoryCode', false), mapArray(readText()))(rootEl);
898
+ return pipe(findIdentification(), findChildrenElement('gmd:MD_TopicCategoryCode', true), mapArray(readText()))(rootEl);
857
899
  }
858
900
  function readSpatialRepresentation(rootEl) {
859
901
  return pipe(findIdentification(), findNestedElement('gmd:spatialRepresentationType', 'gmd:MD_SpatialRepresentationTypeCode'), readAttribute('codeListValue'), map(getSpatialRepresentationFromCode))(rootEl);
@@ -1069,33 +1111,50 @@ function updateCitationDate(date, type) {
1069
1111
  function appendCitationDate(date, type) {
1070
1112
  return appendChildren(pipe(createElement('gmd:date'), createChild('gmd:CI_Date'), appendChildren(pipe(createElement('gmd:date'), writeDateTime(date)), pipe(createElement('gmd:dateType'), createChild('gmd:CI_DateTypeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#CI_DateTypeCode'), addAttribute('codeListValue', type)))));
1071
1113
  }
1072
- function removeKeywords(type) {
1073
- return removeChildren(pipe(findNestedElements('gmd:descriptiveKeywords'), filterArray(pipe(findNestedElement('gmd:MD_Keywords', 'gmd:type', 'gmd:MD_KeywordTypeCode'), readAttribute('codeListValue'),
1074
- // if a specific type is targeted, compare with it; otherwise remove keywords if they have no type defined
1075
- map((typeValue) => (type !== null ? type === typeValue : true))))));
1076
- }
1077
- function appendKeywords(keywords, type) {
1078
- return appendChildren(pipe(createElement('gmd:descriptiveKeywords'), createChild('gmd:MD_Keywords'), type !== null
1079
- ? appendChildren(pipe(createElement('gmd:type'), createChild('gmd:MD_KeywordTypeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_KeywordTypeCode'), addAttribute('codeListValue', type)))
1080
- : noop, appendChildren(...keywords.map((keyword) => pipe(createElement('gmd:keyword'), writeCharacterString(keyword))))));
1081
- }
1082
- function removeAccessConstraints() {
1083
- const securityConstraintsFilter = pipe(findChildrenElement('gmd:MD_SecurityConstraints'), (array) => array.length > 0);
1084
- // remove legal constraints that *only* have 'otherRestrictions'
1085
- const otherConstraintsFilter = pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.every((code) => code === 'otherRestrictions'));
1086
- return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray((el) => securityConstraintsFilter(el) || otherConstraintsFilter(el))));
1087
- }
1088
- function createAccessConstraint(constraint) {
1089
- if (constraint.type === 'security') {
1114
+ function removeKeywords() {
1115
+ return removeChildren(pipe(findNestedElements('gmd:descriptiveKeywords')));
1116
+ }
1117
+ // returns a <gmd:thesaurusName> element
1118
+ function createThesaurus(thesaurus) {
1119
+ return pipe(createElement('gmd:thesaurusName'), createChild('gmd:CI_Citation'), appendChildren(pipe(createElement('gmd:title'), writeCharacterString(thesaurus.name || thesaurus.id)), pipe(createElement('gmd:identifier'), createChild('gmd:MD_Identifier'), appendChildren(pipe(createElement('gmd:code'), thesaurus.url
1120
+ ? writeAnchor(thesaurus.url, thesaurus.id)
1121
+ : writeCharacterString(thesaurus.id))))));
1122
+ }
1123
+ function appendKeywords(keywords) {
1124
+ const keywordsByThesaurus = keywords.reduce((acc, keyword) => {
1125
+ const thesaurusId = keyword.thesaurus?.id;
1126
+ const type = keyword.type;
1127
+ let existingGroup = acc.find((group) => group[0].thesaurus
1128
+ ? group[0].thesaurus.id === thesaurusId
1129
+ : group[0].type === type);
1130
+ if (!existingGroup) {
1131
+ existingGroup = [];
1132
+ acc.push(existingGroup);
1133
+ }
1134
+ existingGroup.push(keyword);
1135
+ return acc;
1136
+ }, []);
1137
+ return appendChildren(...keywordsByThesaurus.map((keywords) => pipe(createElement('gmd:descriptiveKeywords'), createChild('gmd:MD_Keywords'), appendChildren(pipe(createElement('gmd:type'), createChild('gmd:MD_KeywordTypeCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_KeywordTypeCode'), addAttribute('codeListValue', keywords[0].type))), keywords[0].thesaurus
1138
+ ? appendChildren(createThesaurus(keywords[0].thesaurus))
1139
+ : noop, appendChildren(...keywords.map((keyword) => pipe(createElement('gmd:keyword'), writeCharacterString(keyword.label)))))));
1140
+ }
1141
+ function createConstraint(constraint, type) {
1142
+ if (type === 'security') {
1090
1143
  return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_SecurityConstraints'), appendChildren(pipe(createElement('gmd:classification'), createChild('gmd:MD_ClassificationCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_ClassificationCode'), addAttribute('codeListValue', 'restricted')), pipe(createElement('gmd:useLimitation'), writeCharacterString(constraint.text))));
1091
1144
  }
1092
- return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_LegalConstraints'), appendChildren(pipe(createElement('gmd:accessConstraints'), createChild('gmd:MD_RestrictionCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode'), addAttribute('codeListValue', 'otherRestrictions')), pipe(createElement('gmd:otherConstraints'), writeCharacterString(constraint.text))));
1145
+ else if (type === 'legal') {
1146
+ return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_LegalConstraints'), appendChildren(pipe(createElement('gmd:accessConstraints'), createChild('gmd:MD_RestrictionCode'), addAttribute('codeList', 'http://standards.iso.org/iso/19139/resources/gmxCodelists.xml#MD_RestrictionCode'), addAttribute('codeListValue', 'otherRestrictions')), pipe(createElement('gmd:otherConstraints'), writeCharacterString(constraint.text))));
1147
+ }
1148
+ return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_Constraints'), appendChildren(pipe(createElement('gmd:useLimitation'), writeCharacterString(constraint.text))));
1093
1149
  }
1094
- function removeUseLimitations() {
1150
+ function removeOtherConstraints() {
1095
1151
  return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1096
1152
  }
1097
- function createUseLimitation(useLimitation) {
1098
- return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_Constraints'), createChild('gmd:useLimitation'), writeCharacterString(useLimitation));
1153
+ function removeSecurityConstraints() {
1154
+ return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1155
+ }
1156
+ function removeLegalConstraints() {
1157
+ return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.every((code) => code !== 'license')))));
1099
1158
  }
1100
1159
  function removeLicenses() {
1101
1160
  return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_LegalConstraints', 'gmd:accessConstraints', 'gmd:MD_RestrictionCode'), mapArray(readAttribute('codeListValue')), (restrictionCodes) => restrictionCodes.some((code) => code === 'license')))));
@@ -1194,19 +1253,22 @@ function writeContacts(record, rootEl) {
1194
1253
  pipe(findOrCreateIdentification(), removeChildrenByName('gmd:pointOfContact'), appendChildren(...record.contacts.map((contact) => pipe(createElement('gmd:pointOfContact'), appendResponsibleParty(contact)))))(rootEl);
1195
1254
  }
1196
1255
  function writeKeywords(record, rootEl) {
1197
- pipe(findOrCreateIdentification(), removeKeywords(null), appendKeywords(record.keywords, null))(rootEl);
1198
- }
1199
- function writeThemes(record, rootEl) {
1200
- pipe(findOrCreateIdentification(), removeKeywords('theme'), appendKeywords(record.themes, 'theme'))(rootEl);
1256
+ pipe(findOrCreateIdentification(), removeKeywords(), appendKeywords(record.keywords))(rootEl);
1201
1257
  }
1202
- function writeAccessConstraints(record, rootEl) {
1203
- pipe(findOrCreateIdentification(), removeAccessConstraints(), appendChildren(...record.accessConstraints.map(createAccessConstraint)))(rootEl);
1258
+ function writeTopics(record, rootEl) {
1259
+ pipe(findOrCreateIdentification(), removeChildrenByName('gmd:topicCategory'), appendChildren(...record.topics.map((topic) => pipe(createElement('gmd:topicCategory'), createChild('gmd:MD_TopicCategoryCode'), setTextContent(topic)))))(rootEl);
1204
1260
  }
1205
1261
  function writeLicenses(record, rootEl) {
1206
1262
  pipe(findOrCreateIdentification(), removeLicenses(), appendChildren(...record.licenses.map(createLicense)))(rootEl);
1207
1263
  }
1208
- function writeUseLimitations(record, rootEl) {
1209
- pipe(findOrCreateIdentification(), removeUseLimitations(), appendChildren(...record.useLimitations.map(createUseLimitation)))(rootEl);
1264
+ function writeLegalConstraints(record, rootEl) {
1265
+ pipe(findOrCreateIdentification(), removeLegalConstraints(), appendChildren(...record.legalConstraints.map((c) => createConstraint(c, 'legal'))))(rootEl);
1266
+ }
1267
+ function writeSecurityConstraints(record, rootEl) {
1268
+ pipe(findOrCreateIdentification(), removeSecurityConstraints(), appendChildren(...record.securityConstraints.map((c) => createConstraint(c, 'security'))))(rootEl);
1269
+ }
1270
+ function writeOtherConstraints(record, rootEl) {
1271
+ pipe(findOrCreateIdentification(), removeOtherConstraints(), appendChildren(...record.otherConstraints.map((c) => createConstraint(c, 'other'))))(rootEl);
1210
1272
  }
1211
1273
  function writeUpdateFrequency(record, rootEl) {
1212
1274
  pipe(findOrCreateIdentification(), findChildOrCreate('gmd:resourceMaintenance'), removeAllChildren(), findChildOrCreate('gmd:MD_MaintenanceInformation'), typeof record.updateFrequency === 'object'
@@ -1303,13 +1365,12 @@ function toModel(xml) {
1303
1365
  const recordUpdated = readRecordUpdated(rootEl);
1304
1366
  const recordCreated = recordUpdated;
1305
1367
  const keywords = readKeywords(rootEl);
1306
- const themes = readThemes(rootEl);
1307
- const accessConstraints = readAccessConstraints(rootEl);
1308
- const useLimitations = readUseLimitations(rootEl);
1368
+ const topics = readIsoTopics(rootEl);
1369
+ const legalConstraints = readLegalConstraints(rootEl);
1370
+ const otherConstraints = readOtherConstraints(rootEl);
1371
+ const securityConstraints = readSecurityConstraints(rootEl);
1309
1372
  const licenses = readLicenses(rootEl);
1310
1373
  const overviews = readOverviews(rootEl);
1311
- // not used yet
1312
- const isoTopics = readIsoTopics(rootEl);
1313
1374
  if (kind === 'dataset') {
1314
1375
  const status = readStatus(rootEl);
1315
1376
  const datasetCreated = readDatasetCreated(rootEl);
@@ -1332,10 +1393,11 @@ function toModel(xml) {
1332
1393
  contacts,
1333
1394
  contactsForResource: [],
1334
1395
  keywords,
1335
- themes,
1336
- accessConstraints,
1337
- useLimitations,
1396
+ topics,
1338
1397
  licenses,
1398
+ legalConstraints,
1399
+ securityConstraints,
1400
+ otherConstraints,
1339
1401
  ...(datasetCreated && { datasetCreated }),
1340
1402
  ...(datasetUpdated && { datasetUpdated }),
1341
1403
  lineage,
@@ -1359,10 +1421,11 @@ function toModel(xml) {
1359
1421
  ownerOrganization,
1360
1422
  contacts,
1361
1423
  keywords,
1362
- themes,
1363
- accessConstraints,
1364
- useLimitations,
1424
+ topics,
1365
1425
  licenses,
1426
+ legalConstraints,
1427
+ securityConstraints,
1428
+ otherConstraints,
1366
1429
  overviews,
1367
1430
  onlineResources,
1368
1431
  };
@@ -1387,10 +1450,12 @@ function toXml(record, originalXml) {
1387
1450
  writeAbstract(record, rootEl);
1388
1451
  fieldChanged('contacts') && writeContacts(record, rootEl);
1389
1452
  fieldChanged('keywords') && writeKeywords(record, rootEl);
1390
- fieldChanged('themes') && writeThemes(record, rootEl);
1391
- fieldChanged('accessConstraints') && writeAccessConstraints(record, rootEl);
1453
+ fieldChanged('topics') && writeTopics(record, rootEl);
1454
+ fieldChanged('legalConstraints') && writeLegalConstraints(record, rootEl);
1455
+ fieldChanged('securityConstraints') &&
1456
+ writeSecurityConstraints(record, rootEl);
1392
1457
  fieldChanged('licenses') && writeLicenses(record, rootEl);
1393
- fieldChanged('useLimitations') && writeUseLimitations(record, rootEl);
1458
+ fieldChanged('otherConstraints') && writeOtherConstraints(record, rootEl);
1394
1459
  if (record.kind === 'dataset') {
1395
1460
  writeStatus(record, rootEl);
1396
1461
  fieldChanged('updateFrequency') && writeUpdateFrequency(record, rootEl);
@@ -1457,6 +1522,31 @@ const mapContact = (sourceContact, lang3) => {
1457
1522
  ...(phone && { phone }),
1458
1523
  };
1459
1524
  };
1525
+ const mapKeywords = (thesauri, language) => {
1526
+ const keywords = [];
1527
+ for (const thesaurusId in thesauri) {
1528
+ const rawThesaurus = thesauri[thesaurusId];
1529
+ let thesaurus = null;
1530
+ if (rawThesaurus.id) {
1531
+ const thesaurusSource = { ...rawThesaurus };
1532
+ const url = getAsUrl(selectField(thesaurusSource, 'link'));
1533
+ const name = selectField(thesaurusSource, 'title');
1534
+ thesaurus = {
1535
+ id: rawThesaurus.id,
1536
+ ...(name && { name }),
1537
+ ...(url && { url }),
1538
+ };
1539
+ }
1540
+ for (const keyword of rawThesaurus.keywords) {
1541
+ keywords.push({
1542
+ label: selectTranslatedValue(keyword, language),
1543
+ type: getKeywordTypeFromKeywordTypeCode(rawThesaurus.theme),
1544
+ ...(thesaurus && { thesaurus }),
1545
+ });
1546
+ }
1547
+ }
1548
+ return keywords;
1549
+ };
1460
1550
 
1461
1551
  /**
1462
1552
  * Custom HttpParameterCodec
@@ -16774,12 +16864,12 @@ var de = {
16774
16864
  "record.metadata.details": "Technische Informationen",
16775
16865
  "record.metadata.download": "Downloads",
16776
16866
  "record.metadata.formats": "Formate",
16777
- "record.metadata.isOpenData": "Open Data",
16778
16867
  "record.metadata.keywords": "Stichworte",
16779
16868
  "record.metadata.lastUpdate": "Zuletzt aktualisiert am",
16780
16869
  "record.metadata.links": "Links",
16781
16870
  "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
16782
16871
  "record.metadata.origin": "Über die Daten",
16872
+ "record.metadata.otherConstraints": "",
16783
16873
  "record.metadata.owner": "",
16784
16874
  "record.metadata.preview": "Vorschau",
16785
16875
  "record.metadata.publications": "Veröffentlichungen",
@@ -16804,8 +16894,8 @@ var de = {
16804
16894
  "record.metadata.related": "Ähnliche Datensätze",
16805
16895
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
16806
16896
  "record.metadata.status": "",
16807
- "record.metadata.themes": "Kategorien",
16808
16897
  "record.metadata.title": "Titel",
16898
+ "record.metadata.topics": "Kategorien",
16809
16899
  "record.metadata.type": "Geographischer Datensatz",
16810
16900
  "record.metadata.uniqueId": "Eindeutige Kennung",
16811
16901
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
@@ -16841,6 +16931,7 @@ var de = {
16841
16931
  "search.filters.isSpatial": "Ist räumliche Daten",
16842
16932
  "search.filters.isSpatial.no": "nicht räumlich",
16843
16933
  "search.filters.isSpatial.yes": "räumlich",
16934
+ "search.filters.keyword": "Schlüsselwort",
16844
16935
  "search.filters.license": "Lizenz",
16845
16936
  "search.filters.license.cc-by": "Creative Commons CC-BY",
16846
16937
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -17114,12 +17205,12 @@ var en = {
17114
17205
  "record.metadata.details": "Technical information",
17115
17206
  "record.metadata.download": "Downloads",
17116
17207
  "record.metadata.formats": "Formats",
17117
- "record.metadata.isOpenData": "Open Data",
17118
17208
  "record.metadata.keywords": "Keywords",
17119
17209
  "record.metadata.lastUpdate": "Last updated on",
17120
17210
  "record.metadata.links": "Links",
17121
17211
  "record.metadata.noUsage": "No usage conditions specified for this record.",
17122
17212
  "record.metadata.origin": "About the data",
17213
+ "record.metadata.otherConstraints": "Additional Conditions",
17123
17214
  "record.metadata.owner": "Catalog of origin",
17124
17215
  "record.metadata.preview": "Preview",
17125
17216
  "record.metadata.publications": "publications",
@@ -17144,14 +17235,14 @@ var en = {
17144
17235
  "record.metadata.related": "Related records",
17145
17236
  "record.metadata.sheet": "Original metadata",
17146
17237
  "record.metadata.status": "Status",
17147
- "record.metadata.themes": "Categories",
17148
17238
  "record.metadata.title": "Title",
17239
+ "record.metadata.topics": "Categories",
17149
17240
  "record.metadata.type": "Geographical dataset",
17150
17241
  "record.metadata.uniqueId": "Unique Identifier",
17151
17242
  "record.metadata.updateFrequency": "Data Update Frequency",
17152
17243
  "record.metadata.updateStatus": "Data Update Status",
17153
- "record.metadata.updatedOn": "Metadata's last update",
17154
- "record.metadata.usage": "Usage & constraints",
17244
+ "record.metadata.updatedOn": "Last Data Information Update",
17245
+ "record.metadata.usage": "License and Conditions",
17155
17246
  "record.more.details": "Read more",
17156
17247
  "record.tab.chart": "Chart",
17157
17248
  "record.tab.data": "Table",
@@ -17181,6 +17272,7 @@ var en = {
17181
17272
  "search.filters.isSpatial": "Is spatial data",
17182
17273
  "search.filters.isSpatial.no": "non spatial",
17183
17274
  "search.filters.isSpatial.yes": "spatial",
17275
+ "search.filters.keyword": "Keyword",
17184
17276
  "search.filters.license": "License",
17185
17277
  "search.filters.license.cc-by": "Creative Commons CC-BY",
17186
17278
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -17454,12 +17546,12 @@ var es = {
17454
17546
  "record.metadata.details": "",
17455
17547
  "record.metadata.download": "",
17456
17548
  "record.metadata.formats": "",
17457
- "record.metadata.isOpenData": "",
17458
17549
  "record.metadata.keywords": "",
17459
17550
  "record.metadata.lastUpdate": "",
17460
17551
  "record.metadata.links": "",
17461
17552
  "record.metadata.noUsage": "",
17462
17553
  "record.metadata.origin": "",
17554
+ "record.metadata.otherConstraints": "",
17463
17555
  "record.metadata.owner": "",
17464
17556
  "record.metadata.preview": "",
17465
17557
  "record.metadata.publications": "",
@@ -17484,8 +17576,8 @@ var es = {
17484
17576
  "record.metadata.related": "",
17485
17577
  "record.metadata.sheet": "",
17486
17578
  "record.metadata.status": "",
17487
- "record.metadata.themes": "",
17488
17579
  "record.metadata.title": "",
17580
+ "record.metadata.topics": "",
17489
17581
  "record.metadata.type": "",
17490
17582
  "record.metadata.uniqueId": "",
17491
17583
  "record.metadata.updateFrequency": "",
@@ -17521,6 +17613,7 @@ var es = {
17521
17613
  "search.filters.isSpatial": "",
17522
17614
  "search.filters.isSpatial.no": "",
17523
17615
  "search.filters.isSpatial.yes": "",
17616
+ "search.filters.keyword": "",
17524
17617
  "search.filters.license": "",
17525
17618
  "search.filters.license.cc-by": "",
17526
17619
  "search.filters.license.cc-by-sa": "",
@@ -17794,12 +17887,12 @@ var fr = {
17794
17887
  "record.metadata.details": "Informations techniques",
17795
17888
  "record.metadata.download": "Téléchargements",
17796
17889
  "record.metadata.formats": "Formats",
17797
- "record.metadata.isOpenData": "Donnée Ouverte",
17798
17890
  "record.metadata.keywords": "Mots clés",
17799
17891
  "record.metadata.lastUpdate": "Mis à jour le",
17800
17892
  "record.metadata.links": "Liens",
17801
17893
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
17802
17894
  "record.metadata.origin": "À propos des données",
17895
+ "record.metadata.otherConstraints": "Limitations d'usage",
17803
17896
  "record.metadata.owner": "Catalogue d'origine",
17804
17897
  "record.metadata.preview": "Aperçu",
17805
17898
  "record.metadata.publications": "données",
@@ -17824,14 +17917,14 @@ var fr = {
17824
17917
  "record.metadata.related": "Voir aussi",
17825
17918
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
17826
17919
  "record.metadata.status": "",
17827
- "record.metadata.themes": "Catégories",
17828
17920
  "record.metadata.title": "Titre",
17921
+ "record.metadata.topics": "Catégories",
17829
17922
  "record.metadata.type": "Donnée géographique",
17830
17923
  "record.metadata.uniqueId": "Identificateur de ressource unique",
17831
17924
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
17832
17925
  "record.metadata.updateStatus": "Statut de mise à jour des données",
17833
- "record.metadata.updatedOn": "Mise à jour de la fiche de métadonnée",
17834
- "record.metadata.usage": "Conditions d'utilisation",
17926
+ "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
17927
+ "record.metadata.usage": "Licences et conditions d'utilisation",
17835
17928
  "record.more.details": "Détails",
17836
17929
  "record.tab.chart": "Graphique",
17837
17930
  "record.tab.data": "Tableau",
@@ -17861,6 +17954,7 @@ var fr = {
17861
17954
  "search.filters.isSpatial": "Données spatiales",
17862
17955
  "search.filters.isSpatial.no": "non-géolocalisées",
17863
17956
  "search.filters.isSpatial.yes": "géolocalisées",
17957
+ "search.filters.keyword": "Mot-clé",
17864
17958
  "search.filters.license": "Licence",
17865
17959
  "search.filters.license.cc-by": "cc-by",
17866
17960
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18134,12 +18228,12 @@ var it = {
18134
18228
  "record.metadata.details": "Informazioni tecniche",
18135
18229
  "record.metadata.download": "Download",
18136
18230
  "record.metadata.formats": "Formati",
18137
- "record.metadata.isOpenData": "Data aperta",
18138
18231
  "record.metadata.keywords": "Parole chiave",
18139
18232
  "record.metadata.lastUpdate": "Ultimo aggiornamento",
18140
18233
  "record.metadata.links": "Collegamenti",
18141
18234
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
18142
18235
  "record.metadata.origin": "Informazioni sui dati",
18236
+ "record.metadata.otherConstraints": "Limitazioni di uso",
18143
18237
  "record.metadata.owner": "Catalogo originale",
18144
18238
  "record.metadata.preview": "Anteprima",
18145
18239
  "record.metadata.publications": "pubblicazioni",
@@ -18164,14 +18258,14 @@ var it = {
18164
18258
  "record.metadata.related": "Vedi anche",
18165
18259
  "record.metadata.sheet": "Origine del metadata",
18166
18260
  "record.metadata.status": "",
18167
- "record.metadata.themes": "Categorie",
18168
18261
  "record.metadata.title": "Titolo",
18262
+ "record.metadata.topics": "Categorie",
18169
18263
  "record.metadata.type": "Dati geografici",
18170
18264
  "record.metadata.uniqueId": "Identificatore unico di risorsa",
18171
18265
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
18172
18266
  "record.metadata.updateStatus": "Stato di aggiornamento dei dati",
18173
- "record.metadata.updatedOn": "Ultimo aggiornamento del metadata",
18174
- "record.metadata.usage": "Condizioni d'uso",
18267
+ "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
18268
+ "record.metadata.usage": "Licenze e limiti di utilizzo",
18175
18269
  "record.more.details": "Dettagli",
18176
18270
  "record.tab.chart": "Grafico",
18177
18271
  "record.tab.data": "Tabella",
@@ -18201,6 +18295,7 @@ var it = {
18201
18295
  "search.filters.isSpatial": "Dati spaziali",
18202
18296
  "search.filters.isSpatial.no": "Non geolocalizzati",
18203
18297
  "search.filters.isSpatial.yes": "Geolocalizzati",
18298
+ "search.filters.keyword": "Parola chiave",
18204
18299
  "search.filters.license": "Licenza",
18205
18300
  "search.filters.license.cc-by": "cc-by",
18206
18301
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18474,12 +18569,12 @@ var nl = {
18474
18569
  "record.metadata.details": "",
18475
18570
  "record.metadata.download": "",
18476
18571
  "record.metadata.formats": "",
18477
- "record.metadata.isOpenData": "",
18478
18572
  "record.metadata.keywords": "",
18479
18573
  "record.metadata.lastUpdate": "",
18480
18574
  "record.metadata.links": "",
18481
18575
  "record.metadata.noUsage": "",
18482
18576
  "record.metadata.origin": "",
18577
+ "record.metadata.otherConstraints": "",
18483
18578
  "record.metadata.owner": "",
18484
18579
  "record.metadata.preview": "",
18485
18580
  "record.metadata.publications": "",
@@ -18504,8 +18599,8 @@ var nl = {
18504
18599
  "record.metadata.related": "",
18505
18600
  "record.metadata.sheet": "",
18506
18601
  "record.metadata.status": "",
18507
- "record.metadata.themes": "",
18508
18602
  "record.metadata.title": "",
18603
+ "record.metadata.topics": "",
18509
18604
  "record.metadata.type": "",
18510
18605
  "record.metadata.uniqueId": "",
18511
18606
  "record.metadata.updateFrequency": "",
@@ -18541,6 +18636,7 @@ var nl = {
18541
18636
  "search.filters.isSpatial": "",
18542
18637
  "search.filters.isSpatial.no": "",
18543
18638
  "search.filters.isSpatial.yes": "",
18639
+ "search.filters.keyword": "",
18544
18640
  "search.filters.license": "",
18545
18641
  "search.filters.license.cc-by": "",
18546
18642
  "search.filters.license.cc-by-sa": "",
@@ -18814,12 +18910,12 @@ var pt = {
18814
18910
  "record.metadata.details": "",
18815
18911
  "record.metadata.download": "",
18816
18912
  "record.metadata.formats": "",
18817
- "record.metadata.isOpenData": "",
18818
18913
  "record.metadata.keywords": "",
18819
18914
  "record.metadata.lastUpdate": "",
18820
18915
  "record.metadata.links": "",
18821
18916
  "record.metadata.noUsage": "",
18822
18917
  "record.metadata.origin": "",
18918
+ "record.metadata.otherConstraints": "",
18823
18919
  "record.metadata.owner": "",
18824
18920
  "record.metadata.preview": "",
18825
18921
  "record.metadata.publications": "",
@@ -18844,8 +18940,8 @@ var pt = {
18844
18940
  "record.metadata.related": "",
18845
18941
  "record.metadata.sheet": "",
18846
18942
  "record.metadata.status": "",
18847
- "record.metadata.themes": "",
18848
18943
  "record.metadata.title": "",
18944
+ "record.metadata.topics": "",
18849
18945
  "record.metadata.type": "",
18850
18946
  "record.metadata.uniqueId": "",
18851
18947
  "record.metadata.updateFrequency": "",
@@ -18881,6 +18977,7 @@ var pt = {
18881
18977
  "search.filters.isSpatial": "",
18882
18978
  "search.filters.isSpatial.no": "",
18883
18979
  "search.filters.isSpatial.yes": "",
18980
+ "search.filters.keyword": "",
18884
18981
  "search.filters.license": "",
18885
18982
  "search.filters.license.cc-by": "",
18886
18983
  "search.filters.license.cc-by-sa": "",
@@ -18989,8 +19086,8 @@ class Gn4FieldMapper {
18989
19086
  },
18990
19087
  cl_topic: (output, source) => ({
18991
19088
  ...output,
18992
- themes: [
18993
- ...(output.themes || []),
19089
+ topics: [
19090
+ ...(output.topics || []),
18994
19091
  ...getAsArray(selectField(source, 'cl_topic')).map((topic) => selectTranslatedValue(topic, this.lang3)),
18995
19092
  ],
18996
19093
  }),
@@ -19045,31 +19142,22 @@ class Gn4FieldMapper {
19045
19142
  catalogUuid: selectFallback(selectField(source, 'sourceCatalogue'), 'no title'),
19046
19143
  }, output);
19047
19144
  },
19048
- tag: (output, source) => ({
19145
+ allKeywords: (output, source) => ({
19049
19146
  ...output,
19050
- keywords: getAsArray(selectField(source, 'tag')).map((tag) => selectTranslatedValue(tag, this.lang3)),
19147
+ keywords: mapKeywords(selectField(source, 'allKeywords'), this.lang3),
19051
19148
  }),
19052
19149
  inspireTheme: (output, source) => ({
19053
19150
  ...output,
19054
- themes: [
19055
- ...(output.themes || []),
19151
+ topics: [
19152
+ ...(output.topics || []),
19056
19153
  ...getAsArray(selectField(source, 'inspireTheme_syn')),
19057
19154
  ],
19058
19155
  }),
19059
- MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_ConstraintsUseLimitationObject', output, source),
19060
- MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_LegalConstraintsUseLimitationObject', output, source),
19061
- MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('MD_LegalConstraintsOtherConstraintsObject', output, source),
19062
- MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('MD_SecurityConstraintsUseLimitationObject', output, source),
19063
- licenseObject: (output, source) => ({
19064
- ...output,
19065
- licenses: getAsArray(selectField(source, 'licenseObject')).map((license) => {
19066
- const link = getAsUrl(selectField(license, 'link'));
19067
- return {
19068
- text: selectTranslatedValue(license, this.lang3),
19069
- ...(link ? { link } : {}),
19070
- };
19071
- }),
19072
- }),
19156
+ MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('other', output, getAsArray(selectField(source, 'MD_ConstraintsUseLimitationObject'))),
19157
+ MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsUseLimitationObject'))),
19158
+ MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsOtherConstraintsObject'))),
19159
+ MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('security', output, getAsArray(selectField(source, 'MD_SecurityConstraintsUseLimitationObject'))),
19160
+ licenseObject: (output, source) => this.constraintField('license', output, getAsArray(selectField(source, 'licenseObject'))),
19073
19161
  lineageObject: (output, source) => ({
19074
19162
  ...output,
19075
19163
  lineage: selectTranslatedField(source, 'lineageObject', this.lang3),
@@ -19131,31 +19219,42 @@ class Gn4FieldMapper {
19131
19219
  },
19132
19220
  };
19133
19221
  this.genericField = (output) => output;
19134
- this.constraintField = (fieldName, output, source) => ({
19135
- ...output,
19136
- ...(fieldName.endsWith('UseLimitationObject')
19137
- ? {
19138
- legalConstraints: fieldName === 'MD_LegalConstraintsUseLimitationObject'
19139
- ? [
19140
- ...(output.legalConstraints || []),
19141
- ...selectField(source, fieldName).map((source) => selectTranslatedValue(source, this.lang3)),
19142
- ]
19143
- : output.legalConstraints || [],
19144
- useLimitations: [
19145
- ...(output.useLimitations || []),
19146
- ...selectField(source, fieldName).map((source) => selectTranslatedValue(source, this.lang3)),
19147
- ],
19148
- }
19149
- : {
19150
- accessConstraints: [
19151
- ...(output.accessConstraints || []),
19152
- ...selectField(source, fieldName).map((field) => ({
19153
- text: selectTranslatedValue(field, this.lang3),
19154
- type: this.getConstraintsType(fieldName),
19155
- })),
19156
- ],
19157
- }),
19158
- });
19222
+ this.constraintField = (type, output, constraintArray) => {
19223
+ let outputField;
19224
+ switch (type) {
19225
+ case 'license':
19226
+ outputField = 'licenses';
19227
+ break;
19228
+ case 'legal':
19229
+ outputField = 'legalConstraints';
19230
+ break;
19231
+ case 'security':
19232
+ outputField = 'securityConstraints';
19233
+ break;
19234
+ case 'other':
19235
+ outputField = 'otherConstraints';
19236
+ break;
19237
+ }
19238
+ const outputArray = outputField in output ? output[outputField] : [];
19239
+ outputArray.push(...constraintArray.map((item) => {
19240
+ const text = selectTranslatedValue(item, this.lang3);
19241
+ const url = getAsUrl(selectField(item, 'link'));
19242
+ return {
19243
+ text,
19244
+ ...(url ? { url } : {}),
19245
+ };
19246
+ }));
19247
+ const result = {
19248
+ ...output,
19249
+ [outputField]: outputArray,
19250
+ };
19251
+ // avoid legal constraints being duplicates of licenses
19252
+ if ('legalConstraints' in result &&
19253
+ (type === 'legal' || type === 'license')) {
19254
+ result.legalConstraints = result.legalConstraints.filter((constraint) => !output.licenses?.some((license) => license.text === constraint.text));
19255
+ }
19256
+ return result;
19257
+ };
19159
19258
  this.mapLink = (sourceLink) => {
19160
19259
  const url = getAsUrl(selectFallback(selectTranslatedField(sourceLink, 'urlObject', this.lang3), selectField(sourceLink, 'url')));
19161
19260
  const name = selectFallback(selectTranslatedField(sourceLink, 'nameObject', this.lang3), selectField(sourceLink, 'name'));
@@ -19203,17 +19302,6 @@ class Gn4FieldMapper {
19203
19302
  extras: { ...(output.extras || {}), ...value },
19204
19303
  });
19205
19304
  }
19206
- getConstraintsType(indexField) {
19207
- switch (indexField) {
19208
- case 'MD_LegalConstraintsUseLimitationObject':
19209
- return 'legal';
19210
- case 'MD_SecurityConstraintsUseLimitationObject':
19211
- return 'security';
19212
- case 'MD_ConstraintsUseLimitationObject':
19213
- default:
19214
- return 'other';
19215
- }
19216
- }
19217
19305
  getMappingFn(fieldName) {
19218
19306
  return fieldName in this.fields ? this.fields[fieldName] : this.genericField;
19219
19307
  }
@@ -19275,12 +19363,13 @@ class Gn4MetadataMapper extends MetadataBaseMapper {
19275
19363
  recordUpdated: null,
19276
19364
  ownerOrganization: null,
19277
19365
  licenses: [],
19366
+ legalConstraints: [],
19367
+ securityConstraints: [],
19368
+ otherConstraints: [],
19278
19369
  contacts: [],
19279
19370
  contactsForResource: [],
19280
- accessConstraints: [],
19281
19371
  keywords: [],
19282
- themes: [],
19283
- useLimitations: [],
19372
+ topics: [],
19284
19373
  spatialExtents: [],
19285
19374
  temporalExtents: [],
19286
19375
  overviews: [],
@@ -20048,11 +20137,18 @@ class OrganizationsFromMetadataService {
20048
20137
  if (!allContactOrgs.length)
20049
20138
  return of(record);
20050
20139
  const ownerOrganization = allContactOrgs[0];
20051
- return this.organisations$.pipe(takeLast(1), map$1((organisations) => {
20140
+ // read the owner group as well to have a fallback logo
20141
+ const groupId = selectField(source, 'groupOwner');
20142
+ const group$ = this.groups$.pipe(map$1((groups) => groups.find((group) => {
20143
+ return group.id === Number(groupId);
20144
+ })));
20145
+ return this.organisations$.pipe(takeLast(1), withLatestFrom(group$), map$1(([organisations, group]) => {
20052
20146
  const recordOrganisation = organisations.filter((org) => org.name === ownerOrganization.name)[0];
20147
+ const logoUrl = group?.logo && getAsUrl(`${IMAGE_URL$1}${group.logo}`);
20053
20148
  return {
20054
20149
  ...record,
20055
20150
  ownerOrganization: {
20151
+ logoUrl,
20056
20152
  ...ownerOrganization,
20057
20153
  ...recordOrganisation,
20058
20154
  },
@@ -20363,12 +20459,21 @@ class Gn4PlatformMapper {
20363
20459
  const { enabled, emailAddresses, organisation, kind, lastLoginDate, accountNonExpired, accountNonLocked, id, credentialsNonExpired, ...user } = apiUser;
20364
20460
  return { ...apiUser, id: id.toString() };
20365
20461
  }
20366
- thesaurusFromApi(thesaurus) {
20462
+ thesaurusFromApi(thesaurus, lang3) {
20367
20463
  return thesaurus.map((keyword) => {
20368
- const { uri, value } = keyword;
20464
+ let key = keyword.uri;
20465
+ // sometines GN can prefix an URI with an "all thesaurus" URI; only keep the last one
20466
+ if (key.indexOf('@@@') > -1) {
20467
+ key = key.split('@@@')[1];
20468
+ }
20469
+ const label = lang3 && lang3 in keyword.values ? keyword.values[lang3] : keyword.value;
20470
+ const description = lang3 && lang3 in keyword.definitions
20471
+ ? keyword.definitions[lang3]
20472
+ : keyword.definition;
20369
20473
  return {
20370
- key: uri,
20371
- label: value,
20474
+ key,
20475
+ label,
20476
+ description,
20372
20477
  };
20373
20478
  });
20374
20479
  }
@@ -20381,13 +20486,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
20381
20486
 
20382
20487
  const minApiVersion = '4.2.2';
20383
20488
  class Gn4PlatformService {
20384
- constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService) {
20489
+ constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService) {
20385
20490
  this.siteApiService = siteApiService;
20386
20491
  this.meApi = meApi;
20387
20492
  this.usersApi = usersApi;
20388
20493
  this.mapper = mapper;
20389
20494
  this.toolsApiService = toolsApiService;
20390
20495
  this.registriesApiService = registriesApiService;
20496
+ this.langService = langService;
20391
20497
  this.type = 'GeoNetwork';
20392
20498
  this.keyTranslations$ = this.toolsApiService
20393
20499
  .getTranslationsPackage1('gnui')
@@ -20401,6 +20507,11 @@ class Gn4PlatformService {
20401
20507
  throw new Error(`Gn4 API version is not compatible.\nMinimum: ${minApiVersion}\nYour version: ${version}`);
20402
20508
  }
20403
20509
  }), shareReplay(1));
20510
+ /**
20511
+ * A map of already loaded thesauri (groups of keywords); the key is a URI
20512
+ * @private
20513
+ */
20514
+ this.thesauri = {};
20404
20515
  this.me$ = this.meApi.getMe().pipe(switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)), shareReplay({ bufferSize: 1, refCount: true }));
20405
20516
  this.isAnonymous$ = this.me$.pipe(map$1((user) => !user || !('id' in user)));
20406
20517
  this.users$ = this.usersApi.getUsers().pipe(map$1((users) => users.map((user) => this.mapper.userFromApi(user))), shareReplay());
@@ -20427,19 +20538,36 @@ class Gn4PlatformService {
20427
20538
  return this.users$;
20428
20539
  }
20429
20540
  translateKey(key) {
20541
+ // if the key is a URI, use the registries API to look for the translation
20542
+ if (key.match(/^https?:\/\//)) {
20543
+ // the thesaurus URI is inferred by removing a part of the keyword URI
20544
+ // this is not exact science but it's OK, we'll still end up loading a bunch of keywords at once anyway
20545
+ const thesaurusUri = key.replace(/\/([^/]+)$/, '/');
20546
+ return this.getThesaurusByUri(thesaurusUri).pipe(map$1((thesaurus) => {
20547
+ for (const item of thesaurus) {
20548
+ if (item.key === key)
20549
+ return item.label;
20550
+ }
20551
+ return key;
20552
+ }));
20553
+ }
20430
20554
  return this.keyTranslations$.pipe(map$1((translations) => translations[key]));
20431
20555
  }
20432
- getThesaurusByLang(thesaurusName, lang) {
20433
- return this.registriesApiService
20434
- .searchKeywords(null, lang, 1000, 0, null, [thesaurusName])
20435
- .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus)));
20556
+ getThesaurusByUri(uri) {
20557
+ if (this.thesauri[uri]) {
20558
+ return this.thesauri[uri];
20559
+ }
20560
+ this.thesauri[uri] = this.registriesApiService
20561
+ .searchKeywords(null, this.langService.iso3, 1000, 0, null, null, null, `${uri}*`)
20562
+ .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus, this.langService.iso3)), shareReplay(1));
20563
+ return this.thesauri[uri];
20436
20564
  }
20437
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, deps: [{ token: SiteApiService }, { token: MeApiService }, { token: UsersApiService }, { token: Gn4PlatformMapper }, { token: ToolsApiService }, { token: RegistriesApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20565
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, deps: [{ token: SiteApiService }, { token: MeApiService }, { token: UsersApiService }, { token: Gn4PlatformMapper }, { token: ToolsApiService }, { token: RegistriesApiService }, { token: LangService }], target: i0.ɵɵFactoryTarget.Injectable }); }
20438
20566
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService }); }
20439
20567
  }
20440
20568
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, decorators: [{
20441
20569
  type: Injectable
20442
- }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }]; } });
20570
+ }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }]; } });
20443
20571
 
20444
20572
  function provideGn4() {
20445
20573
  return [
@@ -22517,6 +22645,9 @@ class MapContextService {
22517
22645
  if (mapConfig) {
22518
22646
  mapContext = this.mergeMapConfigWithContext(mapContext, mapConfig);
22519
22647
  }
22648
+ else {
22649
+ mapContext.layers = this.addDefaultBaselayerContext(mapContext.layers);
22650
+ }
22520
22651
  if (!mapContext.view?.extent &&
22521
22652
  (!mapContext.view?.center || !mapContext.view?.zoom)) {
22522
22653
  mapContext.view = this.getFallbackView(mapConfig);
@@ -22627,6 +22758,11 @@ class MapContextService {
22627
22758
  }
22628
22759
  return view;
22629
22760
  }
22761
+ addDefaultBaselayerContext(layers) {
22762
+ return layers.includes(DEFAULT_BASELAYER_CONTEXT)
22763
+ ? layers
22764
+ : [DEFAULT_BASELAYER_CONTEXT, ...layers];
22765
+ }
22630
22766
  mergeMapConfigWithContext(mapContext, mapConfig) {
22631
22767
  return {
22632
22768
  ...mapContext,
@@ -23305,8 +23441,7 @@ class MetadataQualityComponent {
23305
23441
  : this.calculatedQualityScore;
23306
23442
  }
23307
23443
  get calculatedQualityScore() {
23308
- return Math.round((this.items.filter(({ value }) => value === true).length * 100) /
23309
- this.items.length);
23444
+ return Math.round((this.items.filter(({ value }) => value).length * 100) / this.items.length);
23310
23445
  }
23311
23446
  showMenu() {
23312
23447
  this.isMenuShown = true;
@@ -23324,7 +23459,7 @@ class MetadataQualityComponent {
23324
23459
  this.items = [];
23325
23460
  this.add('title', !!this.metadata?.title);
23326
23461
  this.add('description', !!this.metadata?.abstract);
23327
- this.add('topic', this.metadata?.themes?.length > 0);
23462
+ this.add('topic', this.metadata?.topics?.length > 0);
23328
23463
  this.add('keywords', this.metadata?.keywords?.length > 0);
23329
23464
  this.add('legalConstraints', this.metadata?.legalConstraints?.length > 0);
23330
23465
  this.add('organisation', !!contact?.organization);
@@ -23772,6 +23907,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23772
23907
  type: Input
23773
23908
  }] } });
23774
23909
 
23910
+ class MarkdownParserComponent {
23911
+ get parsedMarkdown() {
23912
+ return marked.parse(this.textContent);
23913
+ }
23914
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23915
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownParserComponent, isStandalone: true, selector: "gn-ui-markdown-parser", inputs: { textContent: "textContent" }, ngImport: i0, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23916
+ }
23917
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
23918
+ type: Component,
23919
+ args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important;@apply underline;}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"] }]
23920
+ }], propDecorators: { textContent: [{
23921
+ type: Input
23922
+ }] } });
23923
+
23775
23924
  class ContentGhostComponent {
23776
23925
  constructor() {
23777
23926
  this.ghostClass = '';
@@ -23926,36 +24075,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
23926
24075
  args: ['container']
23927
24076
  }] } });
23928
24077
 
23929
- class MarkdownParserComponent {
23930
- get parsedMarkdown() {
23931
- return marked.parse(this.textContent);
23932
- }
23933
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23934
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: { textContent: "textContent" }, ngImport: i0, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none!important;@apply font-bold;}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23935
- }
23936
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
23937
- type: Component,
23938
- args: [{ selector: 'gn-ui-markdown-parser', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"markdown-body\" [innerHTML]=\"parsedMarkdown\"></div>\n", styles: [":host ::ng-deep .markdown-body{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;margin:0px 0px 1.5rem;line-height:1.5;word-wrap:break-word}:host ::ng-deep .markdown-body strong{@apply font-bold;color:var(--color-secondary-darker)}:host ::ng-deep .markdown-body h1,:host ::ng-deep .markdown-body h2,:host ::ng-deep .markdown-body h3,:host ::ng-deep .markdown-body h4,:host ::ng-deep .markdown-body h5,:host ::ng-deep .markdown-body h6{margin-top:24px;margin-bottom:16px;line-height:1.25;@apply text-title font-title font-bold;}:host ::ng-deep .markdown-body h1{margin:.67em 0;padding-bottom:.3em;font-size:2em;color:var(--color-primary)}:host ::ng-deep .markdown-body h2{padding-bottom:.3em;font-size:1.5em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h3{font-size:1.25em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h4{font-size:1em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h5{font-size:.875em;color:var(--color-secondary)}:host ::ng-deep .markdown-body h6{font-size:.85em;color:var(--color-secondary-lighter)}:host ::ng-deep .markdown-body p{margin-top:0;margin-bottom:10px}:host ::ng-deep .markdown-body p>a{margin-top:0;margin-bottom:10px;color:var(--color-primary)!important;text-decoration:none!important;@apply font-bold;}:host ::ng-deep .markdown-body p>a:hover{color:var(--color-primary-darker)!important}:host ::ng-deep .markdown-body blockquote{margin:0;padding:0 1em;color:var(--color-secondary-lighter);border-left:.25em solid var(--color-primary-lighter)}:host ::ng-deep .markdown-body pre{margin-top:0;margin-bottom:0;font-size:12px;background-color:var(--color-gray-100);word-wrap:normal}:host ::ng-deep .markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;color:var(--color-secondary);border-radius:6px}:host ::ng-deep .markdown-body code{padding:.2em .4em;margin:0;font-size:85%;white-space:break-spaces;border-radius:6px}:host ::ng-deep .markdown-body pre code{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;border:0}:host ::ng-deep .markdown-body hr{box-sizing:content-box;overflow:hidden;background:transparent;border-bottom:1px solid var(--color-secondary);height:.15em;padding:0;margin:24px 0;background-color:var(--color-secondary);border:0}:host ::ng-deep .markdown-body hr:before{display:table;content:\"\"}:host ::ng-deep .markdown-body hr:after{display:table;clear:both;content:\"\"}:host ::ng-deep .markdown-body ul,:host ::ng-deep .markdown-body ol{margin-top:0;margin-bottom:0;padding-left:2em;list-style:revert}:host ::ng-deep .markdown-body ol ol,:host ::ng-deep .markdown-body ul ol{list-style-type:lower-roman}:host ::ng-deep .markdown-body ul ul ol,:host ::ng-deep .markdown-body ul ol ol,:host ::ng-deep .markdown-body ol ul ol,:host ::ng-deep .markdown-body ol ol ol{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"a s\"]{list-style-type:lower-alpha}:host ::ng-deep .markdown-body ol[type=\"A s\"]{list-style-type:upper-alpha}:host ::ng-deep .markdown-body ol[type=\"i s\"]{list-style-type:lower-roman}:host ::ng-deep .markdown-body ol[type=\"I s\"]{list-style-type:upper-roman}:host ::ng-deep .markdown-body ol[type=\"1\"]{list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body div>ol:not([type]){list-style:unset;list-style-type:decimal}:host ::ng-deep .markdown-body table{border-spacing:0;border-collapse:collapse;display:block;width:max-content;max-width:100%;overflow:auto;padding-bottom:15px}:host ::ng-deep .markdown-body td,:host ::ng-deep .markdown-body th{padding:0}:host ::ng-deep .markdown-body th{color:var(--color-secondary)}:host ::ng-deep .markdown-body table th,:host ::ng-deep .markdown-body table td{padding:6px 13px;border:1px solid var(--color-gray-500)}:host ::ng-deep .markdown-body table td>:last-child{margin-bottom:0}:host ::ng-deep .markdown-body table tr{background-color:#fff;border-top:1px solid var(--color-secondary-lighter)}:host ::ng-deep .markdown-body table tr:nth-child(2n){background-color:var(--color-gray-100)}:host ::ng-deep .markdown-body table img{background-color:transparent}:host ::ng-deep .markdown-body img{border-style:none;max-width:100%;box-sizing:content-box;background-color:transparent}:host ::ng-deep .markdown-body img[align=right]{padding-left:20px}:host ::ng-deep .markdown-body img[align=left]{padding-right:20px}\n"] }]
23939
- }], propDecorators: { textContent: [{
23940
- type: Input
23941
- }] } });
23942
-
23943
24078
  class MetadataInfoComponent {
23944
24079
  constructor() {
23945
24080
  this.keyword = new EventEmitter();
23946
24081
  }
23947
24082
  get hasUsage() {
23948
24083
  return (this.metadata.extras?.isOpenData === true ||
23949
- this.metadata.useLimitations?.length ||
23950
- this.metadata.accessConstraints?.length);
24084
+ (this.metadata.legalConstraints?.length > 0 &&
24085
+ this.legalConstraints.length > 0) ||
24086
+ (this.metadata.otherConstraints?.length > 0 &&
24087
+ this.otherConstraints.length > 0) ||
24088
+ (this.metadata.licenses?.length > 0 && this.licenses.length > 0));
24089
+ }
24090
+ get legalConstraints() {
24091
+ let array = [];
24092
+ if (this.metadata.legalConstraints?.length) {
24093
+ array = array.concat(this.metadata.legalConstraints.filter((c) => c.text).map((c) => c.text));
24094
+ }
24095
+ return array;
23951
24096
  }
23952
- get usages() {
24097
+ get otherConstraints() {
23953
24098
  let array = [];
23954
- if (this.metadata.useLimitations?.length) {
23955
- array = array.concat(this.metadata.useLimitations);
24099
+ if (this.metadata.otherConstraints?.length) {
24100
+ array = array.concat(this.metadata.otherConstraints.filter((c) => c.text).map((c) => c.text));
23956
24101
  }
23957
- if (this.metadata.accessConstraints?.length) {
23958
- array = array.concat(this.metadata.accessConstraints.map((c) => c.text));
24102
+ return array;
24103
+ }
24104
+ get licenses() {
24105
+ let array = [];
24106
+ if (this.metadata.licenses?.length) {
24107
+ array = array.concat(this.metadata.licenses
24108
+ .filter((c) => c.text)
24109
+ .map((c) => ({ text: c.text, url: c.url })));
23959
24110
  }
23960
24111
  return array;
23961
24112
  }
@@ -23977,16 +24128,12 @@ class MetadataInfoComponent {
23977
24128
  onKeywordClick(keyword) {
23978
24129
  this.keyword.emit(keyword);
23979
24130
  }
23980
- copyText() {
23981
- navigator.clipboard.writeText(this.metadata.uniqueIdentifier);
23982
- event.target.blur();
23983
- }
23984
24131
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
23985
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"py-4 px-6 rounded bg-gray-100 text-gray-700 flex flex-wrap gap-2\">\n <gn-ui-badge *ngIf=\"metadata.extras?.isOpenData\">\n <span translate>record.metadata.isOpenData</span>\n </gn-ui-badge>\n <span\n class=\"text-primary font-medium\"\n *ngFor=\"let usage of usages\"\n gnUiLinkify\n >\n {{ usage }}\n </span>\n <span class=\"text-primary font-medium noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.themes?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.themes</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let theme of metadata.themes\"\n >{{ theme }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24132
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: MetadataInfoComponent, selector: "gn-ui-metadata-info", inputs: { metadata: "metadata", incomplete: "incomplete" }, outputs: { keyword: "keyword" }, ngImport: i0, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words text-gray-900\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"], dependencies: [{ kind: "directive", type: i1$3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable"] }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "collapsed"] }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent"] }, { kind: "component", type: ContentGhostComponent, selector: "gn-ui-content-ghost", inputs: ["showContent", "ghostClass"] }, { kind: "directive", type: GnUiLinkifyDirective, selector: "[gnUiLinkify]" }, { kind: "component", type: MaxLinesComponent, selector: "gn-ui-max-lines", inputs: ["maxLines"] }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
23986
24133
  }
23987
24134
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, decorators: [{
23988
24135
  type: Component,
23989
- args: [{ selector: 'gn-ui-metadata-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"py-4 px-6 rounded bg-gray-100 text-gray-700 flex flex-wrap gap-2\">\n <gn-ui-badge *ngIf=\"metadata.extras?.isOpenData\">\n <span translate>record.metadata.isOpenData</span>\n </gn-ui-badge>\n <span\n class=\"text-primary font-medium\"\n *ngFor=\"let usage of usages\"\n gnUiLinkify\n >\n {{ usage }}\n </span>\n <span class=\"text-primary font-medium noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.themes?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.themes</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let theme of metadata.themes\"\n >{{ theme }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"] }]
24136
+ args: [{ selector: 'gn-ui-metadata-info', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"mb-6 md-description sm:mb-4 sm:pr-16\">\n <gn-ui-content-ghost ghostClass=\"h-32\" [showContent]=\"fieldReady('abstract')\">\n <gn-ui-max-lines [maxLines]=\"6\" *ngIf=\"metadata.abstract\">\n <div>\n <gn-ui-markdown-parser\n [textContent]=\"metadata.abstract\"\n ></gn-ui-markdown-parser>\n </div>\n </gn-ui-max-lines>\n </gn-ui-content-ghost>\n</div>\n\n<gn-ui-expandable-panel [title]=\"'record.metadata.usage' | translate\">\n <div class=\"flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900\">\n <ng-container *ngFor=\"let license of licenses\">\n <div *ngIf=\"license.url; else noUrl\" class=\"text-primary\">\n <a\n [href]=\"license.url\"\n target=\"_blank\"\n class=\"cursor-pointer hover:underline transition-all\"\n >\n {{ license.text }}\n <mat-icon\n class=\"material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0\"\n >open_in_new</mat-icon\n >\n </a>\n </div>\n <ng-template #noUrl>\n <div class=\"text-primary\" gnUiLinkify>\n {{ license.text }}\n </div>\n </ng-template>\n </ng-container>\n <ng-container *ngIf=\"legalConstraints.length\">\n <gn-ui-markdown-parser\n *ngFor=\"let constraint of legalConstraints\"\n [textContent]=\"constraint\"\n >\n </gn-ui-markdown-parser>\n </ng-container>\n <ng-container *ngIf=\"otherConstraints.length\">\n <div gnUiLinkify *ngFor=\"let constraint of otherConstraints\">\n <h5 translate class=\"font-medium text-black text-sm mb-[2px] mt-[16px]\">\n record.metadata.otherConstraints\n </h5>\n <gn-ui-markdown-parser [textContent]=\"constraint\">\n </gn-ui-markdown-parser>\n </div>\n </ng-container>\n\n <span class=\"noUsage\" *ngIf=\"!hasUsage\">\n {{ 'record.metadata.noUsage' | translate }}\n </span>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n class=\"metadata-origin\"\n *ngIf=\"\n metadata.lineage ||\n metadata.recordUpdated ||\n metadata.updateFrequency ||\n metadata.status\n \"\n [title]=\"'record.metadata.origin' | translate\"\n>\n <p\n *ngIf=\"metadata.lineage\"\n class=\"mb-5 pt-4 whitespace-pre-line break-words text-gray-900\"\n gnUiLinkify\n >\n {{ metadata.lineage }}\n </p>\n <div\n class=\"py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid\"\n >\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium mt-1\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"updateFrequency\">\n <p class=\"text-sm\" translate>record.metadata.updateFrequency</p>\n <p\n class=\"text-primary font-medium mt-1 updateFrequency\"\n translate\n [translateParams]=\"{ count: updatedTimes }\"\n >\n {{ updateFrequency }}\n </p>\n </div>\n <div *ngIf=\"metadata.status\">\n <p class=\"text-sm\" translate>record.metadata.updateStatus</p>\n <p class=\"text-primary font-medium mt-1\" translate>\n domain.record.status.{{ metadata.status }}\n </p>\n </div>\n </div>\n</gn-ui-expandable-panel>\n<gn-ui-expandable-panel\n *ngIf=\"metadata.landingPage\"\n [title]=\"'record.metadata.details' | translate\"\n>\n <div class=\"flex flex-col gap-4 mr-4 py-5 rounded text-gray-700\">\n <div *ngIf=\"metadata.recordUpdated\">\n <p class=\"text-sm\" translate>record.metadata.updatedOn</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}\n </p>\n </div>\n <div *ngIf=\"metadata.landingPage\">\n <p class=\"text-sm\" translate>record.metadata.sheet</p>\n <p class=\"text-primary font-medium\" translate>\n <a [href]=\"metadata.landingPage\" target=\"_blank\">\n <span class=\"break-all\" gnUiLinkify>{{ metadata.landingPage }}</span>\n </a>\n </p>\n </div>\n <div *ngIf=\"metadata.ownerOrganization\">\n <p class=\"text-sm\" translate>record.metadata.owner</p>\n <p class=\"text-primary font-medium\">\n {{ metadata.ownerOrganization.name }}\n </p>\n </div>\n <div *ngIf=\"metadata.uniqueIdentifier\">\n <p class=\"text-sm\" translate>record.metadata.uniqueId</p>\n <div class=\"flex flex-row content-align items-end gap-1\">\n <gn-ui-copy-text-button\n [text]=\"metadata.uniqueIdentifier\"\n [tooltipText]=\"'tooltip.id.copy' | translate\"\n [displayText]=\"false\"\n ></gn-ui-copy-text-button>\n <p class=\"text-primary font-medium\">\n {{ metadata.uniqueIdentifier }}\n </p>\n </div>\n </div>\n <div *ngIf=\"metadata.topics?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.topics</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 lowercase\"\n *ngFor=\"let topic of metadata.topics\"\n >{{ topic }}</gn-ui-badge\n >\n </div>\n </div>\n <div *ngIf=\"metadata.keywords?.length\">\n <p class=\"text-sm mb-1\" translate>record.metadata.keywords</p>\n <div class=\"sm:pb-4 sm:pr-16\">\n <gn-ui-badge\n class=\"inline-block mr-2 mb-2 lowercase\"\n (click)=\"onKeywordClick(keyword)\"\n [clickable]=\"true\"\n *ngFor=\"let keyword of metadata.keywords\"\n >{{ keyword.label }}</gn-ui-badge\n >\n </div>\n </div>\n </div>\n</gn-ui-expandable-panel>\n", styles: [".md-description ::ng-deep a{@apply underline text-blue-600 hover:text-blue-800;}.info-grid>:nth-last-child(n+3){padding-bottom:10px;@apply border-b border-gray-300;}:host ::ng-deep gn-ui-copy-text-button button mat-icon{transform:scale(.8)}\n"] }]
23990
24137
  }], propDecorators: { metadata: [{
23991
24138
  type: Input
23992
24139
  }], incomplete: [{
@@ -24055,11 +24202,11 @@ class ButtonComponent {
24055
24202
  propagateToDocumentOnly(event);
24056
24203
  }
24057
24204
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
24058
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ButtonComponent, selector: "gn-ui-button", inputs: { type: "type", disabled: "disabled", extraClass: "extraClass" }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24205
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: ButtonComponent, isStandalone: true, selector: "gn-ui-button", inputs: { type: "type", disabled: "disabled", extraClass: "extraClass" }, outputs: { buttonClick: "buttonClick" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
24059
24206
  }
24060
24207
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: ButtonComponent, decorators: [{
24061
24208
  type: Component,
24062
- args: [{ selector: 'gn-ui-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"] }]
24209
+ args: [{ selector: 'gn-ui-button', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, template: "<button\n type=\"button\"\n class=\"flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none\"\n [class]=\"classList\"\n [disabled]=\"disabled\"\n (click)=\"handleClick($event)\"\n>\n <ng-content></ng-content>\n</button>\n", styles: [":host ::ng-deep mat-icon.mat-icon{margin-top:-.325em;margin-bottom:-.325em}\n"] }]
24063
24210
  }], propDecorators: { type: [{
24064
24211
  type: Input
24065
24212
  }], disabled: [{
@@ -25061,11 +25208,11 @@ class TextAreaComponent {
25061
25208
  this.rawChange.next(value);
25062
25209
  }
25063
25210
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25064
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextAreaComponent, selector: "gn-ui-text-area", inputs: { value: "value", placeholder: "placeholder", required: "required" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
25211
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: TextAreaComponent, isStandalone: true, selector: "gn-ui-text-area", inputs: { value: "value", placeholder: "placeholder", required: "required" }, outputs: { valueChange: "valueChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }); }
25065
25212
  }
25066
25213
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: TextAreaComponent, decorators: [{
25067
25214
  type: Component,
25068
- args: [{ selector: 'gn-ui-text-area', template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
25215
+ args: [{ selector: 'gn-ui-text-area', standalone: true, template: "<div class=\"h-full flex\">\n <textarea\n #input\n name=\"textArea\"\n [placeholder]=\"placeholder\"\n [value]=\"value\"\n (change)=\"handleChange($event)\"\n (input)=\"handleChange($event)\"\n class=\"w-full pt-2 pl-2 resize-none border border-gray-800 rounded italic leading-tight focus:outline-none focus:bg-background focus:border-primary\"\n [attr.required]=\"required || null\"\n ></textarea>\n</div>\n", styles: [".invalid{border-color:var(--color-secondary)}\n"] }]
25069
25216
  }], propDecorators: { value: [{
25070
25217
  type: Input
25071
25218
  }], placeholder: [{
@@ -25335,11 +25482,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25335
25482
 
25336
25483
  class NavigationButtonComponent {
25337
25484
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25338
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NavigationButtonComponent, selector: "gn-ui-navigation-button", inputs: { label: "label", icon: "icon" }, ngImport: i0, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 text-white rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: [""], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25485
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NavigationButtonComponent, selector: "gn-ui-navigation-button", inputs: { label: "label", icon: "icon" }, ngImport: i0, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: ["button{color:var(--navigation-button-color, --color-background)}\n"], dependencies: [{ kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25339
25486
  }
25340
25487
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NavigationButtonComponent, decorators: [{
25341
25488
  type: Component,
25342
- args: [{ selector: 'gn-ui-navigation-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 text-white rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n" }]
25489
+ args: [{ selector: 'gn-ui-navigation-button', changeDetection: ChangeDetectionStrategy.OnPush, template: "<button\n class=\"group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center\"\n>\n <mat-icon class=\"material-symbols-outlined align-middle w-[18px]\">{{\n icon\n }}</mat-icon>\n <span\n class=\"mx-2 mt-0.5 text-[16px] tracking-widest content-center opacity-75\"\n >{{ label.toUpperCase() }}</span\n >\n</button>\n", styles: ["button{color:var(--navigation-button-color, --color-background)}\n"] }]
25343
25490
  }], propDecorators: { label: [{
25344
25491
  type: Input
25345
25492
  }], icon: [{
@@ -25653,10 +25800,8 @@ class UiInputsModule {
25653
25800
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
25654
25801
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.1.7", ngImport: i0, type: UiInputsModule, declarations: [DropdownSelectorComponent,
25655
25802
  AutocompleteComponent,
25656
- ButtonComponent,
25657
25803
  TextInputComponent,
25658
25804
  DragAndDropFileInputComponent,
25659
- TextAreaComponent,
25660
25805
  ChipsInputComponent,
25661
25806
  NavigationButtonComponent,
25662
25807
  StarToggleComponent,
@@ -25689,7 +25834,9 @@ class UiInputsModule {
25689
25834
  MatInputModule,
25690
25835
  MatDatepickerModule,
25691
25836
  MatNativeDateModule,
25692
- EditableLabelDirective], exports: [DropdownSelectorComponent,
25837
+ EditableLabelDirective,
25838
+ TextAreaComponent,
25839
+ ButtonComponent], exports: [DropdownSelectorComponent,
25693
25840
  AutocompleteComponent,
25694
25841
  ButtonComponent,
25695
25842
  TextInputComponent,
@@ -25731,10 +25878,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25731
25878
  declarations: [
25732
25879
  DropdownSelectorComponent,
25733
25880
  AutocompleteComponent,
25734
- ButtonComponent,
25735
25881
  TextInputComponent,
25736
25882
  DragAndDropFileInputComponent,
25737
- TextAreaComponent,
25738
25883
  ChipsInputComponent,
25739
25884
  NavigationButtonComponent,
25740
25885
  StarToggleComponent,
@@ -25773,6 +25918,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25773
25918
  MatDatepickerModule,
25774
25919
  MatNativeDateModule,
25775
25920
  EditableLabelDirective,
25921
+ TextAreaComponent,
25922
+ ButtonComponent,
25776
25923
  ],
25777
25924
  exports: [
25778
25925
  DropdownSelectorComponent,
@@ -25921,6 +26068,8 @@ class RecordApiFormComponent {
25921
26068
  }
25922
26069
  return outputUrl;
25923
26070
  }));
26071
+ this.noLimitChecked$ = this.limit$.pipe(map$2((limit) => limit === '-1' || limit === ''));
26072
+ this.displayLimit$ = this.limit$.pipe(map$2((limit) => (limit !== '-1' ? limit : '')));
25924
26073
  }
25925
26074
  set apiLink(value) {
25926
26075
  this.apiBaseUrl = value ? value.url.href : undefined;
@@ -25930,10 +26079,11 @@ class RecordApiFormComponent {
25930
26079
  this.offset$.next(value);
25931
26080
  }
25932
26081
  setLimit(value) {
25933
- this.limit$.next(value);
26082
+ const newLimit = value === '' ? '-1' : value;
26083
+ this.limit$.next(newLimit);
25934
26084
  }
25935
26085
  setFormat(value) {
25936
- this.format$.next(value);
26086
+ this.format$.next(String(value));
25937
26087
  }
25938
26088
  resetUrl() {
25939
26089
  this.offset$.next(DEFAULT_PARAMS.OFFSET);
@@ -25941,11 +26091,11 @@ class RecordApiFormComponent {
25941
26091
  this.format$.next(DEFAULT_PARAMS.FORMAT);
25942
26092
  }
25943
26093
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25944
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (input)=\"setLimit($event.target.value)\"\n [value]=\"(limit$ | async) !== '-1' ? (limit$ | async) : ''\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"(limit$ | async) === '-1'\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (input)=\"setOffset($event.target.value)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], outputs: ["valueChange"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26094
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: RecordApiFormComponent, selector: "gn-ui-record-api-form", inputs: { apiLink: "apiLink" }, ngImport: i0, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"], dependencies: [{ kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }, { kind: "component", type: TextInputComponent, selector: "gn-ui-text-input", inputs: ["value", "hint", "required"], outputs: ["valueChange"] }, { kind: "component", type: CopyTextButtonComponent, selector: "gn-ui-copy-text-button", inputs: ["text", "tooltipText", "displayText", "rows"] }, { kind: "pipe", type: i1$3.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25945
26095
  }
25946
26096
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
25947
26097
  type: Component,
25948
- args: [{ selector: 'gn-ui-record-api-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (input)=\"setLimit($event.target.value)\"\n [value]=\"(limit$ | async) !== '-1' ? (limit$ | async) : ''\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"(limit$ | async) === '-1'\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (input)=\"setOffset($event.target.value)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"] }]
26098
+ args: [{ selector: 'gn-ui-record-api-form', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col gap-8\">\n <div class=\"flex flex-col bg-white p-8 ng-star-inserted shadow-xl gap-8\">\n <div class=\"flex flex-row\">\n <div class=\"text-[16px] text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.create\n </div>\n <button\n (click)=\"resetUrl()\"\n class=\"bg-primary-opacity-50 inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded capitalize text-primary-lightest hover:bg-primary transition-colors\"\n >\n <p class=\"text-[13px] uppercase\" translate>\n record.metadata.api.form.reset\n </p>\n </button>\n </div>\n <div class=\"flex flex-row flex-wrap justify-between flex-grow gap-5\">\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-[14px]\" translate>record.metadata.api.form.limit</p>\n <div class=\"flex flex-row items-center gap-2\">\n <gn-ui-text-input\n class=\"mr-2 w-20\"\n (valueChange)=\"setLimit($event)\"\n [value]=\"displayLimit$ | async\"\n hint=\"\"\n >\n </gn-ui-text-input>\n <div class=\"flex items-center\">\n <input\n class=\"mr-2 cursor-pointer\"\n type=\"checkbox\"\n [checked]=\"noLimitChecked$ | async\"\n (change)=\"setLimit('-1')\"\n />\n <span class=\"text-sm\" translate\n >record.metadata.api.form.limit.all</span\n >\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.offset</p>\n <gn-ui-text-input\n class=\"w-20\"\n [value]=\"offset$ | async\"\n (valueChange)=\"setOffset($event)\"\n hint=\"\"\n >\n </gn-ui-text-input>\n </div>\n <div class=\"flex flex-col gap-3\">\n <p class=\"text-sm\" translate>record.metadata.api.form.type</p>\n <gn-ui-dropdown-selector\n #dropdown\n [title]=\"''\"\n extraBtnClass=\"secondary min-w-full !w-40 !text-black\"\n [showTitle]=\"false\"\n class=\"text-black\"\n [choices]=\"formatsList\"\n (selectValue)=\"setFormat($event)\"\n [selected]=\"format$ | async\"\n ></gn-ui-dropdown-selector>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3 mb-3\">\n <div class=\"text-sm text-black truncate font-title w-11/12\" translate>\n record.metadata.api.form.customUrl\n </div>\n <div class=\"bg-white rounded-lg\">\n <gn-ui-copy-text-button\n [text]=\"apiQueryUrl$ | async\"\n ></gn-ui-copy-text-button>\n </div>\n </div>\n</div>\n", styles: [":host ::ng-deep input{color:#000;opacity:1}:host ::ng-deep gn-ui-copy-text-button input[type=text]{color:#000;background-color:#fff}:host ::ng-deep gn-ui-copy-text-button button,host ::ng-deep gn-ui-copy-text-button button:hover{background-color:var(--color-secondary)!important}:host ::ng-deep gn-ui-copy-text-button button mat-icon{color:#fff!important;opacity:1!important}:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon{color:#d3d3d3!important}\n"] }]
25949
26099
  }], propDecorators: { apiLink: [{
25950
26100
  type: Input
25951
26101
  }] } });
@@ -25991,7 +26141,6 @@ class UiElementsModule {
25991
26141
  PaginationButtonsComponent,
25992
26142
  MaxLinesComponent,
25993
26143
  RecordApiFormComponent,
25994
- MarkdownParserComponent,
25995
26144
  ImageOverlayPreviewComponent], imports: [CommonModule,
25996
26145
  MatIconModule,
25997
26146
  MatTooltipModule,
@@ -26000,7 +26149,8 @@ class UiElementsModule {
26000
26149
  RouterModule,
26001
26150
  UiInputsModule,
26002
26151
  FormsModule,
26003
- NgOptimizedImage], exports: [MetadataInfoComponent,
26152
+ NgOptimizedImage,
26153
+ MarkdownParserComponent], exports: [MetadataInfoComponent,
26004
26154
  ContentGhostComponent,
26005
26155
  DownloadItemComponent,
26006
26156
  DownloadsListComponent,
@@ -26047,6 +26197,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26047
26197
  UiInputsModule,
26048
26198
  FormsModule,
26049
26199
  NgOptimizedImage,
26200
+ MarkdownParserComponent,
26050
26201
  ],
26051
26202
  declarations: [
26052
26203
  MetadataInfoComponent,
@@ -26069,7 +26220,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
26069
26220
  PaginationButtonsComponent,
26070
26221
  MaxLinesComponent,
26071
26222
  RecordApiFormComponent,
26072
- MarkdownParserComponent,
26073
26223
  ImageOverlayPreviewComponent,
26074
26224
  ],
26075
26225
  exports: [
@@ -27708,10 +27858,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27708
27858
  class AbstractSearchField {
27709
27859
  }
27710
27860
  class SimpleSearchField {
27711
- constructor(esFieldName, order = 'asc', injector) {
27861
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27712
27862
  this.esFieldName = esFieldName;
27713
- this.order = order;
27714
27863
  this.injector = injector;
27864
+ this.order = order;
27865
+ this.orderType = orderType;
27715
27866
  this.repository = this.injector.get(RecordsRepositoryInterface);
27716
27867
  // FIXME: this is required to register runtime fields; abstract this as well
27717
27868
  this.esService = this.injector.get(ElasticsearchService);
@@ -27722,12 +27873,12 @@ class SimpleSearchField {
27722
27873
  type: 'terms',
27723
27874
  field: this.esFieldName,
27724
27875
  limit: 1000,
27725
- sort: [this.order, 'key'],
27876
+ sort: [this.order, this.orderType],
27726
27877
  },
27727
27878
  };
27728
27879
  }
27729
27880
  async getBucketLabel(bucket) {
27730
- return bucket.term;
27881
+ return bucket.term.toString();
27731
27882
  }
27732
27883
  getAvailableValues() {
27733
27884
  return this.repository.aggregate(this.getAggregations()).pipe(map$1((response) => response[this.esFieldName].buckets || []), switchMap((buckets) => {
@@ -27755,9 +27906,13 @@ class SimpleSearchField {
27755
27906
  return of(values);
27756
27907
  }
27757
27908
  }
27758
- class KeySearchField extends SimpleSearchField {
27759
- constructor() {
27760
- super(...arguments);
27909
+ class TranslatedSearchField extends SimpleSearchField {
27910
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27911
+ super(esFieldName, injector, order, orderType);
27912
+ this.esFieldName = esFieldName;
27913
+ this.injector = injector;
27914
+ this.order = order;
27915
+ this.orderType = orderType;
27761
27916
  this.platformService = this.injector.get(PlatformServiceInterface);
27762
27917
  }
27763
27918
  async getTranslation(key) {
@@ -27767,26 +27922,36 @@ class KeySearchField extends SimpleSearchField {
27767
27922
  return (await this.getTranslation(bucket.term)) || bucket.term;
27768
27923
  }
27769
27924
  getAvailableValues() {
27925
+ if (this.orderType === 'count')
27926
+ return super.getAvailableValues();
27770
27927
  // sort values by alphabetical order
27771
27928
  return super
27772
27929
  .getAvailableValues()
27773
27930
  .pipe(map$1((values) => values.sort((a, b) => new Intl.Collator().compare(a.label, b.label))));
27774
27931
  }
27775
27932
  }
27776
- class ThesaurusField extends KeySearchField {
27777
- constructor(esFieldName, thesaurusName, order = 'asc', injector) {
27778
- super(esFieldName, order, injector);
27779
- this.thesaurusName = thesaurusName;
27933
+ /**
27934
+ * This search field will either target the `.default` field, or a specific `.langxyz` field according
27935
+ * to the defined METADATA_LANGUAGE token
27936
+ * The provided ES field name should not include any prefix such as `.langeng`
27937
+ */
27938
+ class MultilingualSearchField extends SimpleSearchField {
27939
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27940
+ super(esFieldName, injector, order, orderType);
27941
+ this.esFieldName = esFieldName;
27942
+ this.injector = injector;
27943
+ this.order = order;
27944
+ this.orderType = orderType;
27780
27945
  this.langService = this.injector.get(LangService);
27781
- this.thesaurus$ = this.platformService
27782
- .getThesaurusByLang(this.thesaurusName, this.langService.iso3)
27783
- .pipe(catchError(() => {
27784
- console.warn('Error while loading thesaurus language package');
27785
- return of([]);
27786
- }), shareReplay(1));
27787
- }
27788
- async getTranslation(key) {
27789
- return firstValueFrom(this.thesaurus$.pipe(map$1((thesaurus) => thesaurus.find((keyword) => keyword.key === key)?.label)));
27946
+ this.searchLanguage = this.injector.get(METADATA_LANGUAGE, null);
27947
+ // note: we're excluding the metadata language "current" value because that would produce
27948
+ // permalinks that might not work for different users
27949
+ if (this.searchLanguage && this.searchLanguage !== 'current') {
27950
+ this.esFieldName += `.lang${this.searchLanguage}`;
27951
+ }
27952
+ else {
27953
+ this.esFieldName += '.default';
27954
+ }
27790
27955
  }
27791
27956
  }
27792
27957
  class FullTextSearchField {
@@ -27806,7 +27971,7 @@ marker('search.filters.isSpatial.yes');
27806
27971
  marker('search.filters.isSpatial.no');
27807
27972
  class IsSpatialSearchField extends SimpleSearchField {
27808
27973
  constructor(injector) {
27809
- super('isSpatial', 'asc', injector);
27974
+ super('isSpatial', injector, 'asc');
27810
27975
  this.translateService = this.injector.get(TranslateService);
27811
27976
  this.esService.registerRuntimeField('isSpatial', `String result = 'no';
27812
27977
  String formats = doc.format.join('|').toLowerCase();
@@ -27856,7 +28021,7 @@ marker('search.filters.license.unknown');
27856
28021
  // Note: values are inspired from https://doc.data.gouv.fr/moissonnage/licences/
27857
28022
  class LicenseSearchField extends SimpleSearchField {
27858
28023
  constructor(injector) {
27859
- super('license', 'asc', injector);
28024
+ super('license', injector, 'asc');
27860
28025
  this.translateService = this.injector.get(TranslateService);
27861
28026
  this.esService.registerRuntimeField('license', `String raw = '';
27862
28027
  if (doc.containsKey('licenseObject.default.keyword') && doc['licenseObject.default.keyword'].length > 0)
@@ -27940,7 +28105,7 @@ class OrganizationSearchField {
27940
28105
  }
27941
28106
  class OwnerSearchField extends SimpleSearchField {
27942
28107
  constructor(injector) {
27943
- super('owner', 'asc', injector);
28108
+ super('owner', injector, 'asc');
27944
28109
  }
27945
28110
  getAvailableValues() {
27946
28111
  return of([]);
@@ -27949,6 +28114,7 @@ class OwnerSearchField extends SimpleSearchField {
27949
28114
 
27950
28115
  marker('search.filters.format');
27951
28116
  marker('search.filters.inspireKeyword');
28117
+ marker('search.filters.keyword');
27952
28118
  marker('search.filters.isSpatial');
27953
28119
  marker('search.filters.license');
27954
28120
  marker('search.filters.publicationYear');
@@ -27966,13 +28132,14 @@ class FieldsService {
27966
28132
  this.injector = injector;
27967
28133
  this.fields = {
27968
28134
  publisher: new OrganizationSearchField(this.injector),
27969
- format: new SimpleSearchField('format', 'asc', this.injector),
27970
- resourceType: new KeySearchField('resourceType', 'asc', this.injector),
27971
- representationType: new KeySearchField('cl_spatialRepresentationType.key', 'asc', this.injector),
27972
- publicationYear: new SimpleSearchField('publicationYearForResource', 'desc', this.injector),
27973
- topic: new KeySearchField('cl_topic.key', 'asc', this.injector),
27974
- inspireKeyword: new ThesaurusField('th_httpinspireeceuropaeutheme-theme.link', 'external.theme.httpinspireeceuropaeutheme-theme', 'asc', this.injector),
27975
- documentStandard: new SimpleSearchField('documentStandard', 'asc', this.injector),
28135
+ format: new SimpleSearchField('format', this.injector, 'asc'),
28136
+ resourceType: new TranslatedSearchField('resourceType', this.injector, 'asc'),
28137
+ representationType: new TranslatedSearchField('cl_spatialRepresentationType.key', this.injector, 'asc'),
28138
+ publicationYear: new SimpleSearchField('publicationYearForResource', this.injector, 'desc'),
28139
+ topic: new TranslatedSearchField('cl_topic.key', this.injector, 'asc'),
28140
+ inspireKeyword: new TranslatedSearchField('th_httpinspireeceuropaeutheme-theme.link', this.injector, 'asc'),
28141
+ keyword: new MultilingualSearchField('tag', this.injector, 'desc', 'count'),
28142
+ documentStandard: new SimpleSearchField('documentStandard', this.injector, 'asc'),
27976
28143
  isSpatial: new IsSpatialSearchField(this.injector),
27977
28144
  q: new FullTextSearchField(),
27978
28145
  license: new LicenseSearchField(this.injector),
@@ -30833,11 +31000,11 @@ class LanguageSwitcherComponent {
30833
31000
  this.translate.use(value);
30834
31001
  }
30835
31002
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, deps: [{ token: LANGUAGES_LIST, optional: true }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
30836
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LanguageSwitcherComponent, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n [extraBtnClass]=\"'flex justify-items-center text-white !pl-2 !py-1'\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }] }); }
31003
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: LanguageSwitcherComponent, selector: "gn-ui-language-switcher", ngImport: i0, template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n [extraBtnClass]=\"'flex justify-items-center !pl-2 !py-1'\"\n>\n</gn-ui-dropdown-selector>\n", styles: [""], dependencies: [{ kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth"], outputs: ["selectValue"] }] }); }
30837
31004
  }
30838
31005
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: LanguageSwitcherComponent, decorators: [{
30839
31006
  type: Component,
30840
- args: [{ selector: 'gn-ui-language-switcher', template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n [extraBtnClass]=\"'flex justify-items-center text-white !pl-2 !py-1'\"\n>\n</gn-ui-dropdown-selector>\n" }]
31007
+ args: [{ selector: 'gn-ui-language-switcher', template: "<gn-ui-dropdown-selector\n [title]=\"'languages'\"\n [choices]=\"languageList\"\n (selectValue)=\"changeLanguage($event)\"\n [selected]=\"currentLang\"\n ariaName=\"languages\"\n [showTitle]=\"false\"\n [extraBtnClass]=\"'flex justify-items-center !pl-2 !py-1'\"\n>\n</gn-ui-dropdown-selector>\n" }]
30841
31008
  }], ctorParameters: function () { return [{ type: undefined, decorators: [{
30842
31009
  type: Optional
30843
31010
  }, {
@@ -32201,5 +32368,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
32201
32368
  * Generated bundle index. Do not edit.
32202
32369
  */
32203
32370
 
32204
- export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseReader, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CONFIG_MALFORMED, CONFIG_MINIMAL, CONFIG_MISSING_MANDATORY, CONFIG_OK, CONFIG_UNRECOGNIZED_KEYS, CONFIG_WITH_TRANSLATIONS, CONFIG_WRONG_LANGUAGE_CODE, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ChipsInputComponent, ClearError, ClearResults, ColorScaleComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_BASELAYER_CONTEXT, DEFAULT_GN4_LOGIN_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DEFAULT_STYLE_FIXTURE, DEFAULT_STYLE_HL_FIXTURE, DEFAULT_VIEW, DataService, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DateRangePickerComponent, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EMPTY_BLOCK_MODEL_FIXTURE, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EditableLabelDirective, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FACET_ITEM_FIXTURE, FEATURE_MAP_OPTIONS, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDatavizModule, FeatureDetailComponent, FeatureEditorModule, FeatureInfoService, FeatureMapModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldFileComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentComponent, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, Gn4MetadataMapper, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageOverlayPreviewComponent, InteractiveTableColumnComponent, InteractiveTableComponent, LANGUAGES_LIST, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_CONFIG_FIXTURE, MAP_FEATURE_KEY, METADATA_LANGUAGE, MY_FORMATS, MapComponent, MapContainerComponent, MapContextComponent, MapContextLayerTypeEnum, MapContextService, MapFacade, MapInstanceDirective, MapManagerService, MapStyleService, MapUtilsService, MapViewComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MyOrgService, NavigationButtonComponent, ORGANIZATIONS_STRATEGY, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationsFromGroupsService, OrganizationsFromMetadataService, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, 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, SearchInputComponent, SearchResultsErrorComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SiteTitleComponent, SortByComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StepBarComponent, StickyHeaderComponent, SupportedTypes, TABLE_ITEM_FIXTURE, TABLE_ITEM_FIXTURE_HAB, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableComponent, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiCatalogModule, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiMapModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UserPreviewComponent, UtilI18nModule, UtilSharedModule, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WFS_MAX_FEATURES, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, createFuzzyFilter, currentPage, defaultMapOptions, dragPanCondition, dropEmptyTranslations, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLinkLabel, getLinkPriority, getMapLayers, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSpatialFilterEnabled, getThemeConfig, initSearch, initialMapState, initialState, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapLogo, mapOrganization, mapReducer, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$1 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, selectFallback, selectFallbackFields, selectField, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, toModel, toXml, totalPages, updateLayer };
32371
+ export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, AuthService, AutocompleteComponent, AvatarComponent, AvatarServiceInterface, BLOCK_MODEL_FIXTURE, BadgeComponent, BaseReader, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CONFIG_MALFORMED, CONFIG_MINIMAL, CONFIG_MISSING_MANDATORY, CONFIG_OK, CONFIG_UNRECOGNIZED_KEYS, CONFIG_WITH_TRANSLATIONS, CONFIG_WRONG_LANGUAGE_CODE, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ChipsInputComponent, ClearError, ClearResults, ColorScaleComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_BASELAYER_CONTEXT, DEFAULT_GN4_LOGIN_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DEFAULT_STYLE_FIXTURE, DEFAULT_STYLE_HL_FIXTURE, DEFAULT_VIEW, DataService, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DateRangePickerComponent, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EMPTY_BLOCK_MODEL_FIXTURE, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EditableLabelDirective, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FACET_ITEM_FIXTURE, FEATURE_MAP_OPTIONS, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogModule, FeatureDatavizModule, FeatureDetailComponent, FeatureEditorModule, FeatureInfoService, FeatureMapModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileTranslateLoader, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldFileComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentComponent, FuzzySearchComponent, GN_UI_VERSION, GeoTableViewComponent, GeocodingComponent, Gn4MetadataMapper, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageOverlayPreviewComponent, InteractiveTableColumnComponent, InteractiveTableComponent, LANGUAGES_LIST, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_CONFIG_FIXTURE, MAP_FEATURE_KEY, METADATA_LANGUAGE, MY_FORMATS, MapComponent, MapContainerComponent, MapContextComponent, MapContextLayerTypeEnum, MapContextService, MapFacade, MapInstanceDirective, MapManagerService, MapStyleService, MapUtilsService, MapViewComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataQualityComponent, MetadataQualityItemComponent, MyOrgService, NavigationButtonComponent, ORGANIZATIONS_STRATEGY, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationsFromGroupsService, OrganizationsFromMetadataService, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PatchResultsAggregations, PopupAlertComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_SEARCH, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, 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, SearchInputComponent, SearchResultsErrorComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SiteTitleComponent, SortByComponent, SourceLabelComponent, SourcesService, SpinningLoaderComponent, StarToggleComponent, StepBarComponent, StickyHeaderComponent, SupportedTypes, TABLE_ITEM_FIXTURE, TABLE_ITEM_FIXTURE_HAB, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableComponent, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiCatalogModule, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiMapModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UserPreviewComponent, UtilI18nModule, UtilSharedModule, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WFS_MAX_FEATURES, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, _reset, addLayer, changeLayerOrder, checkFileFormat, clearLayerError, createFuzzyFilter, currentPage, defaultMapOptions, dragPanCondition, dropEmptyTranslations, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLinkLabel, getLinkPriority, getMapLayers, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSpatialFilterEnabled, getThemeConfig, initSearch, initialMapState, initialState, isConfigLoaded, isEndOfResults, isFormatInQueryParam, loadAppConfig, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, mimeTypeToFormat, mouseWheelZoomCondition, openDataset, parse, placeholder, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readDataset, readDatasetHeaders, reducer$1 as reducer, reducerSearch, removeLayer, removeSearchParams, removeWhitespace, selectFallback, selectFallbackFields, selectField, selectTranslatedField, selectTranslatedValue, setLayerError, sortByFromString, sortByToString, sortByToStrings, stripHtml, toDate, toModel, toXml, totalPages, updateLayer };
32205
32372
  //# sourceMappingURL=geonetwork-ui.mjs.map