geonetwork-ui 2.6.0-dev.97a89c313 → 2.6.0-dev.9b9a26109

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 (133) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +39 -4
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
  3. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.mjs +8 -4
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.mjs +5 -2
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +3 -3
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +2 -2
  7. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +3 -3
  8. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +60 -9
  9. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +7 -1
  10. package/esm2022/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.mjs +2 -1
  11. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  12. package/esm2022/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.mjs +266 -11
  13. package/esm2022/libs/feature/record/src/lib/state/mdview.actions.mjs +3 -1
  14. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +7 -1
  15. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +3 -1
  16. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +7 -1
  17. package/esm2022/libs/feature/record/src/lib/state/mdview.selectors.mjs +3 -1
  18. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +13 -10
  19. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +19 -34
  20. package/esm2022/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.mjs +59 -0
  21. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +20 -10
  22. package/esm2022/libs/ui/search/src/index.mjs +2 -1
  23. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +21 -12
  24. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +39 -18
  25. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +10 -4
  26. package/esm2022/libs/util/i18n/src/lib/i18n.constants.mjs +42 -1
  27. package/esm2022/libs/util/i18n/src/lib/language-codes.mjs +24 -2
  28. package/esm2022/translations/de.json +32 -6
  29. package/esm2022/translations/en.json +32 -6
  30. package/esm2022/translations/es.json +31 -5
  31. package/esm2022/translations/fr.json +32 -6
  32. package/esm2022/translations/it.json +31 -5
  33. package/esm2022/translations/nl.json +31 -5
  34. package/esm2022/translations/pt.json +31 -5
  35. package/fesm2022/geonetwork-ui.mjs +887 -205
  36. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  37. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  38. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +0 -1
  39. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  40. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +1 -0
  41. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +1 -1
  42. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +1 -1
  43. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  44. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  45. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts +1 -1
  46. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  47. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +13 -2
  48. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  49. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +2 -0
  50. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  51. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts +1 -0
  52. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts.map +1 -1
  53. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +6 -0
  54. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  55. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts +48 -3
  56. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts.map +1 -1
  57. package/libs/feature/record/src/lib/state/mdview.actions.d.ts +10 -0
  58. package/libs/feature/record/src/lib/state/mdview.actions.d.ts.map +1 -1
  59. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +6 -0
  60. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  61. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +2 -0
  62. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  63. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts +2 -0
  64. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  65. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts +2 -0
  66. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts.map +1 -1
  67. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +6 -5
  68. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  69. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts +3 -6
  70. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts.map +1 -1
  71. package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts +14 -0
  72. package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts.map +1 -0
  73. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +4 -2
  74. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -1
  75. package/libs/ui/search/src/index.d.ts +1 -0
  76. package/libs/ui/search/src/index.d.ts.map +1 -1
  77. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +4 -3
  78. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -1
  79. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +10 -4
  80. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  81. package/libs/ui/search/src/lib/ui-search.module.d.ts +2 -1
  82. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  83. package/libs/util/i18n/src/lib/i18n.constants.d.ts +1 -0
  84. package/libs/util/i18n/src/lib/i18n.constants.d.ts.map +1 -1
  85. package/libs/util/i18n/src/lib/language-codes.d.ts +23 -1
  86. package/libs/util/i18n/src/lib/language-codes.d.ts.map +1 -1
  87. package/package.json +1 -1
  88. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +1 -1
  89. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +61 -4
  90. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +0 -1
  91. package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +13 -3
  92. package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +5 -1
  93. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +6 -3
  94. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +4 -1
  95. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +2 -2
  96. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +96 -9
  97. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +11 -0
  98. package/src/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.ts +3 -0
  99. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +6 -0
  100. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +49 -0
  101. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.html +117 -11
  102. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.ts +316 -6
  103. package/src/libs/feature/record/src/lib/state/mdview.actions.ts +10 -0
  104. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +22 -0
  105. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +4 -0
  106. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +12 -0
  107. package/src/libs/feature/record/src/lib/state/mdview.selectors.ts +9 -0
  108. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +1 -0
  109. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +13 -3
  110. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +7 -75
  111. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +20 -51
  112. package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.html +69 -0
  113. package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.ts +61 -0
  114. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +3 -2
  115. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +13 -6
  116. package/src/libs/ui/search/src/index.ts +1 -0
  117. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +16 -6
  118. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +15 -11
  119. package/src/libs/ui/search/src/lib/results-table/results-table.component.css +4 -0
  120. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +31 -27
  121. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +33 -15
  122. package/src/libs/ui/search/src/lib/ui-search.module.ts +3 -0
  123. package/src/libs/util/i18n/src/lib/i18n.constants.ts +42 -0
  124. package/src/libs/util/i18n/src/lib/language-codes.ts +23 -1
  125. package/tailwind.base.css +1 -1
  126. package/translations/de.json +32 -6
  127. package/translations/en.json +32 -6
  128. package/translations/es.json +31 -5
  129. package/translations/fr.json +32 -6
  130. package/translations/it.json +31 -5
  131. package/translations/nl.json +31 -5
  132. package/translations/pt.json +31 -5
  133. package/translations/sk.json +31 -5
@@ -14,10 +14,10 @@ import * as i1$1 from '@ngx-translate/core';
14
14
  import { TranslateCompiler, TranslateLoader, TranslateModule, TranslateService } from '@ngx-translate/core';
15
15
  import { TranslateMessageFormatCompiler } from 'ngx-translate-messageformat-compiler';
16
16
  import { TranslateHttpLoader } from '@ngx-translate/http-loader';
17
- import { map as map$1, catchError, tap as tap$1, shareReplay, filter, startWith, withLatestFrom, switchMap as switchMap$1, take, mergeMap, throttleTime, distinctUntilChanged, debounceTime, finalize, delay, first as first$1, share, pairwise, defaultIfEmpty, toArray } from 'rxjs/operators';
17
+ import { map as map$1, shareReplay, catchError, tap as tap$1, filter, startWith, withLatestFrom, switchMap as switchMap$1, take, mergeMap, throttleTime, distinctUntilChanged, debounceTime, finalize, delay, first as first$1, share, pairwise, defaultIfEmpty, toArray } from 'rxjs/operators';
18
18
  import * as i1$2 from '@angular/common';
19
- import { CommonModule, NgSwitch, NgSwitchCase, NgSwitchDefault, NgClass, NgIf, NgTemplateOutlet, NgOptimizedImage, DatePipe } from '@angular/common';
20
- import { of, map as map$2, lastValueFrom, Subject, switchMap, combineLatest, from, exhaustMap, throwError, forkJoin, takeLast, firstValueFrom, merge, BehaviorSubject, fromEvent, animationFrameScheduler, ReplaySubject, Subscription, first, distinctUntilChanged as distinctUntilChanged$1, timer, filter as filter$1, tap as tap$2, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, startWith as startWith$1, catchError as catchError$1, takeUntil, EMPTY, mergeMap as mergeMap$1, withLatestFrom as withLatestFrom$1, shareReplay as shareReplay$1, pairwise as pairwise$1 } from 'rxjs';
19
+ import { CommonModule, NgSwitch, NgSwitchCase, NgSwitchDefault, NgIf, NgClass, NgTemplateOutlet, NgOptimizedImage, DatePipe } from '@angular/common';
20
+ import { of, map as map$2, lastValueFrom, Subject, switchMap, combineLatest, from, exhaustMap, throwError, forkJoin, takeLast, firstValueFrom, merge, BehaviorSubject, fromEvent, animationFrameScheduler, ReplaySubject, Subscription, first, distinctUntilChanged as distinctUntilChanged$1, timer, filter as filter$1, take as take$1, tap as tap$2, Observable, buffer, debounceTime as debounceTime$1, combineLatestWith, startWith as startWith$1, catchError as catchError$1, takeUntil, EMPTY, mergeMap as mergeMap$1, withLatestFrom as withLatestFrom$1, shareReplay as shareReplay$1, pairwise as pairwise$1 } from 'rxjs';
21
21
  import { lt, valid, coerce, satisfies, ltr } from 'semver';
22
22
  import chroma from 'chroma-js';
23
23
  import { WmtsEndpoint, WmsEndpoint, WfsEndpoint, OgcApiEndpoint, sharedFetch, useCache, TmsEndpoint } from '@camptocamp/ogc-client';
@@ -26,7 +26,7 @@ import { createAction, props, createReducer, on, createFeatureSelector, createSe
26
26
  import EmblaCarousel from 'embla-carousel';
27
27
  import * as i2$2 from '@ng-icons/core';
28
28
  import { provideIcons, NgIcon, NgIconComponent, provideNgIconsConfig, NgIconsModule } from '@ng-icons/core';
29
- import { iconoirNavArrowRight, iconoirNavArrowLeft, iconoirNavArrowDown, iconoirNavArrowUp, iconoirSearch, iconoirLongArrowDownLeft, iconoirCalendar, iconoirLink, iconoirArrowUp, iconoirCloudUpload, iconoirFramePlusIn, iconoirExpand, iconoirReduce, iconoirAppleWallet, iconoirAppleShortcuts, iconoirCode, iconoirCreditCard, iconoirInternet, iconoirSettings, iconoirDownload, iconoirMediaImage, iconoirMediaImageXmark, iconoirBin, iconoirPlus, iconoirUser, iconoirLock, iconoirImport, iconoirLightBulbOn, iconoirArrowLeft, iconoirAttachment, iconoirRefresh } from '@ng-icons/iconoir';
29
+ import { iconoirNavArrowRight, iconoirNavArrowLeft, iconoirNavArrowDown, iconoirNavArrowUp, iconoirSearch, iconoirLongArrowDownLeft, iconoirCalendar, iconoirLink, iconoirArrowUp, iconoirCloudUpload, iconoirFramePlusIn, iconoirExpand, iconoirReduce, iconoirAppleWallet, iconoirAppleShortcuts, iconoirCode, iconoirCreditCard, iconoirInternet, iconoirSettings, iconoirDownload, iconoirMediaImage, iconoirMediaImageXmark, iconoirBin, iconoirPlus, iconoirUser, iconoirLock, iconoirTranslate, iconoirImport, iconoirLightBulbOn, iconoirArrowLeft, iconoirAttachment, iconoirRefresh, iconoirCheckCircle, iconoirCircle } from '@ng-icons/iconoir';
30
30
  import { matExpandMore, matExpandLess, matAdd, matRemove, matClose, matContentCopy, matSearch, matStar, matStarBorder, matChevronLeft, matChevronRight, matArrowBackIos, matArrowForwardIos, matCheck, matWarningAmber, matFace, matQuestionMark, matMoodBad, matZoomOutMap, matOpenInNew, matMailOutline, matPersonOutline, matCheckCircleOutline, matWarning, matMoreVert, matCorporateFare } from '@ng-icons/material-icons/baseline';
31
31
  import * as i3 from '@angular/material/tooltip';
32
32
  import { MatTooltipModule } from '@angular/material/tooltip';
@@ -41,7 +41,7 @@ import { TagInputModule } from 'ngx-chips';
41
41
  import * as i1$4 from '@angular/material/progress-spinner';
42
42
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
43
43
  import tippy from 'tippy.js';
44
- import { matErrorOutlineOutline, matLocationSearchingOutline, matInfoOutline, matEmailOutline, matPhoneOutline, matLocationOnOutline, matComputerOutline, matCallOutline, matSwipeOutline, matMailOutline as matMailOutline$1, matWarningAmberOutline, matCloseOutline, matSendOutline, matMapOutline, matCloudDownloadOutline, matHomeWorkOutline, matLayersOutline, matAddCircleOutlineOutline } from '@ng-icons/material-icons/outline';
44
+ import { matErrorOutlineOutline, matLocationSearchingOutline, matInfoOutline, matEmailOutline, matPhoneOutline, matLocationOnOutline, matComputerOutline, matCallOutline, matSwipeOutline, matMailOutline as matMailOutline$1, matWarningAmberOutline, matCloseOutline, matSendOutline, matMapOutline, matCloudDownloadOutline, matHomeWorkOutline, matLayersOutline, matAddCircleOutlineOutline, matMoreHorizOutline } from '@ng-icons/material-icons/outline';
45
45
  import * as i2 from '@angular/material/core';
46
46
  import { MatNativeDateModule, MAT_DATE_LOCALE, DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core';
47
47
  import * as i1$6 from '@angular/material/checkbox';
@@ -909,6 +909,17 @@ const LANG_3_TO_2_MAPPER = {
909
909
  chi: 'zh',
910
910
  slo: 'sk',
911
911
  roh: 'rm',
912
+ ara: 'ar',
913
+ dan: 'da',
914
+ nor: 'no',
915
+ pol: 'pl',
916
+ swe: 'sv',
917
+ tur: 'tr',
918
+ arm: 'hy',
919
+ aze: 'az',
920
+ geo: 'ka',
921
+ ukr: 'uk',
922
+ wel: 'cy',
912
923
  };
913
924
  const LANGUAGE_NAMES = {
914
925
  en: 'English',
@@ -926,7 +937,18 @@ const LANGUAGE_NAMES = {
926
937
  ru: 'Русский',
927
938
  zh: '中文',
928
939
  sk: 'Slovenčina',
929
- roh: 'Rumantsch',
940
+ rm: 'Rumantsch',
941
+ ar: 'العربية',
942
+ da: 'Dansk',
943
+ no: 'Norsk',
944
+ pl: 'Polski',
945
+ sv: 'Swedish',
946
+ tr: 'Türkçe',
947
+ hy: 'հայերեն',
948
+ az: 'Azərbaycan dili',
949
+ ka: 'ქართული',
950
+ uk: 'українська',
951
+ wel: 'Cymraeg',
930
952
  };
931
953
  const LANG_2_TO_3_MAPPER = Object.entries(LANG_3_TO_2_MAPPER).reduce((mapperObject, langEntry) => {
932
954
  return { ...mapperObject, [langEntry[1]]: langEntry[0] };
@@ -1437,10 +1459,10 @@ function readSpatialExtents$1(rootEl) {
1437
1459
  }
1438
1460
  function readOtherLanguages$1(rootEl) {
1439
1461
  const defaultLanguage = readDefaultLanguage$2(rootEl);
1440
- return pipe(findChildrenElement('gmd:locale', false), mapArray(pipe(findChildElement('gmd:LanguageCode'), readAttribute('codeListValue'), map((lang) => LANG_3_TO_2_MAPPER[lang.toLowerCase()]))), map((languages) => (languages.length ? languages : [defaultLanguage])))(rootEl);
1462
+ return pipe(findChildrenElement('gmd:locale', false), mapArray(pipe(findChildElement('lan:LanguageCode'), readAttribute('codeListValue'), map((lang) => LANG_3_TO_2_MAPPER[lang.toLowerCase()] ?? lang))), map((languages) => languages.filter((lang) => lang !== null)), map((languages) => (languages.length ? languages : [defaultLanguage])))(rootEl);
1441
1463
  }
1442
1464
  function readDefaultLanguage$2(rootEl) {
1443
- return pipe(findChildElement('gmd:language', false), findChildElement('gmd:LanguageCode'), readAttribute('codeListValue'), map((lang) => (lang ? LANG_3_TO_2_MAPPER[lang.toLowerCase()] : null)))(rootEl);
1465
+ return pipe(findChildElement('gmd:language', false), findChildElement('lan:LanguageCode'), readAttribute('codeListValue'), map((lang) => (lang ? LANG_3_TO_2_MAPPER[lang.toLowerCase()] : null)))(rootEl);
1444
1466
  }
1445
1467
  function readResourceIdentifier(rootEl) {
1446
1468
  return pipe(findIdentification(), findNestedElement('gmd:citation', 'gmd:CI_Citation', 'gmd:identifier', 'gmd:MD_Identifier', 'gmd:code'), extractCharacterString())(rootEl);
@@ -1936,7 +1958,7 @@ function writeLanguages(record, rootEl) {
1936
1958
  if (!record.otherLanguages?.length) {
1937
1959
  return;
1938
1960
  }
1939
- const createLanguageEl = (lang) => pipe(createNestedElement('gmd:locale', 'gmd:PT_Locale'), writeAttribute('id', lang.toUpperCase()), createNestedChild('gmd:languageCode', 'gmd:LanguageCode'), writeAttribute('codeList', 'http://www.loc.gov/standards/iso639-2/'), writeAttribute('codeListValue', LANG_2_TO_3_MAPPER[lang]));
1961
+ const createLanguageEl = (lang) => pipe(createNestedElement('gmd:locale', 'gmd:PT_Locale'), writeAttribute('id', lang.toUpperCase()), createNestedChild('gmd:languageCode', 'gmd:LanguageCode'), writeAttribute('codeList', 'http://www.loc.gov/standards/iso639-2/'), writeAttribute('codeListValue', lang.length === 2 ? LANG_2_TO_3_MAPPER[lang] : lang));
1940
1962
  // add new languages (only if other than default one)
1941
1963
  appendChildren(createLanguageEl(record.defaultLanguage), ...record.otherLanguages.map(createLanguageEl))(rootEl);
1942
1964
  }
@@ -2374,13 +2396,17 @@ function readOnlineResources$1(rootEl) {
2374
2396
  return pipe(findNestedElements('mrd:distributionInfo', 'mrd:MD_Distribution'), mapArray(getOnlineResources), flattenArray())(rootEl);
2375
2397
  }
2376
2398
  function readLocaleElement() {
2377
- return pipe(findChildElement('lan:LanguageCode'), readAttribute('codeListValue'), map((lang) => (lang ? LANG_3_TO_2_MAPPER[lang.toLowerCase()] : null)));
2399
+ return pipe(findChildElement('lan:LanguageCode'), readAttribute('codeListValue'), map((lang) => {
2400
+ const normalized = lang?.toLowerCase();
2401
+ const iso2Lang = LANG_3_TO_2_MAPPER[normalized];
2402
+ return iso2Lang ?? lang;
2403
+ }));
2378
2404
  }
2379
2405
  function readDefaultLanguage$1(rootEl) {
2380
2406
  return pipe(findChildElement('mdb:defaultLocale', false), readLocaleElement())(rootEl);
2381
2407
  }
2382
2408
  function readOtherLanguages(rootEl) {
2383
- return pipe(findChildrenElement('mdb:otherLocale', false), mapArray(readLocaleElement()))(rootEl);
2409
+ return pipe(findChildrenElement('mdb:otherLocale', false), mapArray(readLocaleElement()), map((languages) => languages.filter((lang) => lang !== null)))(rootEl);
2384
2410
  }
2385
2411
 
2386
2412
  function writeUniqueIdentifier$1(record, rootEl) {
@@ -2513,7 +2539,10 @@ function writeOnlineResources(record, rootEl) {
2513
2539
  });
2514
2540
  }
2515
2541
  function writeLocaleElement(language) {
2516
- const lang3 = LANG_2_TO_3_MAPPER[language.toLowerCase()];
2542
+ const normalizedLang = language.toLowerCase();
2543
+ const lang3 = normalizedLang.length === 2
2544
+ ? LANG_2_TO_3_MAPPER[normalizedLang]
2545
+ : normalizedLang;
2517
2546
  return pipe(findChildOrCreate('lan:PT_Locale'), writeAttribute('id', language.toUpperCase()), findNestedChildOrCreate('lan:language', 'gmd:LanguageCode'), writeAttribute('codeList', 'http://www.loc.gov/standards/iso639-2/'), writeAttribute('codeListValue', lang3));
2518
2547
  }
2519
2548
  function writeDefaultLanguage(record, rootEl) {
@@ -18502,9 +18531,50 @@ marker('language.pt');
18502
18531
  marker('language.ru');
18503
18532
  marker('language.zh');
18504
18533
  marker('language.sk');
18534
+ marker('language.rm');
18535
+ marker('language.ar');
18536
+ marker('language.da');
18537
+ marker('language.no');
18538
+ marker('language.pl');
18539
+ marker('language.sv');
18540
+ marker('language.tr');
18541
+ marker('language.hy');
18542
+ marker('language.az');
18543
+ marker('language.ka');
18544
+ marker('language.uk');
18545
+ marker('language.cy');
18505
18546
  const DEFAULT_LANG = 'en';
18506
18547
  // Caution: changing this can break language selection from third parties!
18507
18548
  const LANGUAGE_STORAGE_KEY = 'geonetwork-ui-language';
18549
+ const SUPPORTED_LANGUAGES = [
18550
+ 'en',
18551
+ 'nl',
18552
+ 'fr',
18553
+ 'de',
18554
+ 'ko',
18555
+ 'es',
18556
+ 'cs',
18557
+ 'ca',
18558
+ 'fi',
18559
+ 'is',
18560
+ 'it',
18561
+ 'pt',
18562
+ 'ru',
18563
+ 'zh',
18564
+ 'sk',
18565
+ 'rm',
18566
+ 'ar',
18567
+ 'da',
18568
+ 'no',
18569
+ 'pl',
18570
+ 'sv',
18571
+ 'tr',
18572
+ 'hy',
18573
+ 'az',
18574
+ 'ka',
18575
+ 'uk',
18576
+ 'cy',
18577
+ ];
18508
18578
  function HttpLoaderFactory(http) {
18509
18579
  return new FileTranslateLoader(http, './assets/i18n/');
18510
18580
  }
@@ -18636,6 +18706,7 @@ var de = {
18636
18706
  "dashboard.labels.mySpace": "Mein Bereich",
18637
18707
  "dashboard.records.all": "Metadatenkatalog",
18638
18708
  "dashboard.records.hasDraft": "",
18709
+ "dashboard.records.isMultilingual": "Dieser Eintrag ist mehrsprachig ({languages})",
18639
18710
  "dashboard.records.myDraft": "Meine Entwürfe",
18640
18711
  "dashboard.records.myRecords": "Meine Datensätze",
18641
18712
  "dashboard.records.search": "Suche nach \"{searchText}\"",
@@ -18810,9 +18881,13 @@ var de = {
18810
18881
  "editor.record.form.license.odc-by": "",
18811
18882
  "editor.record.form.license.pddl": "",
18812
18883
  "editor.record.form.license.unknown": "",
18884
+ "editor.record.form.multilingual.activate": "",
18885
+ "editor.record.form.multilingual.default": "",
18813
18886
  "editor.record.form.multilingual.enable": "",
18887
+ "editor.record.form.multilingual.forbidden": "",
18814
18888
  "editor.record.form.multilingual.open": "",
18815
18889
  "editor.record.form.multilingual.title": "",
18890
+ "editor.record.form.multilingual.validate": "",
18816
18891
  "editor.record.form.page.accessAndContact": "",
18817
18892
  "editor.record.form.page.description": "",
18818
18893
  "editor.record.form.page.resources": "",
@@ -18842,8 +18917,13 @@ var de = {
18842
18917
  "editor.record.loadError.body": "Der Datensatz konnte nicht geladen werden:",
18843
18918
  "editor.record.loadError.closeMessage": "Verstanden",
18844
18919
  "editor.record.loadError.title": "Fehler beim Laden des Datensatzes",
18845
- "editor.record.lock.format": "",
18846
- "editor.record.lock.reason": "",
18920
+ "editor.record.lock.harvested": "",
18921
+ "editor.record.lock.owner": "",
18922
+ "editor.record.lock.resourceType": "",
18923
+ "editor.record.multilingual.confirmation.cancelText": "",
18924
+ "editor.record.multilingual.confirmation.confirmText": "",
18925
+ "editor.record.multilingual.confirmation.message": "",
18926
+ "editor.record.multilingual.confirmation.title": "",
18847
18927
  "editor.record.onlineResource.protocol.other": "",
18848
18928
  "editor.record.onlineResourceError.body": "",
18849
18929
  "editor.record.onlineResourceError.closeMessage": "",
@@ -18904,20 +18984,32 @@ var de = {
18904
18984
  "input.image.uploadErrorLabel": "",
18905
18985
  "input.image.uploadProgressCancel": "",
18906
18986
  "input.image.uploadProgressLabel": "",
18987
+ "language.ar": "",
18988
+ "language.az": "",
18907
18989
  "language.ca": "Katalanisch",
18908
18990
  "language.cs": "Tschechisch",
18991
+ "language.cy": "",
18992
+ "language.da": "",
18909
18993
  "language.de": "Deutsch",
18910
18994
  "language.en": "Englisch",
18911
18995
  "language.es": "Spanisch",
18912
18996
  "language.fi": "Finnisch",
18913
18997
  "language.fr": "Französisch",
18998
+ "language.hy": "",
18914
18999
  "language.is": "Isländisch",
18915
19000
  "language.it": "Italienisch",
19001
+ "language.ka": "",
18916
19002
  "language.ko": "Koreanisch",
18917
19003
  "language.nl": "Niederländisch",
19004
+ "language.no": "",
19005
+ "language.pl": "",
18918
19006
  "language.pt": "Portugiesisch",
19007
+ "language.rm": "",
18919
19008
  "language.ru": "Russisch",
18920
19009
  "language.sk": "Slowakisch",
19010
+ "language.sv": "",
19011
+ "language.tr": "",
19012
+ "language.uk": "",
18921
19013
  "language.zh": "Chinesisch",
18922
19014
  "map.add.layer": "Eine Ebene hinzufügen",
18923
19015
  "map.add.layer.catalog": "Aus dem Katalog",
@@ -18964,6 +19056,7 @@ var de = {
18964
19056
  "record.action.duplicate": "",
18965
19057
  "record.action.duplicating": "",
18966
19058
  "record.action.rollback": "",
19059
+ "record.action.switchLang": "",
18967
19060
  "record.action.view": "Anzeigen",
18968
19061
  "record.card.metadata.contact": "",
18969
19062
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
@@ -19014,9 +19107,15 @@ var de = {
19014
19107
  "record.metadata.download": "Downloads",
19015
19108
  "record.metadata.feature.catalog": "",
19016
19109
  "record.metadata.formats": "Formate",
19110
+ "record.metadata.isGeographical": "Geographischer Datensatz",
19017
19111
  "record.metadata.keywords": "Stichworte",
19018
19112
  "record.metadata.languages": "Sprachen",
19019
19113
  "record.metadata.lastUpdate": "Zuletzt aktualisiert am {date}",
19114
+ "record.metadata.linked.datasets": "Verknüpfte Datensätze",
19115
+ "record.metadata.linked.records": "Verknüpfte Inhalte",
19116
+ "record.metadata.linked.reuses": "Verknüpfte Wiederverwendungen",
19117
+ "record.metadata.linked.services": "Verknüpfte Dienste",
19118
+ "record.metadata.linked.sourceDatasets": "Quelldatensätze",
19020
19119
  "record.metadata.links": "Links",
19021
19120
  "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
19022
19121
  "record.metadata.otherConstraints": "Zusätzliche Bedingungen",
@@ -19043,8 +19142,7 @@ var de = {
19043
19142
  "record.metadata.quality.topic.success": "Thema angegeben",
19044
19143
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
19045
19144
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
19046
- "record.metadata.related": "Ähnliche Datensätze",
19047
- "record.metadata.related.contents": "",
19145
+ "record.metadata.related": "Entdecken Sie den Katalog",
19048
19146
  "record.metadata.ressources.and.links": "Ressourcen und Links",
19049
19147
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
19050
19148
  "record.metadata.status": "Status",
@@ -19056,7 +19154,6 @@ var de = {
19056
19154
  "record.metadata.temporalExtent.untilDate": "Bis {end}",
19057
19155
  "record.metadata.title": "Titel",
19058
19156
  "record.metadata.topics": "Kategorien",
19059
- "record.metadata.isGeographical": "Geographischer Datensatz",
19060
19157
  "record.metadata.uniqueId": "Eindeutige Kennung",
19061
19158
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
19062
19159
  "record.metadata.updatedOn": "Geändert am",
@@ -19176,7 +19273,6 @@ var de = {
19176
19273
  "tooltip.html.copy": "HTML kopieren",
19177
19274
  "tooltip.id.copy": "Eindeutige Kennung kopieren",
19178
19275
  "tooltip.url.copy": "URL kopieren",
19179
- "tooltip.url.open": "URL öffnen",
19180
19276
  "ui.readLess": "Weniger lesen",
19181
19277
  "ui.readMore": "Weiterlesen",
19182
19278
  "wfs.feature.limit": "Zu viele Features, um den WFS-Layer anzuzeigen!",
@@ -19223,6 +19319,7 @@ var en = {
19223
19319
  "dashboard.labels.mySpace": "My space",
19224
19320
  "dashboard.records.all": "Datasets",
19225
19321
  "dashboard.records.hasDraft": "draft",
19322
+ "dashboard.records.isMultilingual": "This record is multilingual ({languages})",
19226
19323
  "dashboard.records.myDraft": "My drafts",
19227
19324
  "dashboard.records.myRecords": "My datasets",
19228
19325
  "dashboard.records.search": "Search for \"{searchText}\"",
@@ -19397,9 +19494,13 @@ var en = {
19397
19494
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
19398
19495
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
19399
19496
  "editor.record.form.license.unknown": "Unknown or absent",
19497
+ "editor.record.form.multilingual.activate": "Activate the languages",
19498
+ "editor.record.form.multilingual.default": "Default",
19400
19499
  "editor.record.form.multilingual.enable": "Multilingual Mode",
19500
+ "editor.record.form.multilingual.forbidden": "You are not allowed to remove the default language",
19401
19501
  "editor.record.form.multilingual.open": "Open the multilingual panel",
19402
19502
  "editor.record.form.multilingual.title": "Translations",
19503
+ "editor.record.form.multilingual.validate": "Validate",
19403
19504
  "editor.record.form.page.accessAndContact": "Information for use",
19404
19505
  "editor.record.form.page.description": "Dataset description",
19405
19506
  "editor.record.form.page.resources": "Resources",
@@ -19429,8 +19530,13 @@ var en = {
19429
19530
  "editor.record.loadError.body": "The dataset could not be loaded:",
19430
19531
  "editor.record.loadError.closeMessage": "Understood",
19431
19532
  "editor.record.loadError.title": "Error loading dataset",
19432
- "editor.record.lock.format": "Record with the format 'service' or 'reuse' are not editable",
19433
- "editor.record.lock.reason": "You are not an editor of the allowed groups",
19533
+ "editor.record.lock.harvested": "Datasets harvested from an external catalog are not editable",
19534
+ "editor.record.lock.owner": "You are not an editor of the allowed groups",
19535
+ "editor.record.lock.resourceType": "Records of a type other than dataset are not editable",
19536
+ "editor.record.multilingual.confirmation.cancelText": "Keep the language(s)",
19537
+ "editor.record.multilingual.confirmation.confirmText": "Remove the language(s)",
19538
+ "editor.record.multilingual.confirmation.message": "You are about to remove one or several languages, which will delete all of the related translations and is irreversible. Do you want to proceed?",
19539
+ "editor.record.multilingual.confirmation.title": "Remove languages",
19434
19540
  "editor.record.onlineResource.protocol.other": "Other",
19435
19541
  "editor.record.onlineResourceError.body": "An error happened while adding the resource:",
19436
19542
  "editor.record.onlineResourceError.closeMessage": "Understood",
@@ -19491,20 +19597,32 @@ var en = {
19491
19597
  "input.image.uploadErrorLabel": "The image could not be uploaded",
19492
19598
  "input.image.uploadProgressCancel": "Cancel",
19493
19599
  "input.image.uploadProgressLabel": "Upload in progress...",
19600
+ "language.ar": "Arabic",
19601
+ "language.az": "Azerbaijani",
19494
19602
  "language.ca": "Catalan",
19495
19603
  "language.cs": "Czech",
19604
+ "language.cy": "Welsh",
19605
+ "language.da": "Danish",
19496
19606
  "language.de": "German",
19497
19607
  "language.en": "English",
19498
19608
  "language.es": "Spanish",
19499
19609
  "language.fi": "Finnish",
19500
19610
  "language.fr": "French",
19611
+ "language.hy": "Armenian",
19501
19612
  "language.is": "Icelandic",
19502
19613
  "language.it": "Italian",
19614
+ "language.ka": "Georgian",
19503
19615
  "language.ko": "Korean",
19504
19616
  "language.nl": "Dutch",
19617
+ "language.no": "Norwegian",
19618
+ "language.pl": "Polish",
19505
19619
  "language.pt": "Portuguese",
19620
+ "language.rm": "Romansh",
19506
19621
  "language.ru": "Russian",
19507
19622
  "language.sk": "Slovak",
19623
+ "language.sv": "Swedish",
19624
+ "language.tr": "Turkish",
19625
+ "language.uk": "Ukrainian",
19508
19626
  "language.zh": "Chinese",
19509
19627
  "map.add.layer": "Add a layer",
19510
19628
  "map.add.layer.catalog": "From the catalog",
@@ -19551,6 +19669,7 @@ var en = {
19551
19669
  "record.action.duplicate": "Duplicate",
19552
19670
  "record.action.duplicating": "Duplicating...",
19553
19671
  "record.action.rollback": "Rollback",
19672
+ "record.action.switchLang": "Switch to default",
19554
19673
  "record.action.view": "View",
19555
19674
  "record.card.metadata.contact": "Metadata Contact",
19556
19675
  "record.externalViewer.open": "Open in the external map viewer",
@@ -19601,9 +19720,15 @@ var en = {
19601
19720
  "record.metadata.download": "Downloads",
19602
19721
  "record.metadata.feature.catalog": "Feature catalog",
19603
19722
  "record.metadata.formats": "Formats",
19723
+ "record.metadata.isGeographical": "Geographical dataset",
19604
19724
  "record.metadata.keywords": "Keywords",
19605
19725
  "record.metadata.languages": "Languages",
19606
19726
  "record.metadata.lastUpdate": "Last updated on {date}",
19727
+ "record.metadata.linked.datasets": "Associated datasets",
19728
+ "record.metadata.linked.records": "Associated content",
19729
+ "record.metadata.linked.reuses": "Associated reuses",
19730
+ "record.metadata.linked.services": "Associated services",
19731
+ "record.metadata.linked.sourceDatasets": "Source datasets",
19607
19732
  "record.metadata.links": "Links",
19608
19733
  "record.metadata.noUsage": "No usage conditions specified for this dataset.",
19609
19734
  "record.metadata.otherConstraints": "Additional Conditions",
@@ -19630,8 +19755,7 @@ var en = {
19630
19755
  "record.metadata.quality.topic.success": "Topic is specified",
19631
19756
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
19632
19757
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
19633
- "record.metadata.related": "Related records",
19634
- "record.metadata.related.contents": "Related content",
19758
+ "record.metadata.related": "Explore the catalog",
19635
19759
  "record.metadata.ressources.and.links": "Resources and links",
19636
19760
  "record.metadata.sheet": "Original metadata",
19637
19761
  "record.metadata.status": "Status",
@@ -19643,7 +19767,6 @@ var en = {
19643
19767
  "record.metadata.temporalExtent.untilDate": "Until { end }",
19644
19768
  "record.metadata.title": "Title",
19645
19769
  "record.metadata.topics": "Categories",
19646
- "record.metadata.isGeographical": "Geographical dataset",
19647
19770
  "record.metadata.uniqueId": "Unique Identifier",
19648
19771
  "record.metadata.updateFrequency": "Data Update Frequency",
19649
19772
  "record.metadata.updatedOn": "Updated on",
@@ -19763,7 +19886,6 @@ var en = {
19763
19886
  "tooltip.html.copy": "Copy HTML",
19764
19887
  "tooltip.id.copy": "Copy unique identifier",
19765
19888
  "tooltip.url.copy": "Copy URL",
19766
- "tooltip.url.open": "Open URL",
19767
19889
  "ui.readLess": "Read less",
19768
19890
  "ui.readMore": "Read more",
19769
19891
  "wfs.feature.limit": "Too many features to display the WFS layer!",
@@ -19810,6 +19932,7 @@ var es = {
19810
19932
  "dashboard.labels.mySpace": "Mi espacio",
19811
19933
  "dashboard.records.all": "Catálogo",
19812
19934
  "dashboard.records.hasDraft": "",
19935
+ "dashboard.records.isMultilingual": "Este registro es multilingüe ({languages})",
19813
19936
  "dashboard.records.myDraft": "Mis borradores",
19814
19937
  "dashboard.records.myRecords": "Mis Registros",
19815
19938
  "dashboard.records.search": "Buscar \"{searchText}\"",
@@ -19984,9 +20107,13 @@ var es = {
19984
20107
  "editor.record.form.license.odc-by": "",
19985
20108
  "editor.record.form.license.pddl": "",
19986
20109
  "editor.record.form.license.unknown": "",
20110
+ "editor.record.form.multilingual.activate": "",
20111
+ "editor.record.form.multilingual.default": "",
19987
20112
  "editor.record.form.multilingual.enable": "",
20113
+ "editor.record.form.multilingual.forbidden": "",
19988
20114
  "editor.record.form.multilingual.open": "",
19989
20115
  "editor.record.form.multilingual.title": "",
20116
+ "editor.record.form.multilingual.validate": "",
19990
20117
  "editor.record.form.page.accessAndContact": "",
19991
20118
  "editor.record.form.page.description": "",
19992
20119
  "editor.record.form.page.resources": "",
@@ -20016,8 +20143,13 @@ var es = {
20016
20143
  "editor.record.loadError.body": "",
20017
20144
  "editor.record.loadError.closeMessage": "",
20018
20145
  "editor.record.loadError.title": "",
20019
- "editor.record.lock.format": "",
20020
- "editor.record.lock.reason": "",
20146
+ "editor.record.lock.harvested": "",
20147
+ "editor.record.lock.owner": "",
20148
+ "editor.record.lock.resourceType": "",
20149
+ "editor.record.multilingual.confirmation.cancelText": "",
20150
+ "editor.record.multilingual.confirmation.confirmText": "",
20151
+ "editor.record.multilingual.confirmation.message": "",
20152
+ "editor.record.multilingual.confirmation.title": "",
20021
20153
  "editor.record.onlineResource.protocol.other": "",
20022
20154
  "editor.record.onlineResourceError.body": "",
20023
20155
  "editor.record.onlineResourceError.closeMessage": "",
@@ -20078,20 +20210,32 @@ var es = {
20078
20210
  "input.image.uploadErrorLabel": "",
20079
20211
  "input.image.uploadProgressCancel": "",
20080
20212
  "input.image.uploadProgressLabel": "",
20213
+ "language.ar": "",
20214
+ "language.az": "",
20081
20215
  "language.ca": "Catalán",
20082
20216
  "language.cs": "Checo",
20217
+ "language.cy": "",
20218
+ "language.da": "",
20083
20219
  "language.de": "Alemán",
20084
20220
  "language.en": "Inglés",
20085
20221
  "language.es": "Español",
20086
20222
  "language.fi": "Finlandés",
20087
20223
  "language.fr": "Francés",
20224
+ "language.hy": "",
20088
20225
  "language.is": "Islandés",
20089
20226
  "language.it": "Italiano",
20227
+ "language.ka": "",
20090
20228
  "language.ko": "Coreano",
20091
20229
  "language.nl": "Neerlandés",
20230
+ "language.no": "",
20231
+ "language.pl": "",
20092
20232
  "language.pt": "Portugués",
20233
+ "language.rm": "",
20093
20234
  "language.ru": "Ruso",
20094
20235
  "language.sk": "Eslovaco",
20236
+ "language.sv": "",
20237
+ "language.tr": "",
20238
+ "language.uk": "",
20095
20239
  "language.zh": "Chino",
20096
20240
  "map.add.layer": "",
20097
20241
  "map.add.layer.catalog": "",
@@ -20138,6 +20282,7 @@ var es = {
20138
20282
  "record.action.duplicate": "",
20139
20283
  "record.action.duplicating": "",
20140
20284
  "record.action.rollback": "",
20285
+ "record.action.switchLang": "",
20141
20286
  "record.action.view": "",
20142
20287
  "record.card.metadata.contact": "",
20143
20288
  "record.externalViewer.open": "",
@@ -20188,9 +20333,15 @@ var es = {
20188
20333
  "record.metadata.download": "",
20189
20334
  "record.metadata.feature.catalog": "",
20190
20335
  "record.metadata.formats": "",
20336
+ "record.metadata.isGeographical": "",
20191
20337
  "record.metadata.keywords": "",
20192
20338
  "record.metadata.languages": "",
20193
20339
  "record.metadata.lastUpdate": "",
20340
+ "record.metadata.linked.datasets": "",
20341
+ "record.metadata.linked.records": "",
20342
+ "record.metadata.linked.reuses": "",
20343
+ "record.metadata.linked.services": "",
20344
+ "record.metadata.linked.sourceDatasets": "",
20194
20345
  "record.metadata.links": "",
20195
20346
  "record.metadata.noUsage": "",
20196
20347
  "record.metadata.otherConstraints": "",
@@ -20218,7 +20369,6 @@ var es = {
20218
20369
  "record.metadata.quality.updateFrequency.failed": "",
20219
20370
  "record.metadata.quality.updateFrequency.success": "",
20220
20371
  "record.metadata.related": "",
20221
- "record.metadata.related.contents": "",
20222
20372
  "record.metadata.ressources.and.links": "Recursos y enlaces",
20223
20373
  "record.metadata.sheet": "",
20224
20374
  "record.metadata.status": "",
@@ -20230,7 +20380,6 @@ var es = {
20230
20380
  "record.metadata.temporalExtent.untilDate": "",
20231
20381
  "record.metadata.title": "",
20232
20382
  "record.metadata.topics": "",
20233
- "record.metadata.isGeographical": "",
20234
20383
  "record.metadata.uniqueId": "",
20235
20384
  "record.metadata.updateFrequency": "",
20236
20385
  "record.metadata.updatedOn": "",
@@ -20350,7 +20499,6 @@ var es = {
20350
20499
  "tooltip.html.copy": "",
20351
20500
  "tooltip.id.copy": "",
20352
20501
  "tooltip.url.copy": "",
20353
- "tooltip.url.open": "",
20354
20502
  "ui.readLess": "",
20355
20503
  "ui.readMore": "",
20356
20504
  "wfs.feature.limit": "",
@@ -20397,6 +20545,7 @@ var fr = {
20397
20545
  "dashboard.labels.mySpace": "Mon espace",
20398
20546
  "dashboard.records.all": "Jeux de données",
20399
20547
  "dashboard.records.hasDraft": "brouillon",
20548
+ "dashboard.records.isMultilingual": "Cet enregistrement est multilingue ({languages})",
20400
20549
  "dashboard.records.myDraft": "Mes brouillons",
20401
20550
  "dashboard.records.myRecords": "Mes jeux de données",
20402
20551
  "dashboard.records.search": "Résultats pour \"{searchText}\"",
@@ -20571,9 +20720,13 @@ var fr = {
20571
20720
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
20572
20721
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
20573
20722
  "editor.record.form.license.unknown": "Inconnue ou absente",
20723
+ "editor.record.form.multilingual.activate": "Activez les langues",
20724
+ "editor.record.form.multilingual.default": "Par défaut",
20574
20725
  "editor.record.form.multilingual.enable": "Mode Multilingue",
20726
+ "editor.record.form.multilingual.forbidden": "Vous ne pouvez pas supprimer le language par défaut",
20575
20727
  "editor.record.form.multilingual.open": "Ouvrir le menu multilingue",
20576
20728
  "editor.record.form.multilingual.title": "Traductions",
20729
+ "editor.record.form.multilingual.validate": "Valider",
20577
20730
  "editor.record.form.page.accessAndContact": "Informations pour l'utilisation",
20578
20731
  "editor.record.form.page.description": "Description du jeu de données",
20579
20732
  "editor.record.form.page.resources": "Ressources",
@@ -20603,8 +20756,13 @@ var fr = {
20603
20756
  "editor.record.loadError.body": "Le jeu de données n'a pas pu être chargé :",
20604
20757
  "editor.record.loadError.closeMessage": "Compris",
20605
20758
  "editor.record.loadError.title": "Erreur lors du chargement",
20606
- "editor.record.lock.format": "Les jeux de données de type 'service' et 'reuse' ne sont pas éditables",
20607
- "editor.record.lock.reason": "Vous n'êtes pas éditeur d'un des groupes autorisés.",
20759
+ "editor.record.lock.harvested": "Les jeux de données moissonnés ne sont pas éditables",
20760
+ "editor.record.lock.owner": "Vous n'êtes pas éditeur d'un des groupes autorisés",
20761
+ "editor.record.lock.resourceType": "Les fiches d'un type autre que jeu de données ne sont pas éditables",
20762
+ "editor.record.multilingual.confirmation.cancelText": "Garder le(s) language(s)",
20763
+ "editor.record.multilingual.confirmation.confirmText": "Supprimer le(s) language(s)",
20764
+ "editor.record.multilingual.confirmation.message": "Vous allez supprimer un ou plusieurs languages, ce qui supprimera toutes les traductions qui y sont liées et est irréversible. Voulez-vous procéder ?",
20765
+ "editor.record.multilingual.confirmation.title": "Suppression de language(s)",
20608
20766
  "editor.record.onlineResource.protocol.other": "Autre",
20609
20767
  "editor.record.onlineResourceError.body": "Une erreur est survenue lors de l'ajout de la ressource :",
20610
20768
  "editor.record.onlineResourceError.closeMessage": "Compris",
@@ -20665,20 +20823,32 @@ var fr = {
20665
20823
  "input.image.uploadErrorLabel": "L'image n'a pas pu être chargée",
20666
20824
  "input.image.uploadProgressCancel": "Annuler",
20667
20825
  "input.image.uploadProgressLabel": "Chargement en cours...",
20826
+ "language.ar": "Arabe",
20827
+ "language.az": "Azéri",
20668
20828
  "language.ca": "Catalan",
20669
20829
  "language.cs": "Tchèque",
20830
+ "language.cy": "Gallois",
20831
+ "language.da": "Danois",
20670
20832
  "language.de": "Allemand",
20671
20833
  "language.en": "Anglais",
20672
20834
  "language.es": "Espagnol",
20673
20835
  "language.fi": "Finnois",
20674
20836
  "language.fr": "Français",
20837
+ "language.hy": "Arménien",
20675
20838
  "language.is": "Islandais",
20676
20839
  "language.it": "Italien",
20840
+ "language.ka": "Géorgien",
20677
20841
  "language.ko": "Coréen",
20678
20842
  "language.nl": "Néerlandais",
20843
+ "language.no": "Norvégien",
20844
+ "language.pl": "Polonais",
20679
20845
  "language.pt": "Portugais",
20846
+ "language.rm": "Romanche",
20680
20847
  "language.ru": "Russe",
20681
20848
  "language.sk": "Slovaque",
20849
+ "language.sv": "Suédois",
20850
+ "language.tr": "Turque",
20851
+ "language.uk": "Ukrainien",
20682
20852
  "language.zh": "Chinois",
20683
20853
  "map.add.layer": "Ajouter une couche",
20684
20854
  "map.add.layer.catalog": "Du catalogue",
@@ -20725,6 +20895,7 @@ var fr = {
20725
20895
  "record.action.duplicate": "Dupliquer",
20726
20896
  "record.action.duplicating": "Duplication...",
20727
20897
  "record.action.rollback": "Restaurer",
20898
+ "record.action.switchLang": "Marquer par défaut",
20728
20899
  "record.action.view": "Voir",
20729
20900
  "record.card.metadata.contact": "Contact de la métadonnée ",
20730
20901
  "record.externalViewer.open": "Ouvrir dans le visualiseur externe",
@@ -20775,9 +20946,15 @@ var fr = {
20775
20946
  "record.metadata.download": "Téléchargements",
20776
20947
  "record.metadata.feature.catalog": "Catalogue d'attributs",
20777
20948
  "record.metadata.formats": "Formats",
20949
+ "record.metadata.isGeographical": "Donnée géographique",
20778
20950
  "record.metadata.keywords": "Mots-clés",
20779
20951
  "record.metadata.languages": "Langues",
20780
20952
  "record.metadata.lastUpdate": "Mis à jour le {date}",
20953
+ "record.metadata.linked.datasets": "Jeux de données associés",
20954
+ "record.metadata.linked.records": "Contenus associés",
20955
+ "record.metadata.linked.reuses": "Réutilisations associées",
20956
+ "record.metadata.linked.services": "Services associés",
20957
+ "record.metadata.linked.sourceDatasets": "Jeux de données sources",
20781
20958
  "record.metadata.links": "Liens",
20782
20959
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
20783
20960
  "record.metadata.otherConstraints": "Limitations d'usage",
@@ -20804,8 +20981,7 @@ var fr = {
20804
20981
  "record.metadata.quality.topic.success": "Le thème est renseigné",
20805
20982
  "record.metadata.quality.updateFrequency.failed": "La fréquence de mise à jour n'est pas renseignée",
20806
20983
  "record.metadata.quality.updateFrequency.success": "La fréquence de mise à jour est renseignée",
20807
- "record.metadata.related": "Voir aussi",
20808
- "record.metadata.related.contents": "Contenu associé",
20984
+ "record.metadata.related": "Explorez le catalogue",
20809
20985
  "record.metadata.ressources.and.links": "Ressources et liens",
20810
20986
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
20811
20987
  "record.metadata.status": "Statut",
@@ -20817,7 +20993,6 @@ var fr = {
20817
20993
  "record.metadata.temporalExtent.untilDate": "Jusqu'au { end }",
20818
20994
  "record.metadata.title": "Intitulé",
20819
20995
  "record.metadata.topics": "Catégories",
20820
- "record.metadata.isGeographical": "Donnée géographique",
20821
20996
  "record.metadata.uniqueId": "Identificateur de ressource unique",
20822
20997
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
20823
20998
  "record.metadata.updatedOn": "Modifié le",
@@ -20937,7 +21112,6 @@ var fr = {
20937
21112
  "tooltip.html.copy": "Copier le HTML",
20938
21113
  "tooltip.id.copy": "Copier l'identifiant unique",
20939
21114
  "tooltip.url.copy": "Copier l'URL",
20940
- "tooltip.url.open": "Ouvrir l'URL",
20941
21115
  "ui.readLess": "Réduire",
20942
21116
  "ui.readMore": "Lire la suite",
20943
21117
  "wfs.feature.limit": "Trop d'objets pour afficher la couche WFS !",
@@ -20984,6 +21158,7 @@ var it = {
20984
21158
  "dashboard.labels.mySpace": "Il mio spazio",
20985
21159
  "dashboard.records.all": "Catalogo",
20986
21160
  "dashboard.records.hasDraft": "Bozza",
21161
+ "dashboard.records.isMultilingual": "Questo record è multilingue ({languages})",
20987
21162
  "dashboard.records.myDraft": "Le mie bozze",
20988
21163
  "dashboard.records.myRecords": "I miei dati",
20989
21164
  "dashboard.records.search": "Risultati per \"{searchText}\"",
@@ -21161,6 +21336,10 @@ var it = {
21161
21336
  "editor.record.form.multilingual.enable": "Aprire il pannello multilingue",
21162
21337
  "editor.record.form.multilingual.open": "Modalità multilingue",
21163
21338
  "editor.record.form.multilingual.title": "Traduzioni",
21339
+ "editor.record.form.multilingual.activate": "",
21340
+ "editor.record.form.multilingual.default": "",
21341
+ "editor.record.form.multilingual.forbidden": "",
21342
+ "editor.record.form.multilingual.validate": "",
21164
21343
  "editor.record.form.page.accessAndContact": "Informazioni per l'uso",
21165
21344
  "editor.record.form.page.description": "Descrizione del dataset",
21166
21345
  "editor.record.form.page.resources": "Risorse",
@@ -21190,8 +21369,13 @@ var it = {
21190
21369
  "editor.record.loadError.body": "Impossibile caricare il dataset:",
21191
21370
  "editor.record.loadError.closeMessage": "Capito",
21192
21371
  "editor.record.loadError.title": "Errore durante il caricamento",
21193
- "editor.record.lock.format": "I record con il formato 'servizio' o 'riutilizzo' non sono modificabili",
21194
- "editor.record.lock.reason": "Non è un editore di uno dei gruppi autorizzati",
21372
+ "editor.record.lock.harvested": "",
21373
+ "editor.record.lock.owner": "Non è un editore di uno dei gruppi autorizzati",
21374
+ "editor.record.lock.resourceType": "I record con il formato 'servizio' o 'riutilizzo' non sono modificabili",
21375
+ "editor.record.multilingual.confirmation.cancelText": "",
21376
+ "editor.record.multilingual.confirmation.confirmText": "",
21377
+ "editor.record.multilingual.confirmation.message": "",
21378
+ "editor.record.multilingual.confirmation.title": "",
21195
21379
  "editor.record.onlineResource.protocol.other": "Altro",
21196
21380
  "editor.record.onlineResourceError.body": "Ha successo un'errore durante l'aggiunta della risorsa:",
21197
21381
  "editor.record.onlineResourceError.closeMessage": "Capito",
@@ -21252,20 +21436,32 @@ var it = {
21252
21436
  "input.image.uploadErrorLabel": "Impossibile caricare l'immagine",
21253
21437
  "input.image.uploadProgressCancel": "Annulla",
21254
21438
  "input.image.uploadProgressLabel": "Caricamento...",
21439
+ "language.ar": "",
21440
+ "language.az": "",
21255
21441
  "language.ca": "Catalano",
21256
21442
  "language.cs": "Ceco",
21443
+ "language.cy": "",
21444
+ "language.da": "",
21257
21445
  "language.de": "Tedesco",
21258
21446
  "language.en": "Inglese",
21259
21447
  "language.es": "Spagnolo",
21260
21448
  "language.fi": "Finlandese",
21261
21449
  "language.fr": "Francese",
21450
+ "language.hy": "",
21262
21451
  "language.is": "Islandese",
21263
21452
  "language.it": "Italiano",
21453
+ "language.ka": "",
21264
21454
  "language.ko": "Coreano",
21265
21455
  "language.nl": "Olandese",
21456
+ "language.no": "",
21457
+ "language.pl": "",
21266
21458
  "language.pt": "Portoghese",
21459
+ "language.rm": "",
21267
21460
  "language.ru": "Russo",
21268
21461
  "language.sk": "Slovacco",
21462
+ "language.sv": "",
21463
+ "language.tr": "",
21464
+ "language.uk": "",
21269
21465
  "language.zh": "Cinese",
21270
21466
  "map.add.layer": "Aggiungere un layer",
21271
21467
  "map.add.layer.catalog": "Dal catalogo",
@@ -21312,6 +21508,7 @@ var it = {
21312
21508
  "record.action.duplicate": "Duplicato",
21313
21509
  "record.action.duplicating": "Duplicazione",
21314
21510
  "record.action.rollback": "Annulla",
21511
+ "record.action.switchLang": "",
21315
21512
  "record.action.view": "Visualizza",
21316
21513
  "record.card.metadata.contact": "Contatto del metadata",
21317
21514
  "record.externalViewer.open": "Aprire nel visualizzatore esterno",
@@ -21362,9 +21559,15 @@ var it = {
21362
21559
  "record.metadata.download": "Download",
21363
21560
  "record.metadata.feature.catalog": "Catalogo dei oggetti",
21364
21561
  "record.metadata.formats": "Formati",
21562
+ "record.metadata.isGeographical": "Dati geografici",
21365
21563
  "record.metadata.keywords": "Parole chiave",
21366
21564
  "record.metadata.languages": "Lingue",
21367
21565
  "record.metadata.lastUpdate": "Ultimo aggiornamento il {date}",
21566
+ "record.metadata.linked.datasets": "",
21567
+ "record.metadata.linked.records": "",
21568
+ "record.metadata.linked.reuses": "",
21569
+ "record.metadata.linked.services": "",
21570
+ "record.metadata.linked.sourceDatasets": "",
21368
21571
  "record.metadata.links": "Collegamenti",
21369
21572
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
21370
21573
  "record.metadata.otherConstraints": "Limitazioni di uso",
@@ -21392,7 +21595,6 @@ var it = {
21392
21595
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
21393
21596
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
21394
21597
  "record.metadata.related": "Vedi anche",
21395
- "record.metadata.related.contents": "Contenuti correlati",
21396
21598
  "record.metadata.ressources.and.links": "Risorse e collegamenti",
21397
21599
  "record.metadata.sheet": "Origine del metadata",
21398
21600
  "record.metadata.status": "Stato",
@@ -21404,7 +21606,6 @@ var it = {
21404
21606
  "record.metadata.temporalExtent.untilDate": "Fino a {end}",
21405
21607
  "record.metadata.title": "Titolo",
21406
21608
  "record.metadata.topics": "Categorie",
21407
- "record.metadata.isGeographical": "Dati geografici",
21408
21609
  "record.metadata.uniqueId": "Identificatore unico di risorsa",
21409
21610
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
21410
21611
  "record.metadata.updatedOn": "Modificato il",
@@ -21524,7 +21725,6 @@ var it = {
21524
21725
  "tooltip.html.copy": "Copiare il HTML",
21525
21726
  "tooltip.id.copy": "Copiare l'identificatore unico",
21526
21727
  "tooltip.url.copy": "Copiare l'URL",
21527
- "tooltip.url.open": "Aprire l'URL",
21528
21728
  "ui.readLess": "Ridurre",
21529
21729
  "ui.readMore": "Leggere di più",
21530
21730
  "wfs.feature.limit": "Troppi oggetti per visualizzare il WFS layer!",
@@ -21571,6 +21771,7 @@ var nl = {
21571
21771
  "dashboard.labels.mySpace": "Mijn ruimte",
21572
21772
  "dashboard.records.all": "Catalogus",
21573
21773
  "dashboard.records.hasDraft": "",
21774
+ "dashboard.records.isMultilingual": "Dit record is meertalig ({languages})",
21574
21775
  "dashboard.records.myDraft": "Mijn concepten",
21575
21776
  "dashboard.records.myRecords": "Mijn Records",
21576
21777
  "dashboard.records.search": "Zoeken naar \"{searchText}\"",
@@ -21745,9 +21946,13 @@ var nl = {
21745
21946
  "editor.record.form.license.odc-by": "",
21746
21947
  "editor.record.form.license.pddl": "",
21747
21948
  "editor.record.form.license.unknown": "",
21949
+ "editor.record.form.multilingual.activate": "",
21950
+ "editor.record.form.multilingual.default": "",
21748
21951
  "editor.record.form.multilingual.enable": "",
21952
+ "editor.record.form.multilingual.forbidden": "",
21749
21953
  "editor.record.form.multilingual.open": "",
21750
21954
  "editor.record.form.multilingual.title": "",
21955
+ "editor.record.form.multilingual.validate": "",
21751
21956
  "editor.record.form.page.accessAndContact": "",
21752
21957
  "editor.record.form.page.description": "",
21753
21958
  "editor.record.form.page.resources": "",
@@ -21777,8 +21982,13 @@ var nl = {
21777
21982
  "editor.record.loadError.body": "",
21778
21983
  "editor.record.loadError.closeMessage": "",
21779
21984
  "editor.record.loadError.title": "",
21780
- "editor.record.lock.format": "",
21781
- "editor.record.lock.reason": "",
21985
+ "editor.record.lock.harvested": "",
21986
+ "editor.record.lock.owner": "",
21987
+ "editor.record.lock.resourceType": "",
21988
+ "editor.record.multilingual.confirmation.cancelText": "",
21989
+ "editor.record.multilingual.confirmation.confirmText": "",
21990
+ "editor.record.multilingual.confirmation.message": "",
21991
+ "editor.record.multilingual.confirmation.title": "",
21782
21992
  "editor.record.onlineResource.protocol.other": "",
21783
21993
  "editor.record.onlineResourceError.body": "",
21784
21994
  "editor.record.onlineResourceError.closeMessage": "",
@@ -21839,20 +22049,32 @@ var nl = {
21839
22049
  "input.image.uploadErrorLabel": "",
21840
22050
  "input.image.uploadProgressCancel": "",
21841
22051
  "input.image.uploadProgressLabel": "",
22052
+ "language.ar": "",
22053
+ "language.az": "",
21842
22054
  "language.ca": "Catalaans",
21843
22055
  "language.cs": "Tsjechisch",
22056
+ "language.cy": "",
22057
+ "language.da": "",
21844
22058
  "language.de": "Duits",
21845
22059
  "language.en": "Engels",
21846
22060
  "language.es": "Spaans",
21847
22061
  "language.fi": "Fins",
21848
22062
  "language.fr": "Frans",
22063
+ "language.hy": "",
21849
22064
  "language.is": "IJslands",
21850
22065
  "language.it": "Italiaans",
22066
+ "language.ka": "",
21851
22067
  "language.ko": "Koreaans",
21852
22068
  "language.nl": "Nederlands",
22069
+ "language.no": "",
22070
+ "language.pl": "",
21853
22071
  "language.pt": "Portugees",
22072
+ "language.rm": "",
21854
22073
  "language.ru": "Russisch",
21855
22074
  "language.sk": "Slowaaks",
22075
+ "language.sv": "",
22076
+ "language.tr": "",
22077
+ "language.uk": "",
21856
22078
  "language.zh": "Chinees",
21857
22079
  "map.add.layer": "",
21858
22080
  "map.add.layer.catalog": "",
@@ -21899,6 +22121,7 @@ var nl = {
21899
22121
  "record.action.duplicate": "",
21900
22122
  "record.action.duplicating": "",
21901
22123
  "record.action.rollback": "",
22124
+ "record.action.switchLang": "",
21902
22125
  "record.action.view": "",
21903
22126
  "record.card.metadata.contact": "",
21904
22127
  "record.externalViewer.open": "",
@@ -21949,9 +22172,15 @@ var nl = {
21949
22172
  "record.metadata.download": "",
21950
22173
  "record.metadata.feature.catalog": "",
21951
22174
  "record.metadata.formats": "",
22175
+ "record.metadata.isGeographical": "",
21952
22176
  "record.metadata.keywords": "",
21953
22177
  "record.metadata.languages": "",
21954
22178
  "record.metadata.lastUpdate": "",
22179
+ "record.metadata.linked.datasets": "",
22180
+ "record.metadata.linked.records": "",
22181
+ "record.metadata.linked.reuses": "",
22182
+ "record.metadata.linked.services": "",
22183
+ "record.metadata.linked.sourceDatasets": "",
21955
22184
  "record.metadata.links": "",
21956
22185
  "record.metadata.noUsage": "",
21957
22186
  "record.metadata.otherConstraints": "",
@@ -21979,7 +22208,6 @@ var nl = {
21979
22208
  "record.metadata.quality.updateFrequency.failed": "",
21980
22209
  "record.metadata.quality.updateFrequency.success": "",
21981
22210
  "record.metadata.related": "",
21982
- "record.metadata.related.contents": "",
21983
22211
  "record.metadata.ressources.and.links": "Bronnen en links",
21984
22212
  "record.metadata.sheet": "",
21985
22213
  "record.metadata.status": "",
@@ -21991,7 +22219,6 @@ var nl = {
21991
22219
  "record.metadata.temporalExtent.untilDate": "",
21992
22220
  "record.metadata.title": "",
21993
22221
  "record.metadata.topics": "",
21994
- "record.metadata.isGeographical": "",
21995
22222
  "record.metadata.uniqueId": "",
21996
22223
  "record.metadata.updateFrequency": "",
21997
22224
  "record.metadata.updatedOn": "",
@@ -22111,7 +22338,6 @@ var nl = {
22111
22338
  "tooltip.html.copy": "",
22112
22339
  "tooltip.id.copy": "",
22113
22340
  "tooltip.url.copy": "",
22114
- "tooltip.url.open": "",
22115
22341
  "ui.readLess": "",
22116
22342
  "ui.readMore": "",
22117
22343
  "wfs.feature.limit": "",
@@ -22158,6 +22384,7 @@ var pt = {
22158
22384
  "dashboard.labels.mySpace": "Meu espaço",
22159
22385
  "dashboard.records.all": "Catálogo",
22160
22386
  "dashboard.records.hasDraft": "",
22387
+ "dashboard.records.isMultilingual": "Este registro é multilíngue ({languages})",
22161
22388
  "dashboard.records.myDraft": "Meus rascunhos",
22162
22389
  "dashboard.records.myRecords": "Meus Registros",
22163
22390
  "dashboard.records.search": "Buscar por \"{searchText}\"",
@@ -22332,9 +22559,13 @@ var pt = {
22332
22559
  "editor.record.form.license.odc-by": "",
22333
22560
  "editor.record.form.license.pddl": "",
22334
22561
  "editor.record.form.license.unknown": "",
22562
+ "editor.record.form.multilingual.activate": "",
22563
+ "editor.record.form.multilingual.default": "",
22335
22564
  "editor.record.form.multilingual.enable": "",
22565
+ "editor.record.form.multilingual.forbidden": "",
22336
22566
  "editor.record.form.multilingual.open": "",
22337
22567
  "editor.record.form.multilingual.title": "",
22568
+ "editor.record.form.multilingual.validate": "",
22338
22569
  "editor.record.form.page.accessAndContact": "",
22339
22570
  "editor.record.form.page.description": "",
22340
22571
  "editor.record.form.page.resources": "",
@@ -22364,8 +22595,13 @@ var pt = {
22364
22595
  "editor.record.loadError.body": "",
22365
22596
  "editor.record.loadError.closeMessage": "",
22366
22597
  "editor.record.loadError.title": "",
22367
- "editor.record.lock.format": "",
22368
- "editor.record.lock.reason": "",
22598
+ "editor.record.lock.harvested": "",
22599
+ "editor.record.lock.owner": "",
22600
+ "editor.record.lock.resourceType": "",
22601
+ "editor.record.multilingual.confirmation.cancelText": "",
22602
+ "editor.record.multilingual.confirmation.confirmText": "",
22603
+ "editor.record.multilingual.confirmation.message": "",
22604
+ "editor.record.multilingual.confirmation.title": "",
22369
22605
  "editor.record.onlineResource.protocol.other": "",
22370
22606
  "editor.record.onlineResourceError.body": "",
22371
22607
  "editor.record.onlineResourceError.closeMessage": "",
@@ -22426,20 +22662,32 @@ var pt = {
22426
22662
  "input.image.uploadErrorLabel": "",
22427
22663
  "input.image.uploadProgressCancel": "",
22428
22664
  "input.image.uploadProgressLabel": "",
22665
+ "language.ar": "",
22666
+ "language.az": "",
22429
22667
  "language.ca": "Catalão",
22430
22668
  "language.cs": "Tcheco",
22669
+ "language.cy": "",
22670
+ "language.da": "",
22431
22671
  "language.de": "Alemão",
22432
22672
  "language.en": "Inglês",
22433
22673
  "language.es": "Espanhol",
22434
22674
  "language.fi": "Finlandês",
22435
22675
  "language.fr": "Francês",
22676
+ "language.hy": "",
22436
22677
  "language.is": "Islandês",
22437
22678
  "language.it": "Italiano",
22679
+ "language.ka": "",
22438
22680
  "language.ko": "Coreano",
22439
22681
  "language.nl": "Holandês",
22682
+ "language.no": "",
22683
+ "language.pl": "",
22440
22684
  "language.pt": "Português",
22685
+ "language.rm": "",
22441
22686
  "language.ru": "Russo",
22442
22687
  "language.sk": "Eslovaco",
22688
+ "language.sv": "",
22689
+ "language.tr": "",
22690
+ "language.uk": "",
22443
22691
  "language.zh": "Chinês",
22444
22692
  "map.add.layer": "",
22445
22693
  "map.add.layer.catalog": "",
@@ -22486,6 +22734,7 @@ var pt = {
22486
22734
  "record.action.duplicate": "",
22487
22735
  "record.action.duplicating": "",
22488
22736
  "record.action.rollback": "",
22737
+ "record.action.switchLang": "",
22489
22738
  "record.action.view": "",
22490
22739
  "record.card.metadata.contact": "",
22491
22740
  "record.externalViewer.open": "",
@@ -22536,9 +22785,15 @@ var pt = {
22536
22785
  "record.metadata.download": "",
22537
22786
  "record.metadata.feature.catalog": "",
22538
22787
  "record.metadata.formats": "",
22788
+ "record.metadata.isGeographical": "",
22539
22789
  "record.metadata.keywords": "",
22540
22790
  "record.metadata.languages": "",
22541
22791
  "record.metadata.lastUpdate": "",
22792
+ "record.metadata.linked.datasets": "",
22793
+ "record.metadata.linked.records": "",
22794
+ "record.metadata.linked.reuses": "",
22795
+ "record.metadata.linked.services": "",
22796
+ "record.metadata.linked.sourceDatasets": "",
22542
22797
  "record.metadata.links": "",
22543
22798
  "record.metadata.noUsage": "",
22544
22799
  "record.metadata.otherConstraints": "",
@@ -22566,7 +22821,6 @@ var pt = {
22566
22821
  "record.metadata.quality.updateFrequency.failed": "",
22567
22822
  "record.metadata.quality.updateFrequency.success": "",
22568
22823
  "record.metadata.related": "",
22569
- "record.metadata.related.contents": "",
22570
22824
  "record.metadata.ressources.and.links": "Recursos e links",
22571
22825
  "record.metadata.sheet": "",
22572
22826
  "record.metadata.status": "",
@@ -22578,7 +22832,6 @@ var pt = {
22578
22832
  "record.metadata.temporalExtent.untilDate": "",
22579
22833
  "record.metadata.title": "",
22580
22834
  "record.metadata.topics": "",
22581
- "record.metadata.isGeographical": "",
22582
22835
  "record.metadata.uniqueId": "",
22583
22836
  "record.metadata.updateFrequency": "",
22584
22837
  "record.metadata.updatedOn": "",
@@ -22698,7 +22951,6 @@ var pt = {
22698
22951
  "tooltip.html.copy": "",
22699
22952
  "tooltip.id.copy": "",
22700
22953
  "tooltip.url.copy": "",
22701
- "tooltip.url.open": "",
22702
22954
  "ui.readLess": "",
22703
22955
  "ui.readMore": "",
22704
22956
  "wfs.feature.limit": "",
@@ -22816,10 +23068,18 @@ class Gn4FieldMapper {
22816
23068
  const langList = getAsArray(selectField(source, 'resourceLanguage'));
22817
23069
  const languages = langList.map((lang) => LANG_3_TO_2_MAPPER[lang]);
22818
23070
  const defaultLanguage = output.defaultLanguage ?? languages[0] ?? null; // set the first language as main one as fallback
22819
- const otherLanguages = languages.filter((lang) => lang !== defaultLanguage);
22820
23071
  return {
22821
23072
  ...output,
22822
23073
  defaultLanguage,
23074
+ };
23075
+ },
23076
+ otherLanguage: (output, source) => {
23077
+ const langList = getAsArray(selectField(source, 'otherLanguage'));
23078
+ const languages = langList.map((lang) => LANG_3_TO_2_MAPPER[lang]);
23079
+ const defaultLanguage = output.defaultLanguage ?? languages[0] ?? null;
23080
+ const otherLanguages = languages.filter((lang) => lang !== defaultLanguage);
23081
+ return {
23082
+ ...output,
22823
23083
  otherLanguages,
22824
23084
  };
22825
23085
  },
@@ -22893,13 +23153,40 @@ class Gn4FieldMapper {
22893
23153
  related: (output, source) => {
22894
23154
  const fcatSource = selectField(getFirstValue(selectField(selectField(source, 'related'), 'fcats')) ?? {}, '_source');
22895
23155
  const featureCatalogIdentifier = selectField(fcatSource, 'uuid');
22896
- return featureCatalogIdentifier
22897
- ? this.addExtra({ featureCatalogIdentifier }, output)
23156
+ const sourceOfLinks = getAsArray(selectField(selectField(source, 'related'), 'hassources'));
23157
+ const sourceOfIdentifiers = sourceOfLinks
23158
+ .filter((link) => link['origin'] === 'catalog')
23159
+ .map((link) => {
23160
+ return selectField(selectField(link, '_source'), 'uuid');
23161
+ });
23162
+ const extraValues = {};
23163
+ if (featureCatalogIdentifier) {
23164
+ extraValues.featureCatalogIdentifier = featureCatalogIdentifier;
23165
+ }
23166
+ if (sourceOfIdentifiers && sourceOfIdentifiers.length > 0) {
23167
+ extraValues.sourceOfIdentifiers = sourceOfIdentifiers;
23168
+ }
23169
+ return Object.keys(extraValues).length > 0
23170
+ ? this.addExtra(extraValues, output)
23171
+ : output;
23172
+ },
23173
+ recordLink: (output, source) => {
23174
+ const recordLinks = getAsArray(selectField(source, 'recordLink'));
23175
+ const sourcesIdentifiers = recordLinks
23176
+ .filter((link) => link['origin'] === 'catalog' && link['type'] === 'sources')
23177
+ .map((link) => selectField(link, 'to'));
23178
+ return sourcesIdentifiers && sourcesIdentifiers.length > 0
23179
+ ? this.addExtra({
23180
+ sourcesIdentifiers,
23181
+ }, output)
22898
23182
  : output;
22899
23183
  },
22900
23184
  isPublishedToAll: (output, source) => this.addExtra({
22901
23185
  isPublishedToAll: selectField(source, 'isPublishedToAll'),
22902
23186
  }, output),
23187
+ isHarvested: (output, source) => this.addExtra({
23188
+ isHarvested: selectField(source, 'isHarvested') !== 'false',
23189
+ }, output),
22903
23190
  edit: (output, source) => this.addExtra({
22904
23191
  edit: selectField(source, 'edit'),
22905
23192
  }, output),
@@ -23280,11 +23567,11 @@ class ElasticsearchService {
23280
23567
  registerRuntimeField(fieldName, expression) {
23281
23568
  this.runtimeFields[fieldName] = expression;
23282
23569
  }
23283
- getMetadataByIdPayload(uuid) {
23570
+ getMetadataByIdsPayload(uuids) {
23284
23571
  return {
23285
23572
  query: {
23286
23573
  ids: {
23287
- values: [uuid],
23574
+ values: uuids,
23288
23575
  },
23289
23576
  },
23290
23577
  };
@@ -23712,16 +23999,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
23712
23999
  args: [METADATA_LANGUAGE]
23713
24000
  }] }] });
23714
24001
 
24002
+ class Gn4SettingsService {
24003
+ constructor(siteApiService) {
24004
+ this.siteApiService = siteApiService;
24005
+ this.identicon$ = this.getSettingsSetValueByKey('system/users/identicon');
24006
+ this.allowEditHarvested$ = this.getSettingsSetValueByKey('system/harvester/enableEditing');
24007
+ }
24008
+ getSettingsSetValueByKey(key) {
24009
+ return this.siteApiService.getSettingsSet(null, [key]).pipe(map$1((v) => v[key]), shareReplay({ bufferSize: 1, refCount: true }));
24010
+ }
24011
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, deps: [{ token: SiteApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
24012
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, providedIn: 'root' }); }
24013
+ }
24014
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, decorators: [{
24015
+ type: Injectable,
24016
+ args: [{
24017
+ providedIn: 'root',
24018
+ }]
24019
+ }], ctorParameters: () => [{ type: SiteApiService }] });
24020
+
23715
24021
  const minPublicationApiVersion = '4.2.5';
23716
24022
  const TEMPORARY_ID_PREFIX = 'TEMP-ID-';
23717
24023
  class Gn4Repository {
23718
- constructor(httpClient, gn4SearchApi, gn4SearchHelper, gn4Mapper, gn4RecordsApi, platformService) {
24024
+ constructor(httpClient, gn4SearchApi, gn4SearchHelper, gn4Mapper, gn4RecordsApi, platformService, gn4LanguagesApi, settingsService) {
23719
24025
  this.httpClient = httpClient;
23720
24026
  this.gn4SearchApi = gn4SearchApi;
23721
24027
  this.gn4SearchHelper = gn4SearchHelper;
23722
24028
  this.gn4Mapper = gn4Mapper;
23723
24029
  this.gn4RecordsApi = gn4RecordsApi;
23724
24030
  this.platformService = platformService;
24031
+ this.gn4LanguagesApi = gn4LanguagesApi;
24032
+ this.settingsService = settingsService;
23725
24033
  this._draftsChanged = new Subject();
23726
24034
  this.draftsChanged$ = this._draftsChanged.asObservable();
23727
24035
  }
@@ -23743,9 +24051,16 @@ class Gn4Repository {
23743
24051
  }
23744
24052
  getRecord(uniqueIdentifier) {
23745
24053
  return this.gn4SearchApi
23746
- .search('bucket', ['fcats'], JSON.stringify(this.gn4SearchHelper.getMetadataByIdPayload(uniqueIdentifier)))
24054
+ .search('bucket', ['fcats', 'hassources'], JSON.stringify(this.gn4SearchHelper.getMetadataByIdsPayload([uniqueIdentifier])))
23747
24055
  .pipe(map$1((results) => results.hits.hits[0]), switchMap((record) => record ? this.gn4Mapper.readRecord(record) : of(null)));
23748
24056
  }
24057
+ getMultipleRecords(uniqueIdentifiers) {
24058
+ return this.gn4SearchApi
24059
+ .search('bucket', undefined, JSON.stringify(this.gn4SearchHelper.getMetadataByIdsPayload(uniqueIdentifiers)))
24060
+ .pipe(map$1((results) => results.hits.hits), switchMap((records) => records && records.length > 0
24061
+ ? this.gn4Mapper.readRecords(records)
24062
+ : of(null)));
24063
+ }
23749
24064
  mapEmbeddedFeatureCatalog(featureTypes) {
23750
24065
  return {
23751
24066
  featureTypes: featureTypes.map((featureType) => ({
@@ -23781,6 +24096,20 @@ class Gn4Repository {
23781
24096
  .search('bucket', null, JSON.stringify(this.gn4SearchHelper.getRelatedRecordPayload(similarTo, 3)))
23782
24097
  .pipe(switchMap((results) => this.gn4Mapper.readRecords(results.hits.hits)));
23783
24098
  }
24099
+ getSources(record) {
24100
+ const sourcesIdentifiers = record.extras?.['sourcesIdentifiers'];
24101
+ if (sourcesIdentifiers && sourcesIdentifiers.length > 0) {
24102
+ return this.getMultipleRecords(sourcesIdentifiers);
24103
+ }
24104
+ return of(null);
24105
+ }
24106
+ getSourceOf(record) {
24107
+ const sourceOfIdentifiers = record.extras?.['sourceOfIdentifiers'];
24108
+ if (sourceOfIdentifiers && sourceOfIdentifiers.length > 0) {
24109
+ return this.getMultipleRecords(sourceOfIdentifiers);
24110
+ }
24111
+ return of(null);
24112
+ }
23784
24113
  aggregate(params) {
23785
24114
  // if aggregations are empty, return an empty object right away
23786
24115
  if (Object.keys(params).length === 0)
@@ -23806,11 +24135,29 @@ class Gn4Repository {
23806
24135
  ? this.getRecord(uniqueIdentifier).pipe(map$1((record) => record.extras['isPublishedToAll']))
23807
24136
  : of(true);
23808
24137
  }
23809
- canEditRecord(uniqueIdentifier) {
23810
- return this.getRecord(uniqueIdentifier).pipe(map$1((record) => {
23811
- return record.extras['edit'];
24138
+ canDuplicate(record) {
24139
+ return record.kind === 'dataset';
24140
+ }
24141
+ canDelete(record) {
24142
+ return this.settingsService.allowEditHarvested$.pipe(map$1((allowEditHarvested) => {
24143
+ return (record.extras['edit'] &&
24144
+ (!record.extras['isHarvested'] || allowEditHarvested));
23812
24145
  }));
23813
24146
  }
24147
+ canEdit(record, allowEditHarvested) {
24148
+ return (record.kind === 'dataset' &&
24149
+ record.extras['edit'] &&
24150
+ (!record.extras['isHarvested'] || allowEditHarvested));
24151
+ }
24152
+ canEditRecord(uniqueIdentifier) {
24153
+ return combineLatest([
24154
+ this.getRecord(uniqueIdentifier),
24155
+ this.settingsService.allowEditHarvested$,
24156
+ ]).pipe(map$1(([record, allowEditHarvested]) => record ? this.canEdit(record, allowEditHarvested) : false));
24157
+ }
24158
+ canEditIndexedRecord(record) {
24159
+ return this.settingsService.allowEditHarvested$.pipe(map$1((allowEditHarvested) => this.canEdit(record, allowEditHarvested)));
24160
+ }
23814
24161
  openRecordForEdition(uniqueIdentifier) {
23815
24162
  const draft$ = of(this.getRecordFromLocalStorage(uniqueIdentifier));
23816
24163
  const recordAsXml$ = this.getRecordAsXml(uniqueIdentifier);
@@ -23925,6 +24272,13 @@ class Gn4Repository {
23925
24272
  }));
23926
24273
  }));
23927
24274
  }
24275
+ getApplicationLanguages() {
24276
+ return this.gn4LanguagesApi
24277
+ .getApplicationLanguages()
24278
+ .pipe(map$1((languages) => languages
24279
+ .map((lang) => LANG_3_TO_2_MAPPER[lang.id ?? ''])
24280
+ .filter((code) => !!code)));
24281
+ }
23928
24282
  getRecordAsXml(uniqueIdentifier) {
23929
24283
  return this.gn4RecordsApi
23930
24284
  .getRecordAs(uniqueIdentifier, undefined, false, undefined, undefined, undefined, 'application/xml', 'response', undefined, { httpHeaderAccept: 'text/xml,application/xml' } // this is to make sure that the response is parsed as text
@@ -23965,12 +24319,12 @@ class Gn4Repository {
23965
24319
  removeRecordFromLocalStorage(recordId) {
23966
24320
  window.localStorage.removeItem(this.getLocalStorageKeyForRecord(recordId));
23967
24321
  }
23968
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4Repository, deps: [{ token: i1.HttpClient }, { token: SearchApiService }, { token: ElasticsearchService }, { token: Gn4Converter }, { token: RecordsApiService }, { token: PlatformServiceInterface }], target: i0.ɵɵFactoryTarget.Injectable }); }
24322
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4Repository, deps: [{ token: i1.HttpClient }, { token: SearchApiService }, { token: ElasticsearchService }, { token: Gn4Converter }, { token: RecordsApiService }, { token: PlatformServiceInterface }, { token: LanguagesApiService }, { token: Gn4SettingsService }], target: i0.ɵɵFactoryTarget.Injectable }); }
23969
24323
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4Repository }); }
23970
24324
  }
23971
24325
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4Repository, decorators: [{
23972
24326
  type: Injectable
23973
- }], ctorParameters: () => [{ type: i1.HttpClient }, { type: SearchApiService }, { type: ElasticsearchService }, { type: Gn4Converter }, { type: RecordsApiService }, { type: PlatformServiceInterface }] });
24327
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: SearchApiService }, { type: ElasticsearchService }, { type: Gn4Converter }, { type: RecordsApiService }, { type: PlatformServiceInterface }, { type: LanguagesApiService }, { type: Gn4SettingsService }] });
23974
24328
 
23975
24329
  const IMAGE_URL$1 = '/geonetwork/images/harvesting/';
23976
24330
  class OrganizationsFromMetadataService {
@@ -24249,24 +24603,6 @@ const ORGANIZATIONS_STRATEGY = new InjectionToken('organizations-strategy', {
24249
24603
  factory: () => 'metadata',
24250
24604
  });
24251
24605
 
24252
- class Gn4SettingsService {
24253
- constructor(siteApiService) {
24254
- this.siteApiService = siteApiService;
24255
- this.identicon$ = this.getSettingsSetValueByKey('system/users/identicon');
24256
- }
24257
- getSettingsSetValueByKey(key) {
24258
- return this.siteApiService.getSettingsSet(null, [key]).pipe(map$1((v) => v[key]), shareReplay({ bufferSize: 1, refCount: true }));
24259
- }
24260
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, deps: [{ token: SiteApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
24261
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, providedIn: 'root' }); }
24262
- }
24263
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, decorators: [{
24264
- type: Injectable,
24265
- args: [{
24266
- providedIn: 'root',
24267
- }]
24268
- }], ctorParameters: () => [{ type: SiteApiService }] });
24269
-
24270
24606
  const DEFAULT_GN4_LOGIN_URL = `/geonetwork/srv/\${lang3}/catalog.signin?redirect=\${current_url}`;
24271
24607
  const LOGIN_URL = new InjectionToken('loginUrl');
24272
24608
  const DEFAULT_GN4_LOGOUT_URL = `/geonetwork/signout`;
@@ -25388,7 +25724,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25388
25724
  }] });
25389
25725
 
25390
25726
  var name = "geonetwork-ui";
25391
- var version = "2.6.0-dev.97a89c313";
25727
+ var version = "2.6.0-dev.9b9a26109";
25392
25728
  var engines = {
25393
25729
  node: ">=20"
25394
25730
  };
@@ -25513,6 +25849,9 @@ class Gn4PlatformService {
25513
25849
  throw new Error(`Gn4 API version is not compatible.\nMinimum: ${minApiVersion}\nYour version: ${version}`);
25514
25850
  }
25515
25851
  }), shareReplay(1));
25852
+ this.allowEditHarvestedMd$ = this.settings$.pipe(map$1((info) => {
25853
+ return info['system/harvester/enableEditing'];
25854
+ }), shareReplay(1));
25516
25855
  /**
25517
25856
  * A map of already loaded thesauri (groups of keywords); the key is a URI
25518
25857
  * @private
@@ -25533,6 +25872,9 @@ class Gn4PlatformService {
25533
25872
  getApiVersion() {
25534
25873
  return this.apiVersion$;
25535
25874
  }
25875
+ getAllowEditHarvestedMd() {
25876
+ return this.allowEditHarvestedMd$;
25877
+ }
25536
25878
  getMe() {
25537
25879
  return this.me$;
25538
25880
  }
@@ -26145,11 +26487,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
26145
26487
  type: Output
26146
26488
  }] } });
26147
26489
 
26148
- marker('editor.record.lock.reason');
26149
- marker('editor.record.lock.format');
26490
+ marker('editor.record.lock.resourceType');
26491
+ marker('editor.record.lock.harvested');
26492
+ marker('editor.record.lock.owner');
26150
26493
  class InteractiveTableComponent {
26151
26494
  constructor() {
26152
26495
  this.items = [];
26496
+ this.canEditItem = () => of(true);
26153
26497
  this.isDraftPage = false;
26154
26498
  this.itemClick = new EventEmitter();
26155
26499
  }
@@ -26165,11 +26509,16 @@ class InteractiveTableComponent {
26165
26509
  };
26166
26510
  }
26167
26511
  getItemTitle(item) {
26168
- if (!item.extras?.edit && !this.isDraftPage && item.kind === 'dataset') {
26169
- return 'editor.record.lock.reason';
26170
- }
26171
- else if (item.kind !== 'dataset') {
26172
- return 'editor.record.lock.format';
26512
+ if (!this.isDraftPage) {
26513
+ if (item.kind !== 'dataset') {
26514
+ return 'editor.record.lock.resourceType';
26515
+ }
26516
+ else if (item.extras?.isHarvested) {
26517
+ return 'editor.record.lock.harvested';
26518
+ }
26519
+ else if (!item.extras?.edit) {
26520
+ return 'editor.record.lock.owner';
26521
+ }
26173
26522
  }
26174
26523
  return '';
26175
26524
  }
@@ -26177,16 +26526,18 @@ class InteractiveTableComponent {
26177
26526
  this.itemClick.emit(item);
26178
26527
  }
26179
26528
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26180
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: InteractiveTableComponent, isStandalone: true, selector: "gn-ui-interactive-table", inputs: { items: "items", isDraftPage: "isDraftPage" }, outputs: { itemClick: "itemClick" }, providers: [provideIcons({ iconoirNavArrowDown, iconoirNavArrowUp })], queries: [{ propertyName: "columns", predicate: InteractiveTableColumnComponent }], ngImport: i0, template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents w-full\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell gap-1\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <ng-icon\n class=\"text-gray-600 -mb-2\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n name=\"iconoirNavArrowUp\"\n ></ng-icon>\n <ng-icon\n class=\"text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n name=\"iconoirNavArrowDown\"\n ></ng-icon>\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n data-cy=\"table-row\"\n [title]=\"getItemTitle(item) | translate\"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-3 py-1.5 flex items-center bg-white transition-colors duration-75 truncate border-b border-gray-200\"\n [ngClass]=\"{\n 'text-purple-light cursor-default':\n (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset',\n 'group-hover:text-main group-hover:bg-gray-50':\n (item.extras?.edit || isDraftPage) && item.kind === 'dataset',\n }\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".table-header-cell{@apply text-gray-700 px-3 py-3 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}ng-icon{@apply w-4 h-4;}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26529
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: InteractiveTableComponent, isStandalone: true, selector: "gn-ui-interactive-table", inputs: { items: "items", canEditItem: "canEditItem", isDraftPage: "isDraftPage" }, outputs: { itemClick: "itemClick" }, providers: [provideIcons({ iconoirNavArrowDown, iconoirNavArrowUp })], queries: [{ propertyName: "columns", predicate: InteractiveTableColumnComponent }], ngImport: i0, template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents w-full\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell gap-1\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <ng-icon\n class=\"text-gray-600 -mb-2\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n name=\"iconoirNavArrowUp\"\n ></ng-icon>\n <ng-icon\n class=\"text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n name=\"iconoirNavArrowDown\"\n ></ng-icon>\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n data-cy=\"table-row\"\n [attr.data-cy-title]=\"item.title\"\n [title]=\"getItemTitle(item) | translate\"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-3 py-1.5 flex items-center bg-white transition-colors duration-75 truncate border-b border-gray-200\"\n [ngClass]=\"{\n 'text-purple-light cursor-default':\n (canEditItem(item) | async) === false,\n 'group-hover:text-main group-hover:bg-gray-50':\n canEditItem(item) | async,\n }\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".table-header-cell{@apply text-gray-700 px-3 py-3 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}ng-icon{@apply w-4 h-4;}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26181
26530
  }
26182
26531
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, decorators: [{
26183
26532
  type: Component,
26184
- args: [{ selector: 'gn-ui-interactive-table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIconComponent, TranslateModule], providers: [provideIcons({ iconoirNavArrowDown, iconoirNavArrowUp })], template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents w-full\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell gap-1\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <ng-icon\n class=\"text-gray-600 -mb-2\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n name=\"iconoirNavArrowUp\"\n ></ng-icon>\n <ng-icon\n class=\"text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n name=\"iconoirNavArrowDown\"\n ></ng-icon>\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n data-cy=\"table-row\"\n [title]=\"getItemTitle(item) | translate\"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-3 py-1.5 flex items-center bg-white transition-colors duration-75 truncate border-b border-gray-200\"\n [ngClass]=\"{\n 'text-purple-light cursor-default':\n (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset',\n 'group-hover:text-main group-hover:bg-gray-50':\n (item.extras?.edit || isDraftPage) && item.kind === 'dataset',\n }\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".table-header-cell{@apply text-gray-700 px-3 py-3 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}ng-icon{@apply w-4 h-4;}\n"] }]
26533
+ args: [{ selector: 'gn-ui-interactive-table', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIconComponent, TranslateModule], providers: [provideIcons({ iconoirNavArrowDown, iconoirNavArrowUp })], template: "<div class=\"grid w-full\" [ngStyle]=\"gridStyle\">\n <div class=\"contents w-full\">\n <ng-container *ngFor=\"let column of columns\">\n <button\n *ngIf=\"column.sortable\"\n type=\"button\"\n class=\"table-header-cell gap-1\"\n (click)=\"column.sortable && column.handleSortChange()\"\n >\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n <div class=\"sort-button flex flex-col\" *ngIf=\"column.sortable\">\n <ng-icon\n class=\"text-gray-600 -mb-2\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'asc' }\"\n name=\"iconoirNavArrowUp\"\n ></ng-icon>\n <ng-icon\n class=\"text-gray-600\"\n [ngClass]=\"{ 'text-main': column.activeSort === 'desc' }\"\n name=\"iconoirNavArrowDown\"\n ></ng-icon>\n </div>\n </button>\n <div *ngIf=\"!column.sortable\" class=\"table-header-cell\">\n <ng-container *ngTemplateOutlet=\"column.header\"></ng-container>\n </div>\n </ng-container>\n </div>\n <div\n class=\"contents text-gray-900 cursor-pointer group\"\n *ngFor=\"let item of items\"\n (click)=\"handleRowClick(item)\"\n data-cy=\"table-row\"\n [attr.data-cy-title]=\"item.title\"\n [title]=\"getItemTitle(item) | translate\"\n >\n <div\n class=\"relative h-0\"\n [ngStyle]=\"{ 'grid-column': 'span ' + this.columns.length }\"\n >\n <!-- this element is only used in keyboard navigation -->\n <button\n type=\"button\"\n class=\"absolute inset-x-0 h-[50px] bg-transparent pointer-events-none\"\n ></button>\n </div>\n <ng-container *ngFor=\"let column of columns\">\n <div\n class=\"table-row-cell px-3 py-1.5 flex items-center bg-white transition-colors duration-75 truncate border-b border-gray-200\"\n [ngClass]=\"{\n 'text-purple-light cursor-default':\n (canEditItem(item) | async) === false,\n 'group-hover:text-main group-hover:bg-gray-50':\n canEditItem(item) | async,\n }\"\n >\n <ng-container\n *ngTemplateOutlet=\"column.cell; context: { $implicit: item }\"\n ></ng-container>\n </div>\n </ng-container>\n </div>\n</div>\n", styles: [".table-header-cell{@apply text-gray-700 px-3 py-3 flex items-center truncate bg-white;}button.table-header-cell{@apply transition-colors duration-75 hover:text-main hover:bg-gray-50 focus:text-main focus:bg-gray-50;}ng-icon{@apply w-4 h-4;}\n"] }]
26185
26534
  }], propDecorators: { columns: [{
26186
26535
  type: ContentChildren,
26187
26536
  args: [InteractiveTableColumnComponent]
26188
26537
  }], items: [{
26189
26538
  type: Input
26539
+ }], canEditItem: [{
26540
+ type: Input
26190
26541
  }], isDraftPage: [{
26191
26542
  type: Input
26192
26543
  }], itemClick: [{
@@ -29279,6 +29630,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29279
29630
  type: Input
29280
29631
  }] } });
29281
29632
 
29633
+ class InternalLinkCardContactComponent {
29634
+ constructor() {
29635
+ this.size = 'M';
29636
+ }
29637
+ get organization() {
29638
+ return this.record.ownerOrganization;
29639
+ }
29640
+ get contacts() {
29641
+ return ((this.record.kind === 'dataset'
29642
+ ? this.record.contactsForResource
29643
+ : this.record.contacts) || []);
29644
+ }
29645
+ openExternalUrl(event, url) {
29646
+ event.stopPropagation();
29647
+ window.open(url, '_blank');
29648
+ }
29649
+ openMailto(event, email) {
29650
+ event.stopPropagation();
29651
+ window.open(`mailto:${email}`, '_blank');
29652
+ }
29653
+ copyToClipboard(event, text) {
29654
+ event.stopPropagation();
29655
+ navigator.clipboard.writeText(text);
29656
+ }
29657
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InternalLinkCardContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29658
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: InternalLinkCardContactComponent, isStandalone: true, selector: "gn-ui-internal-link-card-contact", inputs: { record: "record", size: "size" }, providers: [
29659
+ provideIcons({
29660
+ iconoirInternet,
29661
+ matEmailOutline,
29662
+ matPhoneOutline,
29663
+ matLocationOnOutline,
29664
+ }),
29665
+ ], ngImport: i0, template: "<div\n data-cy=\"recordOrg\"\n class=\"flex items-center justify-evenly bg-gray-50 rounded-lg h-[53px] px-2\"\n>\n <div class=\"flex items-center flex-1 min-w-0\">\n <div class=\"w-[45px] h-[45px] rounded-lg overflow-hidden shrink-0 mr-3\">\n <gn-ui-thumbnail\n [thumbnailUrl]=\"record.ownerOrganization?.logoUrl?.toString() || ''\"\n [fit]=\"'contain'\"\n class=\"w-full h-full rounded-lg\"\n ></gn-ui-thumbnail>\n </div>\n <div *ngIf=\"organization?.name\" class=\"flex-1 w-0 overflow-hidden\">\n <div\n class=\"text-xs text-black font-normal leading-tight truncate\"\n translate\n >\n record.card.metadata.contact\n </div>\n <div\n data-cy=\"recordOrgName\"\n class=\"text-xl text-primary-black font-medium truncate\"\n >\n {{ organization.name }}\n </div>\n </div>\n </div>\n <div *ngIf=\"size === 'L'\" class=\"ml-2 flex space-x-2\">\n <div *ngIf=\"organization?.website\" class=\"flex\">\n <button\n [title]=\"organization.website\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest\"\n (click)=\"openExternalUrl($event, organization.website)\"\n >\n <ng-icon name=\"iconoirInternet\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.email\" class=\"flex\">\n <button\n [title]=\"contacts[0].email\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest\"\n data-cy=\"contact-email\"\n (click)=\"openMailto($event, contacts[0].email)\"\n >\n <ng-icon name=\"matEmailOutline\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.phone\" class=\"flex\">\n <button\n [title]=\"'Copy to clipboard'\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group\"\n data-cy=\"contact-phone\"\n (click)=\"copyToClipboard($event, contacts[0].phone)\"\n >\n <ng-icon name=\"matPhoneOutline\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.address\" class=\"flex\">\n <button\n [title]=\"'Copy to clipboard'\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group\"\n data-cy=\"contact-phone\"\n (click)=\"copyToClipboard($event, contacts[0].address)\"\n >\n <ng-icon name=\"matLocationOnOutline\"></ng-icon>\n </button>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] }); }
29666
+ }
29667
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InternalLinkCardContactComponent, decorators: [{
29668
+ type: Component,
29669
+ args: [{ selector: 'gn-ui-internal-link-card-contact', standalone: true, imports: [NgIf, ThumbnailComponent, NgIconComponent, TranslateModule], providers: [
29670
+ provideIcons({
29671
+ iconoirInternet,
29672
+ matEmailOutline,
29673
+ matPhoneOutline,
29674
+ matLocationOnOutline,
29675
+ }),
29676
+ ], template: "<div\n data-cy=\"recordOrg\"\n class=\"flex items-center justify-evenly bg-gray-50 rounded-lg h-[53px] px-2\"\n>\n <div class=\"flex items-center flex-1 min-w-0\">\n <div class=\"w-[45px] h-[45px] rounded-lg overflow-hidden shrink-0 mr-3\">\n <gn-ui-thumbnail\n [thumbnailUrl]=\"record.ownerOrganization?.logoUrl?.toString() || ''\"\n [fit]=\"'contain'\"\n class=\"w-full h-full rounded-lg\"\n ></gn-ui-thumbnail>\n </div>\n <div *ngIf=\"organization?.name\" class=\"flex-1 w-0 overflow-hidden\">\n <div\n class=\"text-xs text-black font-normal leading-tight truncate\"\n translate\n >\n record.card.metadata.contact\n </div>\n <div\n data-cy=\"recordOrgName\"\n class=\"text-xl text-primary-black font-medium truncate\"\n >\n {{ organization.name }}\n </div>\n </div>\n </div>\n <div *ngIf=\"size === 'L'\" class=\"ml-2 flex space-x-2\">\n <div *ngIf=\"organization?.website\" class=\"flex\">\n <button\n [title]=\"organization.website\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest\"\n (click)=\"openExternalUrl($event, organization.website)\"\n >\n <ng-icon name=\"iconoirInternet\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.email\" class=\"flex\">\n <button\n [title]=\"contacts[0].email\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest\"\n data-cy=\"contact-email\"\n (click)=\"openMailto($event, contacts[0].email)\"\n >\n <ng-icon name=\"matEmailOutline\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.phone\" class=\"flex\">\n <button\n [title]=\"'Copy to clipboard'\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group\"\n data-cy=\"contact-phone\"\n (click)=\"copyToClipboard($event, contacts[0].phone)\"\n >\n <ng-icon name=\"matPhoneOutline\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.address\" class=\"flex\">\n <button\n [title]=\"'Copy to clipboard'\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group\"\n data-cy=\"contact-phone\"\n (click)=\"copyToClipboard($event, contacts[0].address)\"\n >\n <ng-icon name=\"matLocationOnOutline\"></ng-icon>\n </button>\n </div>\n </div>\n</div>\n" }]
29677
+ }], propDecorators: { record: [{
29678
+ type: Input
29679
+ }], size: [{
29680
+ type: Input
29681
+ }] } });
29682
+
29282
29683
  class InternalLinkCardComponent {
29283
29684
  set size(value) {
29284
29685
  this._size = value;
@@ -29320,28 +29721,19 @@ class InternalLinkCardComponent {
29320
29721
  this.abstract = removeWhitespace(stripHtml(this.record?.abstract));
29321
29722
  this.subscription.add(fromEvent(this.elementRef.nativeElement, 'click').subscribe(() => this.mdSelect.emit(this.record)));
29322
29723
  }
29323
- get organization() {
29324
- return this.record.ownerOrganization;
29325
- }
29326
- get contacts() {
29327
- return ((this.record.kind === 'dataset'
29328
- ? this.record.contactsForResource
29329
- : this.record.contacts) || []);
29330
- }
29331
29724
  getTitleClass() {
29332
29725
  return this.titleClassMap[this._size];
29333
29726
  }
29334
- openExternalUrl(event, url) {
29335
- event.stopPropagation();
29336
- window.open(url, '_blank');
29337
- }
29338
- openMailto(event, email) {
29339
- event.stopPropagation();
29340
- window.open(`mailto:${email}`, '_blank');
29727
+ getAbstractClass() {
29728
+ const marginClass = ['S', 'XS'].includes(this.size) ? 'ml-2' : '';
29729
+ const clampClass = this.size === 'L' && !this.record.ownerOrganization?.name
29730
+ ? 'line-clamp-6'
29731
+ : 'line-clamp-2';
29732
+ return `${clampClass} ${marginClass}`.trim();
29341
29733
  }
29342
- copyToClipboard(event, text) {
29343
- event.stopPropagation();
29344
- navigator.clipboard.writeText(text);
29734
+ displayAbstract() {
29735
+ return (this.size === 'L' ||
29736
+ (['M', 'S'].includes(this.size) && !this.record.ownerOrganization?.name));
29345
29737
  }
29346
29738
  get shouldShowThumbnail() {
29347
29739
  return this.size === 'L' || this.size === 'M';
@@ -29351,40 +29743,34 @@ class InternalLinkCardComponent {
29351
29743
  provideIcons({
29352
29744
  iconoirInternet,
29353
29745
  matLocationSearchingOutline,
29354
- matEmailOutline,
29355
- matPhoneOutline,
29356
- matLocationOnOutline,
29357
29746
  }),
29358
29747
  provideNgIconsConfig({
29359
29748
  size: '1.2em',
29360
29749
  }),
29361
- ], ngImport: i0, template: "<a [attr.href]=\"linkHref\" [target]=\"linkTarget\">\n <div\n class=\"group rounded-md bg-white hover:cursor-pointer hover:bg-slate-50 overflow-hidden w-full\"\n [ngClass]=\"cardClass\"\n >\n <div\n class=\"flex flex-row md:gap-0 justify-between w-full\"\n [ngClass]=\"{ 'flex-wrap md:flex-nowrap gap-3': size === 'L' }\"\n >\n <div\n *ngIf=\"shouldShowThumbnail\"\n [ngClass]=\"thumbnailContainerClass\"\n class=\"border mr-4 flex flex-col\"\n >\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grow flex flex-col gap-3\">\n <div class=\"flex items-center gap-2\">\n <div class=\"grow flex flex-wrap items-center gap-2\">\n <gn-ui-kind-badge\n [styling]=\"'default'\"\n [kind]=\"record?.kind\"\n ></gn-ui-kind-badge>\n <gn-ui-geo-data-badge\n [showLabel]=\"size === 'L'\"\n [styling]=\"'light'\"\n [record]=\"record\"\n ></gn-ui-geo-data-badge>\n <gn-ui-metadata-quality\n class=\"flex items-center\"\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n ></gn-ui-metadata-quality>\n </div>\n <div *ngIf=\"size !== 'XS'\" data-cy=\"recordFav\">\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n\n <div class=\"grow flex flex-col gap-2\">\n <div\n class=\"font-medium text-title group-hover:text-primary\"\n [title]=\"record.title\"\n >\n <h4\n class=\"mr-6 overflow-hidden\"\n [ngClass]=\"getTitleClass()\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n </div>\n <div\n *ngIf=\"size === 'L'\"\n class=\"mr-6 text-xs text-gray-900 line-clamp-2 overflow-hidden\"\n data-cy=\"recordAbstract\"\n >\n <gn-ui-markdown-parser\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n ></gn-ui-markdown-parser>\n </div>\n </div>\n\n <div\n data-cy=\"recordOrg\"\n *ngIf=\"size !== 'XS' && record.ownerOrganization?.name\"\n class=\"flex items-center justify-evenly bg-gray-50 rounded-lg h-[53px] px-2\"\n >\n <div class=\"flex items-center flex-1 min-w-0\">\n <div\n class=\"w-[45px] h-[45px] rounded-lg overflow-hidden shrink-0 mr-3\"\n >\n <gn-ui-thumbnail\n [thumbnailUrl]=\"\n record.ownerOrganization?.logoUrl?.toString() || ''\n \"\n [fit]=\"'contain'\"\n class=\"w-full h-full rounded-lg\"\n ></gn-ui-thumbnail>\n </div>\n <div *ngIf=\"organization?.name\" class=\"flex-1 w-0 overflow-hidden\">\n <div\n class=\"text-xs text-black font-normal leading-tight truncate\"\n translate\n >\n record.card.metadata.contact\n </div>\n <div\n data-cy=\"recordOrgName\"\n class=\"text-xl text-primary-black font-medium truncate\"\n >\n {{ organization.name }}\n </div>\n </div>\n </div>\n <div *ngIf=\"size === 'L'\" class=\"ml-2 flex space-x-2\">\n <div *ngIf=\"organization?.website\" class=\"flex\">\n <button\n [title]=\"organization.website\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest\"\n (click)=\"openExternalUrl($event, organization.website)\"\n >\n <ng-icon name=\"iconoirInternet\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.email\" class=\"flex\">\n <button\n [title]=\"contacts[0].email\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest\"\n data-cy=\"contact-email\"\n (click)=\"openMailto($event, contacts[0].email)\"\n >\n <ng-icon name=\"matEmailOutline\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.phone\" class=\"flex\">\n <button\n [title]=\"'Copy to clipboard'\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group\"\n data-cy=\"contact-phone\"\n (click)=\"copyToClipboard($event, contacts[0].phone)\"\n >\n <ng-icon name=\"matPhoneOutline\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.address\" class=\"flex\">\n <button\n [title]=\"'Copy to clipboard'\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group\"\n data-cy=\"contact-phone\"\n (click)=\"copyToClipboard($event, contacts[0].address)\"\n >\n <ng-icon name=\"matLocationOnOutline\"></ng-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }, { kind: "component", type: MetadataQualityComponent, selector: "gn-ui-metadata-quality", inputs: ["metadata", "smaller", "metadataQualityDisplay"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: GeoDataBadgeComponent, selector: "gn-ui-geo-data-badge", inputs: ["showLabel", "styling", "record"] }, { kind: "component", type: KindBadgeComponent, selector: "gn-ui-kind-badge", inputs: ["styling", "contentTemplate", "kind"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }] }); }
29750
+ ], ngImport: i0, template: "<a [attr.href]=\"linkHref\" [target]=\"linkTarget\">\n <div\n class=\"group rounded-md bg-white hover:cursor-pointer hover:bg-slate-50 overflow-hidden w-full\"\n [ngClass]=\"cardClass\"\n >\n <div\n class=\"flex flex-row md:gap-0 justify-between w-full\"\n [ngClass]=\"{ 'flex-wrap md:flex-nowrap gap-3': size === 'L' }\"\n >\n <div\n *ngIf=\"shouldShowThumbnail\"\n [ngClass]=\"thumbnailContainerClass\"\n class=\"border mr-4 flex flex-col\"\n >\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grow flex flex-col gap-3\">\n <div class=\"flex items-center gap-2\">\n <div class=\"grow flex flex-wrap items-center gap-2\">\n <gn-ui-kind-badge\n [styling]=\"'default'\"\n [kind]=\"record?.kind\"\n ></gn-ui-kind-badge>\n <gn-ui-geo-data-badge\n [showLabel]=\"size === 'L'\"\n [styling]=\"'light'\"\n [record]=\"record\"\n ></gn-ui-geo-data-badge>\n <gn-ui-metadata-quality\n class=\"flex items-center\"\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n ></gn-ui-metadata-quality>\n </div>\n <div *ngIf=\"size !== 'XS'\" data-cy=\"recordFav\">\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n\n <div class=\"grow flex flex-col gap-2\">\n <div\n class=\"font-medium text-title group-hover:text-primary\"\n [title]=\"record.title\"\n >\n <h4\n class=\"mr-6 overflow-hidden\"\n [ngClass]=\"getTitleClass()\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n </div>\n <div\n *ngIf=\"displayAbstract()\"\n class=\"mr-6 text-xs text-gray-900 overflow-hidden\"\n [ngClass]=\"getAbstractClass()\"\n data-cy=\"recordAbstract\"\n >\n <gn-ui-markdown-parser\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n ></gn-ui-markdown-parser>\n </div>\n </div>\n\n <gn-ui-internal-link-card-contact\n *ngIf=\"size !== 'XS' && record.ownerOrganization?.name\"\n [record]=\"record\"\n [size]=\"size\"\n ></gn-ui-internal-link-card-contact>\n </div>\n </div>\n </div>\n</a>\n", styles: [""], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: MetadataQualityComponent, selector: "gn-ui-metadata-quality", inputs: ["metadata", "smaller", "metadataQualityDisplay"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "component", type: GeoDataBadgeComponent, selector: "gn-ui-geo-data-badge", inputs: ["showLabel", "styling", "record"] }, { kind: "component", type: KindBadgeComponent, selector: "gn-ui-kind-badge", inputs: ["styling", "contentTemplate", "kind"] }, { kind: "component", type: MarkdownParserComponent, selector: "gn-ui-markdown-parser", inputs: ["textContent", "whitoutStyles"] }, { kind: "component", type: InternalLinkCardContactComponent, selector: "gn-ui-internal-link-card-contact", inputs: ["record", "size"] }, { kind: "component", type: ThumbnailComponent, selector: "gn-ui-thumbnail", inputs: ["thumbnailUrl", "fit"], outputs: ["placeholderShown"] }] }); }
29362
29751
  }
29363
29752
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InternalLinkCardComponent, decorators: [{
29364
29753
  type: Component,
29365
29754
  args: [{ selector: 'gn-ui-internal-link-card', standalone: true, imports: [
29366
29755
  NgClass,
29367
29756
  NgIf,
29368
- ThumbnailComponent,
29369
29757
  MetadataQualityComponent,
29370
29758
  NgTemplateOutlet,
29371
- NgIconComponent,
29372
29759
  TranslateModule,
29373
29760
  GeoDataBadgeComponent,
29374
29761
  KindBadgeComponent,
29375
29762
  MarkdownParserComponent,
29763
+ InternalLinkCardContactComponent,
29764
+ ThumbnailComponent,
29376
29765
  ], providers: [
29377
29766
  provideIcons({
29378
29767
  iconoirInternet,
29379
29768
  matLocationSearchingOutline,
29380
- matEmailOutline,
29381
- matPhoneOutline,
29382
- matLocationOnOutline,
29383
29769
  }),
29384
29770
  provideNgIconsConfig({
29385
29771
  size: '1.2em',
29386
29772
  }),
29387
- ], template: "<a [attr.href]=\"linkHref\" [target]=\"linkTarget\">\n <div\n class=\"group rounded-md bg-white hover:cursor-pointer hover:bg-slate-50 overflow-hidden w-full\"\n [ngClass]=\"cardClass\"\n >\n <div\n class=\"flex flex-row md:gap-0 justify-between w-full\"\n [ngClass]=\"{ 'flex-wrap md:flex-nowrap gap-3': size === 'L' }\"\n >\n <div\n *ngIf=\"shouldShowThumbnail\"\n [ngClass]=\"thumbnailContainerClass\"\n class=\"border mr-4 flex flex-col\"\n >\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grow flex flex-col gap-3\">\n <div class=\"flex items-center gap-2\">\n <div class=\"grow flex flex-wrap items-center gap-2\">\n <gn-ui-kind-badge\n [styling]=\"'default'\"\n [kind]=\"record?.kind\"\n ></gn-ui-kind-badge>\n <gn-ui-geo-data-badge\n [showLabel]=\"size === 'L'\"\n [styling]=\"'light'\"\n [record]=\"record\"\n ></gn-ui-geo-data-badge>\n <gn-ui-metadata-quality\n class=\"flex items-center\"\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n ></gn-ui-metadata-quality>\n </div>\n <div *ngIf=\"size !== 'XS'\" data-cy=\"recordFav\">\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n\n <div class=\"grow flex flex-col gap-2\">\n <div\n class=\"font-medium text-title group-hover:text-primary\"\n [title]=\"record.title\"\n >\n <h4\n class=\"mr-6 overflow-hidden\"\n [ngClass]=\"getTitleClass()\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n </div>\n <div\n *ngIf=\"size === 'L'\"\n class=\"mr-6 text-xs text-gray-900 line-clamp-2 overflow-hidden\"\n data-cy=\"recordAbstract\"\n >\n <gn-ui-markdown-parser\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n ></gn-ui-markdown-parser>\n </div>\n </div>\n\n <div\n data-cy=\"recordOrg\"\n *ngIf=\"size !== 'XS' && record.ownerOrganization?.name\"\n class=\"flex items-center justify-evenly bg-gray-50 rounded-lg h-[53px] px-2\"\n >\n <div class=\"flex items-center flex-1 min-w-0\">\n <div\n class=\"w-[45px] h-[45px] rounded-lg overflow-hidden shrink-0 mr-3\"\n >\n <gn-ui-thumbnail\n [thumbnailUrl]=\"\n record.ownerOrganization?.logoUrl?.toString() || ''\n \"\n [fit]=\"'contain'\"\n class=\"w-full h-full rounded-lg\"\n ></gn-ui-thumbnail>\n </div>\n <div *ngIf=\"organization?.name\" class=\"flex-1 w-0 overflow-hidden\">\n <div\n class=\"text-xs text-black font-normal leading-tight truncate\"\n translate\n >\n record.card.metadata.contact\n </div>\n <div\n data-cy=\"recordOrgName\"\n class=\"text-xl text-primary-black font-medium truncate\"\n >\n {{ organization.name }}\n </div>\n </div>\n </div>\n <div *ngIf=\"size === 'L'\" class=\"ml-2 flex space-x-2\">\n <div *ngIf=\"organization?.website\" class=\"flex\">\n <button\n [title]=\"organization.website\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest\"\n (click)=\"openExternalUrl($event, organization.website)\"\n >\n <ng-icon name=\"iconoirInternet\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.email\" class=\"flex\">\n <button\n [title]=\"contacts[0].email\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest\"\n data-cy=\"contact-email\"\n (click)=\"openMailto($event, contacts[0].email)\"\n >\n <ng-icon name=\"matEmailOutline\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.phone\" class=\"flex\">\n <button\n [title]=\"'Copy to clipboard'\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group\"\n data-cy=\"contact-phone\"\n (click)=\"copyToClipboard($event, contacts[0].phone)\"\n >\n <ng-icon name=\"matPhoneOutline\"></ng-icon>\n </button>\n </div>\n <div *ngIf=\"contacts[0]?.address\" class=\"flex\">\n <button\n [title]=\"'Copy to clipboard'\"\n class=\"w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group\"\n data-cy=\"contact-phone\"\n (click)=\"copyToClipboard($event, contacts[0].address)\"\n >\n <ng-icon name=\"matLocationOnOutline\"></ng-icon>\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</a>\n" }]
29773
+ ], template: "<a [attr.href]=\"linkHref\" [target]=\"linkTarget\">\n <div\n class=\"group rounded-md bg-white hover:cursor-pointer hover:bg-slate-50 overflow-hidden w-full\"\n [ngClass]=\"cardClass\"\n >\n <div\n class=\"flex flex-row md:gap-0 justify-between w-full\"\n [ngClass]=\"{ 'flex-wrap md:flex-nowrap gap-3': size === 'L' }\"\n >\n <div\n *ngIf=\"shouldShowThumbnail\"\n [ngClass]=\"thumbnailContainerClass\"\n class=\"border mr-4 flex flex-col\"\n >\n <gn-ui-thumbnail\n class=\"w-full h-full object-cover\"\n [thumbnailUrl]=\"record.overviews?.[0]?.url?.toString() || ''\"\n [fit]=\"'cover'\"\n ></gn-ui-thumbnail>\n </div>\n <div class=\"grow flex flex-col gap-3\">\n <div class=\"flex items-center gap-2\">\n <div class=\"grow flex flex-wrap items-center gap-2\">\n <gn-ui-kind-badge\n [styling]=\"'default'\"\n [kind]=\"record?.kind\"\n ></gn-ui-kind-badge>\n <gn-ui-geo-data-badge\n [showLabel]=\"size === 'L'\"\n [styling]=\"'light'\"\n [record]=\"record\"\n ></gn-ui-geo-data-badge>\n <gn-ui-metadata-quality\n class=\"flex items-center\"\n [smaller]=\"true\"\n [metadata]=\"record\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n ></gn-ui-metadata-quality>\n </div>\n <div *ngIf=\"size !== 'XS'\" data-cy=\"recordFav\">\n <ng-container\n [ngTemplateOutlet]=\"favoriteTemplate\"\n [ngTemplateOutletContext]=\"{ $implicit: record }\"\n ></ng-container>\n </div>\n </div>\n\n <div class=\"grow flex flex-col gap-2\">\n <div\n class=\"font-medium text-title group-hover:text-primary\"\n [title]=\"record.title\"\n >\n <h4\n class=\"mr-6 overflow-hidden\"\n [ngClass]=\"getTitleClass()\"\n data-cy=\"recordTitle\"\n [title]=\"record.title\"\n >\n {{ record.title }}\n </h4>\n </div>\n <div\n *ngIf=\"displayAbstract()\"\n class=\"mr-6 text-xs text-gray-900 overflow-hidden\"\n [ngClass]=\"getAbstractClass()\"\n data-cy=\"recordAbstract\"\n >\n <gn-ui-markdown-parser\n [textContent]=\"abstract\"\n [whitoutStyles]=\"true\"\n ></gn-ui-markdown-parser>\n </div>\n </div>\n\n <gn-ui-internal-link-card-contact\n *ngIf=\"size !== 'XS' && record.ownerOrganization?.name\"\n [record]=\"record\"\n [size]=\"size\"\n ></gn-ui-internal-link-card-contact>\n </div>\n </div>\n </div>\n</a>\n" }]
29388
29774
  }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { record: [{
29389
29775
  type: Input
29390
29776
  }], linkTarget: [{
@@ -31592,6 +31978,73 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31592
31978
  type: Input
31593
31979
  }] } });
31594
31980
 
31981
+ class ActionMenuComponent {
31982
+ constructor(dialog, cdr) {
31983
+ this.dialog = dialog;
31984
+ this.cdr = cdr;
31985
+ this.canDuplicate = true;
31986
+ this.canDelete = true;
31987
+ this.duplicate = new EventEmitter();
31988
+ this.delete = new EventEmitter();
31989
+ this.closeActionMenu = new EventEmitter();
31990
+ this.rollback = new EventEmitter();
31991
+ this.switch = new EventEmitter();
31992
+ this.sectionDisplayed = 'mainMenu';
31993
+ }
31994
+ displayMainMenu() {
31995
+ this.sectionDisplayed = 'mainMenu';
31996
+ this.cdr.markForCheck();
31997
+ }
31998
+ displayDeleteMenu() {
31999
+ switch (this.page) {
32000
+ case 'draft':
32001
+ this.sectionDisplayed = 'rollbackMenu';
32002
+ break;
32003
+ case 'record':
32004
+ this.delete.emit();
32005
+ break;
32006
+ case 'main':
32007
+ default:
32008
+ this.sectionDisplayed = 'deleteMenu';
32009
+ }
32010
+ this.cdr.markForCheck();
32011
+ }
32012
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ActionMenuComponent, deps: [{ token: i1$a.MatDialog }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
32013
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ActionMenuComponent, isStandalone: true, selector: "gn-ui-action-menu", inputs: { canDuplicate: "canDuplicate", isDuplicating: "isDuplicating", canDelete: "canDelete", page: "page" }, outputs: { duplicate: "duplicate", delete: "delete", closeActionMenu: "closeActionMenu", rollback: "rollback", switch: "switch" }, viewQueries: [{ propertyName: "trigger", first: true, predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<ng-container [ngSwitch]=\"sectionDisplayed\">\n <ng-container *ngSwitchCase=\"'mainMenu'\">\n <div\n data-test=\"mainMenuSection\"\n class=\"mt-2 border border-gray-100 p-2 flex items-center bg-white shadow-2xl rounded-2xl\"\n >\n <ul class=\"flex flex-col gap-2 w-full\">\n <gn-ui-button\n *ngIf=\"page === 'main'\"\n type=\"light\"\n extraClass=\"flex flex-row items-center gap-2 w-full justify-start\"\n (buttonClick)=\"duplicate.emit()\"\n [disabled]=\"!canDuplicate\"\n data-test=\"record-menu-duplicate-button\"\n >\n <span *ngIf=\"isDuplicating; else notDuplicating\" translate\n >record.action.duplicating</span\n >\n <ng-template #notDuplicating>\n <span translate>record.action.duplicate</span>\n </ng-template>\n </gn-ui-button>\n <gn-ui-button\n *ngIf=\"page === 'record'\"\n type=\"light\"\n extraClass=\"flex flex-row items-center gap-2 w-full justify-start\"\n (buttonClick)=\"switch.emit()\"\n data-test=\"record-menu-switch-button\"\n ><span translate>record.action.switchLang</span></gn-ui-button\n >\n <gn-ui-button\n type=\"light\"\n extraClass=\"flex flex-row items-center gap-2 w-full justify-start\"\n (buttonClick)=\"displayDeleteMenu()\"\n [disabled]=\"!canDelete\"\n data-test=\"record-menu-delete-button\"\n ><span *ngIf=\"page !== 'draft'\" translate>record.action.delete</span>\n <span *ngIf=\"page === 'draft'\" translate\n >record.action.rollback</span\n ></gn-ui-button\n >\n </ul>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'deleteMenu'\">\n <div\n data-test=\"deleteMenuSection\"\n class=\"w-72 p-6 flex flex-col gap-3 mt-2 border border-gray-100 bg-white shadow-2xl rounded-2xl\"\n >\n <span class=\"text-lg font-bold text-center\">{{\n 'editor.record.delete.confirmation.title' | translate\n }}</span>\n <span class=\"text-center\">{{\n 'editor.record.delete.confirmation.message' | translate\n }}</span>\n <div class=\"flex flex-row gap-8 justify-center\">\n <gn-ui-button\n (buttonClick)=\"delete.emit()\"\n cdkFocusInitial\n type=\"primary\"\n data-cy=\"confirm-button\"\n [style.--gn-ui-button-width]=\"'100px'\"\n >{{\n 'editor.record.delete.confirmation.confirmText' | translate\n }}</gn-ui-button\n >\n <gn-ui-button\n [style.--gn-ui-button-width]=\"'100px'\"\n (buttonClick)=\"closeActionMenu.emit()\"\n >{{\n 'editor.record.delete.confirmation.cancelText' | translate\n }}</gn-ui-button\n >\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'rollbackMenu'\">\n <div\n data-test=\"rollbackMenuSection\"\n class=\"w-80 p-6 flex flex-col gap-3 mt-2 border border-gray-100 bg-white shadow-2xl rounded-2xl\"\n >\n <span class=\"text-lg font-bold text-center\">{{\n 'editor.record.undo.confirmation.title' | translate\n }}</span>\n <span class=\"text-center\">{{\n 'editor.record.undo.confirmation.message' | translate\n }}</span>\n <div class=\"flex flex-row gap-8 justify-center\">\n <gn-ui-button\n (buttonClick)=\"rollback.emit()\"\n cdkFocusInitial\n type=\"primary\"\n data-cy=\"confirm-button\"\n [style.--gn-ui-button-width]=\"'120px'\"\n >{{\n 'editor.record.undo.confirmation.confirmText' | translate\n }}</gn-ui-button\n >\n <gn-ui-button\n [style.--gn-ui-button-width]=\"'120px'\"\n (buttonClick)=\"closeActionMenu.emit()\"\n >{{\n 'editor.record.undo.confirmation.cancelText' | translate\n }}</gn-ui-button\n >\n </div>\n </div>\n </ng-container>\n</ng-container>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] }); }
32014
+ }
32015
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ActionMenuComponent, decorators: [{
32016
+ type: Component,
32017
+ args: [{ selector: 'gn-ui-action-menu', standalone: true, imports: [
32018
+ CommonModule,
32019
+ ButtonComponent,
32020
+ MatMenuModule,
32021
+ MatDialogModule,
32022
+ ConfirmationDialogComponent,
32023
+ TranslateModule,
32024
+ ], template: "<ng-container [ngSwitch]=\"sectionDisplayed\">\n <ng-container *ngSwitchCase=\"'mainMenu'\">\n <div\n data-test=\"mainMenuSection\"\n class=\"mt-2 border border-gray-100 p-2 flex items-center bg-white shadow-2xl rounded-2xl\"\n >\n <ul class=\"flex flex-col gap-2 w-full\">\n <gn-ui-button\n *ngIf=\"page === 'main'\"\n type=\"light\"\n extraClass=\"flex flex-row items-center gap-2 w-full justify-start\"\n (buttonClick)=\"duplicate.emit()\"\n [disabled]=\"!canDuplicate\"\n data-test=\"record-menu-duplicate-button\"\n >\n <span *ngIf=\"isDuplicating; else notDuplicating\" translate\n >record.action.duplicating</span\n >\n <ng-template #notDuplicating>\n <span translate>record.action.duplicate</span>\n </ng-template>\n </gn-ui-button>\n <gn-ui-button\n *ngIf=\"page === 'record'\"\n type=\"light\"\n extraClass=\"flex flex-row items-center gap-2 w-full justify-start\"\n (buttonClick)=\"switch.emit()\"\n data-test=\"record-menu-switch-button\"\n ><span translate>record.action.switchLang</span></gn-ui-button\n >\n <gn-ui-button\n type=\"light\"\n extraClass=\"flex flex-row items-center gap-2 w-full justify-start\"\n (buttonClick)=\"displayDeleteMenu()\"\n [disabled]=\"!canDelete\"\n data-test=\"record-menu-delete-button\"\n ><span *ngIf=\"page !== 'draft'\" translate>record.action.delete</span>\n <span *ngIf=\"page === 'draft'\" translate\n >record.action.rollback</span\n ></gn-ui-button\n >\n </ul>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'deleteMenu'\">\n <div\n data-test=\"deleteMenuSection\"\n class=\"w-72 p-6 flex flex-col gap-3 mt-2 border border-gray-100 bg-white shadow-2xl rounded-2xl\"\n >\n <span class=\"text-lg font-bold text-center\">{{\n 'editor.record.delete.confirmation.title' | translate\n }}</span>\n <span class=\"text-center\">{{\n 'editor.record.delete.confirmation.message' | translate\n }}</span>\n <div class=\"flex flex-row gap-8 justify-center\">\n <gn-ui-button\n (buttonClick)=\"delete.emit()\"\n cdkFocusInitial\n type=\"primary\"\n data-cy=\"confirm-button\"\n [style.--gn-ui-button-width]=\"'100px'\"\n >{{\n 'editor.record.delete.confirmation.confirmText' | translate\n }}</gn-ui-button\n >\n <gn-ui-button\n [style.--gn-ui-button-width]=\"'100px'\"\n (buttonClick)=\"closeActionMenu.emit()\"\n >{{\n 'editor.record.delete.confirmation.cancelText' | translate\n }}</gn-ui-button\n >\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'rollbackMenu'\">\n <div\n data-test=\"rollbackMenuSection\"\n class=\"w-80 p-6 flex flex-col gap-3 mt-2 border border-gray-100 bg-white shadow-2xl rounded-2xl\"\n >\n <span class=\"text-lg font-bold text-center\">{{\n 'editor.record.undo.confirmation.title' | translate\n }}</span>\n <span class=\"text-center\">{{\n 'editor.record.undo.confirmation.message' | translate\n }}</span>\n <div class=\"flex flex-row gap-8 justify-center\">\n <gn-ui-button\n (buttonClick)=\"rollback.emit()\"\n cdkFocusInitial\n type=\"primary\"\n data-cy=\"confirm-button\"\n [style.--gn-ui-button-width]=\"'120px'\"\n >{{\n 'editor.record.undo.confirmation.confirmText' | translate\n }}</gn-ui-button\n >\n <gn-ui-button\n [style.--gn-ui-button-width]=\"'120px'\"\n (buttonClick)=\"closeActionMenu.emit()\"\n >{{\n 'editor.record.undo.confirmation.cancelText' | translate\n }}</gn-ui-button\n >\n </div>\n </div>\n </ng-container>\n</ng-container>\n" }]
32025
+ }], ctorParameters: () => [{ type: i1$a.MatDialog }, { type: i0.ChangeDetectorRef }], propDecorators: { canDuplicate: [{
32026
+ type: Input
32027
+ }], isDuplicating: [{
32028
+ type: Input
32029
+ }], canDelete: [{
32030
+ type: Input
32031
+ }], page: [{
32032
+ type: Input
32033
+ }], duplicate: [{
32034
+ type: Output
32035
+ }], delete: [{
32036
+ type: Output
32037
+ }], closeActionMenu: [{
32038
+ type: Output
32039
+ }], rollback: [{
32040
+ type: Output
32041
+ }], switch: [{
32042
+ type: Output
32043
+ }], trigger: [{
32044
+ type: ViewChild,
32045
+ args: [MatMenuTrigger]
32046
+ }] } });
32047
+
31595
32048
  class UiSearchModule {
31596
32049
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiSearchModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
31597
32050
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: UiSearchModule, declarations: [RecordPreviewComponent,
@@ -31617,7 +32070,8 @@ class UiSearchModule {
31617
32070
  MatCheckboxModule,
31618
32071
  RouterLink,
31619
32072
  InteractiveTableComponent, i2$2.NgIconsModule, KindBadgeComponent,
31620
- MetadataQualityComponent], exports: [RecordPreviewListComponent,
32073
+ MetadataQualityComponent,
32074
+ ActionMenuComponent], exports: [RecordPreviewListComponent,
31621
32075
  RecordPreviewCardComponent,
31622
32076
  RecordPreviewTextComponent,
31623
32077
  RecordPreviewTitleComponent,
@@ -31628,7 +32082,8 @@ class UiSearchModule {
31628
32082
  ResultsHitsNumberComponent,
31629
32083
  ResultsHitsSearchKindComponent,
31630
32084
  RecordPreviewFeedComponent,
31631
- RecordPreviewRowComponent] }); }
32085
+ RecordPreviewRowComponent,
32086
+ ActionMenuComponent] }); }
31632
32087
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiSearchModule, providers: [
31633
32088
  provideNgIconsConfig({
31634
32089
  size: '1.5em',
@@ -31655,7 +32110,8 @@ class UiSearchModule {
31655
32110
  matHomeWorkOutline,
31656
32111
  }),
31657
32112
  KindBadgeComponent,
31658
- MetadataQualityComponent, FacetsModule$1] }); }
32113
+ MetadataQualityComponent,
32114
+ ActionMenuComponent, FacetsModule$1] }); }
31659
32115
  }
31660
32116
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiSearchModule, decorators: [{
31661
32117
  type: NgModule,
@@ -31698,6 +32154,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31698
32154
  }),
31699
32155
  KindBadgeComponent,
31700
32156
  MetadataQualityComponent,
32157
+ ActionMenuComponent,
31701
32158
  ],
31702
32159
  exports: [
31703
32160
  RecordPreviewListComponent,
@@ -31712,6 +32169,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31712
32169
  ResultsHitsSearchKindComponent,
31713
32170
  RecordPreviewFeedComponent,
31714
32171
  RecordPreviewRowComponent,
32172
+ ActionMenuComponent,
31715
32173
  ],
31716
32174
  providers: [
31717
32175
  provideNgIconsConfig({
@@ -31722,76 +32180,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31722
32180
  }]
31723
32181
  }] });
31724
32182
 
31725
- class ActionMenuComponent {
31726
- constructor(dialog, cdr) {
31727
- this.dialog = dialog;
31728
- this.cdr = cdr;
31729
- this.duplicate = new EventEmitter();
31730
- this.delete = new EventEmitter();
31731
- this.closeActionMenu = new EventEmitter();
31732
- this.rollback = new EventEmitter();
31733
- this.sectionDisplayed = 'mainMenu';
31734
- }
31735
- openMenu() {
31736
- this.trigger.openMenu();
31737
- }
31738
- displayMainMenu() {
31739
- this.sectionDisplayed = 'mainMenu';
31740
- this.cdr.markForCheck();
31741
- }
31742
- displayDeleteMenu() {
31743
- if (this.isDraftPage) {
31744
- this.sectionDisplayed = 'rollbackMenu';
31745
- }
31746
- else {
31747
- this.sectionDisplayed = 'deleteMenu';
31748
- }
31749
- this.cdr.markForCheck();
31750
- }
31751
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ActionMenuComponent, deps: [{ token: i1$a.MatDialog }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
31752
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ActionMenuComponent, isStandalone: true, selector: "gn-ui-action-menu", inputs: { canDuplicate: "canDuplicate", canDelete: "canDelete", isDraftPage: "isDraftPage" }, outputs: { duplicate: "duplicate", delete: "delete", closeActionMenu: "closeActionMenu", rollback: "rollback" }, viewQueries: [{ propertyName: "trigger", first: true, predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<ng-container [ngSwitch]=\"sectionDisplayed\">\n <ng-container *ngSwitchCase=\"'mainMenu'\">\n <div\n data-test=\"mainMenuSection\"\n class=\"mt-2 border border-gray-100 p-2 flex items-center bg-white shadow-2xl rounded-2xl\"\n >\n <ul class=\"flex flex-col gap-2 w-full\">\n <gn-ui-button\n *ngIf=\"!isDraftPage\"\n type=\"light\"\n extraClass=\"flex flex-row items-center gap-2 w-full justify-start\"\n (buttonClick)=\"duplicate.emit()\"\n [disabled]=\"!canDuplicate\"\n data-test=\"record-menu-duplicate-button\"\n >\n <span *ngIf=\"canDuplicate\" translate>record.action.duplicate</span>\n <span *ngIf=\"!canDuplicate\" translate\n >record.action.duplicating</span\n ></gn-ui-button\n >\n <gn-ui-button\n type=\"light\"\n extraClass=\"flex flex-row items-center gap-2 w-full justify-start\"\n (buttonClick)=\"displayDeleteMenu()\"\n [disabled]=\"!canDelete\"\n data-test=\"record-menu-delete-button\"\n ><span *ngIf=\"!isDraftPage\" translate>record.action.delete</span>\n <span *ngIf=\"isDraftPage\" translate\n >record.action.rollback</span\n ></gn-ui-button\n >\n </ul>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'deleteMenu'\">\n <div\n data-test=\"deleteMenuSection\"\n class=\"w-72 p-6 flex flex-col gap-3 mt-2 border border-gray-100 bg-white shadow-2xl rounded-2xl\"\n >\n <span class=\"text-lg font-bold text-center\">{{\n 'editor.record.delete.confirmation.title' | translate\n }}</span>\n <span class=\"text-center\">{{\n 'editor.record.delete.confirmation.message' | translate\n }}</span>\n <div class=\"flex flex-row gap-8 justify-center\">\n <gn-ui-button\n (buttonClick)=\"delete.emit()\"\n cdkFocusInitial\n type=\"primary\"\n data-cy=\"confirm-button\"\n [style.--gn-ui-button-width]=\"'100px'\"\n >{{\n 'editor.record.delete.confirmation.confirmText' | translate\n }}</gn-ui-button\n >\n <gn-ui-button\n [style.--gn-ui-button-width]=\"'100px'\"\n (buttonClick)=\"closeActionMenu.emit()\"\n >{{\n 'editor.record.delete.confirmation.cancelText' | translate\n }}</gn-ui-button\n >\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'rollbackMenu'\">\n <div\n data-test=\"rollbackMenuSection\"\n class=\"w-80 p-6 flex flex-col gap-3 mt-2 border border-gray-100 bg-white shadow-2xl rounded-2xl\"\n >\n <span class=\"text-lg font-bold text-center\">{{\n 'editor.record.undo.confirmation.title' | translate\n }}</span>\n <span class=\"text-center\">{{\n 'editor.record.undo.confirmation.message' | translate\n }}</span>\n <div class=\"flex flex-row gap-8 justify-center\">\n <gn-ui-button\n (buttonClick)=\"rollback.emit()\"\n cdkFocusInitial\n type=\"primary\"\n data-cy=\"confirm-button\"\n [style.--gn-ui-button-width]=\"'120px'\"\n >{{\n 'editor.record.undo.confirmation.confirmText' | translate\n }}</gn-ui-button\n >\n <gn-ui-button\n [style.--gn-ui-button-width]=\"'120px'\"\n (buttonClick)=\"closeActionMenu.emit()\"\n >{{\n 'editor.record.undo.confirmation.cancelText' | translate\n }}</gn-ui-button\n >\n </div>\n </div>\n </ng-container>\n</ng-container>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] }); }
31753
- }
31754
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ActionMenuComponent, decorators: [{
31755
- type: Component,
31756
- args: [{ selector: 'gn-ui-action-menu', standalone: true, imports: [
31757
- CommonModule,
31758
- ButtonComponent,
31759
- MatMenuModule,
31760
- MatDialogModule,
31761
- ConfirmationDialogComponent,
31762
- TranslateModule,
31763
- ], template: "<ng-container [ngSwitch]=\"sectionDisplayed\">\n <ng-container *ngSwitchCase=\"'mainMenu'\">\n <div\n data-test=\"mainMenuSection\"\n class=\"mt-2 border border-gray-100 p-2 flex items-center bg-white shadow-2xl rounded-2xl\"\n >\n <ul class=\"flex flex-col gap-2 w-full\">\n <gn-ui-button\n *ngIf=\"!isDraftPage\"\n type=\"light\"\n extraClass=\"flex flex-row items-center gap-2 w-full justify-start\"\n (buttonClick)=\"duplicate.emit()\"\n [disabled]=\"!canDuplicate\"\n data-test=\"record-menu-duplicate-button\"\n >\n <span *ngIf=\"canDuplicate\" translate>record.action.duplicate</span>\n <span *ngIf=\"!canDuplicate\" translate\n >record.action.duplicating</span\n ></gn-ui-button\n >\n <gn-ui-button\n type=\"light\"\n extraClass=\"flex flex-row items-center gap-2 w-full justify-start\"\n (buttonClick)=\"displayDeleteMenu()\"\n [disabled]=\"!canDelete\"\n data-test=\"record-menu-delete-button\"\n ><span *ngIf=\"!isDraftPage\" translate>record.action.delete</span>\n <span *ngIf=\"isDraftPage\" translate\n >record.action.rollback</span\n ></gn-ui-button\n >\n </ul>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'deleteMenu'\">\n <div\n data-test=\"deleteMenuSection\"\n class=\"w-72 p-6 flex flex-col gap-3 mt-2 border border-gray-100 bg-white shadow-2xl rounded-2xl\"\n >\n <span class=\"text-lg font-bold text-center\">{{\n 'editor.record.delete.confirmation.title' | translate\n }}</span>\n <span class=\"text-center\">{{\n 'editor.record.delete.confirmation.message' | translate\n }}</span>\n <div class=\"flex flex-row gap-8 justify-center\">\n <gn-ui-button\n (buttonClick)=\"delete.emit()\"\n cdkFocusInitial\n type=\"primary\"\n data-cy=\"confirm-button\"\n [style.--gn-ui-button-width]=\"'100px'\"\n >{{\n 'editor.record.delete.confirmation.confirmText' | translate\n }}</gn-ui-button\n >\n <gn-ui-button\n [style.--gn-ui-button-width]=\"'100px'\"\n (buttonClick)=\"closeActionMenu.emit()\"\n >{{\n 'editor.record.delete.confirmation.cancelText' | translate\n }}</gn-ui-button\n >\n </div>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'rollbackMenu'\">\n <div\n data-test=\"rollbackMenuSection\"\n class=\"w-80 p-6 flex flex-col gap-3 mt-2 border border-gray-100 bg-white shadow-2xl rounded-2xl\"\n >\n <span class=\"text-lg font-bold text-center\">{{\n 'editor.record.undo.confirmation.title' | translate\n }}</span>\n <span class=\"text-center\">{{\n 'editor.record.undo.confirmation.message' | translate\n }}</span>\n <div class=\"flex flex-row gap-8 justify-center\">\n <gn-ui-button\n (buttonClick)=\"rollback.emit()\"\n cdkFocusInitial\n type=\"primary\"\n data-cy=\"confirm-button\"\n [style.--gn-ui-button-width]=\"'120px'\"\n >{{\n 'editor.record.undo.confirmation.confirmText' | translate\n }}</gn-ui-button\n >\n <gn-ui-button\n [style.--gn-ui-button-width]=\"'120px'\"\n (buttonClick)=\"closeActionMenu.emit()\"\n >{{\n 'editor.record.undo.confirmation.cancelText' | translate\n }}</gn-ui-button\n >\n </div>\n </div>\n </ng-container>\n</ng-container>\n" }]
31764
- }], ctorParameters: () => [{ type: i1$a.MatDialog }, { type: i0.ChangeDetectorRef }], propDecorators: { canDuplicate: [{
31765
- type: Input
31766
- }], canDelete: [{
31767
- type: Input
31768
- }], isDraftPage: [{
31769
- type: Input
31770
- }], duplicate: [{
31771
- type: Output
31772
- }], delete: [{
31773
- type: Output
31774
- }], closeActionMenu: [{
31775
- type: Output
31776
- }], rollback: [{
31777
- type: Output
31778
- }], trigger: [{
31779
- type: ViewChild,
31780
- args: [MatMenuTrigger]
31781
- }] } });
31782
-
31783
32183
  class ResultsTableComponent {
31784
- constructor(overlay, viewContainerRef, cdr, dateService) {
32184
+ constructor(overlay, viewContainerRef, cdr, dateService, translateService) {
31785
32185
  this.overlay = overlay;
31786
32186
  this.viewContainerRef = viewContainerRef;
31787
32187
  this.cdr = cdr;
31788
32188
  this.dateService = dateService;
32189
+ this.translateService = translateService;
31789
32190
  this.records = [];
31790
32191
  this.selectedRecordsIdentifiers = [];
31791
32192
  this.sortOrder = null;
31792
32193
  this.hasDraft = () => false;
31793
32194
  this.canDuplicate = () => true;
31794
- this.canDelete = () => true;
32195
+ this.canDelete = () => of(true);
32196
+ this.canEdit = () => of(true);
31795
32197
  this.isDraftPage = false;
31796
32198
  this.isDuplicating = false;
31797
32199
  // emits the column (field) as well as the order
@@ -31868,9 +32270,13 @@ class ResultsTableComponent {
31868
32270
  return getBadgeColor(format);
31869
32271
  }
31870
32272
  handleRecordClick(item) {
31871
- if ((item?.extras?.edit || this.isDraftPage) && item.kind === 'dataset') {
31872
- this.recordClick.emit(item);
31873
- }
32273
+ this.canEdit(item)
32274
+ .pipe(take$1(1))
32275
+ .subscribe((canEdit) => {
32276
+ if (canEdit) {
32277
+ this.recordClick.emit(item);
32278
+ }
32279
+ });
31874
32280
  }
31875
32281
  handleDuplicate(item) {
31876
32282
  this.duplicateRecord.emit(item);
@@ -31906,8 +32312,18 @@ class ResultsTableComponent {
31906
32312
  handleRecordSelectedChange(selected, record) {
31907
32313
  this.recordsSelectedChange.emit([[record], selected]);
31908
32314
  }
31909
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableComponent, deps: [{ token: i1$8.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }, { token: DateService }], target: i0.ɵɵFactoryTarget.Component }); }
31910
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsTableComponent, isStandalone: true, selector: "gn-ui-results-table", inputs: { records: "records", selectedRecordsIdentifiers: "selectedRecordsIdentifiers", sortOrder: "sortOrder", hasDraft: "hasDraft", canDuplicate: "canDuplicate", canDelete: "canDelete", isDraftPage: "isDraftPage", isDuplicating: "isDuplicating" }, outputs: { sortByChange: "sortByChange", recordClick: "recordClick", duplicateRecord: "duplicateRecord", deleteRecord: "deleteRecord", rollbackDraft: "rollbackDraft", recordsSelectedChange: "recordsSelectedChange" }, providers: [provideIcons({ iconoirUser, iconoirLock, matMoreVert })], viewQueries: [{ propertyName: "actionMenuButtons", predicate: ["actionMenuButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-interactive-table\n [items]=\"records\"\n [isDraftPage]=\"isDraftPage\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'3rem'\">\n <ng-template #cell let-item let-i=\"index\">\n <ng-icon\n name=\"iconoirLock\"\n class=\"text-purple\"\n *ngIf=\"(!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset'\"\n ></ng-icon>\n <gn-ui-checkbox\n *ngIf=\"(item.extras?.edit || isDraftPage) && item.kind === 'dataset'\"\n [checked]=\"isChecked(item)\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [grow]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword')\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex flex-row items-center gap-2 max-w-full font-semibold\">\n <span data-cy=\"resultItemTitle\" class=\"overflow-hidden text-ellipsis\">{{\n item.title\n }}</span>\n <gn-ui-badge\n *ngIf=\"hasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.2em 0.6em'\"\n [style.--gn-ui-badge-text-size]=\"'12px'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'9rem'\">\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2 font-medium\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"shrink-0 text-xs\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'12rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner')\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.user</span>\n </ng-template>\n <ng-template #cell let-item>\n <ng-icon name=\"iconoirUser\" size=\"16px\"></ng-icon>\n <span data-cy=\"ownerInfo\" class=\"text-xs\">{{\n formatUserInfo(item.extras?.ownerInfo)\n }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'6rem'\">\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n <span class=\"text-xs\">\n {{\n (item.extras?.['isPublishedToAll']\n ? 'record.metadata.status.published'\n : 'record.metadata.status.notPublished'\n ) | translate\n }}</span\n >\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'8rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate')\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.changeDate</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex text-left w-full text-xs\">\n {{\n item.extras?.['isPublishedToAll']\n ? dateToString(item.recordUpdated)\n : '-'\n }}\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- ACTION MENU COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header> </ng-template>\n <ng-template #cell let-item>\n <gn-ui-button\n cdkOverlayOrigin\n #actionMenuButton\n (buttonClick)=\"openActionMenu(item, template)\"\n type=\"light\"\n data-test=\"record-menu-button\"\n [disabled]=\"\n (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset'\n \"\n >\n <ng-icon\n [ngClass]=\"{\n 'text-purple-light':\n (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset',\n }\"\n name=\"matMoreVert\"\n ></ng-icon>\n </gn-ui-button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDuplicate]=\"canDuplicate(item) && !isDuplicating\"\n [canDelete]=\"canDelete(item)\"\n [isDraftPage]=\"isDraftPage\"\n (duplicate)=\"handleDuplicate(item)\"\n (delete)=\"handleDelete(item)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (rollback)=\"handleRollback(item)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: ["type", "checked", "indeterminate"], outputs: ["changed"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "component", type: InteractiveTableComponent, selector: "gn-ui-interactive-table", inputs: ["items", "isDraftPage"], outputs: ["itemClick"] }, { kind: "component", type: InteractiveTableColumnComponent, selector: "gn-ui-interactive-table-column", inputs: ["grow", "width", "sortable", "activeSort"], outputs: ["sortChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ActionMenuComponent, selector: "gn-ui-action-menu", inputs: ["canDuplicate", "canDelete", "isDraftPage"], outputs: ["duplicate", "delete", "closeActionMenu", "rollback"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }] }); }
32315
+ isMultilingual(record) {
32316
+ return record.otherLanguages.length > 0;
32317
+ }
32318
+ getTxtHoverMultilingual(record) {
32319
+ return this.translateService.instant('dashboard.records.isMultilingual', {
32320
+ languages: [...[record.defaultLanguage], ...record.otherLanguages].join(', '),
32321
+ });
32322
+ }
32323
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableComponent, deps: [{ token: i1$8.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }, { token: DateService }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
32324
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsTableComponent, isStandalone: true, selector: "gn-ui-results-table", inputs: { records: "records", selectedRecordsIdentifiers: "selectedRecordsIdentifiers", sortOrder: "sortOrder", hasDraft: "hasDraft", canDuplicate: "canDuplicate", canDelete: "canDelete", canEdit: "canEdit", isDraftPage: "isDraftPage", isDuplicating: "isDuplicating" }, outputs: { sortByChange: "sortByChange", recordClick: "recordClick", duplicateRecord: "duplicateRecord", deleteRecord: "deleteRecord", rollbackDraft: "rollbackDraft", recordsSelectedChange: "recordsSelectedChange" }, providers: [
32325
+ provideIcons({ iconoirUser, iconoirLock, iconoirTranslate, matMoreVert }),
32326
+ ], viewQueries: [{ propertyName: "actionMenuButtons", predicate: ["actionMenuButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "<gn-ui-interactive-table\n [items]=\"records\"\n [canEditItem]=\"canEdit\"\n [isDraftPage]=\"isDraftPage\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'3rem'\">\n <ng-template #cell let-item let-i=\"index\">\n <ng-icon\n name=\"iconoirLock\"\n class=\"text-purple\"\n *ngIf=\"(canEdit(item) | async) === false; else selectCheckbox\"\n ></ng-icon>\n <ng-template #selectCheckbox>\n <gn-ui-checkbox\n [checked]=\"isChecked(item)\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [grow]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword')\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex flex-row items-center gap-2 max-w-full font-semibold\">\n <span data-cy=\"resultItemTitle\" class=\"overflow-hidden text-ellipsis\">{{\n item.title\n }}</span>\n <gn-ui-badge\n *ngIf=\"hasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.2em 0.6em'\"\n [style.--gn-ui-badge-text-size]=\"'12px'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'9rem'\">\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2 font-medium\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"shrink-0 text-xs\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'12rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner')\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.user</span>\n </ng-template>\n <ng-template #cell let-item>\n <ng-icon name=\"iconoirUser\" size=\"16px\"></ng-icon>\n <span data-cy=\"ownerInfo\" class=\"text-xs\">{{\n formatUserInfo(item.extras?.ownerInfo)\n }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'6rem'\">\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n <span class=\"text-xs\">\n {{\n (item.extras?.['isPublishedToAll']\n ? 'record.metadata.status.published'\n : 'record.metadata.status.notPublished'\n ) | translate\n }}</span\n >\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'8rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate')\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.changeDate</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex text-left w-full text-xs\">\n {{\n item.extras?.['isPublishedToAll']\n ? dateToString(item.recordUpdated)\n : '-'\n }}\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- ACTION MENU COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header> </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex justify-end items-center gap-4 w-full\">\n <!-- IS MULTILINGUAL -->\n <ng-icon\n *ngIf=\"isMultilingual(item)\"\n data-cy=\"multilingual-indicator\"\n name=\"iconoirTranslate\"\n [attr.title]=\"getTxtHoverMultilingual(item)\"\n ></ng-icon>\n <!-- MORE ACTIONS MENU BUTTON -->\n <gn-ui-button\n cdkOverlayOrigin\n #actionMenuButton\n (buttonClick)=\"openActionMenu(item, template)\"\n type=\"light\"\n data-test=\"record-menu-button\"\n >\n <ng-icon name=\"matMoreVert\"></ng-icon>\n </gn-ui-button>\n </div>\n <ng-template #template>\n <gn-ui-action-menu\n [canDuplicate]=\"canDuplicate(item)\"\n [isDuplicating]=\"isDuplicating\"\n [canDelete]=\"canDelete(item) | async\"\n [page]=\"isDraftPage ? 'draft' : 'main'\"\n (duplicate)=\"handleDuplicate(item)\"\n (delete)=\"handleDelete(item)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (rollback)=\"handleRollback(item)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n", styles: [":host{--gn-ui-button-height: 40px;--gn-ui-button-width: 40px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "ngmodule", type: UiInputsModule }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: CheckboxComponent, selector: "gn-ui-checkbox", inputs: ["type", "checked", "indeterminate"], outputs: ["changed"] }, { kind: "component", type: BadgeComponent, selector: "gn-ui-badge", inputs: ["clickable", "removable"], outputs: ["badgeRemoveClicked"] }, { kind: "component", type: InteractiveTableComponent, selector: "gn-ui-interactive-table", inputs: ["items", "canEditItem", "isDraftPage"], outputs: ["itemClick"] }, { kind: "component", type: InteractiveTableColumnComponent, selector: "gn-ui-interactive-table-column", inputs: ["grow", "width", "sortable", "activeSort"], outputs: ["sortChange"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ActionMenuComponent, selector: "gn-ui-action-menu", inputs: ["canDuplicate", "isDuplicating", "canDelete", "page"], outputs: ["duplicate", "delete", "closeActionMenu", "rollback", "switch"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "directive", type: CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }] }); }
31911
32327
  }
31912
32328
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableComponent, decorators: [{
31913
32329
  type: Component,
@@ -31921,8 +32337,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31921
32337
  ActionMenuComponent,
31922
32338
  NgIconComponent,
31923
32339
  CdkOverlayOrigin,
31924
- ], providers: [provideIcons({ iconoirUser, iconoirLock, matMoreVert })], template: "<gn-ui-interactive-table\n [items]=\"records\"\n [isDraftPage]=\"isDraftPage\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'3rem'\">\n <ng-template #cell let-item let-i=\"index\">\n <ng-icon\n name=\"iconoirLock\"\n class=\"text-purple\"\n *ngIf=\"(!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset'\"\n ></ng-icon>\n <gn-ui-checkbox\n *ngIf=\"(item.extras?.edit || isDraftPage) && item.kind === 'dataset'\"\n [checked]=\"isChecked(item)\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [grow]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword')\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex flex-row items-center gap-2 max-w-full font-semibold\">\n <span data-cy=\"resultItemTitle\" class=\"overflow-hidden text-ellipsis\">{{\n item.title\n }}</span>\n <gn-ui-badge\n *ngIf=\"hasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.2em 0.6em'\"\n [style.--gn-ui-badge-text-size]=\"'12px'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'9rem'\">\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2 font-medium\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"shrink-0 text-xs\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'12rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner')\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.user</span>\n </ng-template>\n <ng-template #cell let-item>\n <ng-icon name=\"iconoirUser\" size=\"16px\"></ng-icon>\n <span data-cy=\"ownerInfo\" class=\"text-xs\">{{\n formatUserInfo(item.extras?.ownerInfo)\n }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'6rem'\">\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n <span class=\"text-xs\">\n {{\n (item.extras?.['isPublishedToAll']\n ? 'record.metadata.status.published'\n : 'record.metadata.status.notPublished'\n ) | translate\n }}</span\n >\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'8rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate')\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.changeDate</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex text-left w-full text-xs\">\n {{\n item.extras?.['isPublishedToAll']\n ? dateToString(item.recordUpdated)\n : '-'\n }}\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- ACTION MENU COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header> </ng-template>\n <ng-template #cell let-item>\n <gn-ui-button\n cdkOverlayOrigin\n #actionMenuButton\n (buttonClick)=\"openActionMenu(item, template)\"\n type=\"light\"\n data-test=\"record-menu-button\"\n [disabled]=\"\n (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset'\n \"\n >\n <ng-icon\n [ngClass]=\"{\n 'text-purple-light':\n (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset',\n }\"\n name=\"matMoreVert\"\n ></ng-icon>\n </gn-ui-button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDuplicate]=\"canDuplicate(item) && !isDuplicating\"\n [canDelete]=\"canDelete(item)\"\n [isDraftPage]=\"isDraftPage\"\n (duplicate)=\"handleDuplicate(item)\"\n (delete)=\"handleDelete(item)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (rollback)=\"handleRollback(item)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n" }]
31925
- }], ctorParameters: () => [{ type: i1$8.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: DateService }], propDecorators: { records: [{
32340
+ ], providers: [
32341
+ provideIcons({ iconoirUser, iconoirLock, iconoirTranslate, matMoreVert }),
32342
+ ], template: "<gn-ui-interactive-table\n [items]=\"records\"\n [canEditItem]=\"canEdit\"\n [isDraftPage]=\"isDraftPage\"\n (itemClick)=\"handleRecordClick($event)\"\n>\n <!-- SELECTED COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'3rem'\">\n <ng-template #cell let-item let-i=\"index\">\n <ng-icon\n name=\"iconoirLock\"\n class=\"text-purple\"\n *ngIf=\"(canEdit(item) | async) === false; else selectCheckbox\"\n ></ng-icon>\n <ng-template #selectCheckbox>\n <gn-ui-checkbox\n [checked]=\"isChecked(item)\"\n (changed)=\"handleRecordSelectedChange($event, item)\"\n class=\"-m-2\"\n type=\"default\"\n ></gn-ui-checkbox>\n </ng-template>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- TITLE COLUMN -->\n <gn-ui-interactive-table-column\n [sortable]=\"true\"\n [grow]=\"true\"\n [activeSort]=\"isSortedBy('resourceTitleObject.default.keyword')\"\n (sortChange)=\"setSortBy('resourceTitleObject.default.keyword', $event)\"\n >\n <ng-template #header>\n <span translate>record.metadata.title</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex flex-row items-center gap-2 max-w-full font-semibold\">\n <span data-cy=\"resultItemTitle\" class=\"overflow-hidden text-ellipsis\">{{\n item.title\n }}</span>\n <gn-ui-badge\n *ngIf=\"hasDraft(item)\"\n [style.--gn-ui-badge-padding]=\"'0.2em 0.6em'\"\n [style.--gn-ui-badge-text-size]=\"'12px'\"\n [style.--gn-ui-badge-text-color]=\"'#3d2006'\"\n [style.--gn-ui-badge-background-color]=\"'#ffbc7b'\"\n [style.--gn-ui-badge-rounded]=\"'4px'\"\n >\n <span translate>dashboard.records.hasDraft</span>\n </gn-ui-badge>\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- FORMATS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'9rem'\">\n <ng-template #header>\n <span translate>record.metadata.formats</span>\n </ng-template>\n <ng-template #cell let-item>\n <div\n class=\"flex justify-start items-center gap-2 font-medium\"\n *ngIf=\"getRecordFormats(item) as formats\"\n [title]=\"formats.join(', ')\"\n >\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[0])\"\n *ngIf=\"formats[0]\"\n >\n {{ formats[0] }}\n </span>\n <span\n class=\"badge-btn min-w-[45px] text-xs text-gray-900 px-2 shrink-0\"\n [style.background-color]=\"getBadgeColor(formats[1])\"\n *ngIf=\"formats[1]\"\n >\n {{ formats[1] }}\n </span>\n <div class=\"shrink-0 text-xs\" *ngIf=\"formats.slice(2).length > 0\">\n <span>+{{ formats.slice(2).length }}</span>\n </div>\n </div>\n <div *ngIf=\"!getRecordFormats(item)\"></div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- OWNER COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'12rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('recordOwner')\"\n (sortChange)=\"setSortBy('recordOwner', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.user</span>\n </ng-template>\n <ng-template #cell let-item>\n <ng-icon name=\"iconoirUser\" size=\"16px\"></ng-icon>\n <span data-cy=\"ownerInfo\" class=\"text-xs\">{{\n formatUserInfo(item.extras?.ownerInfo)\n }}</span>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- STATUS COLUMN -->\n <gn-ui-interactive-table-column [width]=\"'6rem'\">\n <ng-template #header>\n <span translate>record.metadata.status</span>\n </ng-template>\n <ng-template #cell let-item>\n <span class=\"text-xs\">\n {{\n (item.extras?.['isPublishedToAll']\n ? 'record.metadata.status.published'\n : 'record.metadata.status.notPublished'\n ) | translate\n }}</span\n >\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- UPDATE DATE COLUMN -->\n <gn-ui-interactive-table-column\n [width]=\"'8rem'\"\n [sortable]=\"true\"\n [activeSort]=\"isSortedBy('changeDate')\"\n (sortChange)=\"setSortBy('changeDate', $event)\"\n >\n <ng-template #header>\n <span translate>search.filters.changeDate</span>\n </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex text-left w-full text-xs\">\n {{\n item.extras?.['isPublishedToAll']\n ? dateToString(item.recordUpdated)\n : '-'\n }}\n </div>\n </ng-template>\n </gn-ui-interactive-table-column>\n\n <!-- ACTION MENU COLUMN -->\n <gn-ui-interactive-table-column>\n <ng-template #header> </ng-template>\n <ng-template #cell let-item>\n <div class=\"flex justify-end items-center gap-4 w-full\">\n <!-- IS MULTILINGUAL -->\n <ng-icon\n *ngIf=\"isMultilingual(item)\"\n data-cy=\"multilingual-indicator\"\n name=\"iconoirTranslate\"\n [attr.title]=\"getTxtHoverMultilingual(item)\"\n ></ng-icon>\n <!-- MORE ACTIONS MENU BUTTON -->\n <gn-ui-button\n cdkOverlayOrigin\n #actionMenuButton\n (buttonClick)=\"openActionMenu(item, template)\"\n type=\"light\"\n data-test=\"record-menu-button\"\n >\n <ng-icon name=\"matMoreVert\"></ng-icon>\n </gn-ui-button>\n </div>\n <ng-template #template>\n <gn-ui-action-menu\n [canDuplicate]=\"canDuplicate(item)\"\n [isDuplicating]=\"isDuplicating\"\n [canDelete]=\"canDelete(item) | async\"\n [page]=\"isDraftPage ? 'draft' : 'main'\"\n (duplicate)=\"handleDuplicate(item)\"\n (delete)=\"handleDelete(item)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (rollback)=\"handleRollback(item)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </ng-template>\n </gn-ui-interactive-table-column>\n</gn-ui-interactive-table>\n", styles: [":host{--gn-ui-button-height: 40px;--gn-ui-button-width: 40px}\n"] }]
32343
+ }], ctorParameters: () => [{ type: i1$8.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: DateService }, { type: i1$1.TranslateService }], propDecorators: { records: [{
31926
32344
  type: Input
31927
32345
  }], selectedRecordsIdentifiers: [{
31928
32346
  type: Input
@@ -31934,6 +32352,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31934
32352
  type: Input
31935
32353
  }], canDelete: [{
31936
32354
  type: Input
32355
+ }], canEdit: [{
32356
+ type: Input
31937
32357
  }], isDraftPage: [{
31938
32358
  type: Input
31939
32359
  }], isDuplicating: [{
@@ -34265,14 +34685,21 @@ class ResultsTableContainerComponent {
34265
34685
  this.recordsRepository = recordsRepository;
34266
34686
  this.notificationsService = notificationsService;
34267
34687
  this.translateService = translateService;
34268
- this.canDuplicate = () => true;
34269
- this.canDelete = () => true;
34270
34688
  this.recordClick = new EventEmitter();
34271
34689
  this.duplicateRecord = new EventEmitter();
34272
34690
  this.subscription = new Subscription();
34273
34691
  this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
34274
34692
  this.sortBy$ = this.searchFacade.sortBy$;
34275
34693
  this.hasDraft = (record) => this.recordsRepository.recordHasDraft(record.uniqueIdentifier);
34694
+ this.canDuplicate = (record) => {
34695
+ return this.recordsRepository.canDuplicate(record);
34696
+ };
34697
+ this.canDelete = (record) => {
34698
+ return this.recordsRepository.canDelete(record);
34699
+ };
34700
+ this.canEdit = (record) => {
34701
+ return this.recordsRepository.canEditIndexedRecord(record);
34702
+ };
34276
34703
  }
34277
34704
  handleRecordClick(item) {
34278
34705
  this.recordClick.emit(item);
@@ -34317,16 +34744,12 @@ class ResultsTableContainerComponent {
34317
34744
  this.subscription.unsubscribe();
34318
34745
  }
34319
34746
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableContainerComponent, deps: [{ token: SearchFacade }, { token: SearchService }, { token: SelectionService }, { token: RecordsRepositoryInterface }, { token: NotificationsService }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
34320
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsTableContainerComponent, isStandalone: true, selector: "gn-ui-results-table-container", inputs: { canDuplicate: "canDuplicate", canDelete: "canDelete", isDuplicating: "isDuplicating" }, outputs: { recordClick: "recordClick", duplicateRecord: "duplicateRecord" }, ngImport: i0, template: "<gn-ui-results-table\n *ngIf=\"searchFacade.results$ | async as records\"\n [records]=\"records\"\n [hasDraft]=\"hasDraft\"\n [selectedRecordsIdentifiers]=\"selectedRecords$ | async\"\n [sortOrder]=\"sortBy$ | async\"\n [canDelete]=\"canDelete\"\n [canDuplicate]=\"canDuplicate\"\n [isDuplicating]=\"isDuplicating\"\n (recordClick)=\"handleRecordClick($event)\"\n (duplicateRecord)=\"handleDuplicateRecord($event)\"\n (deleteRecord)=\"handleDeleteRecord($event)\"\n (recordsSelectedChange)=\"handleRecordsSelectedChange($event[0], $event[1])\"\n (sortByChange)=\"handleSortByChange($event[0], $event[1])\"\n></gn-ui-results-table>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: ResultsTableComponent, selector: "gn-ui-results-table", inputs: ["records", "selectedRecordsIdentifiers", "sortOrder", "hasDraft", "canDuplicate", "canDelete", "isDraftPage", "isDuplicating"], outputs: ["sortByChange", "recordClick", "duplicateRecord", "deleteRecord", "rollbackDraft", "recordsSelectedChange"] }] }); }
34747
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ResultsTableContainerComponent, isStandalone: true, selector: "gn-ui-results-table-container", inputs: { isDuplicating: "isDuplicating" }, outputs: { recordClick: "recordClick", duplicateRecord: "duplicateRecord" }, ngImport: i0, template: "<gn-ui-results-table\n *ngIf=\"searchFacade.results$ | async as records\"\n [records]=\"records\"\n [hasDraft]=\"hasDraft\"\n [selectedRecordsIdentifiers]=\"selectedRecords$ | async\"\n [sortOrder]=\"sortBy$ | async\"\n [canDelete]=\"canDelete\"\n [canDuplicate]=\"canDuplicate\"\n [isDuplicating]=\"isDuplicating\"\n [canEdit]=\"canEdit\"\n (recordClick)=\"handleRecordClick($event)\"\n (duplicateRecord)=\"handleDuplicateRecord($event)\"\n (deleteRecord)=\"handleDeleteRecord($event)\"\n (recordsSelectedChange)=\"handleRecordsSelectedChange($event[0], $event[1])\"\n (sortByChange)=\"handleSortByChange($event[0], $event[1])\"\n></gn-ui-results-table>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: ResultsTableComponent, selector: "gn-ui-results-table", inputs: ["records", "selectedRecordsIdentifiers", "sortOrder", "hasDraft", "canDuplicate", "canDelete", "canEdit", "isDraftPage", "isDuplicating"], outputs: ["sortByChange", "recordClick", "duplicateRecord", "deleteRecord", "rollbackDraft", "recordsSelectedChange"] }] }); }
34321
34748
  }
34322
34749
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableContainerComponent, decorators: [{
34323
34750
  type: Component,
34324
- args: [{ selector: 'gn-ui-results-table-container', standalone: true, imports: [CommonModule, ResultsTableComponent], template: "<gn-ui-results-table\n *ngIf=\"searchFacade.results$ | async as records\"\n [records]=\"records\"\n [hasDraft]=\"hasDraft\"\n [selectedRecordsIdentifiers]=\"selectedRecords$ | async\"\n [sortOrder]=\"sortBy$ | async\"\n [canDelete]=\"canDelete\"\n [canDuplicate]=\"canDuplicate\"\n [isDuplicating]=\"isDuplicating\"\n (recordClick)=\"handleRecordClick($event)\"\n (duplicateRecord)=\"handleDuplicateRecord($event)\"\n (deleteRecord)=\"handleDeleteRecord($event)\"\n (recordsSelectedChange)=\"handleRecordsSelectedChange($event[0], $event[1])\"\n (sortByChange)=\"handleSortByChange($event[0], $event[1])\"\n></gn-ui-results-table>\n" }]
34325
- }], ctorParameters: () => [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }, { type: RecordsRepositoryInterface }, { type: NotificationsService }, { type: i1$1.TranslateService }], propDecorators: { canDuplicate: [{
34326
- type: Input
34327
- }], canDelete: [{
34328
- type: Input
34329
- }], isDuplicating: [{
34751
+ args: [{ selector: 'gn-ui-results-table-container', standalone: true, imports: [CommonModule, ResultsTableComponent], template: "<gn-ui-results-table\n *ngIf=\"searchFacade.results$ | async as records\"\n [records]=\"records\"\n [hasDraft]=\"hasDraft\"\n [selectedRecordsIdentifiers]=\"selectedRecords$ | async\"\n [sortOrder]=\"sortBy$ | async\"\n [canDelete]=\"canDelete\"\n [canDuplicate]=\"canDuplicate\"\n [isDuplicating]=\"isDuplicating\"\n [canEdit]=\"canEdit\"\n (recordClick)=\"handleRecordClick($event)\"\n (duplicateRecord)=\"handleDuplicateRecord($event)\"\n (deleteRecord)=\"handleDeleteRecord($event)\"\n (recordsSelectedChange)=\"handleRecordsSelectedChange($event[0], $event[1])\"\n (sortByChange)=\"handleSortByChange($event[0], $event[1])\"\n></gn-ui-results-table>\n" }]
34752
+ }], ctorParameters: () => [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }, { type: RecordsRepositoryInterface }, { type: NotificationsService }, { type: i1$1.TranslateService }], propDecorators: { isDuplicating: [{
34330
34753
  type: Input
34331
34754
  }], recordClick: [{
34332
34755
  type: Output
@@ -36249,6 +36672,8 @@ const closeMetadata = createAction('[Metadata view] close');
36249
36672
  Related actions
36250
36673
  */
36251
36674
  const setRelated = createAction('[Metadata view] Set related records', props());
36675
+ const setSources = createAction('[Metadata view] Set sources', props());
36676
+ const setSourceOf = createAction('[Metadata view] Set has sources', props());
36252
36677
  /*
36253
36678
  ChartConfig actions
36254
36679
  */
@@ -36280,7 +36705,9 @@ var mdview_actions = /*#__PURE__*/Object.freeze({
36280
36705
  loadUserFeedbacksSuccess: loadUserFeedbacksSuccess,
36281
36706
  setChartConfig: setChartConfig,
36282
36707
  setIncompleteMetadata: setIncompleteMetadata,
36283
- setRelated: setRelated
36708
+ setRelated: setRelated,
36709
+ setSourceOf: setSourceOf,
36710
+ setSources: setSources
36284
36711
  });
36285
36712
 
36286
36713
  const METADATA_VIEW_FEATURE_STATE_KEY = 'metadataView';
@@ -36323,6 +36750,12 @@ on(loadFullMetadata, (state) => ({
36323
36750
  on(setRelated, (state, { related }) => ({
36324
36751
  ...state,
36325
36752
  related,
36753
+ })), on(setSources, (state, { sources }) => ({
36754
+ ...state,
36755
+ sources,
36756
+ })), on(setSourceOf, (state, { sourceOf }) => ({
36757
+ ...state,
36758
+ sourceOf,
36326
36759
  })),
36327
36760
  /*
36328
36761
  ChartConfig reducers
@@ -36384,6 +36817,8 @@ const getMetadataError = createSelector(getMdViewState, (state) => state.error);
36384
36817
  Related selectors
36385
36818
  */
36386
36819
  const getRelated = createSelector(getMdViewState, (state) => state.related);
36820
+ const getSources = createSelector(getMdViewState, (state) => state.sources);
36821
+ const getSourceOf = createSelector(getMdViewState, (state) => state.sourceOf);
36387
36822
  /*
36388
36823
  Metadata selectors
36389
36824
  */
@@ -38415,6 +38850,8 @@ class MdViewFacade {
38415
38850
  }));
38416
38851
  this.error$ = this.store.pipe(select(getMetadataError));
38417
38852
  this.related$ = this.store.pipe(select(getRelated));
38853
+ this.sources$ = this.store.pipe(select(getSources));
38854
+ this.sourceOf$ = this.store.pipe(select(getSourceOf));
38418
38855
  this.chartConfig$ = this.store.pipe(select(getChartConfig));
38419
38856
  this.allLinks$ = this.metadata$.pipe(map$1((record) => 'onlineResources' in record ? record.onlineResources : []), shareReplay(1));
38420
38857
  this.apiLinks$ = this.allLinks$.pipe(map$1((links) => links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.API))), shareReplay(1));
@@ -38516,6 +38953,12 @@ class MdViewEffects {
38516
38953
  this.loadRelatedRecords$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadataSuccess), switchMap$1(({ full }) => this.recordsRepository.getSimilarRecords(full)), map$1((related) => {
38517
38954
  return setRelated({ related });
38518
38955
  }), catchError((error) => of(setRelated({ related: null })))));
38956
+ this.loadSources$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadataSuccess), switchMap$1(({ full }) => this.recordsRepository.getSources(full)), map$1((sources) => {
38957
+ return setSources({ sources });
38958
+ }), catchError(() => of(setSources({ sources: null })))));
38959
+ this.loadSourceOf$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadataSuccess), switchMap$1(({ full }) => this.recordsRepository.getSourceOf(full)), map$1((sourceOf) => {
38960
+ return setSourceOf({ sourceOf });
38961
+ }), catchError(() => of(setSourceOf({ sourceOf: null })))));
38519
38962
  /*
38520
38963
  UserFeedback effects
38521
38964
  */
@@ -42726,17 +43169,256 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
42726
43169
  args: [{ selector: 'gn-ui-record-form', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, FormFieldComponent, TranslateModule], template: "<div class=\"flex flex-col gap-6\">\n <ng-container\n *ngFor=\"\n let section of facade.currentSections$ | async;\n trackBy: sectionTracker\n \"\n >\n <ng-container *ngIf=\"!section.hidden\">\n <div class=\"flex flex-col gap-6 border p-8 rounded-[8px] shadow\">\n <div class=\"flex flex-col gap-2\">\n <div\n *ngIf=\"section.labelKey\"\n class=\"text-2xl font-title text-black\"\n translate\n >\n {{ section.labelKey }}\n </div>\n <div\n *ngIf=\"section.descriptionKey\"\n class=\"text-gray-800 text-sm\"\n translate\n >\n {{ section.descriptionKey }}\n </div>\n </div>\n <div class=\"grid auto-rows-auto grid-cols-2 gap-[32px]\">\n <ng-container\n *ngFor=\"\n let field of section.fieldsWithValues;\n trackBy: fieldTracker\n \"\n >\n <ng-container *ngIf=\"!field.config.hidden\">\n <gn-ui-form-field\n [ngClass]=\"\n field.config.gridColumnSpan === 1\n ? 'col-span-1'\n : 'col-span-2'\n \"\n [uniqueIdentifier]=\"recordUniqueIdentifier$ | async\"\n [model]=\"field.config.model!\"\n [modelSpecifier]=\"field.config.modelSpecifier!\"\n [config]=\"field.config.formFieldConfig\"\n [value]=\"field.value\"\n [componentName]=\"field.config.componentName\"\n (valueChange)=\"\n handleFieldValueChange(field.config.model!, $event)\n \"\n ></gn-ui-form-field>\n </ng-container>\n </ng-container>\n </div>\n </div>\n </ng-container>\n </ng-container>\n</div>\n" }]
42727
43170
  }], ctorParameters: () => [{ type: EditorFacade }] });
42728
43171
 
43172
+ const extraFlagMap = {
43173
+ ar: 'arab',
43174
+ en: 'gb',
43175
+ ko: 'kr',
43176
+ cs: 'cz',
43177
+ zh: 'cn',
43178
+ ca: 'es-ct',
43179
+ rm: 'ch',
43180
+ da: 'dk',
43181
+ sv: 'se',
43182
+ cy: 'gb-wls',
43183
+ hy: 'am',
43184
+ ka: 'ge',
43185
+ uk: 'ua',
43186
+ };
42729
43187
  class MultilingualPanelComponent {
42730
- constructor() {
42731
- this.translationsEnabled = false;
43188
+ set record(value) {
43189
+ this._record = value;
43190
+ this.isMultilingual = value.otherLanguages.length > 0;
43191
+ this.editTranslations = false;
43192
+ this.recordLanguages = [...value.otherLanguages, value.defaultLanguage];
43193
+ this.selectedLanguages = this.recordLanguages;
43194
+ this.formLanguage = value.defaultLanguage;
43195
+ }
43196
+ constructor(facade, dialog, translateService, recordsRepository, overlay, viewContainerRef, cdr) {
43197
+ this.facade = facade;
43198
+ this.dialog = dialog;
43199
+ this.translateService = translateService;
43200
+ this.recordsRepository = recordsRepository;
43201
+ this.overlay = overlay;
43202
+ this.viewContainerRef = viewContainerRef;
43203
+ this.cdr = cdr;
43204
+ this.selectedLanguages = [];
43205
+ this.recordLanguages = [];
43206
+ this.formLanguage = '';
43207
+ this.isActionMenuOpen = false;
43208
+ this.subscription = new Subscription();
43209
+ this.supportedLanguages$ = this.recordsRepository
43210
+ .getApplicationLanguages()
43211
+ .pipe(map$2((languages) => this.sortLanguages(languages)));
43212
+ }
43213
+ ngOnDestroy() {
43214
+ this.subscription.unsubscribe();
43215
+ }
43216
+ sortLanguages(languages) {
43217
+ return languages
43218
+ .map((lang) => {
43219
+ const label = this.translateService.instant('language.' + lang);
43220
+ const isTranslated = label !== 'language.' + lang;
43221
+ return {
43222
+ lang,
43223
+ label,
43224
+ isTranslated,
43225
+ };
43226
+ })
43227
+ .sort((a, b) => {
43228
+ if (a.isTranslated && !b.isTranslated)
43229
+ return -1;
43230
+ if (!a.isTranslated && b.isTranslated)
43231
+ return 1;
43232
+ return a.label.localeCompare(b.label);
43233
+ })
43234
+ .map((item) => item.lang);
42732
43235
  }
42733
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MultilingualPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
42734
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MultilingualPanelComponent, isStandalone: true, selector: "gn-ui-multilingual-panel", ngImport: i0, template: "<div\n class=\"flex flex-col h-full w-[302px] bg-neutral-100 border-l border-gray-300 py-9 px-3 gap-8\"\n>\n <span class=\"text-3xl font-title text-black/80 px-2\" translate\n >editor.record.form.multilingual.title</span\n >\n <gn-ui-check-toggle\n class=\"p-2\"\n [label]=\"'editor.record.form.multilingual.enable' | translate\"\n [color]=\"'primary'\"\n [value]=\"translationsEnabled\"\n (toggled)=\"translationsEnabled = $event\"\n ></gn-ui-check-toggle>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: CheckToggleComponent, selector: "gn-ui-check-toggle", inputs: ["title", "label", "value", "color"], outputs: ["toggled"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }] }); }
43236
+ toggleLanguageSelection() {
43237
+ this.editTranslations = !this.editTranslations;
43238
+ }
43239
+ getIconClass(lang) {
43240
+ return extraFlagMap[lang]
43241
+ ? `fi fi-${extraFlagMap[lang]} w-4 h-3`
43242
+ : `fi fi-${lang} w-4 h-3`;
43243
+ }
43244
+ switchMultilingual() {
43245
+ if (this.isMultilingual && this.selectedLanguages.length > 1) {
43246
+ this.confirmDeleteAction();
43247
+ }
43248
+ else {
43249
+ this.isMultilingual = true;
43250
+ this.editTranslations = true;
43251
+ }
43252
+ }
43253
+ getExtraClass(lang) {
43254
+ const baseClass = 'h-[34px] w-full font-bold justify-start hover:bg-white';
43255
+ if (this.selectedLanguages.includes(lang)) {
43256
+ return `${baseClass} bg-white border border-black`;
43257
+ }
43258
+ return baseClass;
43259
+ }
43260
+ toggleLanguage(lang) {
43261
+ if (this.selectedLanguages.includes(lang)) {
43262
+ this.removeSelectedLanguage(lang);
43263
+ }
43264
+ else {
43265
+ this.selectedLanguages.push(lang);
43266
+ }
43267
+ }
43268
+ removeSelectedLanguage(lang) {
43269
+ this.selectedLanguages = this.selectedLanguages.filter((language) => language !== lang);
43270
+ }
43271
+ validateTranslations() {
43272
+ const equalLength = this.selectedLanguages.length === this.recordLanguages.length;
43273
+ if (this.selectedLanguages.length < this.recordLanguages.length ||
43274
+ (equalLength && this.selectedLanguages !== this.recordLanguages)) {
43275
+ this.confirmDeleteAction(this.selectedLanguages);
43276
+ }
43277
+ else {
43278
+ this.updateTranslations();
43279
+ }
43280
+ }
43281
+ updateTranslations() {
43282
+ this.facade.updateRecordField('otherLanguages', this.selectedLanguages.filter((lang) => lang !== this.formLanguage));
43283
+ this.recordLanguages = this.selectedLanguages;
43284
+ this.editTranslations = false;
43285
+ }
43286
+ switchFormLang(lang) {
43287
+ // TO IMPLEMENT FURTHER
43288
+ }
43289
+ switchDefaultLang(lang) {
43290
+ this.formLanguage = lang;
43291
+ this.facade.updateRecordField('defaultLanguage', lang);
43292
+ this.facade.updateRecordField('otherLanguages', this.selectedLanguages.filter((lang) => lang !== this.formLanguage));
43293
+ this.closeActionMenu();
43294
+ }
43295
+ confirmDeleteAction(lang) {
43296
+ const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
43297
+ data: {
43298
+ title: this.translateService.instant('editor.record.multilingual.confirmation.title'),
43299
+ message: this.translateService.instant('editor.record.multilingual.confirmation.message'),
43300
+ confirmText: this.translateService.instant('editor.record.multilingual.confirmation.confirmText'),
43301
+ cancelText: this.translateService.instant('editor.record.multilingual.confirmation.cancelText'),
43302
+ },
43303
+ restoreFocus: true,
43304
+ });
43305
+ this.subscription.add(dialogRef.afterClosed().subscribe((confirmed) => {
43306
+ if (confirmed) {
43307
+ if (lang) {
43308
+ if (!Array.isArray(lang)) {
43309
+ this.removeSelectedLanguage(lang);
43310
+ this.closeActionMenu();
43311
+ }
43312
+ this.updateTranslations();
43313
+ }
43314
+ else {
43315
+ this.facade.updateRecordField('otherLanguages', []);
43316
+ this.isMultilingual = false;
43317
+ this.selectedLanguages = [];
43318
+ }
43319
+ }
43320
+ else {
43321
+ this.isMultilingual = true;
43322
+ this.selectedLanguages = this.recordLanguages;
43323
+ }
43324
+ this.editTranslations = false;
43325
+ }));
43326
+ }
43327
+ isFirstUnsupported(index) {
43328
+ const langs = this.sortLanguages(this.recordLanguages);
43329
+ return (langs[index].length === 3 &&
43330
+ langs.slice(0, index).every((lang) => lang.length !== 3));
43331
+ }
43332
+ isLangSupported(lang) {
43333
+ return lang.length === 2;
43334
+ }
43335
+ getToggleTitle(lang) {
43336
+ if (lang === this._record.defaultLanguage) {
43337
+ return this.translateService.instant('editor.record.form.multilingual.forbidden');
43338
+ }
43339
+ return '';
43340
+ }
43341
+ openActionMenu(item, template) {
43342
+ this.isActionMenuOpen = true;
43343
+ const index = this.sortLanguages(this.selectedLanguages).indexOf(item);
43344
+ const buttonElement = this.actionMenuButtons.toArray()[index];
43345
+ const positionStrategy = this.overlay
43346
+ .position()
43347
+ .flexibleConnectedTo(buttonElement)
43348
+ .withFlexibleDimensions(true)
43349
+ .withPush(true)
43350
+ .withPositions([
43351
+ {
43352
+ originX: 'end',
43353
+ originY: 'bottom',
43354
+ overlayX: 'end',
43355
+ overlayY: 'top',
43356
+ },
43357
+ {
43358
+ originX: 'end',
43359
+ originY: 'top',
43360
+ overlayX: 'end',
43361
+ overlayY: 'bottom',
43362
+ },
43363
+ ]);
43364
+ this.overlayRef = this.overlay.create({
43365
+ hasBackdrop: true,
43366
+ backdropClass: 'cdk-overlay-transparent-backdrop',
43367
+ positionStrategy: positionStrategy,
43368
+ scrollStrategy: this.overlay.scrollStrategies.reposition(),
43369
+ });
43370
+ const portal = new TemplatePortal(template, this.viewContainerRef);
43371
+ this.overlayRef.attach(portal);
43372
+ this.subscription.add(this.overlayRef.backdropClick().subscribe(() => {
43373
+ this.closeActionMenu();
43374
+ }));
43375
+ }
43376
+ closeActionMenu() {
43377
+ if (this.overlayRef) {
43378
+ this.isActionMenuOpen = false;
43379
+ this.overlayRef.dispose();
43380
+ this.cdr.markForCheck();
43381
+ }
43382
+ }
43383
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MultilingualPanelComponent, deps: [{ token: EditorFacade }, { token: i1$a.MatDialog }, { token: i1$1.TranslateService }, { token: RecordsRepositoryInterface }, { token: i1$8.Overlay }, { token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
43384
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MultilingualPanelComponent, isStandalone: true, selector: "gn-ui-multilingual-panel", inputs: { record: "record" }, providers: [
43385
+ provideIcons({
43386
+ iconoirSettings,
43387
+ matMoreHorizOutline,
43388
+ iconoirCheckCircle,
43389
+ iconoirCircle,
43390
+ }),
43391
+ provideNgIconsConfig({
43392
+ size: '1.25em',
43393
+ }),
43394
+ ], viewQueries: [{ propertyName: "actionMenuButtons", predicate: ["actionMenuButton"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n class=\"flex flex-col h-full w-[302px] bg-neutral-100 border-l border-gray-300 py-8 px-3 gap-6 overflow-auto\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.multilingual.title</span\n >\n <button\n [title]=\"'editor.record.form.multilingual.open' | translate\"\n (click)=\"toggleLanguageSelection()\"\n *ngIf=\"isMultilingual\"\n data-test=\"activateSelection\"\n >\n <ng-icon class=\"mt-1\" name=\"iconoirSettings\"></ng-icon>\n </button>\n </div>\n <div class=\"flex flex-col gap-2\" *ngIf=\"editTranslations || !isMultilingual\">\n <gn-ui-check-toggle\n class=\"p-2\"\n [label]=\"'editor.record.form.multilingual.enable' | translate\"\n [color]=\"'primary'\"\n [(value)]=\"isMultilingual\"\n (toggled)=\"switchMultilingual($event)\"\n ></gn-ui-check-toggle>\n <div *ngIf=\"isMultilingual\" class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row justify-between border-t border-gray-300 p-3\">\n <span class=\"mt-2 text-sm text-gray-600\" translate\n >editor.record.form.multilingual.activate</span\n >\n <gn-ui-button\n extraClass=\"w-16 h-8 font-bold\"\n type=\"gray\"\n (buttonClick)=\"validateTranslations()\"\n data-test=\"validateSelection\"\n >{{ 'editor.record.form.multilingual.validate' | translate }}\n </gn-ui-button>\n </div>\n <ng-container *ngIf=\"supportedLanguages$ | async as languages\">\n <div\n class=\"flex flex-col gap-2 w-full px-2\"\n data-test=\"langAvailable\"\n *ngFor=\"let lang of languages\"\n >\n <gn-ui-button\n [extraClass]=\"getExtraClass(lang)\"\n type=\"gray\"\n (buttonClick)=\"toggleLanguage(lang)\"\n [disabled]=\"lang === _record.defaultLanguage\"\n [title]=\"getToggleTitle(lang)\"\n >\n <span [class]=\"getIconClass(lang)\"></span>\n <span class=\"ml-2\">{{ 'language.' + lang | translate }}</span>\n </gn-ui-button>\n </div>\n </ng-container>\n </div>\n </div>\n <div *ngIf=\"!editTranslations && isMultilingual\" class=\"flex flex-col gap-2\">\n <gn-ui-button\n *ngFor=\"let recordLang of sortLanguages(recordLanguages); let i = index\"\n extraClass=\"flex flex-row justify-between bg-white border border-white rounded mb-1 h-[34px] w-full\"\n [ngClass]=\"{\n 'mt-8': isFirstUnsupported(i),\n '': true,\n }\"\n (buttonClick)=\"switchFormLang(recordLang)\"\n type=\"outline\"\n data-test=\"langSwitch\"\n >\n <div class=\"flex flex-row gap-2 items-center\">\n <ng-icon\n *ngIf=\"recordLang === formLanguage\"\n class=\"text-primary mt-1\"\n name=\"iconoirCheckCircle\"\n ></ng-icon>\n <ng-icon\n *ngIf=\"recordLang !== formLanguage\"\n class=\"text-gray-800 mt-1\"\n name=\"iconoirCircle\"\n ></ng-icon>\n <span\n *ngIf=\"recordLang.length === 2\"\n [class]=\"getIconClass(recordLang) + 'mt-1'\"\n ></span>\n <span [ngClass]=\"recordLang === formLanguage ? 'text-black' : ''\">{{\n isLangSupported(recordLang)\n ? ('language.' + recordLang | translate)\n : recordLang.toUpperCase()\n }}</span>\n </div>\n <div class=\"flex flex-row gap-2 items-center\">\n <span\n *ngIf=\"recordLang === formLanguage\"\n class=\"text-xs text-base\"\n translate\n >editor.record.form.multilingual.default</span\n >\n <button\n (click)=\"\n openActionMenu(recordLang, template); $event.stopPropagation()\n \"\n cdkOverlayOrigin\n #actionMenuButton\n >\n <ng-icon class=\"pb-5\" name=\"matMoreHorizOutline\"></ng-icon>\n </button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDelete]=\"recordLang !== _record.defaultLanguage\"\n page=\"record\"\n (delete)=\"confirmDeleteAction(recordLang)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (switch)=\"switchDefaultLang(recordLang)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </div>\n </gn-ui-button>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: CheckToggleComponent, selector: "gn-ui-check-toggle", inputs: ["title", "label", "value", "color"], outputs: ["toggled"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ActionMenuComponent, selector: "gn-ui-action-menu", inputs: ["canDuplicate", "isDuplicating", "canDelete", "page"], outputs: ["duplicate", "delete", "closeActionMenu", "rollback", "switch"] }] }); }
42735
43395
  }
42736
43396
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MultilingualPanelComponent, decorators: [{
42737
43397
  type: Component,
42738
- args: [{ selector: 'gn-ui-multilingual-panel', standalone: true, imports: [CommonModule, CheckToggleComponent, TranslateModule], template: "<div\n class=\"flex flex-col h-full w-[302px] bg-neutral-100 border-l border-gray-300 py-9 px-3 gap-8\"\n>\n <span class=\"text-3xl font-title text-black/80 px-2\" translate\n >editor.record.form.multilingual.title</span\n >\n <gn-ui-check-toggle\n class=\"p-2\"\n [label]=\"'editor.record.form.multilingual.enable' | translate\"\n [color]=\"'primary'\"\n [value]=\"translationsEnabled\"\n (toggled)=\"translationsEnabled = $event\"\n ></gn-ui-check-toggle>\n</div>\n" }]
42739
- }] });
43398
+ args: [{ selector: 'gn-ui-multilingual-panel', standalone: true, imports: [
43399
+ CommonModule,
43400
+ CheckToggleComponent,
43401
+ TranslateModule,
43402
+ ButtonComponent,
43403
+ NgIconComponent,
43404
+ ActionMenuComponent,
43405
+ ], providers: [
43406
+ provideIcons({
43407
+ iconoirSettings,
43408
+ matMoreHorizOutline,
43409
+ iconoirCheckCircle,
43410
+ iconoirCircle,
43411
+ }),
43412
+ provideNgIconsConfig({
43413
+ size: '1.25em',
43414
+ }),
43415
+ ], template: "<div\n class=\"flex flex-col h-full w-[302px] bg-neutral-100 border-l border-gray-300 py-8 px-3 gap-6 overflow-auto\"\n>\n <div class=\"flex flex-row px-2 justify-between\">\n <span class=\"text-3xl font-title text-black/80\" translate\n >editor.record.form.multilingual.title</span\n >\n <button\n [title]=\"'editor.record.form.multilingual.open' | translate\"\n (click)=\"toggleLanguageSelection()\"\n *ngIf=\"isMultilingual\"\n data-test=\"activateSelection\"\n >\n <ng-icon class=\"mt-1\" name=\"iconoirSettings\"></ng-icon>\n </button>\n </div>\n <div class=\"flex flex-col gap-2\" *ngIf=\"editTranslations || !isMultilingual\">\n <gn-ui-check-toggle\n class=\"p-2\"\n [label]=\"'editor.record.form.multilingual.enable' | translate\"\n [color]=\"'primary'\"\n [(value)]=\"isMultilingual\"\n (toggled)=\"switchMultilingual($event)\"\n ></gn-ui-check-toggle>\n <div *ngIf=\"isMultilingual\" class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row justify-between border-t border-gray-300 p-3\">\n <span class=\"mt-2 text-sm text-gray-600\" translate\n >editor.record.form.multilingual.activate</span\n >\n <gn-ui-button\n extraClass=\"w-16 h-8 font-bold\"\n type=\"gray\"\n (buttonClick)=\"validateTranslations()\"\n data-test=\"validateSelection\"\n >{{ 'editor.record.form.multilingual.validate' | translate }}\n </gn-ui-button>\n </div>\n <ng-container *ngIf=\"supportedLanguages$ | async as languages\">\n <div\n class=\"flex flex-col gap-2 w-full px-2\"\n data-test=\"langAvailable\"\n *ngFor=\"let lang of languages\"\n >\n <gn-ui-button\n [extraClass]=\"getExtraClass(lang)\"\n type=\"gray\"\n (buttonClick)=\"toggleLanguage(lang)\"\n [disabled]=\"lang === _record.defaultLanguage\"\n [title]=\"getToggleTitle(lang)\"\n >\n <span [class]=\"getIconClass(lang)\"></span>\n <span class=\"ml-2\">{{ 'language.' + lang | translate }}</span>\n </gn-ui-button>\n </div>\n </ng-container>\n </div>\n </div>\n <div *ngIf=\"!editTranslations && isMultilingual\" class=\"flex flex-col gap-2\">\n <gn-ui-button\n *ngFor=\"let recordLang of sortLanguages(recordLanguages); let i = index\"\n extraClass=\"flex flex-row justify-between bg-white border border-white rounded mb-1 h-[34px] w-full\"\n [ngClass]=\"{\n 'mt-8': isFirstUnsupported(i),\n '': true,\n }\"\n (buttonClick)=\"switchFormLang(recordLang)\"\n type=\"outline\"\n data-test=\"langSwitch\"\n >\n <div class=\"flex flex-row gap-2 items-center\">\n <ng-icon\n *ngIf=\"recordLang === formLanguage\"\n class=\"text-primary mt-1\"\n name=\"iconoirCheckCircle\"\n ></ng-icon>\n <ng-icon\n *ngIf=\"recordLang !== formLanguage\"\n class=\"text-gray-800 mt-1\"\n name=\"iconoirCircle\"\n ></ng-icon>\n <span\n *ngIf=\"recordLang.length === 2\"\n [class]=\"getIconClass(recordLang) + 'mt-1'\"\n ></span>\n <span [ngClass]=\"recordLang === formLanguage ? 'text-black' : ''\">{{\n isLangSupported(recordLang)\n ? ('language.' + recordLang | translate)\n : recordLang.toUpperCase()\n }}</span>\n </div>\n <div class=\"flex flex-row gap-2 items-center\">\n <span\n *ngIf=\"recordLang === formLanguage\"\n class=\"text-xs text-base\"\n translate\n >editor.record.form.multilingual.default</span\n >\n <button\n (click)=\"\n openActionMenu(recordLang, template); $event.stopPropagation()\n \"\n cdkOverlayOrigin\n #actionMenuButton\n >\n <ng-icon class=\"pb-5\" name=\"matMoreHorizOutline\"></ng-icon>\n </button>\n <ng-template #template>\n <gn-ui-action-menu\n [canDelete]=\"recordLang !== _record.defaultLanguage\"\n page=\"record\"\n (delete)=\"confirmDeleteAction(recordLang)\"\n (closeActionMenu)=\"closeActionMenu()\"\n (switch)=\"switchDefaultLang(recordLang)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </div>\n </gn-ui-button>\n </div>\n</div>\n" }]
43416
+ }], ctorParameters: () => [{ type: EditorFacade }, { type: i1$a.MatDialog }, { type: i1$1.TranslateService }, { type: RecordsRepositoryInterface }, { type: i1$8.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }], propDecorators: { record: [{
43417
+ type: Input
43418
+ }], actionMenuButtons: [{
43419
+ type: ViewChildren,
43420
+ args: ['actionMenuButton', { read: ElementRef }]
43421
+ }] } });
42740
43422
 
42741
43423
  const ROUTER_STATE_KEY = 'router';
42742
43424
  const ROUTER_ROUTE_SEARCH = 'search';
@@ -43182,5 +43864,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
43182
43864
  * Generated bundle index. Do not edit.
43183
43865
  */
43184
43866
 
43185
- export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, ApplicationBannerComponent, AuthService, AutocompleteComponent, AvailableServicesField, AvatarComponent, AvatarServiceInterface, BASEMAP_LAYERS, BadgeComponent, BaseConverter, BaseFileReader, BaseReader, BlockListComponent, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ClearError, ClearResults, ColorScaleComponent, ConfirmationDialogComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_GN4_LOGIN_URL, DEFAULT_GN4_LOGOUT_URL, DEFAULT_GN4_SETTINGS_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DO_NOT_USE_DEFAULT_BASEMAP, DataService, DataTableComponent, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangeDropdownComponent, DateRangePickerComponent, DateRangeSearchField, DateService, DcatApConverter, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EXTERNAL_VIEWER_OPEN_NEW_TAB, EXTERNAL_VIEWER_URL_TEMPLATE, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FILTER_SUMMARY_IGNORE_LIST, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogListComponent, FeatureCatalogModule, FeatureDetailComponent, FeatureEditorModule, FeatureMapModule, FeatureNotificationsModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileInputComponent, FileTranslateLoader, FilesDropDirective, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldDateComponent, FormFieldFileComponent, FormFieldKeywordsComponent, FormFieldLicenseComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentsComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GEONETWORK_UI_TAG_NAME, GEONETWORK_UI_VERSION, GeoDataBadgeComponent, GeoTableViewComponent, GeocodingComponent, GeojsonReader, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GpfApiDlComponent, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageInputComponent, ImageOverlayPreviewComponent, ImportRecordComponent, InlineFilterComponent, InteractiveTableColumnComponent, InteractiveTableComponent, InternalLinkCardComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, KindBadgeComponent, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LOGOUT_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LicenseSearchField, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_FEATURE_KEY, MAP_VIEW_CONSTRAINTS, METADATA_LANGUAGE, MY_FORMATS, MapContainerComponent, MapFacade, MapLegendComponent, MapStateContainerComponent, MapStyleService, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataMapperContext, MetadataQualityComponent, MetadataQualityItemComponent, ModalDialogComponent, MultilingualPanelComponent, MultilingualSearchField, MyOrgService, NAMESPACES, NOT_APPLICABLE_CONSTRAINT, NOT_KNOWN_CONSTRAINT, NotificationComponent, NotificationsContainerComponent, NotificationsService, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PaginationDotsComponent, PatchResultsAggregations, PopoverComponent, PopupAlertComponent, PossibleResourceTypes, PossibleResourceTypesDefinition, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_DATASET_URL_TOKEN, RECORD_REUSE_URL_TOKEN, RECORD_SERVICE_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, ROUTER_ROUTE_REUSE, ROUTER_ROUTE_SEARCH, ROUTER_ROUTE_SERVICE, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordKindField, RecordMetaComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResourceTypeLegacyField, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsHitsSearchKindComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SETTINGS_URL, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SearchEffects, SearchFacade, SearchFeatureCatalogComponent, SearchFiltersSummaryComponent, SearchFiltersSummaryItemComponent, SearchInputComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, ServiceCapabilitiesComponent, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortableListComponent, SourceLabelComponent, SourcesService, SpatialExtentComponent, SpinningLoaderComponent, StarToggleComponent, StickyHeaderComponent, SupportedTypes, SwitchToggleComponent, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslatedSearchField, TruncatedTextComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UrlInputComponent, UserFeedbackItemComponent, UserPreviewComponent, UserSearchField, UtilI18nModule, UtilSharedModule, VECTOR_STYLE_DEFAULT, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, XmlParseError, _reset, allChildrenElement, appConfigWithTranslationFixture, appendChildTree, appendChildren, assertValidXml, blockModelFixture, bytesToMegabytes, canEditRecord, checkFileFormat, clearSelectedFeatures, createChild, createDocument, createElement, createFuzzyFilter, createNestedChild, createNestedElement, currentPage, defaultMapStyleFixture, defaultMapStyleHlFixture, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, emptyBlockModelFixture, findChildElement, findChildOrCreate, findChildrenElement, findConverterForDocument, findNestedChildOrCreate, findNestedElement, findNestedElements, findParent, firstChildElement, formatDate, formatUserInfo, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLayers, getLinkLabel, getLinkPriority, getMapContext, getMapContextLayerFromConfig, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getNamespace, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getResourceType, getReuseType, getRootElement, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSelectedFeatures, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, hasRecordChangedSinceDraft, hasRecordChangedSinceDraftSuccess, initSearch, initialEditorState, initialMapState, initialState, isConfigLoaded, isDateRange, isFormatInQueryParam, isPublished, itemModelFixture, kindToCodeListValue, loadAppConfig, malformedConfigFixture, mapConfigFixture, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, matchesNoApplicableConstraint, matchesNoKnownConstraint, megabytesToBytes, mimeTypeToFormat, minimalAppConfigFixture, missingMandatoryConfigFixture, mouseWheelZoomCondition, noDuplicateFileName, okAppConfigFixture, openDataset, openRecord, parse, parseXmlString, placeholder, prioritizePageScroll, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readAttribute, readDataset, readDatasetHeaders, readText, reducer$2 as reducer, reducerSearch, removeAllChildren, removeChildren, removeChildrenByName, removeSearchParams, removeWhitespace, renameElements, saveRecord, saveRecordFailure, saveRecordSuccess, selectCanEditRecord, selectCurrentPage, selectEditorConfig, selectEditorState, selectFallback, selectFallbackFields, selectField, selectHasRecordChanged, selectIsPublished, selectRecord, selectRecordChangedSinceSave, selectRecordSaveError, selectRecordSaving, selectRecordSections, selectRecordSource, selectTranslatedField, selectTranslatedValue, setContext, setCurrentPage, setFieldVisibility, setSelectedFeatures, setTextContent, someHabTableItemFixture, sortByFromString, sortByToString, sortByToStrings, stripHtml, stripNamespace, tableItemsFixture, toDate, totalPages, undoRecordDraft, unrecognizedKeysConfigFixture, updateRecordField, wmsLayerFlatten, writeAttribute, wrongLanguageCodeConfigFixture, xmlToString };
43867
+ export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, ActionMenuComponent, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, ApplicationBannerComponent, AuthService, AutocompleteComponent, AvailableServicesField, AvatarComponent, AvatarServiceInterface, BASEMAP_LAYERS, BadgeComponent, BaseConverter, BaseFileReader, BaseReader, BlockListComponent, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ClearError, ClearResults, ColorScaleComponent, ConfirmationDialogComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_GN4_LOGIN_URL, DEFAULT_GN4_LOGOUT_URL, DEFAULT_GN4_SETTINGS_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DO_NOT_USE_DEFAULT_BASEMAP, DataService, DataTableComponent, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangeDropdownComponent, DateRangePickerComponent, DateRangeSearchField, DateService, DcatApConverter, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EXTERNAL_VIEWER_OPEN_NEW_TAB, EXTERNAL_VIEWER_URL_TEMPLATE, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FILTER_SUMMARY_IGNORE_LIST, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogListComponent, FeatureCatalogModule, FeatureDetailComponent, FeatureEditorModule, FeatureMapModule, FeatureNotificationsModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileInputComponent, FileTranslateLoader, FilesDropDirective, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldDateComponent, FormFieldFileComponent, FormFieldKeywordsComponent, FormFieldLicenseComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentsComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GEONETWORK_UI_TAG_NAME, GEONETWORK_UI_VERSION, GeoDataBadgeComponent, GeoTableViewComponent, GeocodingComponent, GeojsonReader, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GpfApiDlComponent, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageInputComponent, ImageOverlayPreviewComponent, ImportRecordComponent, InlineFilterComponent, InteractiveTableColumnComponent, InteractiveTableComponent, InternalLinkCardComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, KindBadgeComponent, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LOGOUT_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LicenseSearchField, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_FEATURE_KEY, MAP_VIEW_CONSTRAINTS, METADATA_LANGUAGE, MY_FORMATS, MapContainerComponent, MapFacade, MapLegendComponent, MapStateContainerComponent, MapStyleService, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataMapperContext, MetadataQualityComponent, MetadataQualityItemComponent, ModalDialogComponent, MultilingualPanelComponent, MultilingualSearchField, MyOrgService, NAMESPACES, NOT_APPLICABLE_CONSTRAINT, NOT_KNOWN_CONSTRAINT, NotificationComponent, NotificationsContainerComponent, NotificationsService, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PaginationDotsComponent, PatchResultsAggregations, PopoverComponent, PopupAlertComponent, PossibleResourceTypes, PossibleResourceTypesDefinition, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_DATASET_URL_TOKEN, RECORD_REUSE_URL_TOKEN, RECORD_SERVICE_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, ROUTER_ROUTE_REUSE, ROUTER_ROUTE_SEARCH, ROUTER_ROUTE_SERVICE, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordKindField, RecordMetaComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResourceTypeLegacyField, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsHitsSearchKindComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SETTINGS_URL, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SUPPORTED_LANGUAGES, SearchEffects, SearchFacade, SearchFeatureCatalogComponent, SearchFiltersSummaryComponent, SearchFiltersSummaryItemComponent, SearchInputComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, ServiceCapabilitiesComponent, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortableListComponent, SourceLabelComponent, SourcesService, SpatialExtentComponent, SpinningLoaderComponent, StarToggleComponent, StickyHeaderComponent, SupportedTypes, SwitchToggleComponent, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslatedSearchField, TruncatedTextComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UrlInputComponent, UserFeedbackItemComponent, UserPreviewComponent, UserSearchField, UtilI18nModule, UtilSharedModule, VECTOR_STYLE_DEFAULT, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, XmlParseError, _reset, allChildrenElement, appConfigWithTranslationFixture, appendChildTree, appendChildren, assertValidXml, blockModelFixture, bytesToMegabytes, canEditRecord, checkFileFormat, clearSelectedFeatures, createChild, createDocument, createElement, createFuzzyFilter, createNestedChild, createNestedElement, currentPage, defaultMapStyleFixture, defaultMapStyleHlFixture, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, emptyBlockModelFixture, findChildElement, findChildOrCreate, findChildrenElement, findConverterForDocument, findNestedChildOrCreate, findNestedElement, findNestedElements, findParent, firstChildElement, formatDate, formatUserInfo, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLayers, getLinkLabel, getLinkPriority, getMapContext, getMapContextLayerFromConfig, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getNamespace, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getResourceType, getReuseType, getRootElement, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSelectedFeatures, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, hasRecordChangedSinceDraft, hasRecordChangedSinceDraftSuccess, initSearch, initialEditorState, initialMapState, initialState, isConfigLoaded, isDateRange, isFormatInQueryParam, isPublished, itemModelFixture, kindToCodeListValue, loadAppConfig, malformedConfigFixture, mapConfigFixture, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, matchesNoApplicableConstraint, matchesNoKnownConstraint, megabytesToBytes, mimeTypeToFormat, minimalAppConfigFixture, missingMandatoryConfigFixture, mouseWheelZoomCondition, noDuplicateFileName, okAppConfigFixture, openDataset, openRecord, parse, parseXmlString, placeholder, prioritizePageScroll, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readAttribute, readDataset, readDatasetHeaders, readText, reducer$2 as reducer, reducerSearch, removeAllChildren, removeChildren, removeChildrenByName, removeSearchParams, removeWhitespace, renameElements, saveRecord, saveRecordFailure, saveRecordSuccess, selectCanEditRecord, selectCurrentPage, selectEditorConfig, selectEditorState, selectFallback, selectFallbackFields, selectField, selectHasRecordChanged, selectIsPublished, selectRecord, selectRecordChangedSinceSave, selectRecordSaveError, selectRecordSaving, selectRecordSections, selectRecordSource, selectTranslatedField, selectTranslatedValue, setContext, setCurrentPage, setFieldVisibility, setSelectedFeatures, setTextContent, someHabTableItemFixture, sortByFromString, sortByToString, sortByToStrings, stripHtml, stripNamespace, tableItemsFixture, toDate, totalPages, undoRecordDraft, unrecognizedKeysConfigFixture, updateRecordField, wmsLayerFlatten, writeAttribute, wrongLanguageCodeConfigFixture, xmlToString };
43186
43868
  //# sourceMappingURL=geonetwork-ui.mjs.map