geonetwork-ui 2.2.0-dev.eaf94daa → 2.2.0-dev.ecc0ab67

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 (86) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +42 -51
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +4 -3
  3. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +16 -11
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +23 -16
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +21 -18
  6. package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.mjs +10 -3
  7. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +14 -5
  8. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +33 -8
  9. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  10. package/esm2022/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.mjs +1 -1
  11. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  12. package/esm2022/libs/feature/search/src/lib/utils/service/fields.mjs +41 -26
  13. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +11 -9
  14. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +2 -2
  15. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +35 -22
  16. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +2 -3
  17. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +9 -6
  18. package/esm2022/translations/de.json +2 -1
  19. package/esm2022/translations/en.json +4 -3
  20. package/esm2022/translations/es.json +2 -1
  21. package/esm2022/translations/fr.json +4 -3
  22. package/esm2022/translations/it.json +4 -3
  23. package/esm2022/translations/nl.json +2 -1
  24. package/esm2022/translations/pt.json +2 -1
  25. package/fesm2022/geonetwork-ui.mjs +254 -170
  26. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  27. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts +0 -1
  28. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  29. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -1
  30. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +1 -1
  31. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +5 -4
  32. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  33. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +3 -2
  34. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  35. package/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.d.ts.map +1 -1
  36. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +1 -1
  37. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  38. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -2
  39. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  40. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +5 -10
  41. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  42. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts +1 -0
  43. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts.map +1 -1
  44. package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -1
  45. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  46. package/libs/feature/search/src/lib/utils/service/fields.d.ts +21 -8
  47. package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
  48. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  49. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +7 -3
  50. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  51. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  52. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +3 -1
  53. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  54. package/package.json +1 -1
  55. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +6 -6
  56. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +5 -3
  57. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +22 -4
  58. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +69 -65
  59. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +3 -2
  60. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +19 -12
  61. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +62 -43
  62. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +91 -59
  63. package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts +22 -2
  64. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +15 -4
  65. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +47 -8
  66. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +5 -11
  67. package/src/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.ts +1 -0
  68. package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -4
  69. package/src/libs/common/fixtures/src/lib/gn4/groups.fixtures.ts +1 -1
  70. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +6 -2
  71. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +21 -16
  72. package/src/libs/feature/search/src/lib/utils/service/fields.ts +43 -34
  73. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +2 -2
  74. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +45 -18
  75. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +31 -12
  76. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +1 -2
  77. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +5 -5
  78. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +12 -4
  79. package/translations/de.json +2 -1
  80. package/translations/en.json +4 -3
  81. package/translations/es.json +2 -1
  82. package/translations/fr.json +4 -3
  83. package/translations/it.json +4 -3
  84. package/translations/nl.json +2 -1
  85. package/translations/pt.json +2 -1
  86. package/translations/sk.json +2 -1
@@ -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';
@@ -649,28 +649,32 @@ function extractStatus() {
649
649
  return pipe(findChildElement('gmd:MD_ProgressCode'), readAttribute('codeListValue'), map(getStatusFromStatusCode));
650
650
  }
651
651
  // 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) => ({
652
+ function extractLegalConstraints() {
653
+ 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]) => ({
654
+ ...(url && { url }),
655
655
  text,
656
- type: 'other',
657
656
  })));
658
- const getSecurityConstraints = pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), mapArray(extractCharacterString()), mapArray((text) => ({
657
+ }
658
+ // from gmd:resourceConstraints
659
+ function extractSecurityConstraints() {
660
+ return pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
661
+ ...(url && { url }),
659
662
  text,
660
- type: 'security',
661
663
  })));
662
- return pipe(combine(getOtherConstraints, getSecurityConstraints), flattenArray());
663
664
  }
664
665
  // 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()));
666
+ function extractOtherConstraints() {
667
+ return pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), flattenArray(), mapArray(combine(extractCharacterString(), extractUrl())), mapArray(([text, url]) => ({
668
+ ...(url && { url }),
669
+ text,
670
+ })));
667
671
  }
668
672
  // from gmd:resourceConstraints
669
673
  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]) => ({
674
+ 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
675
  ...(url && { url }),
672
676
  text,
673
- })))));
677
+ })));
674
678
  }
675
679
  // from gmd:MD_Distribution
676
680
  function extractDatasetDistributions() {
@@ -842,11 +846,14 @@ function readStatus(rootEl) {
842
846
  return pipe(findIdentification(), findChildElement('gmd:status', false), extractStatus())(rootEl);
843
847
  }
844
848
  const getConstraints = pipe(findIdentification(), findChildrenElement('gmd:resourceConstraints', false));
845
- function readAccessConstraints(rootEl) {
846
- return pipe(getConstraints, mapArray(extractAccessConstraints()), flattenArray(), flattenArray())(rootEl);
849
+ function readLegalConstraints(rootEl) {
850
+ return pipe(getConstraints, mapArray(extractLegalConstraints()), flattenArray(), flattenArray())(rootEl);
847
851
  }
848
- function readUseLimitations(rootEl) {
849
- return pipe(getConstraints, mapArray(extractUseLimitations()), flattenArray())(rootEl);
852
+ function readSecurityConstraints(rootEl) {
853
+ return pipe(getConstraints, mapArray(extractSecurityConstraints()), flattenArray())(rootEl);
854
+ }
855
+ function readOtherConstraints(rootEl) {
856
+ return pipe(getConstraints, mapArray(extractOtherConstraints()), flattenArray())(rootEl);
850
857
  }
851
858
  function readLicenses(rootEl) {
852
859
  return pipe(getConstraints, mapArray(extractLicenses()), flattenArray())(rootEl);
@@ -1079,23 +1086,23 @@ function appendKeywords(keywords, type) {
1079
1086
  ? 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
1087
  : noop, appendChildren(...keywords.map((keyword) => pipe(createElement('gmd:keyword'), writeCharacterString(keyword))))));
1081
1088
  }
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') {
1089
+ function createConstraint(constraint, type) {
1090
+ if (type === 'security') {
1090
1091
  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
1092
  }
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))));
1093
+ else if (type === 'legal') {
1094
+ 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))));
1095
+ }
1096
+ return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_Constraints'), appendChildren(pipe(createElement('gmd:useLimitation'), writeCharacterString(constraint.text))));
1093
1097
  }
1094
- function removeUseLimitations() {
1098
+ function removeOtherConstraints() {
1095
1099
  return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_Constraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1096
1100
  }
1097
- function createUseLimitation(useLimitation) {
1098
- return pipe(createElement('gmd:resourceConstraints'), createChild('gmd:MD_Constraints'), createChild('gmd:useLimitation'), writeCharacterString(useLimitation));
1101
+ function removeSecurityConstraints() {
1102
+ return removeChildren(pipe(findChildrenElement('gmd:resourceConstraints'), filterArray(pipe(findNestedElements('gmd:MD_SecurityConstraints', 'gmd:useLimitation'), (array) => array.length > 0))));
1103
+ }
1104
+ function removeLegalConstraints() {
1105
+ 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
1106
  }
1100
1107
  function removeLicenses() {
1101
1108
  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')))));
@@ -1199,14 +1206,17 @@ function writeKeywords(record, rootEl) {
1199
1206
  function writeThemes(record, rootEl) {
1200
1207
  pipe(findOrCreateIdentification(), removeKeywords('theme'), appendKeywords(record.themes, 'theme'))(rootEl);
1201
1208
  }
1202
- function writeAccessConstraints(record, rootEl) {
1203
- pipe(findOrCreateIdentification(), removeAccessConstraints(), appendChildren(...record.accessConstraints.map(createAccessConstraint)))(rootEl);
1204
- }
1205
1209
  function writeLicenses(record, rootEl) {
1206
1210
  pipe(findOrCreateIdentification(), removeLicenses(), appendChildren(...record.licenses.map(createLicense)))(rootEl);
1207
1211
  }
1208
- function writeUseLimitations(record, rootEl) {
1209
- pipe(findOrCreateIdentification(), removeUseLimitations(), appendChildren(...record.useLimitations.map(createUseLimitation)))(rootEl);
1212
+ function writeLegalConstraints(record, rootEl) {
1213
+ pipe(findOrCreateIdentification(), removeLegalConstraints(), appendChildren(...record.legalConstraints.map((c) => createConstraint(c, 'legal'))))(rootEl);
1214
+ }
1215
+ function writeSecurityConstraints(record, rootEl) {
1216
+ pipe(findOrCreateIdentification(), removeSecurityConstraints(), appendChildren(...record.securityConstraints.map((c) => createConstraint(c, 'security'))))(rootEl);
1217
+ }
1218
+ function writeOtherConstraints(record, rootEl) {
1219
+ pipe(findOrCreateIdentification(), removeOtherConstraints(), appendChildren(...record.otherConstraints.map((c) => createConstraint(c, 'other'))))(rootEl);
1210
1220
  }
1211
1221
  function writeUpdateFrequency(record, rootEl) {
1212
1222
  pipe(findOrCreateIdentification(), findChildOrCreate('gmd:resourceMaintenance'), removeAllChildren(), findChildOrCreate('gmd:MD_MaintenanceInformation'), typeof record.updateFrequency === 'object'
@@ -1304,8 +1314,9 @@ function toModel(xml) {
1304
1314
  const recordCreated = recordUpdated;
1305
1315
  const keywords = readKeywords(rootEl);
1306
1316
  const themes = readThemes(rootEl);
1307
- const accessConstraints = readAccessConstraints(rootEl);
1308
- const useLimitations = readUseLimitations(rootEl);
1317
+ const legalConstraints = readLegalConstraints(rootEl);
1318
+ const otherConstraints = readOtherConstraints(rootEl);
1319
+ const securityConstraints = readSecurityConstraints(rootEl);
1309
1320
  const licenses = readLicenses(rootEl);
1310
1321
  const overviews = readOverviews(rootEl);
1311
1322
  // not used yet
@@ -1333,9 +1344,10 @@ function toModel(xml) {
1333
1344
  contactsForResource: [],
1334
1345
  keywords,
1335
1346
  themes,
1336
- accessConstraints,
1337
- useLimitations,
1338
1347
  licenses,
1348
+ legalConstraints,
1349
+ securityConstraints,
1350
+ otherConstraints,
1339
1351
  ...(datasetCreated && { datasetCreated }),
1340
1352
  ...(datasetUpdated && { datasetUpdated }),
1341
1353
  lineage,
@@ -1360,9 +1372,10 @@ function toModel(xml) {
1360
1372
  contacts,
1361
1373
  keywords,
1362
1374
  themes,
1363
- accessConstraints,
1364
- useLimitations,
1365
1375
  licenses,
1376
+ legalConstraints,
1377
+ securityConstraints,
1378
+ otherConstraints,
1366
1379
  overviews,
1367
1380
  onlineResources,
1368
1381
  };
@@ -1388,9 +1401,11 @@ function toXml(record, originalXml) {
1388
1401
  fieldChanged('contacts') && writeContacts(record, rootEl);
1389
1402
  fieldChanged('keywords') && writeKeywords(record, rootEl);
1390
1403
  fieldChanged('themes') && writeThemes(record, rootEl);
1391
- fieldChanged('accessConstraints') && writeAccessConstraints(record, rootEl);
1404
+ fieldChanged('legalConstraints') && writeLegalConstraints(record, rootEl);
1405
+ fieldChanged('securityConstraints') &&
1406
+ writeSecurityConstraints(record, rootEl);
1392
1407
  fieldChanged('licenses') && writeLicenses(record, rootEl);
1393
- fieldChanged('useLimitations') && writeUseLimitations(record, rootEl);
1408
+ fieldChanged('otherConstraints') && writeOtherConstraints(record, rootEl);
1394
1409
  if (record.kind === 'dataset') {
1395
1410
  writeStatus(record, rootEl);
1396
1411
  fieldChanged('updateFrequency') && writeUpdateFrequency(record, rootEl);
@@ -16774,12 +16789,12 @@ var de = {
16774
16789
  "record.metadata.details": "Technische Informationen",
16775
16790
  "record.metadata.download": "Downloads",
16776
16791
  "record.metadata.formats": "Formate",
16777
- "record.metadata.isOpenData": "Open Data",
16778
16792
  "record.metadata.keywords": "Stichworte",
16779
16793
  "record.metadata.lastUpdate": "Zuletzt aktualisiert am",
16780
16794
  "record.metadata.links": "Links",
16781
16795
  "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
16782
16796
  "record.metadata.origin": "Über die Daten",
16797
+ "record.metadata.otherConstraints": "",
16783
16798
  "record.metadata.owner": "",
16784
16799
  "record.metadata.preview": "Vorschau",
16785
16800
  "record.metadata.publications": "Veröffentlichungen",
@@ -16841,6 +16856,7 @@ var de = {
16841
16856
  "search.filters.isSpatial": "Ist räumliche Daten",
16842
16857
  "search.filters.isSpatial.no": "nicht räumlich",
16843
16858
  "search.filters.isSpatial.yes": "räumlich",
16859
+ "search.filters.keyword": "Schlüsselwort",
16844
16860
  "search.filters.license": "Lizenz",
16845
16861
  "search.filters.license.cc-by": "Creative Commons CC-BY",
16846
16862
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -17114,12 +17130,12 @@ var en = {
17114
17130
  "record.metadata.details": "Technical information",
17115
17131
  "record.metadata.download": "Downloads",
17116
17132
  "record.metadata.formats": "Formats",
17117
- "record.metadata.isOpenData": "Open Data",
17118
17133
  "record.metadata.keywords": "Keywords",
17119
17134
  "record.metadata.lastUpdate": "Last updated on",
17120
17135
  "record.metadata.links": "Links",
17121
17136
  "record.metadata.noUsage": "No usage conditions specified for this record.",
17122
17137
  "record.metadata.origin": "About the data",
17138
+ "record.metadata.otherConstraints": "Additional Conditions",
17123
17139
  "record.metadata.owner": "Catalog of origin",
17124
17140
  "record.metadata.preview": "Preview",
17125
17141
  "record.metadata.publications": "publications",
@@ -17150,8 +17166,8 @@ var en = {
17150
17166
  "record.metadata.uniqueId": "Unique Identifier",
17151
17167
  "record.metadata.updateFrequency": "Data Update Frequency",
17152
17168
  "record.metadata.updateStatus": "Data Update Status",
17153
- "record.metadata.updatedOn": "Metadata's last update",
17154
- "record.metadata.usage": "Usage & constraints",
17169
+ "record.metadata.updatedOn": "Last Data Information Update",
17170
+ "record.metadata.usage": "License and Conditions",
17155
17171
  "record.more.details": "Read more",
17156
17172
  "record.tab.chart": "Chart",
17157
17173
  "record.tab.data": "Table",
@@ -17181,6 +17197,7 @@ var en = {
17181
17197
  "search.filters.isSpatial": "Is spatial data",
17182
17198
  "search.filters.isSpatial.no": "non spatial",
17183
17199
  "search.filters.isSpatial.yes": "spatial",
17200
+ "search.filters.keyword": "Keyword",
17184
17201
  "search.filters.license": "License",
17185
17202
  "search.filters.license.cc-by": "Creative Commons CC-BY",
17186
17203
  "search.filters.license.cc-by-sa": "Creative Commons CC-BY-SA",
@@ -17454,12 +17471,12 @@ var es = {
17454
17471
  "record.metadata.details": "",
17455
17472
  "record.metadata.download": "",
17456
17473
  "record.metadata.formats": "",
17457
- "record.metadata.isOpenData": "",
17458
17474
  "record.metadata.keywords": "",
17459
17475
  "record.metadata.lastUpdate": "",
17460
17476
  "record.metadata.links": "",
17461
17477
  "record.metadata.noUsage": "",
17462
17478
  "record.metadata.origin": "",
17479
+ "record.metadata.otherConstraints": "",
17463
17480
  "record.metadata.owner": "",
17464
17481
  "record.metadata.preview": "",
17465
17482
  "record.metadata.publications": "",
@@ -17521,6 +17538,7 @@ var es = {
17521
17538
  "search.filters.isSpatial": "",
17522
17539
  "search.filters.isSpatial.no": "",
17523
17540
  "search.filters.isSpatial.yes": "",
17541
+ "search.filters.keyword": "",
17524
17542
  "search.filters.license": "",
17525
17543
  "search.filters.license.cc-by": "",
17526
17544
  "search.filters.license.cc-by-sa": "",
@@ -17794,12 +17812,12 @@ var fr = {
17794
17812
  "record.metadata.details": "Informations techniques",
17795
17813
  "record.metadata.download": "Téléchargements",
17796
17814
  "record.metadata.formats": "Formats",
17797
- "record.metadata.isOpenData": "Donnée Ouverte",
17798
17815
  "record.metadata.keywords": "Mots clés",
17799
17816
  "record.metadata.lastUpdate": "Mis à jour le",
17800
17817
  "record.metadata.links": "Liens",
17801
17818
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
17802
17819
  "record.metadata.origin": "À propos des données",
17820
+ "record.metadata.otherConstraints": "Limitations d'usage",
17803
17821
  "record.metadata.owner": "Catalogue d'origine",
17804
17822
  "record.metadata.preview": "Aperçu",
17805
17823
  "record.metadata.publications": "données",
@@ -17830,8 +17848,8 @@ var fr = {
17830
17848
  "record.metadata.uniqueId": "Identificateur de ressource unique",
17831
17849
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
17832
17850
  "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",
17851
+ "record.metadata.updatedOn": "Dernière mise à jour des informations sur les données",
17852
+ "record.metadata.usage": "Licences et conditions d'utilisation",
17835
17853
  "record.more.details": "Détails",
17836
17854
  "record.tab.chart": "Graphique",
17837
17855
  "record.tab.data": "Tableau",
@@ -17861,6 +17879,7 @@ var fr = {
17861
17879
  "search.filters.isSpatial": "Données spatiales",
17862
17880
  "search.filters.isSpatial.no": "non-géolocalisées",
17863
17881
  "search.filters.isSpatial.yes": "géolocalisées",
17882
+ "search.filters.keyword": "Mot-clé",
17864
17883
  "search.filters.license": "Licence",
17865
17884
  "search.filters.license.cc-by": "cc-by",
17866
17885
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18134,12 +18153,12 @@ var it = {
18134
18153
  "record.metadata.details": "Informazioni tecniche",
18135
18154
  "record.metadata.download": "Download",
18136
18155
  "record.metadata.formats": "Formati",
18137
- "record.metadata.isOpenData": "Data aperta",
18138
18156
  "record.metadata.keywords": "Parole chiave",
18139
18157
  "record.metadata.lastUpdate": "Ultimo aggiornamento",
18140
18158
  "record.metadata.links": "Collegamenti",
18141
18159
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
18142
18160
  "record.metadata.origin": "Informazioni sui dati",
18161
+ "record.metadata.otherConstraints": "Limitazioni di uso",
18143
18162
  "record.metadata.owner": "Catalogo originale",
18144
18163
  "record.metadata.preview": "Anteprima",
18145
18164
  "record.metadata.publications": "pubblicazioni",
@@ -18170,8 +18189,8 @@ var it = {
18170
18189
  "record.metadata.uniqueId": "Identificatore unico di risorsa",
18171
18190
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
18172
18191
  "record.metadata.updateStatus": "Stato di aggiornamento dei dati",
18173
- "record.metadata.updatedOn": "Ultimo aggiornamento del metadata",
18174
- "record.metadata.usage": "Condizioni d'uso",
18192
+ "record.metadata.updatedOn": "Ultimo aggiornamento delle informazioni sui dati",
18193
+ "record.metadata.usage": "Licenze e limiti di utilizzo",
18175
18194
  "record.more.details": "Dettagli",
18176
18195
  "record.tab.chart": "Grafico",
18177
18196
  "record.tab.data": "Tabella",
@@ -18201,6 +18220,7 @@ var it = {
18201
18220
  "search.filters.isSpatial": "Dati spaziali",
18202
18221
  "search.filters.isSpatial.no": "Non geolocalizzati",
18203
18222
  "search.filters.isSpatial.yes": "Geolocalizzati",
18223
+ "search.filters.keyword": "Parola chiave",
18204
18224
  "search.filters.license": "Licenza",
18205
18225
  "search.filters.license.cc-by": "cc-by",
18206
18226
  "search.filters.license.cc-by-sa": "cc-by-sa",
@@ -18474,12 +18494,12 @@ var nl = {
18474
18494
  "record.metadata.details": "",
18475
18495
  "record.metadata.download": "",
18476
18496
  "record.metadata.formats": "",
18477
- "record.metadata.isOpenData": "",
18478
18497
  "record.metadata.keywords": "",
18479
18498
  "record.metadata.lastUpdate": "",
18480
18499
  "record.metadata.links": "",
18481
18500
  "record.metadata.noUsage": "",
18482
18501
  "record.metadata.origin": "",
18502
+ "record.metadata.otherConstraints": "",
18483
18503
  "record.metadata.owner": "",
18484
18504
  "record.metadata.preview": "",
18485
18505
  "record.metadata.publications": "",
@@ -18541,6 +18561,7 @@ var nl = {
18541
18561
  "search.filters.isSpatial": "",
18542
18562
  "search.filters.isSpatial.no": "",
18543
18563
  "search.filters.isSpatial.yes": "",
18564
+ "search.filters.keyword": "",
18544
18565
  "search.filters.license": "",
18545
18566
  "search.filters.license.cc-by": "",
18546
18567
  "search.filters.license.cc-by-sa": "",
@@ -18814,12 +18835,12 @@ var pt = {
18814
18835
  "record.metadata.details": "",
18815
18836
  "record.metadata.download": "",
18816
18837
  "record.metadata.formats": "",
18817
- "record.metadata.isOpenData": "",
18818
18838
  "record.metadata.keywords": "",
18819
18839
  "record.metadata.lastUpdate": "",
18820
18840
  "record.metadata.links": "",
18821
18841
  "record.metadata.noUsage": "",
18822
18842
  "record.metadata.origin": "",
18843
+ "record.metadata.otherConstraints": "",
18823
18844
  "record.metadata.owner": "",
18824
18845
  "record.metadata.preview": "",
18825
18846
  "record.metadata.publications": "",
@@ -18881,6 +18902,7 @@ var pt = {
18881
18902
  "search.filters.isSpatial": "",
18882
18903
  "search.filters.isSpatial.no": "",
18883
18904
  "search.filters.isSpatial.yes": "",
18905
+ "search.filters.keyword": "",
18884
18906
  "search.filters.license": "",
18885
18907
  "search.filters.license.cc-by": "",
18886
18908
  "search.filters.license.cc-by-sa": "",
@@ -19056,20 +19078,11 @@ class Gn4FieldMapper {
19056
19078
  ...getAsArray(selectField(source, 'inspireTheme_syn')),
19057
19079
  ],
19058
19080
  }),
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
- }),
19081
+ MD_ConstraintsUseLimitationObject: (output, source) => this.constraintField('other', output, getAsArray(selectField(source, 'MD_ConstraintsUseLimitationObject'))),
19082
+ MD_LegalConstraintsUseLimitationObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsUseLimitationObject'))),
19083
+ MD_LegalConstraintsOtherConstraintsObject: (output, source) => this.constraintField('legal', output, getAsArray(selectField(source, 'MD_LegalConstraintsOtherConstraintsObject'))),
19084
+ MD_SecurityConstraintsUseLimitationObject: (output, source) => this.constraintField('security', output, getAsArray(selectField(source, 'MD_SecurityConstraintsUseLimitationObject'))),
19085
+ licenseObject: (output, source) => this.constraintField('license', output, getAsArray(selectField(source, 'licenseObject'))),
19073
19086
  lineageObject: (output, source) => ({
19074
19087
  ...output,
19075
19088
  lineage: selectTranslatedField(source, 'lineageObject', this.lang3),
@@ -19131,31 +19144,42 @@ class Gn4FieldMapper {
19131
19144
  },
19132
19145
  };
19133
19146
  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
- });
19147
+ this.constraintField = (type, output, constraintArray) => {
19148
+ let outputField;
19149
+ switch (type) {
19150
+ case 'license':
19151
+ outputField = 'licenses';
19152
+ break;
19153
+ case 'legal':
19154
+ outputField = 'legalConstraints';
19155
+ break;
19156
+ case 'security':
19157
+ outputField = 'securityConstraints';
19158
+ break;
19159
+ case 'other':
19160
+ outputField = 'otherConstraints';
19161
+ break;
19162
+ }
19163
+ const outputArray = outputField in output ? output[outputField] : [];
19164
+ outputArray.push(...constraintArray.map((item) => {
19165
+ const text = selectTranslatedValue(item, this.lang3);
19166
+ const url = getAsUrl(selectField(item, 'link'));
19167
+ return {
19168
+ text,
19169
+ ...(url ? { url } : {}),
19170
+ };
19171
+ }));
19172
+ const result = {
19173
+ ...output,
19174
+ [outputField]: outputArray,
19175
+ };
19176
+ // avoid legal constraints being duplicates of licenses
19177
+ if ('legalConstraints' in result &&
19178
+ (type === 'legal' || type === 'license')) {
19179
+ result.legalConstraints = result.legalConstraints.filter((constraint) => !output.licenses?.some((license) => license.text === constraint.text));
19180
+ }
19181
+ return result;
19182
+ };
19159
19183
  this.mapLink = (sourceLink) => {
19160
19184
  const url = getAsUrl(selectFallback(selectTranslatedField(sourceLink, 'urlObject', this.lang3), selectField(sourceLink, 'url')));
19161
19185
  const name = selectFallback(selectTranslatedField(sourceLink, 'nameObject', this.lang3), selectField(sourceLink, 'name'));
@@ -19203,17 +19227,6 @@ class Gn4FieldMapper {
19203
19227
  extras: { ...(output.extras || {}), ...value },
19204
19228
  });
19205
19229
  }
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
19230
  getMappingFn(fieldName) {
19218
19231
  return fieldName in this.fields ? this.fields[fieldName] : this.genericField;
19219
19232
  }
@@ -19275,12 +19288,13 @@ class Gn4MetadataMapper extends MetadataBaseMapper {
19275
19288
  recordUpdated: null,
19276
19289
  ownerOrganization: null,
19277
19290
  licenses: [],
19291
+ legalConstraints: [],
19292
+ securityConstraints: [],
19293
+ otherConstraints: [],
19278
19294
  contacts: [],
19279
19295
  contactsForResource: [],
19280
- accessConstraints: [],
19281
19296
  keywords: [],
19282
19297
  themes: [],
19283
- useLimitations: [],
19284
19298
  spatialExtents: [],
19285
19299
  temporalExtents: [],
19286
19300
  overviews: [],
@@ -20048,11 +20062,18 @@ class OrganizationsFromMetadataService {
20048
20062
  if (!allContactOrgs.length)
20049
20063
  return of(record);
20050
20064
  const ownerOrganization = allContactOrgs[0];
20051
- return this.organisations$.pipe(takeLast(1), map$1((organisations) => {
20065
+ // read the owner group as well to have a fallback logo
20066
+ const groupId = selectField(source, 'groupOwner');
20067
+ const group$ = this.groups$.pipe(map$1((groups) => groups.find((group) => {
20068
+ return group.id === Number(groupId);
20069
+ })));
20070
+ return this.organisations$.pipe(takeLast(1), withLatestFrom(group$), map$1(([organisations, group]) => {
20052
20071
  const recordOrganisation = organisations.filter((org) => org.name === ownerOrganization.name)[0];
20072
+ const logoUrl = group?.logo && getAsUrl(`${IMAGE_URL$1}${group.logo}`);
20053
20073
  return {
20054
20074
  ...record,
20055
20075
  ownerOrganization: {
20076
+ logoUrl,
20056
20077
  ...ownerOrganization,
20057
20078
  ...recordOrganisation,
20058
20079
  },
@@ -20363,12 +20384,21 @@ class Gn4PlatformMapper {
20363
20384
  const { enabled, emailAddresses, organisation, kind, lastLoginDate, accountNonExpired, accountNonLocked, id, credentialsNonExpired, ...user } = apiUser;
20364
20385
  return { ...apiUser, id: id.toString() };
20365
20386
  }
20366
- thesaurusFromApi(thesaurus) {
20387
+ thesaurusFromApi(thesaurus, lang3) {
20367
20388
  return thesaurus.map((keyword) => {
20368
- const { uri, value } = keyword;
20389
+ let key = keyword.uri;
20390
+ // sometines GN can prefix an URI with an "all thesaurus" URI; only keep the last one
20391
+ if (key.indexOf('@@@') > -1) {
20392
+ key = key.split('@@@')[1];
20393
+ }
20394
+ const label = lang3 && lang3 in keyword.values ? keyword.values[lang3] : keyword.value;
20395
+ const description = lang3 && lang3 in keyword.definitions
20396
+ ? keyword.definitions[lang3]
20397
+ : keyword.definition;
20369
20398
  return {
20370
- key: uri,
20371
- label: value,
20399
+ key,
20400
+ label,
20401
+ description,
20372
20402
  };
20373
20403
  });
20374
20404
  }
@@ -20381,13 +20411,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
20381
20411
 
20382
20412
  const minApiVersion = '4.2.2';
20383
20413
  class Gn4PlatformService {
20384
- constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService) {
20414
+ constructor(siteApiService, meApi, usersApi, mapper, toolsApiService, registriesApiService, langService) {
20385
20415
  this.siteApiService = siteApiService;
20386
20416
  this.meApi = meApi;
20387
20417
  this.usersApi = usersApi;
20388
20418
  this.mapper = mapper;
20389
20419
  this.toolsApiService = toolsApiService;
20390
20420
  this.registriesApiService = registriesApiService;
20421
+ this.langService = langService;
20391
20422
  this.type = 'GeoNetwork';
20392
20423
  this.keyTranslations$ = this.toolsApiService
20393
20424
  .getTranslationsPackage1('gnui')
@@ -20401,6 +20432,11 @@ class Gn4PlatformService {
20401
20432
  throw new Error(`Gn4 API version is not compatible.\nMinimum: ${minApiVersion}\nYour version: ${version}`);
20402
20433
  }
20403
20434
  }), shareReplay(1));
20435
+ /**
20436
+ * A map of already loaded thesauri (groups of keywords); the key is a URI
20437
+ * @private
20438
+ */
20439
+ this.thesauri = {};
20404
20440
  this.me$ = this.meApi.getMe().pipe(switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)), shareReplay({ bufferSize: 1, refCount: true }));
20405
20441
  this.isAnonymous$ = this.me$.pipe(map$1((user) => !user || !('id' in user)));
20406
20442
  this.users$ = this.usersApi.getUsers().pipe(map$1((users) => users.map((user) => this.mapper.userFromApi(user))), shareReplay());
@@ -20427,19 +20463,36 @@ class Gn4PlatformService {
20427
20463
  return this.users$;
20428
20464
  }
20429
20465
  translateKey(key) {
20466
+ // if the key is a URI, use the registries API to look for the translation
20467
+ if (key.match(/^https?:\/\//)) {
20468
+ // the thesaurus URI is inferred by removing a part of the keyword URI
20469
+ // this is not exact science but it's OK, we'll still end up loading a bunch of keywords at once anyway
20470
+ const thesaurusUri = key.replace(/\/([^/]+)$/, '/');
20471
+ return this.getThesaurusByUri(thesaurusUri).pipe(map$1((thesaurus) => {
20472
+ for (const item of thesaurus) {
20473
+ if (item.key === key)
20474
+ return item.label;
20475
+ }
20476
+ return key;
20477
+ }));
20478
+ }
20430
20479
  return this.keyTranslations$.pipe(map$1((translations) => translations[key]));
20431
20480
  }
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)));
20481
+ getThesaurusByUri(uri) {
20482
+ if (this.thesauri[uri]) {
20483
+ return this.thesauri[uri];
20484
+ }
20485
+ this.thesauri[uri] = this.registriesApiService
20486
+ .searchKeywords(null, this.langService.iso3, 1000, 0, null, null, null, `${uri}*`)
20487
+ .pipe(map$1((thesaurus) => this.mapper.thesaurusFromApi(thesaurus, this.langService.iso3)), shareReplay(1));
20488
+ return this.thesauri[uri];
20436
20489
  }
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 }); }
20490
+ 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
20491
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService }); }
20439
20492
  }
20440
20493
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: Gn4PlatformService, decorators: [{
20441
20494
  type: Injectable
20442
- }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }]; } });
20495
+ }], ctorParameters: function () { return [{ type: SiteApiService }, { type: MeApiService }, { type: UsersApiService }, { type: Gn4PlatformMapper }, { type: ToolsApiService }, { type: RegistriesApiService }, { type: LangService }]; } });
20443
20496
 
20444
20497
  function provideGn4() {
20445
20498
  return [
@@ -23305,8 +23358,7 @@ class MetadataQualityComponent {
23305
23358
  : this.calculatedQualityScore;
23306
23359
  }
23307
23360
  get calculatedQualityScore() {
23308
- return Math.round((this.items.filter(({ value }) => value === true).length * 100) /
23309
- this.items.length);
23361
+ return Math.round((this.items.filter(({ value }) => value).length * 100) / this.items.length);
23310
23362
  }
23311
23363
  showMenu() {
23312
23364
  this.isMenuShown = true;
@@ -23931,11 +23983,11 @@ class MarkdownParserComponent {
23931
23983
  return marked.parse(this.textContent);
23932
23984
  }
23933
23985
  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 }); }
23986
+ 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}: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 }); }
23935
23987
  }
23936
23988
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MarkdownParserComponent, decorators: [{
23937
23989
  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"] }]
23990
+ 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}: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"] }]
23939
23991
  }], propDecorators: { textContent: [{
23940
23992
  type: Input
23941
23993
  }] } });
@@ -23946,16 +23998,32 @@ class MetadataInfoComponent {
23946
23998
  }
23947
23999
  get hasUsage() {
23948
24000
  return (this.metadata.extras?.isOpenData === true ||
23949
- this.metadata.useLimitations?.length ||
23950
- this.metadata.accessConstraints?.length);
24001
+ (this.metadata.legalConstraints?.length > 0 &&
24002
+ this.legalConstraints.length > 0) ||
24003
+ (this.metadata.otherConstraints?.length > 0 &&
24004
+ this.otherConstraints.length > 0) ||
24005
+ (this.metadata.licenses?.length > 0 && this.licenses.length > 0));
24006
+ }
24007
+ get legalConstraints() {
24008
+ let array = [];
24009
+ if (this.metadata.legalConstraints?.length) {
24010
+ array = array.concat(this.metadata.legalConstraints.filter((c) => c.text).map((c) => c.text));
24011
+ }
24012
+ return array;
23951
24013
  }
23952
- get usages() {
24014
+ get otherConstraints() {
23953
24015
  let array = [];
23954
- if (this.metadata.useLimitations?.length) {
23955
- array = array.concat(this.metadata.useLimitations);
24016
+ if (this.metadata.otherConstraints?.length) {
24017
+ array = array.concat(this.metadata.otherConstraints.filter((c) => c.text).map((c) => c.text));
23956
24018
  }
23957
- if (this.metadata.accessConstraints?.length) {
23958
- array = array.concat(this.metadata.accessConstraints.map((c) => c.text));
24019
+ return array;
24020
+ }
24021
+ get licenses() {
24022
+ let array = [];
24023
+ if (this.metadata.licenses?.length) {
24024
+ array = array.concat(this.metadata.licenses
24025
+ .filter((c) => c.text)
24026
+ .map((c) => ({ text: c.text, url: c.url })));
23959
24027
  }
23960
24028
  return array;
23961
24029
  }
@@ -23977,16 +24045,12 @@ class MetadataInfoComponent {
23977
24045
  onKeywordClick(keyword) {
23978
24046
  this.keyword.emit(keyword);
23979
24047
  }
23980
- copyText() {
23981
- navigator.clipboard.writeText(this.metadata.uniqueIdentifier);
23982
- event.target.blur();
23983
- }
23984
24048
  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 }); }
24049
+ 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.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: 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: 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 }); }
23986
24050
  }
23987
24051
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: MetadataInfoComponent, decorators: [{
23988
24052
  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"] }]
24053
+ 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.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"] }]
23990
24054
  }], propDecorators: { metadata: [{
23991
24055
  type: Input
23992
24056
  }], incomplete: [{
@@ -25892,7 +25956,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
25892
25956
 
25893
25957
  const DEFAULT_PARAMS = {
25894
25958
  OFFSET: '',
25895
- LIMIT: '',
25959
+ LIMIT: '-1',
25896
25960
  FORMAT: 'json',
25897
25961
  };
25898
25962
  class RecordApiFormComponent {
@@ -25921,6 +25985,8 @@ class RecordApiFormComponent {
25921
25985
  }
25922
25986
  return outputUrl;
25923
25987
  }));
25988
+ this.noLimitChecked$ = this.limit$.pipe(map$2((limit) => limit === '-1' || limit === ''));
25989
+ this.displayLimit$ = this.limit$.pipe(map$2((limit) => (limit !== '-1' ? limit : '')));
25924
25990
  }
25925
25991
  set apiLink(value) {
25926
25992
  this.apiBaseUrl = value ? value.url.href : undefined;
@@ -25930,10 +25996,11 @@ class RecordApiFormComponent {
25930
25996
  this.offset$.next(value);
25931
25997
  }
25932
25998
  setLimit(value) {
25933
- this.limit$.next(value);
25999
+ const newLimit = value === '' ? '-1' : value;
26000
+ this.limit$.next(newLimit);
25934
26001
  }
25935
26002
  setFormat(value) {
25936
- this.format$.next(value);
26003
+ this.format$.next(String(value));
25937
26004
  }
25938
26005
  resetUrl() {
25939
26006
  this.offset$.next(DEFAULT_PARAMS.OFFSET);
@@ -25941,11 +26008,11 @@ class RecordApiFormComponent {
25941
26008
  this.format$.next(DEFAULT_PARAMS.FORMAT);
25942
26009
  }
25943
26010
  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\"\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) === ''\"\n (change)=\"setLimit('')\"\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 }); }
26011
+ 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
26012
  }
25946
26013
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: RecordApiFormComponent, decorators: [{
25947
26014
  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\"\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) === ''\"\n (change)=\"setLimit('')\"\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"] }]
26015
+ 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
26016
  }], propDecorators: { apiLink: [{
25950
26017
  type: Input
25951
26018
  }] } });
@@ -27708,10 +27775,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImpor
27708
27775
  class AbstractSearchField {
27709
27776
  }
27710
27777
  class SimpleSearchField {
27711
- constructor(esFieldName, order = 'asc', injector) {
27778
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27712
27779
  this.esFieldName = esFieldName;
27713
- this.order = order;
27714
27780
  this.injector = injector;
27781
+ this.order = order;
27782
+ this.orderType = orderType;
27715
27783
  this.repository = this.injector.get(RecordsRepositoryInterface);
27716
27784
  // FIXME: this is required to register runtime fields; abstract this as well
27717
27785
  this.esService = this.injector.get(ElasticsearchService);
@@ -27722,12 +27790,12 @@ class SimpleSearchField {
27722
27790
  type: 'terms',
27723
27791
  field: this.esFieldName,
27724
27792
  limit: 1000,
27725
- sort: [this.order, 'key'],
27793
+ sort: [this.order, this.orderType],
27726
27794
  },
27727
27795
  };
27728
27796
  }
27729
27797
  async getBucketLabel(bucket) {
27730
- return bucket.term;
27798
+ return bucket.term.toString();
27731
27799
  }
27732
27800
  getAvailableValues() {
27733
27801
  return this.repository.aggregate(this.getAggregations()).pipe(map$1((response) => response[this.esFieldName].buckets || []), switchMap((buckets) => {
@@ -27755,9 +27823,13 @@ class SimpleSearchField {
27755
27823
  return of(values);
27756
27824
  }
27757
27825
  }
27758
- class KeySearchField extends SimpleSearchField {
27759
- constructor() {
27760
- super(...arguments);
27826
+ class TranslatedSearchField extends SimpleSearchField {
27827
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27828
+ super(esFieldName, injector, order, orderType);
27829
+ this.esFieldName = esFieldName;
27830
+ this.injector = injector;
27831
+ this.order = order;
27832
+ this.orderType = orderType;
27761
27833
  this.platformService = this.injector.get(PlatformServiceInterface);
27762
27834
  }
27763
27835
  async getTranslation(key) {
@@ -27767,26 +27839,36 @@ class KeySearchField extends SimpleSearchField {
27767
27839
  return (await this.getTranslation(bucket.term)) || bucket.term;
27768
27840
  }
27769
27841
  getAvailableValues() {
27842
+ if (this.orderType === 'count')
27843
+ return super.getAvailableValues();
27770
27844
  // sort values by alphabetical order
27771
27845
  return super
27772
27846
  .getAvailableValues()
27773
27847
  .pipe(map$1((values) => values.sort((a, b) => new Intl.Collator().compare(a.label, b.label))));
27774
27848
  }
27775
27849
  }
27776
- class ThesaurusField extends KeySearchField {
27777
- constructor(esFieldName, thesaurusName, order = 'asc', injector) {
27778
- super(esFieldName, order, injector);
27779
- this.thesaurusName = thesaurusName;
27850
+ /**
27851
+ * This search field will either target the `.default` field, or a specific `.langxyz` field according
27852
+ * to the defined METADATA_LANGUAGE token
27853
+ * The provided ES field name should not include any prefix such as `.langeng`
27854
+ */
27855
+ class MultilingualSearchField extends SimpleSearchField {
27856
+ constructor(esFieldName, injector, order = 'asc', orderType = 'key') {
27857
+ super(esFieldName, injector, order, orderType);
27858
+ this.esFieldName = esFieldName;
27859
+ this.injector = injector;
27860
+ this.order = order;
27861
+ this.orderType = orderType;
27780
27862
  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)));
27863
+ this.searchLanguage = this.injector.get(METADATA_LANGUAGE, null);
27864
+ // note: we're excluding the metadata language "current" value because that would produce
27865
+ // permalinks that might not work for different users
27866
+ if (this.searchLanguage && this.searchLanguage !== 'current') {
27867
+ this.esFieldName += `.lang${this.searchLanguage}`;
27868
+ }
27869
+ else {
27870
+ this.esFieldName += '.default';
27871
+ }
27790
27872
  }
27791
27873
  }
27792
27874
  class FullTextSearchField {
@@ -27806,7 +27888,7 @@ marker('search.filters.isSpatial.yes');
27806
27888
  marker('search.filters.isSpatial.no');
27807
27889
  class IsSpatialSearchField extends SimpleSearchField {
27808
27890
  constructor(injector) {
27809
- super('isSpatial', 'asc', injector);
27891
+ super('isSpatial', injector, 'asc');
27810
27892
  this.translateService = this.injector.get(TranslateService);
27811
27893
  this.esService.registerRuntimeField('isSpatial', `String result = 'no';
27812
27894
  String formats = doc.format.join('|').toLowerCase();
@@ -27856,7 +27938,7 @@ marker('search.filters.license.unknown');
27856
27938
  // Note: values are inspired from https://doc.data.gouv.fr/moissonnage/licences/
27857
27939
  class LicenseSearchField extends SimpleSearchField {
27858
27940
  constructor(injector) {
27859
- super('license', 'asc', injector);
27941
+ super('license', injector, 'asc');
27860
27942
  this.translateService = this.injector.get(TranslateService);
27861
27943
  this.esService.registerRuntimeField('license', `String raw = '';
27862
27944
  if (doc.containsKey('licenseObject.default.keyword') && doc['licenseObject.default.keyword'].length > 0)
@@ -27940,7 +28022,7 @@ class OrganizationSearchField {
27940
28022
  }
27941
28023
  class OwnerSearchField extends SimpleSearchField {
27942
28024
  constructor(injector) {
27943
- super('owner', 'asc', injector);
28025
+ super('owner', injector, 'asc');
27944
28026
  }
27945
28027
  getAvailableValues() {
27946
28028
  return of([]);
@@ -27949,6 +28031,7 @@ class OwnerSearchField extends SimpleSearchField {
27949
28031
 
27950
28032
  marker('search.filters.format');
27951
28033
  marker('search.filters.inspireKeyword');
28034
+ marker('search.filters.keyword');
27952
28035
  marker('search.filters.isSpatial');
27953
28036
  marker('search.filters.license');
27954
28037
  marker('search.filters.publicationYear');
@@ -27966,13 +28049,14 @@ class FieldsService {
27966
28049
  this.injector = injector;
27967
28050
  this.fields = {
27968
28051
  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),
28052
+ format: new SimpleSearchField('format', this.injector, 'asc'),
28053
+ resourceType: new TranslatedSearchField('resourceType', this.injector, 'asc'),
28054
+ representationType: new TranslatedSearchField('cl_spatialRepresentationType.key', this.injector, 'asc'),
28055
+ publicationYear: new SimpleSearchField('publicationYearForResource', this.injector, 'desc'),
28056
+ topic: new TranslatedSearchField('cl_topic.key', this.injector, 'asc'),
28057
+ inspireKeyword: new TranslatedSearchField('th_httpinspireeceuropaeutheme-theme.link', this.injector, 'asc'),
28058
+ keyword: new MultilingualSearchField('tag', this.injector, 'desc', 'count'),
28059
+ documentStandard: new SimpleSearchField('documentStandard', this.injector, 'asc'),
27976
28060
  isSpatial: new IsSpatialSearchField(this.injector),
27977
28061
  q: new FullTextSearchField(),
27978
28062
  license: new LicenseSearchField(this.injector),