geonetwork-ui 2.6.0-dev.9d3ad45e2 → 2.6.0-dev.a0bd52a21

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 (183) 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/constant.mjs +2 -1
  8. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +3 -3
  9. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +75 -15
  10. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +7 -1
  11. package/esm2022/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.mjs +2 -1
  12. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  13. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  14. package/esm2022/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.mjs +266 -11
  15. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-from-catalog.component.mjs +1 -1
  16. package/esm2022/libs/feature/record/src/lib/state/mdview.actions.mjs +3 -1
  17. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +7 -1
  18. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +3 -1
  19. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +7 -1
  20. package/esm2022/libs/feature/record/src/lib/state/mdview.selectors.mjs +3 -1
  21. package/esm2022/libs/feature/search/src/lib/constants.mjs +3 -2
  22. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +5 -3
  23. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +13 -10
  24. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +19 -34
  25. package/esm2022/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.mjs +59 -0
  26. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +35 -10
  27. package/esm2022/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.mjs +5 -1
  28. package/esm2022/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.mjs +50 -29
  29. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +7 -3
  30. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +3 -3
  31. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  32. package/esm2022/libs/ui/layout/src/lib/cell-popin/cell-popin.component.mjs +110 -0
  33. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +20 -10
  34. package/esm2022/libs/ui/layout/src/lib/truncated-text/truncated-text.component.mjs +15 -49
  35. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +2 -2
  36. package/esm2022/libs/ui/search/src/index.mjs +2 -1
  37. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +21 -12
  38. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +39 -18
  39. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +10 -4
  40. package/esm2022/libs/util/i18n/src/lib/i18n.constants.mjs +42 -1
  41. package/esm2022/libs/util/i18n/src/lib/language-codes.mjs +24 -2
  42. package/esm2022/translations/de.json +41 -6
  43. package/esm2022/translations/en.json +41 -6
  44. package/esm2022/translations/es.json +40 -5
  45. package/esm2022/translations/fr.json +41 -6
  46. package/esm2022/translations/it.json +40 -5
  47. package/esm2022/translations/nl.json +40 -5
  48. package/esm2022/translations/pt.json +40 -5
  49. package/fesm2022/geonetwork-ui.mjs +1591 -719
  50. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  51. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  52. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +0 -1
  53. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  54. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +1 -0
  55. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +1 -1
  56. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +1 -1
  57. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  58. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  59. package/libs/api/repository/src/lib/gn4/elasticsearch/constant.d.ts.map +1 -1
  60. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts +1 -1
  61. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  62. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +13 -2
  63. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  64. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +2 -0
  65. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  66. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts +1 -0
  67. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts.map +1 -1
  68. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +20 -17
  69. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  70. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +6 -0
  71. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  72. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts +48 -3
  73. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts.map +1 -1
  74. package/libs/feature/record/src/lib/state/mdview.actions.d.ts +10 -0
  75. package/libs/feature/record/src/lib/state/mdview.actions.d.ts.map +1 -1
  76. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +6 -0
  77. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  78. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +2 -0
  79. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  80. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts +2 -0
  81. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  82. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts +2 -0
  83. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts.map +1 -1
  84. package/libs/feature/search/src/lib/constants.d.ts.map +1 -1
  85. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +2 -1
  86. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  87. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +6 -5
  88. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  89. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts +3 -6
  90. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts.map +1 -1
  91. package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts +14 -0
  92. package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts.map +1 -0
  93. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts +3 -0
  94. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  95. package/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.d.ts.map +1 -1
  96. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts +20 -9
  97. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts.map +1 -1
  98. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +2 -1
  99. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  100. package/libs/ui/layout/src/index.d.ts +1 -0
  101. package/libs/ui/layout/src/index.d.ts.map +1 -1
  102. package/libs/ui/layout/src/lib/cell-popin/cell-popin.component.d.ts +28 -0
  103. package/libs/ui/layout/src/lib/cell-popin/cell-popin.component.d.ts.map +1 -0
  104. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +4 -2
  105. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -1
  106. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts +5 -10
  107. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts.map +1 -1
  108. package/libs/ui/search/src/index.d.ts +1 -0
  109. package/libs/ui/search/src/index.d.ts.map +1 -1
  110. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +4 -3
  111. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -1
  112. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +10 -4
  113. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  114. package/libs/ui/search/src/lib/ui-search.module.d.ts +2 -1
  115. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  116. package/libs/util/i18n/src/lib/i18n.constants.d.ts +1 -0
  117. package/libs/util/i18n/src/lib/i18n.constants.d.ts.map +1 -1
  118. package/libs/util/i18n/src/lib/language-codes.d.ts +23 -1
  119. package/libs/util/i18n/src/lib/language-codes.d.ts.map +1 -1
  120. package/package.json +1 -1
  121. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +1 -1
  122. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +61 -4
  123. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +0 -1
  124. package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +13 -3
  125. package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +5 -1
  126. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +6 -3
  127. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +4 -1
  128. package/src/libs/api/repository/src/lib/gn4/elasticsearch/constant.ts +1 -0
  129. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +2 -2
  130. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +111 -15
  131. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +11 -0
  132. package/src/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.ts +3 -0
  133. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +20 -14
  134. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +6 -0
  135. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +63 -0
  136. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.html +117 -11
  137. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.ts +316 -6
  138. package/src/libs/feature/record/src/lib/state/mdview.actions.ts +10 -0
  139. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +22 -0
  140. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +4 -0
  141. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +12 -0
  142. package/src/libs/feature/record/src/lib/state/mdview.selectors.ts +9 -0
  143. package/src/libs/feature/search/src/lib/constants.ts +2 -1
  144. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.html +1 -1
  145. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +1 -0
  146. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +1 -0
  147. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +13 -3
  148. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +7 -75
  149. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +20 -51
  150. package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.html +69 -0
  151. package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.ts +61 -0
  152. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +48 -9
  153. package/src/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.ts +4 -0
  154. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.html +96 -37
  155. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.ts +60 -29
  156. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +2 -0
  157. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
  158. package/src/libs/ui/layout/src/index.ts +1 -0
  159. package/src/libs/ui/layout/src/lib/cell-popin/cell-popin.component.html +40 -0
  160. package/src/libs/ui/layout/src/lib/cell-popin/cell-popin.component.ts +141 -0
  161. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +3 -2
  162. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +13 -6
  163. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.html +25 -42
  164. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.ts +10 -49
  165. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +1 -1
  166. package/src/libs/ui/search/src/index.ts +1 -0
  167. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +16 -6
  168. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +15 -11
  169. package/src/libs/ui/search/src/lib/results-table/results-table.component.css +4 -0
  170. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +31 -27
  171. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +33 -15
  172. package/src/libs/ui/search/src/lib/ui-search.module.ts +3 -0
  173. package/src/libs/util/i18n/src/lib/i18n.constants.ts +42 -0
  174. package/src/libs/util/i18n/src/lib/language-codes.ts +23 -1
  175. package/tailwind.base.css +1 -1
  176. package/translations/de.json +41 -6
  177. package/translations/en.json +41 -6
  178. package/translations/es.json +40 -5
  179. package/translations/fr.json +41 -6
  180. package/translations/it.json +40 -5
  181. package/translations/nl.json +40 -5
  182. package/translations/pt.json +40 -5
  183. package/translations/sk.json +40 -5
@@ -7,17 +7,17 @@ import { marker } from '@biesbjerg/ngx-translate-extract-marker';
7
7
  import { format } from 'date-fns/format';
8
8
  import { Namespace, Literal, lit, parse as parse$2, sym, BlankNode, graph } from 'rdflib';
9
9
  import * as i0 from '@angular/core';
10
- import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Directive, Input, HostListener, HostBinding, Component, EventEmitter, ChangeDetectionStrategy, ViewChild, Output, ContentChild, ContentChildren, TemplateRef, Host, ElementRef, ViewChildren, ViewContainerRef, ViewEncapsulation, Pipe, inject } from '@angular/core';
10
+ import { InjectionToken, Injectable, Optional, Inject, NgModule, SkipSelf, Directive, Input, HostListener, HostBinding, Component, EventEmitter, ChangeDetectionStrategy, ViewChild, Output, TemplateRef, ElementRef, ViewChildren, ContentChild, ContentChildren, Host, ViewContainerRef, ViewEncapsulation, Pipe, inject } from '@angular/core';
11
11
  import * as i1 from '@angular/common/http';
12
12
  import { HttpHeaders, HttpParams, HttpClient, HttpClientModule, HTTP_INTERCEPTORS, HttpEventType, HttpClientXsrfModule } from '@angular/common/http';
13
13
  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, distinctUntilChanged, debounceTime, finalize, throttleTime, 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, ReplaySubject, Subscription, first, distinctUntilChanged as distinctUntilChanged$1, fromEvent, animationFrameScheduler, 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';
@@ -25,12 +25,11 @@ import * as i1$3 from '@ngrx/store';
25
25
  import { createAction, props, createReducer, on, createFeatureSelector, createSelector, select, StoreModule, Store } from '@ngrx/store';
26
26
  import EmblaCarousel from 'embla-carousel';
27
27
  import * as i2$2 from '@ng-icons/core';
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';
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
- import * as i3 from '@angular/material/tooltip';
32
- import { MatTooltipModule } from '@angular/material/tooltip';
33
- import { moveItemInArray, CdkDropList, CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';
28
+ import { provideIcons, NgIconComponent, provideNgIconsConfig, NgIcon, NgIconsModule } from '@ng-icons/core';
29
+ import { iconoirNavArrowRight, iconoirNavArrowLeft, iconoirSearch, iconoirLongArrowDownLeft, iconoirCalendar, iconoirLink, iconoirArrowUp, iconoirCloudUpload, iconoirFramePlusIn, iconoirReduce, iconoirNavArrowDown, iconoirNavArrowUp, iconoirExpand, iconoirAppleWallet, iconoirAppleShortcuts, iconoirCode, iconoirCreditCard, iconoirInternet, iconoirSettings, iconoirDownload, iconoirMediaImage, iconoirMediaImageXmark, iconoirBin, iconoirPlus, iconoirList, iconoirUser, iconoirLock, iconoirTranslate, iconoirImport, iconoirLightBulbOn, iconoirArrowLeft, iconoirAttachment, iconoirRefresh, iconoirCheckCircle, iconoirCircle } from '@ng-icons/iconoir';
30
+ import { MatButtonModule } from '@angular/material/button';
31
+ import * as i1$8 from '@angular/cdk/overlay';
32
+ import { CdkConnectedOverlay, OverlayModule, CdkOverlayOrigin } from '@angular/cdk/overlay';
34
33
  import * as i2$1 from '@angular/forms';
35
34
  import { FormsModule, ReactiveFormsModule, UntypedFormControl } from '@angular/forms';
36
35
  import * as i1$5 from '@angular/material/autocomplete';
@@ -41,22 +40,23 @@ import { TagInputModule } from 'ngx-chips';
41
40
  import * as i1$4 from '@angular/material/progress-spinner';
42
41
  import { MatProgressSpinnerModule } from '@angular/material/progress-spinner';
43
42
  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';
43
+ 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';
44
+ import { matClose, matContentCopy, matExpandMore, matExpandLess, matSearch, matStar, matStarBorder, matAdd, matRemove, matChevronLeft, matChevronRight, matArrowBackIos, matArrowForwardIos, matCheck, matWarningAmber, matFace, matQuestionMark, matMoodBad, matZoomOutMap, matOpenInNew, matMailOutline, matPersonOutline, matCheckCircleOutline, matWarning, matMoreVert, matCorporateFare } from '@ng-icons/material-icons/baseline';
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';
48
48
  import { MatCheckboxModule } from '@angular/material/checkbox';
49
+ import * as i3 from '@angular/material/tooltip';
50
+ import { MatTooltipModule } from '@angular/material/tooltip';
49
51
  import * as i1$7 from '@angular/material/datepicker';
50
52
  import { MatDatepickerModule } from '@angular/material/datepicker';
51
- import * as i1$8 from '@angular/cdk/overlay';
52
- import { CdkConnectedOverlay, OverlayModule, CdkOverlayOrigin } from '@angular/cdk/overlay';
53
53
  import * as i1$9 from '@angular/material/button-toggle';
54
54
  import { MatButtonToggleModule } from '@angular/material/button-toggle';
55
55
  import { MatFormFieldModule } from '@angular/material/form-field';
56
56
  import { MatInputModule } from '@angular/material/input';
57
+ import { moveItemInArray, CdkDropList, CdkDrag, CdkDragHandle } from '@angular/cdk/drag-drop';
57
58
  import * as i1$a from '@angular/material/dialog';
58
59
  import { MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog';
59
- import { MatButtonModule } from '@angular/material/button';
60
60
  import * as i2$3 from '@angular/material/tabs';
61
61
  import { MatTabsModule } from '@angular/material/tabs';
62
62
  import * as i1$c from '@angular/router';
@@ -72,6 +72,8 @@ import { mouseOnly, noModifierKeys, primaryAction, platformModifierKeyOnly } fro
72
72
  import { Polygon } from 'ol/geom';
73
73
  import { formatDistance } from 'date-fns/formatDistance';
74
74
  import { enUS, sk, pt as pt$1, nl as nl$1, it as it$1, es as es$1, de as de$1, fr as fr$1 } from 'date-fns/locale';
75
+ import * as i3$2 from '@angular/cdk/scrolling';
76
+ import { ScrollingModule, CdkScrollable } from '@angular/cdk/scrolling';
75
77
  import { MatMenuTrigger, MatMenuModule } from '@angular/material/menu';
76
78
  import { TemplatePortal } from '@angular/cdk/portal';
77
79
  import * as i1$b from '@ngrx/effects';
@@ -89,8 +91,7 @@ import { parseISO } from 'date-fns/parseISO';
89
91
  import { WFS, GeoJSON as GeoJSON$1 } from 'ol/format';
90
92
  import { tablerFolderOpen } from '@ng-icons/tabler-icons';
91
93
  import { Chart, BarController, BarElement, CategoryScale, LinearScale, LineController, LineElement, PointElement, PieController, ArcElement, ScatterController, Tooltip, Colors, Legend } from 'chart.js';
92
- import { ScrollingModule } from '@angular/cdk/scrolling';
93
- import * as i3$2 from '@angular/material/sort';
94
+ import * as i3$3 from '@angular/material/sort';
94
95
  import { MatSort, MatSortModule } from '@angular/material/sort';
95
96
  import * as i2$4 from '@angular/material/table';
96
97
  import { MatTableModule } from '@angular/material/table';
@@ -105,7 +106,7 @@ import { MatRadioModule } from '@angular/material/radio';
105
106
  import { MatIconModule } from '@angular/material/icon';
106
107
  import * as i4$2 from '@angular/cdk/text-field';
107
108
  import { TextFieldModule } from '@angular/cdk/text-field';
108
- import * as i3$3 from '@ngrx/router-store';
109
+ import * as i3$4 from '@ngrx/router-store';
109
110
  import { getRouterSelectors, routerReducer, StoreRouterConnectingModule, FullRouterStateSerializer } from '@ngrx/router-store';
110
111
  import { navigation } from '@ngrx/router-store/data-persistence';
111
112
 
@@ -909,6 +910,17 @@ const LANG_3_TO_2_MAPPER = {
909
910
  chi: 'zh',
910
911
  slo: 'sk',
911
912
  roh: 'rm',
913
+ ara: 'ar',
914
+ dan: 'da',
915
+ nor: 'no',
916
+ pol: 'pl',
917
+ swe: 'sv',
918
+ tur: 'tr',
919
+ arm: 'hy',
920
+ aze: 'az',
921
+ geo: 'ka',
922
+ ukr: 'uk',
923
+ wel: 'cy',
912
924
  };
913
925
  const LANGUAGE_NAMES = {
914
926
  en: 'English',
@@ -926,7 +938,18 @@ const LANGUAGE_NAMES = {
926
938
  ru: 'Русский',
927
939
  zh: '中文',
928
940
  sk: 'Slovenčina',
929
- roh: 'Rumantsch',
941
+ rm: 'Rumantsch',
942
+ ar: 'العربية',
943
+ da: 'Dansk',
944
+ no: 'Norsk',
945
+ pl: 'Polski',
946
+ sv: 'Swedish',
947
+ tr: 'Türkçe',
948
+ hy: 'հայերեն',
949
+ az: 'Azərbaycan dili',
950
+ ka: 'ქართული',
951
+ uk: 'українська',
952
+ wel: 'Cymraeg',
930
953
  };
931
954
  const LANG_2_TO_3_MAPPER = Object.entries(LANG_3_TO_2_MAPPER).reduce((mapperObject, langEntry) => {
932
955
  return { ...mapperObject, [langEntry[1]]: langEntry[0] };
@@ -1437,10 +1460,10 @@ function readSpatialExtents$1(rootEl) {
1437
1460
  }
1438
1461
  function readOtherLanguages$1(rootEl) {
1439
1462
  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);
1463
+ 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
1464
  }
1442
1465
  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);
1466
+ return pipe(findChildElement('gmd:language', false), findChildElement('lan:LanguageCode'), readAttribute('codeListValue'), map((lang) => (lang ? LANG_3_TO_2_MAPPER[lang.toLowerCase()] : null)))(rootEl);
1444
1467
  }
1445
1468
  function readResourceIdentifier(rootEl) {
1446
1469
  return pipe(findIdentification(), findNestedElement('gmd:citation', 'gmd:CI_Citation', 'gmd:identifier', 'gmd:MD_Identifier', 'gmd:code'), extractCharacterString())(rootEl);
@@ -1936,7 +1959,7 @@ function writeLanguages(record, rootEl) {
1936
1959
  if (!record.otherLanguages?.length) {
1937
1960
  return;
1938
1961
  }
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]));
1962
+ 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
1963
  // add new languages (only if other than default one)
1941
1964
  appendChildren(createLanguageEl(record.defaultLanguage), ...record.otherLanguages.map(createLanguageEl))(rootEl);
1942
1965
  }
@@ -2374,13 +2397,17 @@ function readOnlineResources$1(rootEl) {
2374
2397
  return pipe(findNestedElements('mrd:distributionInfo', 'mrd:MD_Distribution'), mapArray(getOnlineResources), flattenArray())(rootEl);
2375
2398
  }
2376
2399
  function readLocaleElement() {
2377
- return pipe(findChildElement('lan:LanguageCode'), readAttribute('codeListValue'), map((lang) => (lang ? LANG_3_TO_2_MAPPER[lang.toLowerCase()] : null)));
2400
+ return pipe(findChildElement('lan:LanguageCode'), readAttribute('codeListValue'), map((lang) => {
2401
+ const normalized = lang?.toLowerCase();
2402
+ const iso2Lang = LANG_3_TO_2_MAPPER[normalized];
2403
+ return iso2Lang ?? lang;
2404
+ }));
2378
2405
  }
2379
2406
  function readDefaultLanguage$1(rootEl) {
2380
2407
  return pipe(findChildElement('mdb:defaultLocale', false), readLocaleElement())(rootEl);
2381
2408
  }
2382
2409
  function readOtherLanguages(rootEl) {
2383
- return pipe(findChildrenElement('mdb:otherLocale', false), mapArray(readLocaleElement()))(rootEl);
2410
+ return pipe(findChildrenElement('mdb:otherLocale', false), mapArray(readLocaleElement()), map((languages) => languages.filter((lang) => lang !== null)))(rootEl);
2384
2411
  }
2385
2412
 
2386
2413
  function writeUniqueIdentifier$1(record, rootEl) {
@@ -2513,7 +2540,10 @@ function writeOnlineResources(record, rootEl) {
2513
2540
  });
2514
2541
  }
2515
2542
  function writeLocaleElement(language) {
2516
- const lang3 = LANG_2_TO_3_MAPPER[language.toLowerCase()];
2543
+ const normalizedLang = language.toLowerCase();
2544
+ const lang3 = normalizedLang.length === 2
2545
+ ? LANG_2_TO_3_MAPPER[normalizedLang]
2546
+ : normalizedLang;
2517
2547
  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
2548
  }
2519
2549
  function writeDefaultLanguage(record, rootEl) {
@@ -18502,9 +18532,50 @@ marker('language.pt');
18502
18532
  marker('language.ru');
18503
18533
  marker('language.zh');
18504
18534
  marker('language.sk');
18535
+ marker('language.rm');
18536
+ marker('language.ar');
18537
+ marker('language.da');
18538
+ marker('language.no');
18539
+ marker('language.pl');
18540
+ marker('language.sv');
18541
+ marker('language.tr');
18542
+ marker('language.hy');
18543
+ marker('language.az');
18544
+ marker('language.ka');
18545
+ marker('language.uk');
18546
+ marker('language.cy');
18505
18547
  const DEFAULT_LANG = 'en';
18506
18548
  // Caution: changing this can break language selection from third parties!
18507
18549
  const LANGUAGE_STORAGE_KEY = 'geonetwork-ui-language';
18550
+ const SUPPORTED_LANGUAGES = [
18551
+ 'en',
18552
+ 'nl',
18553
+ 'fr',
18554
+ 'de',
18555
+ 'ko',
18556
+ 'es',
18557
+ 'cs',
18558
+ 'ca',
18559
+ 'fi',
18560
+ 'is',
18561
+ 'it',
18562
+ 'pt',
18563
+ 'ru',
18564
+ 'zh',
18565
+ 'sk',
18566
+ 'rm',
18567
+ 'ar',
18568
+ 'da',
18569
+ 'no',
18570
+ 'pl',
18571
+ 'sv',
18572
+ 'tr',
18573
+ 'hy',
18574
+ 'az',
18575
+ 'ka',
18576
+ 'uk',
18577
+ 'cy',
18578
+ ];
18508
18579
  function HttpLoaderFactory(http) {
18509
18580
  return new FileTranslateLoader(http, './assets/i18n/');
18510
18581
  }
@@ -18636,6 +18707,7 @@ var de = {
18636
18707
  "dashboard.labels.mySpace": "Mein Bereich",
18637
18708
  "dashboard.records.all": "Metadatenkatalog",
18638
18709
  "dashboard.records.hasDraft": "",
18710
+ "dashboard.records.isMultilingual": "Dieser Eintrag ist mehrsprachig ({languages})",
18639
18711
  "dashboard.records.myDraft": "Meine Entwürfe",
18640
18712
  "dashboard.records.myRecords": "Meine Datensätze",
18641
18713
  "dashboard.records.search": "Suche nach \"{searchText}\"",
@@ -18810,9 +18882,13 @@ var de = {
18810
18882
  "editor.record.form.license.odc-by": "",
18811
18883
  "editor.record.form.license.pddl": "",
18812
18884
  "editor.record.form.license.unknown": "",
18885
+ "editor.record.form.multilingual.activate": "",
18886
+ "editor.record.form.multilingual.default": "",
18813
18887
  "editor.record.form.multilingual.enable": "",
18888
+ "editor.record.form.multilingual.forbidden": "",
18814
18889
  "editor.record.form.multilingual.open": "",
18815
18890
  "editor.record.form.multilingual.title": "",
18891
+ "editor.record.form.multilingual.validate": "",
18816
18892
  "editor.record.form.page.accessAndContact": "",
18817
18893
  "editor.record.form.page.description": "",
18818
18894
  "editor.record.form.page.resources": "",
@@ -18842,8 +18918,13 @@ var de = {
18842
18918
  "editor.record.loadError.body": "Der Datensatz konnte nicht geladen werden:",
18843
18919
  "editor.record.loadError.closeMessage": "Verstanden",
18844
18920
  "editor.record.loadError.title": "Fehler beim Laden des Datensatzes",
18845
- "editor.record.lock.format": "",
18846
- "editor.record.lock.reason": "",
18921
+ "editor.record.lock.harvested": "",
18922
+ "editor.record.lock.owner": "",
18923
+ "editor.record.lock.resourceType": "",
18924
+ "editor.record.multilingual.confirmation.cancelText": "",
18925
+ "editor.record.multilingual.confirmation.confirmText": "",
18926
+ "editor.record.multilingual.confirmation.message": "",
18927
+ "editor.record.multilingual.confirmation.title": "",
18847
18928
  "editor.record.onlineResource.protocol.other": "",
18848
18929
  "editor.record.onlineResourceError.body": "",
18849
18930
  "editor.record.onlineResourceError.closeMessage": "",
@@ -18890,6 +18971,11 @@ var de = {
18890
18971
  "facets.block.title.tag.default": "Stichwort",
18891
18972
  "facets.block.title.th_regions_tree.default": "Regionen",
18892
18973
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Anmelden</a>, um auf diese Funktion zuzugreifen</div>",
18974
+ "feature.catalog.attribute.code": "Code",
18975
+ "feature.catalog.attribute.definition": "Beschreibung",
18976
+ "feature.catalog.attribute.name": "Name",
18977
+ "feature.catalog.attribute.type": "Typ",
18978
+ "feature.catalog.attribute.values": "Werte",
18893
18979
  "input.file.dropFileLabel": "",
18894
18980
  "input.file.orInputUrl": "",
18895
18981
  "input.file.selectFileLabel": "",
@@ -18904,20 +18990,32 @@ var de = {
18904
18990
  "input.image.uploadErrorLabel": "",
18905
18991
  "input.image.uploadProgressCancel": "",
18906
18992
  "input.image.uploadProgressLabel": "",
18993
+ "language.ar": "",
18994
+ "language.az": "",
18907
18995
  "language.ca": "Katalanisch",
18908
18996
  "language.cs": "Tschechisch",
18997
+ "language.cy": "",
18998
+ "language.da": "",
18909
18999
  "language.de": "Deutsch",
18910
19000
  "language.en": "Englisch",
18911
19001
  "language.es": "Spanisch",
18912
19002
  "language.fi": "Finnisch",
18913
19003
  "language.fr": "Französisch",
19004
+ "language.hy": "",
18914
19005
  "language.is": "Isländisch",
18915
19006
  "language.it": "Italienisch",
19007
+ "language.ka": "",
18916
19008
  "language.ko": "Koreanisch",
18917
19009
  "language.nl": "Niederländisch",
19010
+ "language.no": "",
19011
+ "language.pl": "",
18918
19012
  "language.pt": "Portugiesisch",
19013
+ "language.rm": "",
18919
19014
  "language.ru": "Russisch",
18920
19015
  "language.sk": "Slowakisch",
19016
+ "language.sv": "",
19017
+ "language.tr": "",
19018
+ "language.uk": "",
18921
19019
  "language.zh": "Chinesisch",
18922
19020
  "map.add.layer": "Eine Ebene hinzufügen",
18923
19021
  "map.add.layer.catalog": "Aus dem Katalog",
@@ -18964,6 +19062,7 @@ var de = {
18964
19062
  "record.action.duplicate": "",
18965
19063
  "record.action.duplicating": "",
18966
19064
  "record.action.rollback": "",
19065
+ "record.action.switchLang": "",
18967
19066
  "record.action.view": "Anzeigen",
18968
19067
  "record.card.metadata.contact": "",
18969
19068
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
@@ -19014,9 +19113,15 @@ var de = {
19014
19113
  "record.metadata.download": "Downloads",
19015
19114
  "record.metadata.feature.catalog": "",
19016
19115
  "record.metadata.formats": "Formate",
19116
+ "record.metadata.isGeographical": "Geographischer Datensatz",
19017
19117
  "record.metadata.keywords": "Stichworte",
19018
19118
  "record.metadata.languages": "Sprachen",
19019
19119
  "record.metadata.lastUpdate": "Zuletzt aktualisiert am {date}",
19120
+ "record.metadata.linked.datasets": "Verknüpfte Datensätze",
19121
+ "record.metadata.linked.records": "Verknüpfte Inhalte",
19122
+ "record.metadata.linked.reuses": "Verknüpfte Wiederverwendungen",
19123
+ "record.metadata.linked.services": "Verknüpfte Dienste",
19124
+ "record.metadata.linked.sourceDatasets": "Quelldatensätze",
19020
19125
  "record.metadata.links": "Links",
19021
19126
  "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
19022
19127
  "record.metadata.otherConstraints": "Zusätzliche Bedingungen",
@@ -19026,6 +19131,8 @@ var de = {
19026
19131
  "record.metadata.publication": "Veröffentlichungsdatum",
19027
19132
  "record.metadata.publications": "{count, plural, =0{Veröffentlichungsdatum} one{Veröffentlichungsdatum} other{Veröffentlichungen}}",
19028
19133
  "record.metadata.quality": "Metadatenqualität",
19134
+ "record.metadata.quality.capabilities.failed": "",
19135
+ "record.metadata.quality.capabilities.success": "",
19029
19136
  "record.metadata.quality.contact.failed": "Kontakt nicht angegeben",
19030
19137
  "record.metadata.quality.contact.success": "Kontakt angegeben",
19031
19138
  "record.metadata.quality.description.failed": "Beschreibung nicht angegeben",
@@ -19037,14 +19144,15 @@ var de = {
19037
19144
  "record.metadata.quality.legalConstraints.success": "Rechtliche Beschränkungen angegeben",
19038
19145
  "record.metadata.quality.organisation.failed": "Organisation nicht angegeben",
19039
19146
  "record.metadata.quality.organisation.success": "Organisation angegeben",
19147
+ "record.metadata.quality.source.failed": "",
19148
+ "record.metadata.quality.source.success": "",
19040
19149
  "record.metadata.quality.title.failed": "Titel nicht angegeben",
19041
19150
  "record.metadata.quality.title.success": "Titel angegeben",
19042
19151
  "record.metadata.quality.topic.failed": "Thema nicht angegeben",
19043
19152
  "record.metadata.quality.topic.success": "Thema angegeben",
19044
19153
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
19045
19154
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
19046
- "record.metadata.related": "Ähnliche Datensätze",
19047
- "record.metadata.related.contents": "",
19155
+ "record.metadata.related": "Entdecken Sie den Katalog",
19048
19156
  "record.metadata.ressources.and.links": "Ressourcen und Links",
19049
19157
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
19050
19158
  "record.metadata.status": "Status",
@@ -19056,7 +19164,6 @@ var de = {
19056
19164
  "record.metadata.temporalExtent.untilDate": "Bis {end}",
19057
19165
  "record.metadata.title": "Titel",
19058
19166
  "record.metadata.topics": "Kategorien",
19059
- "record.metadata.isGeographical": "Geographischer Datensatz",
19060
19167
  "record.metadata.uniqueId": "Eindeutige Kennung",
19061
19168
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
19062
19169
  "record.metadata.updatedOn": "Geändert am",
@@ -19176,7 +19283,6 @@ var de = {
19176
19283
  "tooltip.html.copy": "HTML kopieren",
19177
19284
  "tooltip.id.copy": "Eindeutige Kennung kopieren",
19178
19285
  "tooltip.url.copy": "URL kopieren",
19179
- "tooltip.url.open": "URL öffnen",
19180
19286
  "ui.readLess": "Weniger lesen",
19181
19287
  "ui.readMore": "Weiterlesen",
19182
19288
  "wfs.feature.limit": "Zu viele Features, um den WFS-Layer anzuzeigen!",
@@ -19223,6 +19329,7 @@ var en = {
19223
19329
  "dashboard.labels.mySpace": "My space",
19224
19330
  "dashboard.records.all": "Datasets",
19225
19331
  "dashboard.records.hasDraft": "draft",
19332
+ "dashboard.records.isMultilingual": "This record is multilingual ({languages})",
19226
19333
  "dashboard.records.myDraft": "My drafts",
19227
19334
  "dashboard.records.myRecords": "My datasets",
19228
19335
  "dashboard.records.search": "Search for \"{searchText}\"",
@@ -19397,9 +19504,13 @@ var en = {
19397
19504
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
19398
19505
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
19399
19506
  "editor.record.form.license.unknown": "Unknown or absent",
19507
+ "editor.record.form.multilingual.activate": "Activate the languages",
19508
+ "editor.record.form.multilingual.default": "Default",
19400
19509
  "editor.record.form.multilingual.enable": "Multilingual Mode",
19510
+ "editor.record.form.multilingual.forbidden": "You are not allowed to remove the default language",
19401
19511
  "editor.record.form.multilingual.open": "Open the multilingual panel",
19402
19512
  "editor.record.form.multilingual.title": "Translations",
19513
+ "editor.record.form.multilingual.validate": "Validate",
19403
19514
  "editor.record.form.page.accessAndContact": "Information for use",
19404
19515
  "editor.record.form.page.description": "Dataset description",
19405
19516
  "editor.record.form.page.resources": "Resources",
@@ -19429,8 +19540,13 @@ var en = {
19429
19540
  "editor.record.loadError.body": "The dataset could not be loaded:",
19430
19541
  "editor.record.loadError.closeMessage": "Understood",
19431
19542
  "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",
19543
+ "editor.record.lock.harvested": "Datasets harvested from an external catalog are not editable",
19544
+ "editor.record.lock.owner": "You are not an editor of the allowed groups",
19545
+ "editor.record.lock.resourceType": "Records of a type other than dataset are not editable",
19546
+ "editor.record.multilingual.confirmation.cancelText": "Keep the language(s)",
19547
+ "editor.record.multilingual.confirmation.confirmText": "Remove the language(s)",
19548
+ "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?",
19549
+ "editor.record.multilingual.confirmation.title": "Remove languages",
19434
19550
  "editor.record.onlineResource.protocol.other": "Other",
19435
19551
  "editor.record.onlineResourceError.body": "An error happened while adding the resource:",
19436
19552
  "editor.record.onlineResourceError.closeMessage": "Understood",
@@ -19477,6 +19593,11 @@ var en = {
19477
19593
  "facets.block.title.tag.default": "Tag",
19478
19594
  "facets.block.title.th_regions_tree.default": "Regions",
19479
19595
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Login</a> to access this feature</div>",
19596
+ "feature.catalog.attribute.code": "Code",
19597
+ "feature.catalog.attribute.definition": "Description",
19598
+ "feature.catalog.attribute.name": "Name",
19599
+ "feature.catalog.attribute.type": "Type",
19600
+ "feature.catalog.attribute.values": "Values",
19480
19601
  "input.file.dropFileLabel": "or drop it here",
19481
19602
  "input.file.orInputUrl": "or create a link to an external resource",
19482
19603
  "input.file.selectFileLabel": "Select a file ({sizeMB} MB max.)",
@@ -19491,20 +19612,32 @@ var en = {
19491
19612
  "input.image.uploadErrorLabel": "The image could not be uploaded",
19492
19613
  "input.image.uploadProgressCancel": "Cancel",
19493
19614
  "input.image.uploadProgressLabel": "Upload in progress...",
19615
+ "language.ar": "Arabic",
19616
+ "language.az": "Azerbaijani",
19494
19617
  "language.ca": "Catalan",
19495
19618
  "language.cs": "Czech",
19619
+ "language.cy": "Welsh",
19620
+ "language.da": "Danish",
19496
19621
  "language.de": "German",
19497
19622
  "language.en": "English",
19498
19623
  "language.es": "Spanish",
19499
19624
  "language.fi": "Finnish",
19500
19625
  "language.fr": "French",
19626
+ "language.hy": "Armenian",
19501
19627
  "language.is": "Icelandic",
19502
19628
  "language.it": "Italian",
19629
+ "language.ka": "Georgian",
19503
19630
  "language.ko": "Korean",
19504
19631
  "language.nl": "Dutch",
19632
+ "language.no": "Norwegian",
19633
+ "language.pl": "Polish",
19505
19634
  "language.pt": "Portuguese",
19635
+ "language.rm": "Romansh",
19506
19636
  "language.ru": "Russian",
19507
19637
  "language.sk": "Slovak",
19638
+ "language.sv": "Swedish",
19639
+ "language.tr": "Turkish",
19640
+ "language.uk": "Ukrainian",
19508
19641
  "language.zh": "Chinese",
19509
19642
  "map.add.layer": "Add a layer",
19510
19643
  "map.add.layer.catalog": "From the catalog",
@@ -19551,6 +19684,7 @@ var en = {
19551
19684
  "record.action.duplicate": "Duplicate",
19552
19685
  "record.action.duplicating": "Duplicating...",
19553
19686
  "record.action.rollback": "Rollback",
19687
+ "record.action.switchLang": "Switch to default",
19554
19688
  "record.action.view": "View",
19555
19689
  "record.card.metadata.contact": "Metadata Contact",
19556
19690
  "record.externalViewer.open": "Open in the external map viewer",
@@ -19601,9 +19735,15 @@ var en = {
19601
19735
  "record.metadata.download": "Downloads",
19602
19736
  "record.metadata.feature.catalog": "Feature catalog",
19603
19737
  "record.metadata.formats": "Formats",
19738
+ "record.metadata.isGeographical": "Geographical dataset",
19604
19739
  "record.metadata.keywords": "Keywords",
19605
19740
  "record.metadata.languages": "Languages",
19606
19741
  "record.metadata.lastUpdate": "Last updated on {date}",
19742
+ "record.metadata.linked.datasets": "Associated datasets",
19743
+ "record.metadata.linked.records": "Associated content",
19744
+ "record.metadata.linked.reuses": "Associated reuses",
19745
+ "record.metadata.linked.services": "Associated services",
19746
+ "record.metadata.linked.sourceDatasets": "Source datasets",
19607
19747
  "record.metadata.links": "Links",
19608
19748
  "record.metadata.noUsage": "No usage conditions specified for this dataset.",
19609
19749
  "record.metadata.otherConstraints": "Additional Conditions",
@@ -19613,6 +19753,8 @@ var en = {
19613
19753
  "record.metadata.publication": "Date of publication",
19614
19754
  "record.metadata.publications": "{count, plural, =0{publication} one{publication} other{publications}}",
19615
19755
  "record.metadata.quality": "Metadata Quality",
19756
+ "record.metadata.quality.capabilities.failed": "Capabilities URL is not specified",
19757
+ "record.metadata.quality.capabilities.success": "Capabilities URL is specified",
19616
19758
  "record.metadata.quality.contact.failed": "Contact is not specified",
19617
19759
  "record.metadata.quality.contact.success": "Contact is specified",
19618
19760
  "record.metadata.quality.description.failed": "Description is not specified",
@@ -19624,14 +19766,15 @@ var en = {
19624
19766
  "record.metadata.quality.legalConstraints.success": "Legal constraints are specified",
19625
19767
  "record.metadata.quality.organisation.failed": "Organisation is not specified",
19626
19768
  "record.metadata.quality.organisation.success": "Organisation is specified",
19769
+ "record.metadata.quality.source.failed": "No source dataset is specified",
19770
+ "record.metadata.quality.source.success": "A source dataset is specified",
19627
19771
  "record.metadata.quality.title.failed": "Title is not specified",
19628
19772
  "record.metadata.quality.title.success": "Title is specified",
19629
19773
  "record.metadata.quality.topic.failed": "Topic is not specified",
19630
19774
  "record.metadata.quality.topic.success": "Topic is specified",
19631
19775
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
19632
19776
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
19633
- "record.metadata.related": "Related records",
19634
- "record.metadata.related.contents": "Related content",
19777
+ "record.metadata.related": "Explore the catalog",
19635
19778
  "record.metadata.ressources.and.links": "Resources and links",
19636
19779
  "record.metadata.sheet": "Original metadata",
19637
19780
  "record.metadata.status": "Status",
@@ -19643,7 +19786,6 @@ var en = {
19643
19786
  "record.metadata.temporalExtent.untilDate": "Until { end }",
19644
19787
  "record.metadata.title": "Title",
19645
19788
  "record.metadata.topics": "Categories",
19646
- "record.metadata.isGeographical": "Geographical dataset",
19647
19789
  "record.metadata.uniqueId": "Unique Identifier",
19648
19790
  "record.metadata.updateFrequency": "Data Update Frequency",
19649
19791
  "record.metadata.updatedOn": "Updated on",
@@ -19763,7 +19905,6 @@ var en = {
19763
19905
  "tooltip.html.copy": "Copy HTML",
19764
19906
  "tooltip.id.copy": "Copy unique identifier",
19765
19907
  "tooltip.url.copy": "Copy URL",
19766
- "tooltip.url.open": "Open URL",
19767
19908
  "ui.readLess": "Read less",
19768
19909
  "ui.readMore": "Read more",
19769
19910
  "wfs.feature.limit": "Too many features to display the WFS layer!",
@@ -19810,6 +19951,7 @@ var es = {
19810
19951
  "dashboard.labels.mySpace": "Mi espacio",
19811
19952
  "dashboard.records.all": "Catálogo",
19812
19953
  "dashboard.records.hasDraft": "",
19954
+ "dashboard.records.isMultilingual": "Este registro es multilingüe ({languages})",
19813
19955
  "dashboard.records.myDraft": "Mis borradores",
19814
19956
  "dashboard.records.myRecords": "Mis Registros",
19815
19957
  "dashboard.records.search": "Buscar \"{searchText}\"",
@@ -19984,9 +20126,13 @@ var es = {
19984
20126
  "editor.record.form.license.odc-by": "",
19985
20127
  "editor.record.form.license.pddl": "",
19986
20128
  "editor.record.form.license.unknown": "",
20129
+ "editor.record.form.multilingual.activate": "",
20130
+ "editor.record.form.multilingual.default": "",
19987
20131
  "editor.record.form.multilingual.enable": "",
20132
+ "editor.record.form.multilingual.forbidden": "",
19988
20133
  "editor.record.form.multilingual.open": "",
19989
20134
  "editor.record.form.multilingual.title": "",
20135
+ "editor.record.form.multilingual.validate": "",
19990
20136
  "editor.record.form.page.accessAndContact": "",
19991
20137
  "editor.record.form.page.description": "",
19992
20138
  "editor.record.form.page.resources": "",
@@ -20016,8 +20162,13 @@ var es = {
20016
20162
  "editor.record.loadError.body": "",
20017
20163
  "editor.record.loadError.closeMessage": "",
20018
20164
  "editor.record.loadError.title": "",
20019
- "editor.record.lock.format": "",
20020
- "editor.record.lock.reason": "",
20165
+ "editor.record.lock.harvested": "",
20166
+ "editor.record.lock.owner": "",
20167
+ "editor.record.lock.resourceType": "",
20168
+ "editor.record.multilingual.confirmation.cancelText": "",
20169
+ "editor.record.multilingual.confirmation.confirmText": "",
20170
+ "editor.record.multilingual.confirmation.message": "",
20171
+ "editor.record.multilingual.confirmation.title": "",
20021
20172
  "editor.record.onlineResource.protocol.other": "",
20022
20173
  "editor.record.onlineResourceError.body": "",
20023
20174
  "editor.record.onlineResourceError.closeMessage": "",
@@ -20064,6 +20215,11 @@ var es = {
20064
20215
  "facets.block.title.tag.default": "",
20065
20216
  "facets.block.title.th_regions_tree.default": "",
20066
20217
  "favorite.not.authenticated.tooltip": "",
20218
+ "feature.catalog.attribute.code": "Código",
20219
+ "feature.catalog.attribute.definition": "Descripción",
20220
+ "feature.catalog.attribute.name": "Nombre",
20221
+ "feature.catalog.attribute.type": "Tipo",
20222
+ "feature.catalog.attribute.values": "Valores",
20067
20223
  "input.file.dropFileLabel": "",
20068
20224
  "input.file.orInputUrl": "",
20069
20225
  "input.file.selectFileLabel": "",
@@ -20078,20 +20234,32 @@ var es = {
20078
20234
  "input.image.uploadErrorLabel": "",
20079
20235
  "input.image.uploadProgressCancel": "",
20080
20236
  "input.image.uploadProgressLabel": "",
20237
+ "language.ar": "",
20238
+ "language.az": "",
20081
20239
  "language.ca": "Catalán",
20082
20240
  "language.cs": "Checo",
20241
+ "language.cy": "",
20242
+ "language.da": "",
20083
20243
  "language.de": "Alemán",
20084
20244
  "language.en": "Inglés",
20085
20245
  "language.es": "Español",
20086
20246
  "language.fi": "Finlandés",
20087
20247
  "language.fr": "Francés",
20248
+ "language.hy": "",
20088
20249
  "language.is": "Islandés",
20089
20250
  "language.it": "Italiano",
20251
+ "language.ka": "",
20090
20252
  "language.ko": "Coreano",
20091
20253
  "language.nl": "Neerlandés",
20254
+ "language.no": "",
20255
+ "language.pl": "",
20092
20256
  "language.pt": "Portugués",
20257
+ "language.rm": "",
20093
20258
  "language.ru": "Ruso",
20094
20259
  "language.sk": "Eslovaco",
20260
+ "language.sv": "",
20261
+ "language.tr": "",
20262
+ "language.uk": "",
20095
20263
  "language.zh": "Chino",
20096
20264
  "map.add.layer": "",
20097
20265
  "map.add.layer.catalog": "",
@@ -20138,6 +20306,7 @@ var es = {
20138
20306
  "record.action.duplicate": "",
20139
20307
  "record.action.duplicating": "",
20140
20308
  "record.action.rollback": "",
20309
+ "record.action.switchLang": "",
20141
20310
  "record.action.view": "",
20142
20311
  "record.card.metadata.contact": "",
20143
20312
  "record.externalViewer.open": "",
@@ -20188,9 +20357,15 @@ var es = {
20188
20357
  "record.metadata.download": "",
20189
20358
  "record.metadata.feature.catalog": "",
20190
20359
  "record.metadata.formats": "",
20360
+ "record.metadata.isGeographical": "",
20191
20361
  "record.metadata.keywords": "",
20192
20362
  "record.metadata.languages": "",
20193
20363
  "record.metadata.lastUpdate": "",
20364
+ "record.metadata.linked.datasets": "",
20365
+ "record.metadata.linked.records": "",
20366
+ "record.metadata.linked.reuses": "",
20367
+ "record.metadata.linked.services": "",
20368
+ "record.metadata.linked.sourceDatasets": "",
20194
20369
  "record.metadata.links": "",
20195
20370
  "record.metadata.noUsage": "",
20196
20371
  "record.metadata.otherConstraints": "",
@@ -20200,6 +20375,8 @@ var es = {
20200
20375
  "record.metadata.publication": "",
20201
20376
  "record.metadata.publications": "{count, plural, =0{} one{} other{}}",
20202
20377
  "record.metadata.quality": "",
20378
+ "record.metadata.quality.capabilities.failed": "",
20379
+ "record.metadata.quality.capabilities.success": "",
20203
20380
  "record.metadata.quality.contact.failed": "",
20204
20381
  "record.metadata.quality.contact.success": "",
20205
20382
  "record.metadata.quality.description.failed": "",
@@ -20211,6 +20388,8 @@ var es = {
20211
20388
  "record.metadata.quality.legalConstraints.success": "",
20212
20389
  "record.metadata.quality.organisation.failed": "",
20213
20390
  "record.metadata.quality.organisation.success": "",
20391
+ "record.metadata.quality.source.failed": "",
20392
+ "record.metadata.quality.source.success": "",
20214
20393
  "record.metadata.quality.title.failed": "",
20215
20394
  "record.metadata.quality.title.success": "",
20216
20395
  "record.metadata.quality.topic.failed": "",
@@ -20218,7 +20397,6 @@ var es = {
20218
20397
  "record.metadata.quality.updateFrequency.failed": "",
20219
20398
  "record.metadata.quality.updateFrequency.success": "",
20220
20399
  "record.metadata.related": "",
20221
- "record.metadata.related.contents": "",
20222
20400
  "record.metadata.ressources.and.links": "Recursos y enlaces",
20223
20401
  "record.metadata.sheet": "",
20224
20402
  "record.metadata.status": "",
@@ -20230,7 +20408,6 @@ var es = {
20230
20408
  "record.metadata.temporalExtent.untilDate": "",
20231
20409
  "record.metadata.title": "",
20232
20410
  "record.metadata.topics": "",
20233
- "record.metadata.isGeographical": "",
20234
20411
  "record.metadata.uniqueId": "",
20235
20412
  "record.metadata.updateFrequency": "",
20236
20413
  "record.metadata.updatedOn": "",
@@ -20350,7 +20527,6 @@ var es = {
20350
20527
  "tooltip.html.copy": "",
20351
20528
  "tooltip.id.copy": "",
20352
20529
  "tooltip.url.copy": "",
20353
- "tooltip.url.open": "",
20354
20530
  "ui.readLess": "",
20355
20531
  "ui.readMore": "",
20356
20532
  "wfs.feature.limit": "",
@@ -20397,6 +20573,7 @@ var fr = {
20397
20573
  "dashboard.labels.mySpace": "Mon espace",
20398
20574
  "dashboard.records.all": "Jeux de données",
20399
20575
  "dashboard.records.hasDraft": "brouillon",
20576
+ "dashboard.records.isMultilingual": "Cet enregistrement est multilingue ({languages})",
20400
20577
  "dashboard.records.myDraft": "Mes brouillons",
20401
20578
  "dashboard.records.myRecords": "Mes jeux de données",
20402
20579
  "dashboard.records.search": "Résultats pour \"{searchText}\"",
@@ -20571,9 +20748,13 @@ var fr = {
20571
20748
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
20572
20749
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
20573
20750
  "editor.record.form.license.unknown": "Inconnue ou absente",
20751
+ "editor.record.form.multilingual.activate": "Activez les langues",
20752
+ "editor.record.form.multilingual.default": "Par défaut",
20574
20753
  "editor.record.form.multilingual.enable": "Mode Multilingue",
20754
+ "editor.record.form.multilingual.forbidden": "Vous ne pouvez pas supprimer le language par défaut",
20575
20755
  "editor.record.form.multilingual.open": "Ouvrir le menu multilingue",
20576
20756
  "editor.record.form.multilingual.title": "Traductions",
20757
+ "editor.record.form.multilingual.validate": "Valider",
20577
20758
  "editor.record.form.page.accessAndContact": "Informations pour l'utilisation",
20578
20759
  "editor.record.form.page.description": "Description du jeu de données",
20579
20760
  "editor.record.form.page.resources": "Ressources",
@@ -20603,8 +20784,13 @@ var fr = {
20603
20784
  "editor.record.loadError.body": "Le jeu de données n'a pas pu être chargé :",
20604
20785
  "editor.record.loadError.closeMessage": "Compris",
20605
20786
  "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.",
20787
+ "editor.record.lock.harvested": "Les jeux de données moissonnés ne sont pas éditables",
20788
+ "editor.record.lock.owner": "Vous n'êtes pas éditeur d'un des groupes autorisés",
20789
+ "editor.record.lock.resourceType": "Les fiches d'un type autre que jeu de données ne sont pas éditables",
20790
+ "editor.record.multilingual.confirmation.cancelText": "Garder le(s) language(s)",
20791
+ "editor.record.multilingual.confirmation.confirmText": "Supprimer le(s) language(s)",
20792
+ "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 ?",
20793
+ "editor.record.multilingual.confirmation.title": "Suppression de language(s)",
20608
20794
  "editor.record.onlineResource.protocol.other": "Autre",
20609
20795
  "editor.record.onlineResourceError.body": "Une erreur est survenue lors de l'ajout de la ressource :",
20610
20796
  "editor.record.onlineResourceError.closeMessage": "Compris",
@@ -20651,6 +20837,11 @@ var fr = {
20651
20837
  "facets.block.title.tag.default": "Tag",
20652
20838
  "facets.block.title.th_regions_tree.default": "Régions",
20653
20839
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Connectez-vous</a> pour avoir accès à cette fonctionnalité</div>",
20840
+ "feature.catalog.attribute.code": "Code",
20841
+ "feature.catalog.attribute.definition": "Description",
20842
+ "feature.catalog.attribute.name": "Nom",
20843
+ "feature.catalog.attribute.type": "Type",
20844
+ "feature.catalog.attribute.values": "Valeurs",
20654
20845
  "input.file.dropFileLabel": "ou glissez-le ici",
20655
20846
  "input.file.orInputUrl": "ou créez un lien vers une ressource externe",
20656
20847
  "input.file.selectFileLabel": "Sélectionnez un fichier ({sizeMB} Mo max.)",
@@ -20665,20 +20856,32 @@ var fr = {
20665
20856
  "input.image.uploadErrorLabel": "L'image n'a pas pu être chargée",
20666
20857
  "input.image.uploadProgressCancel": "Annuler",
20667
20858
  "input.image.uploadProgressLabel": "Chargement en cours...",
20859
+ "language.ar": "Arabe",
20860
+ "language.az": "Azéri",
20668
20861
  "language.ca": "Catalan",
20669
20862
  "language.cs": "Tchèque",
20863
+ "language.cy": "Gallois",
20864
+ "language.da": "Danois",
20670
20865
  "language.de": "Allemand",
20671
20866
  "language.en": "Anglais",
20672
20867
  "language.es": "Espagnol",
20673
20868
  "language.fi": "Finnois",
20674
20869
  "language.fr": "Français",
20870
+ "language.hy": "Arménien",
20675
20871
  "language.is": "Islandais",
20676
20872
  "language.it": "Italien",
20873
+ "language.ka": "Géorgien",
20677
20874
  "language.ko": "Coréen",
20678
20875
  "language.nl": "Néerlandais",
20876
+ "language.no": "Norvégien",
20877
+ "language.pl": "Polonais",
20679
20878
  "language.pt": "Portugais",
20879
+ "language.rm": "Romanche",
20680
20880
  "language.ru": "Russe",
20681
20881
  "language.sk": "Slovaque",
20882
+ "language.sv": "Suédois",
20883
+ "language.tr": "Turque",
20884
+ "language.uk": "Ukrainien",
20682
20885
  "language.zh": "Chinois",
20683
20886
  "map.add.layer": "Ajouter une couche",
20684
20887
  "map.add.layer.catalog": "Du catalogue",
@@ -20725,6 +20928,7 @@ var fr = {
20725
20928
  "record.action.duplicate": "Dupliquer",
20726
20929
  "record.action.duplicating": "Duplication...",
20727
20930
  "record.action.rollback": "Restaurer",
20931
+ "record.action.switchLang": "Marquer par défaut",
20728
20932
  "record.action.view": "Voir",
20729
20933
  "record.card.metadata.contact": "Contact de la métadonnée ",
20730
20934
  "record.externalViewer.open": "Ouvrir dans le visualiseur externe",
@@ -20775,9 +20979,15 @@ var fr = {
20775
20979
  "record.metadata.download": "Téléchargements",
20776
20980
  "record.metadata.feature.catalog": "Catalogue d'attributs",
20777
20981
  "record.metadata.formats": "Formats",
20982
+ "record.metadata.isGeographical": "Donnée géographique",
20778
20983
  "record.metadata.keywords": "Mots-clés",
20779
20984
  "record.metadata.languages": "Langues",
20780
20985
  "record.metadata.lastUpdate": "Mis à jour le {date}",
20986
+ "record.metadata.linked.datasets": "Jeux de données associés",
20987
+ "record.metadata.linked.records": "Contenus associés",
20988
+ "record.metadata.linked.reuses": "Réutilisations associées",
20989
+ "record.metadata.linked.services": "Services associés",
20990
+ "record.metadata.linked.sourceDatasets": "Jeux de données sources",
20781
20991
  "record.metadata.links": "Liens",
20782
20992
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
20783
20993
  "record.metadata.otherConstraints": "Limitations d'usage",
@@ -20787,6 +20997,8 @@ var fr = {
20787
20997
  "record.metadata.publication": "Date de publication",
20788
20998
  "record.metadata.publications": "{count, plural, =0{donnée} one{donnée} other{données}}",
20789
20999
  "record.metadata.quality": "Qualité des métadonnées",
21000
+ "record.metadata.quality.capabilities.failed": "Aucune URL de Capabilities n'est renseignée",
21001
+ "record.metadata.quality.capabilities.success": "Une URL de Capabilities est renseignée",
20790
21002
  "record.metadata.quality.contact.failed": "Le contact n'est pas renseigné",
20791
21003
  "record.metadata.quality.contact.success": "Le contact est renseigné",
20792
21004
  "record.metadata.quality.description.failed": "La description n'est pas renseignée",
@@ -20798,14 +21010,15 @@ var fr = {
20798
21010
  "record.metadata.quality.legalConstraints.success": "Les contraintes légales sont renseignées",
20799
21011
  "record.metadata.quality.organisation.failed": "Le producteur n'est pas renseigné",
20800
21012
  "record.metadata.quality.organisation.success": "Le producteur est renseigné",
21013
+ "record.metadata.quality.source.failed": "Aucun jeu de données source n'est renseigné",
21014
+ "record.metadata.quality.source.success": "Un jeu de données source est renseigné",
20801
21015
  "record.metadata.quality.title.failed": "Le titre n'est pas renseigné",
20802
21016
  "record.metadata.quality.title.success": "Le titre est renseigné",
20803
21017
  "record.metadata.quality.topic.failed": "Le thème n'est pas renseigné",
20804
21018
  "record.metadata.quality.topic.success": "Le thème est renseigné",
20805
21019
  "record.metadata.quality.updateFrequency.failed": "La fréquence de mise à jour n'est pas renseignée",
20806
21020
  "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é",
21021
+ "record.metadata.related": "Explorez le catalogue",
20809
21022
  "record.metadata.ressources.and.links": "Ressources et liens",
20810
21023
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
20811
21024
  "record.metadata.status": "Statut",
@@ -20817,7 +21030,6 @@ var fr = {
20817
21030
  "record.metadata.temporalExtent.untilDate": "Jusqu'au { end }",
20818
21031
  "record.metadata.title": "Intitulé",
20819
21032
  "record.metadata.topics": "Catégories",
20820
- "record.metadata.isGeographical": "Donnée géographique",
20821
21033
  "record.metadata.uniqueId": "Identificateur de ressource unique",
20822
21034
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
20823
21035
  "record.metadata.updatedOn": "Modifié le",
@@ -20937,7 +21149,6 @@ var fr = {
20937
21149
  "tooltip.html.copy": "Copier le HTML",
20938
21150
  "tooltip.id.copy": "Copier l'identifiant unique",
20939
21151
  "tooltip.url.copy": "Copier l'URL",
20940
- "tooltip.url.open": "Ouvrir l'URL",
20941
21152
  "ui.readLess": "Réduire",
20942
21153
  "ui.readMore": "Lire la suite",
20943
21154
  "wfs.feature.limit": "Trop d'objets pour afficher la couche WFS !",
@@ -20984,6 +21195,7 @@ var it = {
20984
21195
  "dashboard.labels.mySpace": "Il mio spazio",
20985
21196
  "dashboard.records.all": "Catalogo",
20986
21197
  "dashboard.records.hasDraft": "Bozza",
21198
+ "dashboard.records.isMultilingual": "Questo record è multilingue ({languages})",
20987
21199
  "dashboard.records.myDraft": "Le mie bozze",
20988
21200
  "dashboard.records.myRecords": "I miei dati",
20989
21201
  "dashboard.records.search": "Risultati per \"{searchText}\"",
@@ -21161,6 +21373,10 @@ var it = {
21161
21373
  "editor.record.form.multilingual.enable": "Aprire il pannello multilingue",
21162
21374
  "editor.record.form.multilingual.open": "Modalità multilingue",
21163
21375
  "editor.record.form.multilingual.title": "Traduzioni",
21376
+ "editor.record.form.multilingual.activate": "",
21377
+ "editor.record.form.multilingual.default": "",
21378
+ "editor.record.form.multilingual.forbidden": "",
21379
+ "editor.record.form.multilingual.validate": "",
21164
21380
  "editor.record.form.page.accessAndContact": "Informazioni per l'uso",
21165
21381
  "editor.record.form.page.description": "Descrizione del dataset",
21166
21382
  "editor.record.form.page.resources": "Risorse",
@@ -21190,8 +21406,13 @@ var it = {
21190
21406
  "editor.record.loadError.body": "Impossibile caricare il dataset:",
21191
21407
  "editor.record.loadError.closeMessage": "Capito",
21192
21408
  "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",
21409
+ "editor.record.lock.harvested": "",
21410
+ "editor.record.lock.owner": "Non è un editore di uno dei gruppi autorizzati",
21411
+ "editor.record.lock.resourceType": "I record con il formato 'servizio' o 'riutilizzo' non sono modificabili",
21412
+ "editor.record.multilingual.confirmation.cancelText": "",
21413
+ "editor.record.multilingual.confirmation.confirmText": "",
21414
+ "editor.record.multilingual.confirmation.message": "",
21415
+ "editor.record.multilingual.confirmation.title": "",
21195
21416
  "editor.record.onlineResource.protocol.other": "Altro",
21196
21417
  "editor.record.onlineResourceError.body": "Ha successo un'errore durante l'aggiunta della risorsa:",
21197
21418
  "editor.record.onlineResourceError.closeMessage": "Capito",
@@ -21238,6 +21459,11 @@ var it = {
21238
21459
  "facets.block.title.tag.default": "Tag",
21239
21460
  "facets.block.title.th_regions_tree.default": "Regioni",
21240
21461
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Login</a> per accedere a questa funzionalità</div>",
21462
+ "feature.catalog.attribute.code": "Codice",
21463
+ "feature.catalog.attribute.definition": "Descrizione",
21464
+ "feature.catalog.attribute.name": "Nome",
21465
+ "feature.catalog.attribute.type": "Tipo",
21466
+ "feature.catalog.attribute.values": "Valori",
21241
21467
  "input.file.dropFileLabel": "oppure trascinalo qui",
21242
21468
  "input.file.orInputUrl": "o collegamento a una risorsa esterna",
21243
21469
  "input.file.selectFileLabel": "Seleziona un file ({sizeMB} MB max.)",
@@ -21252,20 +21478,32 @@ var it = {
21252
21478
  "input.image.uploadErrorLabel": "Impossibile caricare l'immagine",
21253
21479
  "input.image.uploadProgressCancel": "Annulla",
21254
21480
  "input.image.uploadProgressLabel": "Caricamento...",
21481
+ "language.ar": "",
21482
+ "language.az": "",
21255
21483
  "language.ca": "Catalano",
21256
21484
  "language.cs": "Ceco",
21485
+ "language.cy": "",
21486
+ "language.da": "",
21257
21487
  "language.de": "Tedesco",
21258
21488
  "language.en": "Inglese",
21259
21489
  "language.es": "Spagnolo",
21260
21490
  "language.fi": "Finlandese",
21261
21491
  "language.fr": "Francese",
21492
+ "language.hy": "",
21262
21493
  "language.is": "Islandese",
21263
21494
  "language.it": "Italiano",
21495
+ "language.ka": "",
21264
21496
  "language.ko": "Coreano",
21265
21497
  "language.nl": "Olandese",
21498
+ "language.no": "",
21499
+ "language.pl": "",
21266
21500
  "language.pt": "Portoghese",
21501
+ "language.rm": "",
21267
21502
  "language.ru": "Russo",
21268
21503
  "language.sk": "Slovacco",
21504
+ "language.sv": "",
21505
+ "language.tr": "",
21506
+ "language.uk": "",
21269
21507
  "language.zh": "Cinese",
21270
21508
  "map.add.layer": "Aggiungere un layer",
21271
21509
  "map.add.layer.catalog": "Dal catalogo",
@@ -21312,6 +21550,7 @@ var it = {
21312
21550
  "record.action.duplicate": "Duplicato",
21313
21551
  "record.action.duplicating": "Duplicazione",
21314
21552
  "record.action.rollback": "Annulla",
21553
+ "record.action.switchLang": "",
21315
21554
  "record.action.view": "Visualizza",
21316
21555
  "record.card.metadata.contact": "Contatto del metadata",
21317
21556
  "record.externalViewer.open": "Aprire nel visualizzatore esterno",
@@ -21362,9 +21601,15 @@ var it = {
21362
21601
  "record.metadata.download": "Download",
21363
21602
  "record.metadata.feature.catalog": "Catalogo dei oggetti",
21364
21603
  "record.metadata.formats": "Formati",
21604
+ "record.metadata.isGeographical": "Dati geografici",
21365
21605
  "record.metadata.keywords": "Parole chiave",
21366
21606
  "record.metadata.languages": "Lingue",
21367
21607
  "record.metadata.lastUpdate": "Ultimo aggiornamento il {date}",
21608
+ "record.metadata.linked.datasets": "",
21609
+ "record.metadata.linked.records": "",
21610
+ "record.metadata.linked.reuses": "",
21611
+ "record.metadata.linked.services": "",
21612
+ "record.metadata.linked.sourceDatasets": "",
21368
21613
  "record.metadata.links": "Collegamenti",
21369
21614
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
21370
21615
  "record.metadata.otherConstraints": "Limitazioni di uso",
@@ -21374,6 +21619,8 @@ var it = {
21374
21619
  "record.metadata.publication": "Data di pubblicazione",
21375
21620
  "record.metadata.publications": "{count, plural, =0{pubblicazione} one{pubblicazione} other{pubblicazioni}}",
21376
21621
  "record.metadata.quality": "Qualità dei metadati",
21622
+ "record.metadata.quality.capabilities.failed": "",
21623
+ "record.metadata.quality.capabilities.success": "",
21377
21624
  "record.metadata.quality.contact.failed": "Il contatto non è specificato",
21378
21625
  "record.metadata.quality.contact.success": "Il contatto è specificato",
21379
21626
  "record.metadata.quality.description.failed": "La descrizione non è specificata",
@@ -21385,6 +21632,8 @@ var it = {
21385
21632
  "record.metadata.quality.legalConstraints.success": "I vincoli legali sono specificate",
21386
21633
  "record.metadata.quality.organisation.failed": "Il produttore non è specificato",
21387
21634
  "record.metadata.quality.organisation.success": "Il produttore è specificato",
21635
+ "record.metadata.quality.source.failed": "",
21636
+ "record.metadata.quality.source.success": "",
21388
21637
  "record.metadata.quality.title.failed": "Il titolo non è specificato",
21389
21638
  "record.metadata.quality.title.success": "Il titolo è specificato",
21390
21639
  "record.metadata.quality.topic.failed": "Il tema non è specificato",
@@ -21392,7 +21641,6 @@ var it = {
21392
21641
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
21393
21642
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
21394
21643
  "record.metadata.related": "Vedi anche",
21395
- "record.metadata.related.contents": "Contenuti correlati",
21396
21644
  "record.metadata.ressources.and.links": "Risorse e collegamenti",
21397
21645
  "record.metadata.sheet": "Origine del metadata",
21398
21646
  "record.metadata.status": "Stato",
@@ -21404,7 +21652,6 @@ var it = {
21404
21652
  "record.metadata.temporalExtent.untilDate": "Fino a {end}",
21405
21653
  "record.metadata.title": "Titolo",
21406
21654
  "record.metadata.topics": "Categorie",
21407
- "record.metadata.isGeographical": "Dati geografici",
21408
21655
  "record.metadata.uniqueId": "Identificatore unico di risorsa",
21409
21656
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
21410
21657
  "record.metadata.updatedOn": "Modificato il",
@@ -21524,7 +21771,6 @@ var it = {
21524
21771
  "tooltip.html.copy": "Copiare il HTML",
21525
21772
  "tooltip.id.copy": "Copiare l'identificatore unico",
21526
21773
  "tooltip.url.copy": "Copiare l'URL",
21527
- "tooltip.url.open": "Aprire l'URL",
21528
21774
  "ui.readLess": "Ridurre",
21529
21775
  "ui.readMore": "Leggere di più",
21530
21776
  "wfs.feature.limit": "Troppi oggetti per visualizzare il WFS layer!",
@@ -21571,6 +21817,7 @@ var nl = {
21571
21817
  "dashboard.labels.mySpace": "Mijn ruimte",
21572
21818
  "dashboard.records.all": "Catalogus",
21573
21819
  "dashboard.records.hasDraft": "",
21820
+ "dashboard.records.isMultilingual": "Dit record is meertalig ({languages})",
21574
21821
  "dashboard.records.myDraft": "Mijn concepten",
21575
21822
  "dashboard.records.myRecords": "Mijn Records",
21576
21823
  "dashboard.records.search": "Zoeken naar \"{searchText}\"",
@@ -21745,9 +21992,13 @@ var nl = {
21745
21992
  "editor.record.form.license.odc-by": "",
21746
21993
  "editor.record.form.license.pddl": "",
21747
21994
  "editor.record.form.license.unknown": "",
21995
+ "editor.record.form.multilingual.activate": "",
21996
+ "editor.record.form.multilingual.default": "",
21748
21997
  "editor.record.form.multilingual.enable": "",
21998
+ "editor.record.form.multilingual.forbidden": "",
21749
21999
  "editor.record.form.multilingual.open": "",
21750
22000
  "editor.record.form.multilingual.title": "",
22001
+ "editor.record.form.multilingual.validate": "",
21751
22002
  "editor.record.form.page.accessAndContact": "",
21752
22003
  "editor.record.form.page.description": "",
21753
22004
  "editor.record.form.page.resources": "",
@@ -21777,8 +22028,13 @@ var nl = {
21777
22028
  "editor.record.loadError.body": "",
21778
22029
  "editor.record.loadError.closeMessage": "",
21779
22030
  "editor.record.loadError.title": "",
21780
- "editor.record.lock.format": "",
21781
- "editor.record.lock.reason": "",
22031
+ "editor.record.lock.harvested": "",
22032
+ "editor.record.lock.owner": "",
22033
+ "editor.record.lock.resourceType": "",
22034
+ "editor.record.multilingual.confirmation.cancelText": "",
22035
+ "editor.record.multilingual.confirmation.confirmText": "",
22036
+ "editor.record.multilingual.confirmation.message": "",
22037
+ "editor.record.multilingual.confirmation.title": "",
21782
22038
  "editor.record.onlineResource.protocol.other": "",
21783
22039
  "editor.record.onlineResourceError.body": "",
21784
22040
  "editor.record.onlineResourceError.closeMessage": "",
@@ -21825,6 +22081,11 @@ var nl = {
21825
22081
  "facets.block.title.tag.default": "",
21826
22082
  "facets.block.title.th_regions_tree.default": "",
21827
22083
  "favorite.not.authenticated.tooltip": "",
22084
+ "feature.catalog.attribute.code": "Code",
22085
+ "feature.catalog.attribute.definition": "Beschrijving",
22086
+ "feature.catalog.attribute.name": "Naam",
22087
+ "feature.catalog.attribute.type": "Type",
22088
+ "feature.catalog.attribute.values": "Waarden",
21828
22089
  "input.file.dropFileLabel": "",
21829
22090
  "input.file.orInputUrl": "",
21830
22091
  "input.file.selectFileLabel": "",
@@ -21839,20 +22100,32 @@ var nl = {
21839
22100
  "input.image.uploadErrorLabel": "",
21840
22101
  "input.image.uploadProgressCancel": "",
21841
22102
  "input.image.uploadProgressLabel": "",
22103
+ "language.ar": "",
22104
+ "language.az": "",
21842
22105
  "language.ca": "Catalaans",
21843
22106
  "language.cs": "Tsjechisch",
22107
+ "language.cy": "",
22108
+ "language.da": "",
21844
22109
  "language.de": "Duits",
21845
22110
  "language.en": "Engels",
21846
22111
  "language.es": "Spaans",
21847
22112
  "language.fi": "Fins",
21848
22113
  "language.fr": "Frans",
22114
+ "language.hy": "",
21849
22115
  "language.is": "IJslands",
21850
22116
  "language.it": "Italiaans",
22117
+ "language.ka": "",
21851
22118
  "language.ko": "Koreaans",
21852
22119
  "language.nl": "Nederlands",
22120
+ "language.no": "",
22121
+ "language.pl": "",
21853
22122
  "language.pt": "Portugees",
22123
+ "language.rm": "",
21854
22124
  "language.ru": "Russisch",
21855
22125
  "language.sk": "Slowaaks",
22126
+ "language.sv": "",
22127
+ "language.tr": "",
22128
+ "language.uk": "",
21856
22129
  "language.zh": "Chinees",
21857
22130
  "map.add.layer": "",
21858
22131
  "map.add.layer.catalog": "",
@@ -21899,6 +22172,7 @@ var nl = {
21899
22172
  "record.action.duplicate": "",
21900
22173
  "record.action.duplicating": "",
21901
22174
  "record.action.rollback": "",
22175
+ "record.action.switchLang": "",
21902
22176
  "record.action.view": "",
21903
22177
  "record.card.metadata.contact": "",
21904
22178
  "record.externalViewer.open": "",
@@ -21949,9 +22223,15 @@ var nl = {
21949
22223
  "record.metadata.download": "",
21950
22224
  "record.metadata.feature.catalog": "",
21951
22225
  "record.metadata.formats": "",
22226
+ "record.metadata.isGeographical": "",
21952
22227
  "record.metadata.keywords": "",
21953
22228
  "record.metadata.languages": "",
21954
22229
  "record.metadata.lastUpdate": "",
22230
+ "record.metadata.linked.datasets": "",
22231
+ "record.metadata.linked.records": "",
22232
+ "record.metadata.linked.reuses": "",
22233
+ "record.metadata.linked.services": "",
22234
+ "record.metadata.linked.sourceDatasets": "",
21955
22235
  "record.metadata.links": "",
21956
22236
  "record.metadata.noUsage": "",
21957
22237
  "record.metadata.otherConstraints": "",
@@ -21961,6 +22241,8 @@ var nl = {
21961
22241
  "record.metadata.publication": "",
21962
22242
  "record.metadata.publications": "{count, plural, =0{} one{} other{}}",
21963
22243
  "record.metadata.quality": "",
22244
+ "record.metadata.quality.capabilities.failed": "",
22245
+ "record.metadata.quality.capabilities.success": "",
21964
22246
  "record.metadata.quality.contact.failed": "",
21965
22247
  "record.metadata.quality.contact.success": "",
21966
22248
  "record.metadata.quality.description.failed": "",
@@ -21972,6 +22254,8 @@ var nl = {
21972
22254
  "record.metadata.quality.legalConstraints.success": "",
21973
22255
  "record.metadata.quality.organisation.failed": "",
21974
22256
  "record.metadata.quality.organisation.success": "",
22257
+ "record.metadata.quality.source.failed": "",
22258
+ "record.metadata.quality.source.success": "",
21975
22259
  "record.metadata.quality.title.failed": "",
21976
22260
  "record.metadata.quality.title.success": "",
21977
22261
  "record.metadata.quality.topic.failed": "",
@@ -21979,7 +22263,6 @@ var nl = {
21979
22263
  "record.metadata.quality.updateFrequency.failed": "",
21980
22264
  "record.metadata.quality.updateFrequency.success": "",
21981
22265
  "record.metadata.related": "",
21982
- "record.metadata.related.contents": "",
21983
22266
  "record.metadata.ressources.and.links": "Bronnen en links",
21984
22267
  "record.metadata.sheet": "",
21985
22268
  "record.metadata.status": "",
@@ -21991,7 +22274,6 @@ var nl = {
21991
22274
  "record.metadata.temporalExtent.untilDate": "",
21992
22275
  "record.metadata.title": "",
21993
22276
  "record.metadata.topics": "",
21994
- "record.metadata.isGeographical": "",
21995
22277
  "record.metadata.uniqueId": "",
21996
22278
  "record.metadata.updateFrequency": "",
21997
22279
  "record.metadata.updatedOn": "",
@@ -22111,7 +22393,6 @@ var nl = {
22111
22393
  "tooltip.html.copy": "",
22112
22394
  "tooltip.id.copy": "",
22113
22395
  "tooltip.url.copy": "",
22114
- "tooltip.url.open": "",
22115
22396
  "ui.readLess": "",
22116
22397
  "ui.readMore": "",
22117
22398
  "wfs.feature.limit": "",
@@ -22158,6 +22439,7 @@ var pt = {
22158
22439
  "dashboard.labels.mySpace": "Meu espaço",
22159
22440
  "dashboard.records.all": "Catálogo",
22160
22441
  "dashboard.records.hasDraft": "",
22442
+ "dashboard.records.isMultilingual": "Este registro é multilíngue ({languages})",
22161
22443
  "dashboard.records.myDraft": "Meus rascunhos",
22162
22444
  "dashboard.records.myRecords": "Meus Registros",
22163
22445
  "dashboard.records.search": "Buscar por \"{searchText}\"",
@@ -22332,9 +22614,13 @@ var pt = {
22332
22614
  "editor.record.form.license.odc-by": "",
22333
22615
  "editor.record.form.license.pddl": "",
22334
22616
  "editor.record.form.license.unknown": "",
22617
+ "editor.record.form.multilingual.activate": "",
22618
+ "editor.record.form.multilingual.default": "",
22335
22619
  "editor.record.form.multilingual.enable": "",
22620
+ "editor.record.form.multilingual.forbidden": "",
22336
22621
  "editor.record.form.multilingual.open": "",
22337
22622
  "editor.record.form.multilingual.title": "",
22623
+ "editor.record.form.multilingual.validate": "",
22338
22624
  "editor.record.form.page.accessAndContact": "",
22339
22625
  "editor.record.form.page.description": "",
22340
22626
  "editor.record.form.page.resources": "",
@@ -22364,8 +22650,13 @@ var pt = {
22364
22650
  "editor.record.loadError.body": "",
22365
22651
  "editor.record.loadError.closeMessage": "",
22366
22652
  "editor.record.loadError.title": "",
22367
- "editor.record.lock.format": "",
22368
- "editor.record.lock.reason": "",
22653
+ "editor.record.lock.harvested": "",
22654
+ "editor.record.lock.owner": "",
22655
+ "editor.record.lock.resourceType": "",
22656
+ "editor.record.multilingual.confirmation.cancelText": "",
22657
+ "editor.record.multilingual.confirmation.confirmText": "",
22658
+ "editor.record.multilingual.confirmation.message": "",
22659
+ "editor.record.multilingual.confirmation.title": "",
22369
22660
  "editor.record.onlineResource.protocol.other": "",
22370
22661
  "editor.record.onlineResourceError.body": "",
22371
22662
  "editor.record.onlineResourceError.closeMessage": "",
@@ -22412,6 +22703,11 @@ var pt = {
22412
22703
  "facets.block.title.tag.default": "",
22413
22704
  "facets.block.title.th_regions_tree.default": "",
22414
22705
  "favorite.not.authenticated.tooltip": "",
22706
+ "feature.catalog.attribute.code": "Código",
22707
+ "feature.catalog.attribute.definition": "Descrição",
22708
+ "feature.catalog.attribute.name": "Nome",
22709
+ "feature.catalog.attribute.type": "Tipo",
22710
+ "feature.catalog.attribute.values": "Valores",
22415
22711
  "input.file.dropFileLabel": "",
22416
22712
  "input.file.orInputUrl": "",
22417
22713
  "input.file.selectFileLabel": "",
@@ -22426,20 +22722,32 @@ var pt = {
22426
22722
  "input.image.uploadErrorLabel": "",
22427
22723
  "input.image.uploadProgressCancel": "",
22428
22724
  "input.image.uploadProgressLabel": "",
22725
+ "language.ar": "",
22726
+ "language.az": "",
22429
22727
  "language.ca": "Catalão",
22430
22728
  "language.cs": "Tcheco",
22729
+ "language.cy": "",
22730
+ "language.da": "",
22431
22731
  "language.de": "Alemão",
22432
22732
  "language.en": "Inglês",
22433
22733
  "language.es": "Espanhol",
22434
22734
  "language.fi": "Finlandês",
22435
22735
  "language.fr": "Francês",
22736
+ "language.hy": "",
22436
22737
  "language.is": "Islandês",
22437
22738
  "language.it": "Italiano",
22739
+ "language.ka": "",
22438
22740
  "language.ko": "Coreano",
22439
22741
  "language.nl": "Holandês",
22742
+ "language.no": "",
22743
+ "language.pl": "",
22440
22744
  "language.pt": "Português",
22745
+ "language.rm": "",
22441
22746
  "language.ru": "Russo",
22442
22747
  "language.sk": "Eslovaco",
22748
+ "language.sv": "",
22749
+ "language.tr": "",
22750
+ "language.uk": "",
22443
22751
  "language.zh": "Chinês",
22444
22752
  "map.add.layer": "",
22445
22753
  "map.add.layer.catalog": "",
@@ -22486,6 +22794,7 @@ var pt = {
22486
22794
  "record.action.duplicate": "",
22487
22795
  "record.action.duplicating": "",
22488
22796
  "record.action.rollback": "",
22797
+ "record.action.switchLang": "",
22489
22798
  "record.action.view": "",
22490
22799
  "record.card.metadata.contact": "",
22491
22800
  "record.externalViewer.open": "",
@@ -22536,9 +22845,15 @@ var pt = {
22536
22845
  "record.metadata.download": "",
22537
22846
  "record.metadata.feature.catalog": "",
22538
22847
  "record.metadata.formats": "",
22848
+ "record.metadata.isGeographical": "",
22539
22849
  "record.metadata.keywords": "",
22540
22850
  "record.metadata.languages": "",
22541
22851
  "record.metadata.lastUpdate": "",
22852
+ "record.metadata.linked.datasets": "",
22853
+ "record.metadata.linked.records": "",
22854
+ "record.metadata.linked.reuses": "",
22855
+ "record.metadata.linked.services": "",
22856
+ "record.metadata.linked.sourceDatasets": "",
22542
22857
  "record.metadata.links": "",
22543
22858
  "record.metadata.noUsage": "",
22544
22859
  "record.metadata.otherConstraints": "",
@@ -22548,6 +22863,8 @@ var pt = {
22548
22863
  "record.metadata.publication": "",
22549
22864
  "record.metadata.publications": "{count, plural, =0{} one{} other{}}",
22550
22865
  "record.metadata.quality": "",
22866
+ "record.metadata.quality.capabilities.failed": "",
22867
+ "record.metadata.quality.capabilities.success": "",
22551
22868
  "record.metadata.quality.contact.failed": "",
22552
22869
  "record.metadata.quality.contact.success": "",
22553
22870
  "record.metadata.quality.description.failed": "",
@@ -22559,6 +22876,8 @@ var pt = {
22559
22876
  "record.metadata.quality.legalConstraints.success": "",
22560
22877
  "record.metadata.quality.organisation.failed": "",
22561
22878
  "record.metadata.quality.organisation.success": "",
22879
+ "record.metadata.quality.source.failed": "",
22880
+ "record.metadata.quality.source.success": "",
22562
22881
  "record.metadata.quality.title.failed": "",
22563
22882
  "record.metadata.quality.title.success": "",
22564
22883
  "record.metadata.quality.topic.failed": "",
@@ -22566,7 +22885,6 @@ var pt = {
22566
22885
  "record.metadata.quality.updateFrequency.failed": "",
22567
22886
  "record.metadata.quality.updateFrequency.success": "",
22568
22887
  "record.metadata.related": "",
22569
- "record.metadata.related.contents": "",
22570
22888
  "record.metadata.ressources.and.links": "Recursos e links",
22571
22889
  "record.metadata.sheet": "",
22572
22890
  "record.metadata.status": "",
@@ -22578,7 +22896,6 @@ var pt = {
22578
22896
  "record.metadata.temporalExtent.untilDate": "",
22579
22897
  "record.metadata.title": "",
22580
22898
  "record.metadata.topics": "",
22581
- "record.metadata.isGeographical": "",
22582
22899
  "record.metadata.uniqueId": "",
22583
22900
  "record.metadata.updateFrequency": "",
22584
22901
  "record.metadata.updatedOn": "",
@@ -22698,7 +23015,6 @@ var pt = {
22698
23015
  "tooltip.html.copy": "",
22699
23016
  "tooltip.id.copy": "",
22700
23017
  "tooltip.url.copy": "",
22701
- "tooltip.url.open": "",
22702
23018
  "ui.readLess": "",
22703
23019
  "ui.readMore": "",
22704
23020
  "wfs.feature.limit": "",
@@ -22816,10 +23132,18 @@ class Gn4FieldMapper {
22816
23132
  const langList = getAsArray(selectField(source, 'resourceLanguage'));
22817
23133
  const languages = langList.map((lang) => LANG_3_TO_2_MAPPER[lang]);
22818
23134
  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
23135
  return {
22821
23136
  ...output,
22822
23137
  defaultLanguage,
23138
+ };
23139
+ },
23140
+ otherLanguage: (output, source) => {
23141
+ const langList = getAsArray(selectField(source, 'otherLanguage'));
23142
+ const languages = langList.map((lang) => LANG_3_TO_2_MAPPER[lang]);
23143
+ const defaultLanguage = output.defaultLanguage ?? languages[0] ?? null;
23144
+ const otherLanguages = languages.filter((lang) => lang !== defaultLanguage);
23145
+ return {
23146
+ ...output,
22823
23147
  otherLanguages,
22824
23148
  };
22825
23149
  },
@@ -22893,13 +23217,40 @@ class Gn4FieldMapper {
22893
23217
  related: (output, source) => {
22894
23218
  const fcatSource = selectField(getFirstValue(selectField(selectField(source, 'related'), 'fcats')) ?? {}, '_source');
22895
23219
  const featureCatalogIdentifier = selectField(fcatSource, 'uuid');
22896
- return featureCatalogIdentifier
22897
- ? this.addExtra({ featureCatalogIdentifier }, output)
23220
+ const sourceOfLinks = getAsArray(selectField(selectField(source, 'related'), 'hassources'));
23221
+ const sourceOfIdentifiers = sourceOfLinks
23222
+ .filter((link) => link['origin'] === 'catalog')
23223
+ .map((link) => {
23224
+ return selectField(selectField(link, '_source'), 'uuid');
23225
+ });
23226
+ const extraValues = {};
23227
+ if (featureCatalogIdentifier) {
23228
+ extraValues.featureCatalogIdentifier = featureCatalogIdentifier;
23229
+ }
23230
+ if (sourceOfIdentifiers && sourceOfIdentifiers.length > 0) {
23231
+ extraValues.sourceOfIdentifiers = sourceOfIdentifiers;
23232
+ }
23233
+ return Object.keys(extraValues).length > 0
23234
+ ? this.addExtra(extraValues, output)
23235
+ : output;
23236
+ },
23237
+ recordLink: (output, source) => {
23238
+ const recordLinks = getAsArray(selectField(source, 'recordLink'));
23239
+ const sourcesIdentifiers = recordLinks
23240
+ .filter((link) => link['origin'] === 'catalog' && link['type'] === 'sources')
23241
+ .map((link) => selectField(link, 'to'));
23242
+ return sourcesIdentifiers && sourcesIdentifiers.length > 0
23243
+ ? this.addExtra({
23244
+ sourcesIdentifiers,
23245
+ }, output)
22898
23246
  : output;
22899
23247
  },
22900
23248
  isPublishedToAll: (output, source) => this.addExtra({
22901
23249
  isPublishedToAll: selectField(source, 'isPublishedToAll'),
22902
23250
  }, output),
23251
+ isHarvested: (output, source) => this.addExtra({
23252
+ isHarvested: selectField(source, 'isHarvested') !== 'false',
23253
+ }, output),
22903
23254
  edit: (output, source) => this.addExtra({
22904
23255
  edit: selectField(source, 'edit'),
22905
23256
  }, output),
@@ -23189,6 +23540,7 @@ const ES_SOURCE_SUMMARY = [
23189
23540
  'cl_maintenanceAndUpdateFrequency',
23190
23541
  'tag',
23191
23542
  'MD_LegalConstraintsUseLimitationObject',
23543
+ 'MD_LegalConstraintsOtherConstraintsObject',
23192
23544
  'qualityScore',
23193
23545
  ];
23194
23546
  const ES_QUERY_FIELDS_PRIORITY = {
@@ -23280,11 +23632,11 @@ class ElasticsearchService {
23280
23632
  registerRuntimeField(fieldName, expression) {
23281
23633
  this.runtimeFields[fieldName] = expression;
23282
23634
  }
23283
- getMetadataByIdPayload(uuid) {
23635
+ getMetadataByIdsPayload(uuids) {
23284
23636
  return {
23285
23637
  query: {
23286
23638
  ids: {
23287
- values: [uuid],
23639
+ values: uuids,
23288
23640
  },
23289
23641
  },
23290
23642
  };
@@ -23712,16 +24064,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
23712
24064
  args: [METADATA_LANGUAGE]
23713
24065
  }] }] });
23714
24066
 
24067
+ class Gn4SettingsService {
24068
+ constructor(siteApiService) {
24069
+ this.siteApiService = siteApiService;
24070
+ this.identicon$ = this.getSettingsSetValueByKey('system/users/identicon');
24071
+ this.allowEditHarvested$ = this.getSettingsSetValueByKey('system/harvester/enableEditing');
24072
+ }
24073
+ getSettingsSetValueByKey(key) {
24074
+ return this.siteApiService.getSettingsSet(null, [key]).pipe(map$1((v) => v[key]), shareReplay({ bufferSize: 1, refCount: true }));
24075
+ }
24076
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, deps: [{ token: SiteApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
24077
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, providedIn: 'root' }); }
24078
+ }
24079
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, decorators: [{
24080
+ type: Injectable,
24081
+ args: [{
24082
+ providedIn: 'root',
24083
+ }]
24084
+ }], ctorParameters: () => [{ type: SiteApiService }] });
24085
+
23715
24086
  const minPublicationApiVersion = '4.2.5';
23716
24087
  const TEMPORARY_ID_PREFIX = 'TEMP-ID-';
23717
24088
  class Gn4Repository {
23718
- constructor(httpClient, gn4SearchApi, gn4SearchHelper, gn4Mapper, gn4RecordsApi, platformService) {
24089
+ constructor(httpClient, gn4SearchApi, gn4SearchHelper, gn4Mapper, gn4RecordsApi, platformService, gn4LanguagesApi, settingsService) {
23719
24090
  this.httpClient = httpClient;
23720
24091
  this.gn4SearchApi = gn4SearchApi;
23721
24092
  this.gn4SearchHelper = gn4SearchHelper;
23722
24093
  this.gn4Mapper = gn4Mapper;
23723
24094
  this.gn4RecordsApi = gn4RecordsApi;
23724
24095
  this.platformService = platformService;
24096
+ this.gn4LanguagesApi = gn4LanguagesApi;
24097
+ this.settingsService = settingsService;
23725
24098
  this._draftsChanged = new Subject();
23726
24099
  this.draftsChanged$ = this._draftsChanged.asObservable();
23727
24100
  }
@@ -23743,21 +24116,37 @@ class Gn4Repository {
23743
24116
  }
23744
24117
  getRecord(uniqueIdentifier) {
23745
24118
  return this.gn4SearchApi
23746
- .search('bucket', ['fcats'], JSON.stringify(this.gn4SearchHelper.getMetadataByIdPayload(uniqueIdentifier)))
24119
+ .search('bucket', ['fcats', 'hassources'], JSON.stringify(this.gn4SearchHelper.getMetadataByIdsPayload([uniqueIdentifier])))
23747
24120
  .pipe(map$1((results) => results.hits.hits[0]), switchMap((record) => record ? this.gn4Mapper.readRecord(record) : of(null)));
23748
24121
  }
24122
+ getMultipleRecords(uniqueIdentifiers) {
24123
+ return this.gn4SearchApi
24124
+ .search('bucket', undefined, JSON.stringify(this.gn4SearchHelper.getMetadataByIdsPayload(uniqueIdentifiers)))
24125
+ .pipe(map$1((results) => results.hits.hits), switchMap((records) => records && records.length > 0
24126
+ ? this.gn4Mapper.readRecords(records)
24127
+ : of(null)));
24128
+ }
23749
24129
  mapEmbeddedFeatureCatalog(featureTypes) {
23750
24130
  return {
23751
24131
  featureTypes: featureTypes.map((featureType) => ({
23752
24132
  name: featureType.typeName || '',
23753
24133
  definition: featureType.definition || '',
23754
24134
  attributes: Array.isArray(featureType.attributeTable)
23755
- ? featureType.attributeTable.map((attr) => ({
23756
- name: attr.name,
23757
- code: attr.code,
23758
- title: attr.definition,
23759
- type: attr.type,
23760
- }))
24135
+ ? featureType.attributeTable.map((attr) => {
24136
+ const values = attr.values
24137
+ ?.filter((v) => v.code || v.label)
24138
+ .map((v) => ({
24139
+ code: v.code,
24140
+ label: v.label,
24141
+ }));
24142
+ return {
24143
+ name: attr.name,
24144
+ code: attr.code,
24145
+ definition: attr.definition,
24146
+ type: attr.type,
24147
+ ...(values?.length > 0 ? { values } : {}),
24148
+ };
24149
+ })
23761
24150
  : [],
23762
24151
  })),
23763
24152
  };
@@ -23781,6 +24170,20 @@ class Gn4Repository {
23781
24170
  .search('bucket', null, JSON.stringify(this.gn4SearchHelper.getRelatedRecordPayload(similarTo, 3)))
23782
24171
  .pipe(switchMap((results) => this.gn4Mapper.readRecords(results.hits.hits)));
23783
24172
  }
24173
+ getSources(record) {
24174
+ const sourcesIdentifiers = record.extras?.['sourcesIdentifiers'];
24175
+ if (sourcesIdentifiers && sourcesIdentifiers.length > 0) {
24176
+ return this.getMultipleRecords(sourcesIdentifiers);
24177
+ }
24178
+ return of(null);
24179
+ }
24180
+ getSourceOf(record) {
24181
+ const sourceOfIdentifiers = record.extras?.['sourceOfIdentifiers'];
24182
+ if (sourceOfIdentifiers && sourceOfIdentifiers.length > 0) {
24183
+ return this.getMultipleRecords(sourceOfIdentifiers);
24184
+ }
24185
+ return of(null);
24186
+ }
23784
24187
  aggregate(params) {
23785
24188
  // if aggregations are empty, return an empty object right away
23786
24189
  if (Object.keys(params).length === 0)
@@ -23806,11 +24209,29 @@ class Gn4Repository {
23806
24209
  ? this.getRecord(uniqueIdentifier).pipe(map$1((record) => record.extras['isPublishedToAll']))
23807
24210
  : of(true);
23808
24211
  }
23809
- canEditRecord(uniqueIdentifier) {
23810
- return this.getRecord(uniqueIdentifier).pipe(map$1((record) => {
23811
- return record.extras['edit'];
24212
+ canDuplicate(record) {
24213
+ return record.kind === 'dataset';
24214
+ }
24215
+ canDelete(record) {
24216
+ return this.settingsService.allowEditHarvested$.pipe(map$1((allowEditHarvested) => {
24217
+ return (record.extras['edit'] &&
24218
+ (!record.extras['isHarvested'] || allowEditHarvested));
23812
24219
  }));
23813
24220
  }
24221
+ canEdit(record, allowEditHarvested) {
24222
+ return (record.kind === 'dataset' &&
24223
+ record.extras['edit'] &&
24224
+ (!record.extras['isHarvested'] || allowEditHarvested));
24225
+ }
24226
+ canEditRecord(uniqueIdentifier) {
24227
+ return combineLatest([
24228
+ this.getRecord(uniqueIdentifier),
24229
+ this.settingsService.allowEditHarvested$,
24230
+ ]).pipe(map$1(([record, allowEditHarvested]) => record ? this.canEdit(record, allowEditHarvested) : false));
24231
+ }
24232
+ canEditIndexedRecord(record) {
24233
+ return this.settingsService.allowEditHarvested$.pipe(map$1((allowEditHarvested) => this.canEdit(record, allowEditHarvested)));
24234
+ }
23814
24235
  openRecordForEdition(uniqueIdentifier) {
23815
24236
  const draft$ = of(this.getRecordFromLocalStorage(uniqueIdentifier));
23816
24237
  const recordAsXml$ = this.getRecordAsXml(uniqueIdentifier);
@@ -23925,6 +24346,13 @@ class Gn4Repository {
23925
24346
  }));
23926
24347
  }));
23927
24348
  }
24349
+ getApplicationLanguages() {
24350
+ return this.gn4LanguagesApi
24351
+ .getApplicationLanguages()
24352
+ .pipe(map$1((languages) => languages
24353
+ .map((lang) => LANG_3_TO_2_MAPPER[lang.id ?? ''])
24354
+ .filter((code) => !!code)));
24355
+ }
23928
24356
  getRecordAsXml(uniqueIdentifier) {
23929
24357
  return this.gn4RecordsApi
23930
24358
  .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 +24393,12 @@ class Gn4Repository {
23965
24393
  removeRecordFromLocalStorage(recordId) {
23966
24394
  window.localStorage.removeItem(this.getLocalStorageKeyForRecord(recordId));
23967
24395
  }
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 }); }
24396
+ 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
24397
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4Repository }); }
23970
24398
  }
23971
24399
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4Repository, decorators: [{
23972
24400
  type: Injectable
23973
- }], ctorParameters: () => [{ type: i1.HttpClient }, { type: SearchApiService }, { type: ElasticsearchService }, { type: Gn4Converter }, { type: RecordsApiService }, { type: PlatformServiceInterface }] });
24401
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: SearchApiService }, { type: ElasticsearchService }, { type: Gn4Converter }, { type: RecordsApiService }, { type: PlatformServiceInterface }, { type: LanguagesApiService }, { type: Gn4SettingsService }] });
23974
24402
 
23975
24403
  const IMAGE_URL$1 = '/geonetwork/images/harvesting/';
23976
24404
  class OrganizationsFromMetadataService {
@@ -24249,24 +24677,6 @@ const ORGANIZATIONS_STRATEGY = new InjectionToken('organizations-strategy', {
24249
24677
  factory: () => 'metadata',
24250
24678
  });
24251
24679
 
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
24680
  const DEFAULT_GN4_LOGIN_URL = `/geonetwork/srv/\${lang3}/catalog.signin?redirect=\${current_url}`;
24271
24681
  const LOGIN_URL = new InjectionToken('loginUrl');
24272
24682
  const DEFAULT_GN4_LOGOUT_URL = `/geonetwork/signout`;
@@ -25388,7 +25798,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25388
25798
  }] });
25389
25799
 
25390
25800
  var name = "geonetwork-ui";
25391
- var version = "2.6.0-dev.9d3ad45e2";
25801
+ var version = "2.6.0-dev.a0bd52a21";
25392
25802
  var engines = {
25393
25803
  node: ">=20"
25394
25804
  };
@@ -25513,6 +25923,9 @@ class Gn4PlatformService {
25513
25923
  throw new Error(`Gn4 API version is not compatible.\nMinimum: ${minApiVersion}\nYour version: ${version}`);
25514
25924
  }
25515
25925
  }), shareReplay(1));
25926
+ this.allowEditHarvestedMd$ = this.settings$.pipe(map$1((info) => {
25927
+ return info['system/harvester/enableEditing'];
25928
+ }), shareReplay(1));
25516
25929
  /**
25517
25930
  * A map of already loaded thesauri (groups of keywords); the key is a URI
25518
25931
  * @private
@@ -25533,6 +25946,9 @@ class Gn4PlatformService {
25533
25946
  getApiVersion() {
25534
25947
  return this.apiVersion$;
25535
25948
  }
25949
+ getAllowEditHarvestedMd() {
25950
+ return this.allowEditHarvestedMd$;
25951
+ }
25536
25952
  getMe() {
25537
25953
  return this.me$;
25538
25954
  }
@@ -25965,422 +26381,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25965
26381
  type: Output
25966
26382
  }] } });
25967
26383
 
25968
- class ExpandablePanelButtonComponent {
25969
- constructor() {
25970
- this.collapsed = true;
25971
- }
25972
- toggle() {
25973
- this.collapsed = !this.collapsed;
25974
- }
25975
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
25976
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ExpandablePanelButtonComponent, isStandalone: true, selector: "gn-ui-expandable-panel-button", inputs: { titleTemplate: "titleTemplate", collapsed: "collapsed" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"px-4 bg-primary hover:bg-primary-darker text-white flex flex-row w-full items-center font-bold text-lg pointer-events-auto\"\n [style.height]=\"'55px'\"\n (click)=\"toggle()\"\n>\n <ng-container [ngTemplateOutlet]=\"titleTemplate\"></ng-container>\n <div class=\"ml-3 grow\"></div>\n <ng-icon *ngIf=\"collapsed\" name=\"matExpandMore\"></ng-icon>\n <ng-icon name=\"matExpandLess\" *ngIf=\"!collapsed\"></ng-icon>\n</button>\n<div\n class=\"content transition-all pointer-events-auto bg-white\"\n [style.height]=\"collapsed ? '0px' : 'calc(100% - 55px)'\"\n [ngClass]=\"collapsed ? 'overflow-hidden' : 'overflow-auto'\"\n>\n <ng-content></ng-content>\n</div>\n", styles: [":host{height:100%;position:absolute;inset:0;display:flex;flex-direction:column;justify-content:flex-end;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], viewProviders: [provideIcons({ matExpandMore, matExpandLess })], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
25977
- }
25978
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelButtonComponent, decorators: [{
25979
- type: Component,
25980
- args: [{ selector: 'gn-ui-expandable-panel-button', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, NgIcon], viewProviders: [provideIcons({ matExpandMore, matExpandLess })], standalone: true, template: "<button\n type=\"button\"\n class=\"px-4 bg-primary hover:bg-primary-darker text-white flex flex-row w-full items-center font-bold text-lg pointer-events-auto\"\n [style.height]=\"'55px'\"\n (click)=\"toggle()\"\n>\n <ng-container [ngTemplateOutlet]=\"titleTemplate\"></ng-container>\n <div class=\"ml-3 grow\"></div>\n <ng-icon *ngIf=\"collapsed\" name=\"matExpandMore\"></ng-icon>\n <ng-icon name=\"matExpandLess\" *ngIf=\"!collapsed\"></ng-icon>\n</button>\n<div\n class=\"content transition-all pointer-events-auto bg-white\"\n [style.height]=\"collapsed ? '0px' : 'calc(100% - 55px)'\"\n [ngClass]=\"collapsed ? 'overflow-hidden' : 'overflow-auto'\"\n>\n <ng-content></ng-content>\n</div>\n", styles: [":host{height:100%;position:absolute;inset:0;display:flex;flex-direction:column;justify-content:flex-end;pointer-events:none}\n"] }]
25981
- }], propDecorators: { titleTemplate: [{
25982
- type: Input
25983
- }], collapsed: [{
25984
- type: Input
25985
- }] } });
25986
-
25987
- class ExpandablePanelComponent {
25988
- constructor(changeDetector) {
25989
- this.changeDetector = changeDetector;
25990
- this.iconColor = '';
25991
- this._collapsed = true;
25992
- }
25993
- ngAfterViewInit() {
25994
- if (this.contentDiv) {
25995
- this.contentObserver = new ResizeObserver(() => {
25996
- this.changeDetector.detectChanges();
25997
- });
25998
- this.contentObserver.observe(this.contentDiv.nativeElement);
25999
- }
26000
- }
26001
- set collapsed(value) {
26002
- this._collapsed = value;
26003
- }
26004
- get collapsed() {
26005
- return this._collapsed;
26006
- }
26007
- toggle() {
26008
- this.collapsed = !this.collapsed;
26009
- }
26010
- ngOnDestroy() {
26011
- if (this.contentObserver) {
26012
- this.contentObserver.disconnect();
26013
- }
26014
- }
26015
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
26016
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ExpandablePanelComponent, isStandalone: true, selector: "gn-ui-expandable-panel", inputs: { title: "title", iconColor: "iconColor", collapsed: "collapsed" }, queries: [{ propertyName: "titleTemplate", first: true, predicate: ["titleTemplate"], descendants: true }], viewQueries: [{ propertyName: "contentDiv", first: true, predicate: ["contentDiv"], descendants: true }], ngImport: i0, template: "<div\n class=\"group flex items-center justify-between title border-b border-gray-100 cursor-pointer\"\n (click)=\"toggle()\"\n data-cy=\"expandable-panel-header\"\n>\n <div class=\"grow py-2.5\">\n <ng-container *ngIf=\"titleTemplate; else simpleTitle\">\n <div data-cy=\"expandable-panel-custom-title\">\n <ng-container *ngTemplateOutlet=\"titleTemplate\"></ng-container>\n </div>\n </ng-container>\n <ng-template #simpleTitle>\n <div\n class=\"font-medium text-black text-sm\"\n data-cy=\"expandable-panel-title\"\n >\n {{ title }}\n </div>\n </ng-template>\n </div>\n <div\n class=\"w-8 opacity-25 text-primary group-hover:opacity-100 transition-opacity flex items-center shrink-0\"\n >\n <ng-icon\n [name]=\"collapsed ? 'matAdd' : 'matRemove'\"\n [style.color]=\"iconColor\"\n ></ng-icon>\n </div>\n</div>\n<div\n class=\"content overflow-hidden transition-all duration-300\"\n [ngClass]=\"collapsed ? 'ease-out' : 'ease-in'\"\n #contentDiv\n *ngIf=\"!collapsed\"\n data-cy=\"expandable-panel-content\"\n>\n <ng-content></ng-content>\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.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], viewProviders: [provideIcons({ matAdd, matRemove })], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26017
- }
26018
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelComponent, decorators: [{
26019
- type: Component,
26020
- args: [{ selector: 'gn-ui-expandable-panel', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIcon], viewProviders: [provideIcons({ matAdd, matRemove })], template: "<div\n class=\"group flex items-center justify-between title border-b border-gray-100 cursor-pointer\"\n (click)=\"toggle()\"\n data-cy=\"expandable-panel-header\"\n>\n <div class=\"grow py-2.5\">\n <ng-container *ngIf=\"titleTemplate; else simpleTitle\">\n <div data-cy=\"expandable-panel-custom-title\">\n <ng-container *ngTemplateOutlet=\"titleTemplate\"></ng-container>\n </div>\n </ng-container>\n <ng-template #simpleTitle>\n <div\n class=\"font-medium text-black text-sm\"\n data-cy=\"expandable-panel-title\"\n >\n {{ title }}\n </div>\n </ng-template>\n </div>\n <div\n class=\"w-8 opacity-25 text-primary group-hover:opacity-100 transition-opacity flex items-center shrink-0\"\n >\n <ng-icon\n [name]=\"collapsed ? 'matAdd' : 'matRemove'\"\n [style.color]=\"iconColor\"\n ></ng-icon>\n </div>\n</div>\n<div\n class=\"content overflow-hidden transition-all duration-300\"\n [ngClass]=\"collapsed ? 'ease-out' : 'ease-in'\"\n #contentDiv\n *ngIf=\"!collapsed\"\n data-cy=\"expandable-panel-content\"\n>\n <ng-content></ng-content>\n</div>\n" }]
26021
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { title: [{
26022
- type: Input
26023
- }], iconColor: [{
26024
- type: Input
26025
- }], titleTemplate: [{
26026
- type: ContentChild,
26027
- args: ['titleTemplate']
26028
- }], contentDiv: [{
26029
- type: ViewChild,
26030
- args: ['contentDiv']
26031
- }], collapsed: [{
26032
- type: Input
26033
- }] } });
26034
-
26035
- class FormFieldWrapperComponent {
26036
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26037
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormFieldWrapperComponent, isStandalone: true, selector: "gn-ui-form-field-wrapper", inputs: { label: "label", hint: "hint" }, ngImport: i0, template: "<div class=\"h-full flex flex-col\" *ngIf=\"label; else onlyContent\">\n <div class=\"flex-none w-full flex flex-row items-center\">\n <span class=\"flex-none font-bold\" translate=\"\">{{ label }}</span>\n <div class=\"flex-1 flex justify-end items-center\">\n <ng-content select=\"[form-field-interaction]\"></ng-content>\n <span\n *ngIf=\"hint\"\n class=\"material-symbols-outlined m-2 gn-ui-icon-small\"\n [matTooltip]=\"hint\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n <div class=\"flex-1 mt-2\">\n <ng-container *ngTemplateOutlet=\"onlyContent\"> </ng-container>\n </div>\n</div>\n\n<ng-template #onlyContent>\n <ng-content></ng-content>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: CommonModule }, { 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: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26038
- }
26039
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldWrapperComponent, decorators: [{
26040
- type: Component,
26041
- args: [{ selector: 'gn-ui-form-field-wrapper', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MatTooltipModule, CommonModule, TranslateModule], template: "<div class=\"h-full flex flex-col\" *ngIf=\"label; else onlyContent\">\n <div class=\"flex-none w-full flex flex-row items-center\">\n <span class=\"flex-none font-bold\" translate=\"\">{{ label }}</span>\n <div class=\"flex-1 flex justify-end items-center\">\n <ng-content select=\"[form-field-interaction]\"></ng-content>\n <span\n *ngIf=\"hint\"\n class=\"material-symbols-outlined m-2 gn-ui-icon-small\"\n [matTooltip]=\"hint\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n <div class=\"flex-1 mt-2\">\n <ng-container *ngTemplateOutlet=\"onlyContent\"> </ng-container>\n </div>\n</div>\n\n<ng-template #onlyContent>\n <ng-content></ng-content>\n</ng-template>\n" }]
26042
- }], propDecorators: { label: [{
26043
- type: Input
26044
- }], hint: [{
26045
- type: Input
26046
- }] } });
26047
-
26048
- class MaxLinesComponent {
26049
- constructor(cdr) {
26050
- this.cdr = cdr;
26051
- this.maxLines = 6;
26052
- this.isExpanded = false;
26053
- this.maxHeight = '';
26054
- this.showToggleButton = false;
26055
- }
26056
- ngAfterViewInit() {
26057
- this.calculateMaxHeight();
26058
- this.observer = new ResizeObserver((mutations) => {
26059
- mutations.forEach(() => {
26060
- this.calculateMaxHeight();
26061
- });
26062
- });
26063
- this.observer.observe(this.container.nativeElement.children[0]);
26064
- }
26065
- toggleDisplay() {
26066
- this.isExpanded = !this.isExpanded;
26067
- this.calculateMaxHeight();
26068
- }
26069
- calculateMaxHeight() {
26070
- const containerElement = this.container.nativeElement;
26071
- const contentElement = containerElement.children[0];
26072
- const contentHeight = contentElement.getBoundingClientRect().height;
26073
- if (contentHeight) {
26074
- if (contentHeight > this.maxLines * this.getLineHeight(contentElement)) {
26075
- this.showToggleButton = true;
26076
- this.maxHeight = this.isExpanded
26077
- ? `${contentHeight}px`
26078
- : `${this.maxLines * this.getLineHeight(contentElement)}px`;
26079
- }
26080
- else {
26081
- this.showToggleButton = false;
26082
- this.maxHeight = `${contentHeight}px`;
26083
- }
26084
- containerElement.setAttribute('style', `max-height: ${this.maxHeight}; overflow: hidden`);
26085
- this.cdr.detectChanges();
26086
- }
26087
- }
26088
- getLineHeight(element) {
26089
- const computedStyle = window.getComputedStyle(element);
26090
- const lineHeight = parseFloat(computedStyle.lineHeight);
26091
- const fontSize = parseFloat(computedStyle.fontSize || '14');
26092
- const result = isNaN(lineHeight) ? fontSize * 1.2 : lineHeight; // Use a default if line height is not specified
26093
- return result;
26094
- }
26095
- ngOnDestroy() {
26096
- if (!this.observer)
26097
- return;
26098
- this.observer.unobserve(this.container.nativeElement.children[0]);
26099
- }
26100
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaxLinesComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
26101
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MaxLinesComponent, isStandalone: true, selector: "gn-ui-max-lines", inputs: { maxLines: "maxLines" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300 relative\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n <div\n *ngIf=\"showToggleButton && !isExpanded\"\n class=\"absolute inset-x-0 bottom-0 bg-gradient-to-b from-transparent to-white h-10\"\n ></div>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-primary cursor-pointer pt-2.5\"\n data-cy=\"readMoreButton\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\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.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26102
- }
26103
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaxLinesComponent, decorators: [{
26104
- type: Component,
26105
- args: [{ selector: 'gn-ui-max-lines', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, TranslateModule], template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300 relative\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n <div\n *ngIf=\"showToggleButton && !isExpanded\"\n class=\"absolute inset-x-0 bottom-0 bg-gradient-to-b from-transparent to-white h-10\"\n ></div>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-primary cursor-pointer pt-2.5\"\n data-cy=\"readMoreButton\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\n</div>\n" }]
26106
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { maxLines: [{
26107
- type: Input
26108
- }], container: [{
26109
- type: ViewChild,
26110
- args: ['container']
26111
- }] } });
26112
-
26113
- class InteractiveTableColumnComponent {
26114
- constructor() {
26115
- this.grow = false;
26116
- this.sortable = false;
26117
- this.activeSort = null;
26118
- this.sortChange = new EventEmitter();
26119
- }
26120
- handleSortChange() {
26121
- this.activeSort = this.activeSort === 'asc' ? 'desc' : 'asc';
26122
- this.sortChange.emit(this.activeSort);
26123
- }
26124
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26125
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: InteractiveTableColumnComponent, isStandalone: true, selector: "gn-ui-interactive-table-column", inputs: { grow: "grow", width: "width", sortable: "sortable", activeSort: "activeSort" }, outputs: { sortChange: "sortChange" }, queries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }, { propertyName: "cell", first: true, predicate: ["cell"], descendants: true }], ngImport: i0, template: "<span>empty</span>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26126
- }
26127
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableColumnComponent, decorators: [{
26128
- type: Component,
26129
- args: [{ selector: 'gn-ui-interactive-table-column', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span>empty</span>\n" }]
26130
- }], propDecorators: { header: [{
26131
- type: ContentChild,
26132
- args: ['header']
26133
- }], cell: [{
26134
- type: ContentChild,
26135
- args: ['cell']
26136
- }], grow: [{
26137
- type: Input
26138
- }], width: [{
26139
- type: Input
26140
- }], sortable: [{
26141
- type: Input
26142
- }], activeSort: [{
26143
- type: Input
26144
- }], sortChange: [{
26145
- type: Output
26146
- }] } });
26147
-
26148
- marker('editor.record.lock.reason');
26149
- marker('editor.record.lock.format');
26150
- class InteractiveTableComponent {
26151
- constructor() {
26152
- this.items = [];
26153
- this.isDraftPage = false;
26154
- this.itemClick = new EventEmitter();
26155
- }
26156
- get gridStyle() {
26157
- return {
26158
- 'grid-template-columns': this.columns
26159
- .map((column) => column.width
26160
- ? column.width
26161
- : column.grow
26162
- ? `minmax(0px,1fr)`
26163
- : `minmax(0px,max-content)`)
26164
- .join(' '),
26165
- };
26166
- }
26167
- 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';
26173
- }
26174
- return '';
26175
- }
26176
- handleRowClick(item) {
26177
- this.itemClick.emit(item);
26178
- }
26179
- 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 }); }
26181
- }
26182
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, decorators: [{
26183
- 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"] }]
26185
- }], propDecorators: { columns: [{
26186
- type: ContentChildren,
26187
- args: [InteractiveTableColumnComponent]
26188
- }], items: [{
26189
- type: Input
26190
- }], isDraftPage: [{
26191
- type: Input
26192
- }], itemClick: [{
26193
- type: Output
26194
- }] } });
26195
-
26196
- /**
26197
- * This component will make a block that will stay sticky on the top of the page,
26198
- * but will also shrink down to a minimum height when scrolling.
26199
- * The ratio between minimum and nominal height is stored in the shrinkRatio
26200
- * property, and can be used to change e.g. the opacity or size of child elements.
26201
- * This component renders at z-index: 50 by default.
26202
- * The first parent element with an overflow of `scroll` or `overflow` is considered
26203
- * for scroll events.
26204
- */
26205
- class StickyHeaderComponent {
26206
- constructor(changeDetector, hostEl, zone) {
26207
- this.changeDetector = changeDetector;
26208
- this.hostEl = hostEl;
26209
- this.zone = zone;
26210
- }
26211
- ngAfterViewInit() {
26212
- this.scrollSub = fromEvent(window, 'scroll', {
26213
- passive: true,
26214
- })
26215
- .pipe(throttleTime(0, animationFrameScheduler, {
26216
- leading: true,
26217
- trailing: true,
26218
- }))
26219
- .subscribe(this.updateSize.bind(this));
26220
- }
26221
- ngOnInit() {
26222
- this.placeholderEl = document.createElement('div');
26223
- this.placeholderEl.style.position = 'absolute';
26224
- this.placeholderEl.classList.add('sticky-header-placeholder');
26225
- this.hostEl.nativeElement.insertAdjacentElement('beforebegin', this.placeholderEl);
26226
- }
26227
- ngAfterViewChecked() {
26228
- this.updateSize();
26229
- }
26230
- ngOnDestroy() {
26231
- this.scrollSub.unsubscribe();
26232
- this.placeholderEl.remove();
26233
- }
26234
- updateSize() {
26235
- this.zone.runOutsideAngular(() => {
26236
- if (window.scrollY === this.parentScroll)
26237
- return;
26238
- this.parentScroll = window.scrollY;
26239
- const offsetTop = Math.max(0, this.parentScroll - this.placeholderEl.offsetTop);
26240
- const newHeightPx = Math.max(this.minHeightPx, this.fullHeightPx - offsetTop);
26241
- this.innerContainer.nativeElement.style.transform = `translate(0, ${newHeightPx - this.fullHeightPx}px)`;
26242
- this.expandRatio =
26243
- (newHeightPx - this.minHeightPx) /
26244
- (this.fullHeightPx - this.minHeightPx);
26245
- this.changeDetector.detectChanges();
26246
- });
26247
- }
26248
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickyHeaderComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef, host: true }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
26249
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StickyHeaderComponent, selector: "gn-ui-sticky-header", inputs: { minHeightPx: "minHeightPx", fullHeightPx: "fullHeightPx" }, queries: [{ propertyName: "template", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "outerContainer", first: true, predicate: ["outerContainer"], descendants: true }, { propertyName: "innerContainer", first: true, predicate: ["innerContainer"], descendants: true }], ngImport: i0, template: "<div\n #outerContainer\n class=\"sticky pointer-events-none z-50 top-0\"\n [style.height]=\"fullHeightPx + 'px'\"\n>\n <div\n #innerContainer\n class=\"relative pointer-events-auto\"\n [style.height]=\"fullHeightPx + 'px'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: expandRatio }\"\n ></ng-container>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26250
- }
26251
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickyHeaderComponent, decorators: [{
26252
- type: Component,
26253
- args: [{ selector: 'gn-ui-sticky-header', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #outerContainer\n class=\"sticky pointer-events-none z-50 top-0\"\n [style.height]=\"fullHeightPx + 'px'\"\n>\n <div\n #innerContainer\n class=\"relative pointer-events-auto\"\n [style.height]=\"fullHeightPx + 'px'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: expandRatio }\"\n ></ng-container>\n </div>\n</div>\n" }]
26254
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef, decorators: [{
26255
- type: Host
26256
- }] }, { type: i0.NgZone }], propDecorators: { minHeightPx: [{
26257
- type: Input
26258
- }], fullHeightPx: [{
26259
- type: Input
26260
- }], template: [{
26261
- type: ContentChild,
26262
- args: [TemplateRef]
26263
- }], outerContainer: [{
26264
- type: ViewChild,
26265
- args: ['outerContainer']
26266
- }], innerContainer: [{
26267
- type: ViewChild,
26268
- args: ['innerContainer']
26269
- }] } });
26270
-
26271
- class BlockListComponent {
26272
- get pages() {
26273
- return new Array(this.pagesCount).fill(0).map((_, i) => i);
26274
- }
26275
- get isFirstPage() {
26276
- return this.currentPage_ === 0;
26277
- }
26278
- get isLastPage() {
26279
- return this.currentPage_ === this.pagesCount - 1;
26280
- }
26281
- get pagesCount() {
26282
- return this.blocks ? Math.ceil(this.blocks.length / this.pageSize) : 1;
26283
- }
26284
- get currentPage() {
26285
- return this.currentPage_ + 1;
26286
- }
26287
- constructor(changeDetector) {
26288
- this.changeDetector = changeDetector;
26289
- this.pageSize = 4;
26290
- this.containerClass = '';
26291
- this.paginationContainerClass = 'w-full bottom-0 top-auto';
26292
- this.minHeight = 0;
26293
- this.listChanges = new EventEmitter();
26294
- this.subComponentSize = 'M';
26295
- this.currentPage_ = 0;
26296
- this.refreshBlocksVisibility = () => {
26297
- this.blocks.forEach((block, index) => {
26298
- block.nativeElement.style.display =
26299
- index >= this.currentPage_ * this.pageSize &&
26300
- index < (this.currentPage_ + 1) * this.pageSize
26301
- ? null
26302
- : 'none';
26303
- });
26304
- };
26305
- }
26306
- ngAfterViewInit() {
26307
- this.blocks.changes.subscribe(() => {
26308
- this.updateSizes();
26309
- this.refreshBlocksVisibility();
26310
- this.goToPage(1);
26311
- this.changeDetector.detectChanges();
26312
- this.listChanges.emit(this);
26313
- });
26314
- this.updateSizes();
26315
- this.refreshBlocksVisibility();
26316
- // we store the first height as the min-height of the list container
26317
- this.minHeight = this.blockContainer.nativeElement.clientHeight;
26318
- this.changeDetector.detectChanges();
26319
- this.listChanges.emit(this);
26320
- }
26321
- updateSizes() {
26322
- this.subComponentSize = this.computeSubComponentSize();
26323
- this.pageSize = this.computePageSize();
26324
- }
26325
- computeSubComponentSize() {
26326
- if (!this.blocks)
26327
- return 'M';
26328
- const subComponentsCount = this.blocks.length;
26329
- if (subComponentsCount <= 3)
26330
- return 'L';
26331
- if (subComponentsCount <= 12)
26332
- return 'M';
26333
- if (subComponentsCount <= 18)
26334
- return 'S';
26335
- return 'XS';
26336
- }
26337
- computePageSize() {
26338
- switch (this.subComponentSize) {
26339
- case 'L':
26340
- return 3;
26341
- case 'S':
26342
- return 6;
26343
- case 'XS':
26344
- return 8;
26345
- default:
26346
- return 4;
26347
- }
26348
- }
26349
- goToPage(pageIndex) {
26350
- this.currentPage_ = Math.max(Math.min(pageIndex - 1, this.pagesCount - 1), 0);
26351
- this.changeDetector.detectChanges();
26352
- this.refreshBlocksVisibility();
26353
- }
26354
- goToPrevPage() {
26355
- if (this.isFirstPage)
26356
- return;
26357
- this.goToPage(this.currentPage - 1);
26358
- }
26359
- goToNextPage() {
26360
- if (this.isLastPage)
26361
- return;
26362
- this.goToPage(this.currentPage + 1);
26363
- }
26364
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BlockListComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
26365
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BlockListComponent, isStandalone: true, selector: "gn-ui-block-list", inputs: { containerClass: "containerClass", paginationContainerClass: "paginationContainerClass" }, outputs: { listChanges: "listChanges" }, queries: [{ propertyName: "blocks", predicate: ["block"], read: ElementRef }], viewQueries: [{ propertyName: "blockContainer", first: true, predicate: ["blockContainer"], descendants: true }], ngImport: i0, template: "<div\n class=\"grid gap-4 w-full md:grid-cols-2\"\n #blockContainer\n [ngClass]=\"[containerClass, 'size-' + subComponentSize]\"\n [ngStyle]=\"{ minHeight: minHeight + 'px' }\"\n>\n <ng-content></ng-content>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + paginationContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host .block-list-container ::ng-deep>*{flex-shrink:0}:host{position:relative}@media screen and (min-width: 769px){.size-L{grid-template-columns:repeat(1,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-M{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-S{grid-template-columns:repeat(3,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-XS{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: PaginationDotsComponent, selector: "gn-ui-pagination-dots", inputs: ["listComponent", "containerClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26366
- }
26367
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BlockListComponent, decorators: [{
26368
- type: Component,
26369
- args: [{ selector: 'gn-ui-block-list', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, PaginationDotsComponent], template: "<div\n class=\"grid gap-4 w-full md:grid-cols-2\"\n #blockContainer\n [ngClass]=\"[containerClass, 'size-' + subComponentSize]\"\n [ngStyle]=\"{ minHeight: minHeight + 'px' }\"\n>\n <ng-content></ng-content>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + paginationContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host .block-list-container ::ng-deep>*{flex-shrink:0}:host{position:relative}@media screen and (min-width: 769px){.size-L{grid-template-columns:repeat(1,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-M{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-S{grid-template-columns:repeat(3,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-XS{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}}\n"] }]
26370
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { containerClass: [{
26371
- type: Input
26372
- }], paginationContainerClass: [{
26373
- type: Input
26374
- }], blocks: [{
26375
- type: ContentChildren,
26376
- args: ['block', { read: ElementRef }]
26377
- }], blockContainer: [{
26378
- type: ViewChild,
26379
- args: ['blockContainer']
26380
- }], listChanges: [{
26381
- type: Output
26382
- }] } });
26383
-
26384
26384
  class ColorScaleComponent {
26385
26385
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ColorScaleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26386
26386
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ColorScaleComponent, selector: "gn-ui-color-scale", ngImport: i0, template: "<div class=\"flex flex-row items-center\">\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32 text-right\">primary</div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-black\"\n title=\"primary-black\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-darkest\"\n title=\"primary-darkest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-darker\"\n title=\"primary-darker\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary border-2 border-primary-darkest\"\n title=\"primary\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-lighter\"\n title=\"primary-lighter\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-lightest\"\n title=\"primary-lightest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-primary-white\"\n title=\"primary-white\"\n ></div>\n</div>\n<div class=\"flex flex-row\">\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32 text-right\">\n secondary\n </div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-black\"\n title=\"secondary-black\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-darkest\"\n title=\"secondary-darkest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-darker\"\n title=\"secondary-darker\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary border-2 border-secondary-darkest\"\n title=\"secondary\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-lighter\"\n title=\"secondary-lighter\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-lightest\"\n title=\"secondary-lightest\"\n ></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-secondary-white\"\n title=\"secondary-white\"\n ></div>\n</div>\n<div class=\"flex flex-row\">\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32 text-right\">main</div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-main\" title=\"main\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-900\" title=\"gray-900\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-800\" title=\"gray-800\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-700\" title=\"gray-700\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-600\" title=\"gray-600\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-500\" title=\"gray-500\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-400\" title=\"gray-400\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-300\" title=\"gray-300\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-200\" title=\"gray-200\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-100\" title=\"gray-100\"></div>\n <div class=\"shadow-md rounded w-6 h-6 m-2 bg-gray-50\" title=\"gray-50\"></div>\n <div\n class=\"shadow-md rounded w-6 h-6 m-2 bg-background\"\n title=\"background\"\n ></div>\n <div class=\"text-xs text-gray-700 font-bold m-2 w-32\">background</div>\n</div>\n", styles: [""] }); }
@@ -26869,7 +26869,7 @@ class AutocompleteComponent {
26869
26869
  provideNgIconsConfig({
26870
26870
  size: '1.75rem',
26871
26871
  }),
26872
- ], viewQueries: [{ propertyName: "triggerRef", first: true, predicate: MatAutocompleteTrigger, descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "inputRef", first: true, predicate: ["searchInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<span class=\"w-full inline-block relative\">\n <div\n class=\"absolute inset-y-[--icon-padding] left-[--icon-padding] w-[--icon-width] pointer-events-none\"\n *ngIf=\"!allowSubmit\"\n >\n <ng-icon name=\"iconoirSearch\" class=\"text-primary search\"></ng-icon>\n </div>\n <div class=\"flex flex-row\">\n <input\n #searchInput\n type=\"text\"\n class=\"gn-ui-text-input\"\n (input)=\"handleInput($event)\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter(searchInput.value)\"\n [ngClass]=\"{\n 'text-primary': searchActive && enterButton,\n 'text-gray-900': !searchActive,\n 'px-[--icon-width]': !allowSubmit,\n }\"\n />\n <gn-ui-button\n type=\"gray\"\n *ngIf=\"searchInput.value && displayEnterBtn\"\n extraClass=\"w-32 h-8 !opacity-100\"\n [ngStyle]=\"{ left: enterBtnPosition + 'px' }\"\n class=\"absolute\"\n disabled=\"true\"\n >\n <ng-icon\n name=\"iconoirLongArrowDownLeft\"\n class=\"!w-4 text-gray-900 font-bold\"\n ></ng-icon>\n <span translate class=\"text-bold text-gray-900 font-bold\">\n Enter to search\n </span>\n </gn-ui-button>\n </div>\n <gn-ui-button\n type=\"primary\"\n [extraClass]=\"getExtraClass()\"\n data-test=\"clear-btn\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (buttonClick)=\"clear()\"\n >\n <ng-icon class=\"text-white\" name=\"matClose\"></ng-icon>\n </gn-ui-button>\n <gn-ui-button\n type=\"light\"\n extraClass=\"border-0 border-l-[1px] border-gray-300 hover:border-gray-500 text-primary hover:text-primary-darkest focus:text-primary-darkest absolute inset-y-[--icon-padding] right-[--icon-padding]\"\n aria-label=\"Trigger search\"\n *ngIf=\"allowSubmit\"\n data-test=\"autocomplete-submit-btn\"\n (buttonClick)=\"handleClickSearch()\"\n >\n <ng-icon name=\"iconoirSearch\"></ng-icon>\n </gn-ui-button>\n\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"matErrorOutlineOutline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</span>\n\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFnInternal\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFnInternal(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: ["span{--icon-padding: var(--gn-ui-text-input-border-size, 2px);--icon-width: calc(var(--gn-ui-text-input-padding, .6em) * 2 + 1.25em)}span>*:not(gn-ui-popup-alert){font-size:var(--gn-ui-text-input-font-size, 1em)}input:placeholder-shown{text-overflow:ellipsis}gn-ui-button{--gn-ui-button-rounded: 0;--gn-ui-button-width: var(--icon-width);--gn-ui-button-padding: 0;font-size:1em}ng-icon.search{margin-top:.6rem;margin-left:.6rem}gn-ui-button:last-of-type{--gn-ui-button-rounded: 0 var(--gn-ui-text-input-rounded, .25em) var(--gn-ui-text-input-rounded, .25em) 0}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"], dependencies: [{ kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i1$5.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i1$5.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { 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.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26872
+ ], viewQueries: [{ propertyName: "triggerRef", first: true, predicate: MatAutocompleteTrigger, descendants: true }, { propertyName: "autocomplete", first: true, predicate: MatAutocomplete, descendants: true }, { propertyName: "inputRef", first: true, predicate: ["searchInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<span class=\"w-full inline-block relative\">\n <div\n class=\"absolute inset-y-[--icon-padding] left-[--icon-padding] w-[--icon-width] pointer-events-none\"\n *ngIf=\"!allowSubmit\"\n >\n <ng-icon name=\"iconoirSearch\" class=\"text-primary search\"></ng-icon>\n </div>\n <div class=\"flex flex-row\">\n <input\n #searchInput\n type=\"text\"\n class=\"gn-ui-text-input\"\n (input)=\"handleInput($event)\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter(searchInput.value)\"\n [ngClass]=\"{\n 'text-primary': searchActive && enterButton,\n 'text-gray-900': !searchActive,\n 'px-[--icon-width]': !allowSubmit,\n }\"\n />\n <gn-ui-button\n type=\"gray\"\n *ngIf=\"searchInput.value && displayEnterBtn\"\n extraClass=\"w-32 h-8 !opacity-100\"\n [ngStyle]=\"{ left: enterBtnPosition + 'px' }\"\n class=\"absolute\"\n disabled=\"true\"\n >\n <ng-icon\n name=\"iconoirLongArrowDownLeft\"\n class=\"!w-4 text-gray-900 font-bold\"\n ></ng-icon>\n <span translate class=\"text-bold text-gray-900 font-bold\">\n Enter to search\n </span>\n </gn-ui-button>\n </div>\n <gn-ui-button\n type=\"primary\"\n [extraClass]=\"getExtraClass()\"\n data-test=\"clear-btn\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (buttonClick)=\"clear()\"\n >\n <ng-icon class=\"text-white\" name=\"matClose\"></ng-icon>\n </gn-ui-button>\n <gn-ui-button\n type=\"light\"\n extraClass=\"border-0 border-l-[1px] border-gray-300 hover:border-gray-500 text-primary hover:text-primary-darkest focus:text-primary-darkest absolute inset-y-[--icon-padding] right-[--icon-padding]\"\n aria-label=\"Trigger search\"\n *ngIf=\"allowSubmit\"\n data-test=\"autocomplete-submit-btn\"\n (buttonClick)=\"handleClickSearch()\"\n >\n <ng-icon name=\"iconoirSearch\"></ng-icon>\n </gn-ui-button>\n\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"matErrorOutlineOutline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</span>\n\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFnInternal\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion text-start\"\n >\n {{ displayWithFnInternal(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: ["span{--icon-padding: var(--gn-ui-text-input-border-size, 2px);--icon-width: calc(var(--gn-ui-text-input-padding, .6em) * 2 + 1.25em)}span>*:not(gn-ui-popup-alert){font-size:var(--gn-ui-text-input-font-size, 1em)}input:placeholder-shown{text-overflow:ellipsis}gn-ui-button{--gn-ui-button-rounded: 0;--gn-ui-button-width: var(--icon-width);--gn-ui-button-padding: 0;font-size:1em}ng-icon.search{margin-top:.6rem;margin-left:.6rem}gn-ui-button:last-of-type{--gn-ui-button-rounded: 0 var(--gn-ui-text-input-rounded, .25em) var(--gn-ui-text-input-rounded, .25em) 0}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"], dependencies: [{ kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i1$5.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i1$5.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { 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.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
26873
26873
  }
26874
26874
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AutocompleteComponent, decorators: [{
26875
26875
  type: Component,
@@ -26890,7 +26890,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
26890
26890
  provideNgIconsConfig({
26891
26891
  size: '1.75rem',
26892
26892
  }),
26893
- ], template: "<span class=\"w-full inline-block relative\">\n <div\n class=\"absolute inset-y-[--icon-padding] left-[--icon-padding] w-[--icon-width] pointer-events-none\"\n *ngIf=\"!allowSubmit\"\n >\n <ng-icon name=\"iconoirSearch\" class=\"text-primary search\"></ng-icon>\n </div>\n <div class=\"flex flex-row\">\n <input\n #searchInput\n type=\"text\"\n class=\"gn-ui-text-input\"\n (input)=\"handleInput($event)\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter(searchInput.value)\"\n [ngClass]=\"{\n 'text-primary': searchActive && enterButton,\n 'text-gray-900': !searchActive,\n 'px-[--icon-width]': !allowSubmit,\n }\"\n />\n <gn-ui-button\n type=\"gray\"\n *ngIf=\"searchInput.value && displayEnterBtn\"\n extraClass=\"w-32 h-8 !opacity-100\"\n [ngStyle]=\"{ left: enterBtnPosition + 'px' }\"\n class=\"absolute\"\n disabled=\"true\"\n >\n <ng-icon\n name=\"iconoirLongArrowDownLeft\"\n class=\"!w-4 text-gray-900 font-bold\"\n ></ng-icon>\n <span translate class=\"text-bold text-gray-900 font-bold\">\n Enter to search\n </span>\n </gn-ui-button>\n </div>\n <gn-ui-button\n type=\"primary\"\n [extraClass]=\"getExtraClass()\"\n data-test=\"clear-btn\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (buttonClick)=\"clear()\"\n >\n <ng-icon class=\"text-white\" name=\"matClose\"></ng-icon>\n </gn-ui-button>\n <gn-ui-button\n type=\"light\"\n extraClass=\"border-0 border-l-[1px] border-gray-300 hover:border-gray-500 text-primary hover:text-primary-darkest focus:text-primary-darkest absolute inset-y-[--icon-padding] right-[--icon-padding]\"\n aria-label=\"Trigger search\"\n *ngIf=\"allowSubmit\"\n data-test=\"autocomplete-submit-btn\"\n (buttonClick)=\"handleClickSearch()\"\n >\n <ng-icon name=\"iconoirSearch\"></ng-icon>\n </gn-ui-button>\n\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"matErrorOutlineOutline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</span>\n\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFnInternal\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion\"\n >\n {{ displayWithFnInternal(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: ["span{--icon-padding: var(--gn-ui-text-input-border-size, 2px);--icon-width: calc(var(--gn-ui-text-input-padding, .6em) * 2 + 1.25em)}span>*:not(gn-ui-popup-alert){font-size:var(--gn-ui-text-input-font-size, 1em)}input:placeholder-shown{text-overflow:ellipsis}gn-ui-button{--gn-ui-button-rounded: 0;--gn-ui-button-width: var(--icon-width);--gn-ui-button-padding: 0;font-size:1em}ng-icon.search{margin-top:.6rem;margin-left:.6rem}gn-ui-button:last-of-type{--gn-ui-button-rounded: 0 var(--gn-ui-text-input-rounded, .25em) var(--gn-ui-text-input-rounded, .25em) 0}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"] }]
26893
+ ], template: "<span class=\"w-full inline-block relative\">\n <div\n class=\"absolute inset-y-[--icon-padding] left-[--icon-padding] w-[--icon-width] pointer-events-none\"\n *ngIf=\"!allowSubmit\"\n >\n <ng-icon name=\"iconoirSearch\" class=\"text-primary search\"></ng-icon>\n </div>\n <div class=\"flex flex-row\">\n <input\n #searchInput\n type=\"text\"\n class=\"gn-ui-text-input\"\n (input)=\"handleInput($event)\"\n [placeholder]=\"placeholder\"\n [formControl]=\"control\"\n [matAutocomplete]=\"auto\"\n (keyup.enter)=\"handleEnter(searchInput.value)\"\n [ngClass]=\"{\n 'text-primary': searchActive && enterButton,\n 'text-gray-900': !searchActive,\n 'px-[--icon-width]': !allowSubmit,\n }\"\n />\n <gn-ui-button\n type=\"gray\"\n *ngIf=\"searchInput.value && displayEnterBtn\"\n extraClass=\"w-32 h-8 !opacity-100\"\n [ngStyle]=\"{ left: enterBtnPosition + 'px' }\"\n class=\"absolute\"\n disabled=\"true\"\n >\n <ng-icon\n name=\"iconoirLongArrowDownLeft\"\n class=\"!w-4 text-gray-900 font-bold\"\n ></ng-icon>\n <span translate class=\"text-bold text-gray-900 font-bold\">\n Enter to search\n </span>\n </gn-ui-button>\n </div>\n <gn-ui-button\n type=\"primary\"\n [extraClass]=\"getExtraClass()\"\n data-test=\"clear-btn\"\n *ngIf=\"searchInput.value\"\n aria-label=\"Clear\"\n (buttonClick)=\"clear()\"\n >\n <ng-icon class=\"text-white\" name=\"matClose\"></ng-icon>\n </gn-ui-button>\n <gn-ui-button\n type=\"light\"\n extraClass=\"border-0 border-l-[1px] border-gray-300 hover:border-gray-500 text-primary hover:text-primary-darkest focus:text-primary-darkest absolute inset-y-[--icon-padding] right-[--icon-padding]\"\n aria-label=\"Trigger search\"\n *ngIf=\"allowSubmit\"\n data-test=\"autocomplete-submit-btn\"\n (buttonClick)=\"handleClickSearch()\"\n >\n <ng-icon name=\"iconoirSearch\"></ng-icon>\n </gn-ui-button>\n\n <gn-ui-popup-alert\n *ngIf=\"error\"\n class=\"absolute mt-2 w-full top-[100%] left-0\"\n icon=\"matErrorOutlineOutline\"\n position=\"top\"\n type=\"warning\"\n >\n <span translate>search.autocomplete.error</span>\n {{ error }}\n </gn-ui-popup-alert>\n</span>\n\n<mat-autocomplete\n #auto=\"matAutocomplete\"\n (optionSelected)=\"handleSelection($event)\"\n [displayWith]=\"displayWithFnInternal\"\n>\n <mat-option\n *ngFor=\"let suggestion of suggestions$ | async\"\n [value]=\"suggestion\"\n class=\"p-2 suggestion text-start\"\n >\n {{ displayWithFnInternal(suggestion) }}\n </mat-option>\n</mat-autocomplete>\n", styles: ["span{--icon-padding: var(--gn-ui-text-input-border-size, 2px);--icon-width: calc(var(--gn-ui-text-input-padding, .6em) * 2 + 1.25em)}span>*:not(gn-ui-popup-alert){font-size:var(--gn-ui-text-input-font-size, 1em)}input:placeholder-shown{text-overflow:ellipsis}gn-ui-button{--gn-ui-button-rounded: 0;--gn-ui-button-width: var(--icon-width);--gn-ui-button-padding: 0;font-size:1em}ng-icon.search{margin-top:.6rem;margin-left:.6rem}gn-ui-button:last-of-type{--gn-ui-button-rounded: 0 var(--gn-ui-text-input-rounded, .25em) var(--gn-ui-text-input-rounded, .25em) 0}.mat-mdc-option.suggestion.mat-mdc-option-active{background-color:var(--color-primary-lightest)}\n"] }]
26894
26894
  }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { placeholder: [{
26895
26895
  type: Input
26896
26896
  }], enterButton: [{
@@ -28313,6 +28313,531 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28313
28313
  type: Output
28314
28314
  }] } });
28315
28315
 
28316
+ class CellPopinComponent {
28317
+ set activePopin(active) {
28318
+ this._activePopin = !!active;
28319
+ this.updateIntersectionObserver();
28320
+ }
28321
+ get activePopin() {
28322
+ return this._activePopin;
28323
+ }
28324
+ constructor(scrollDispatcher, cdr) {
28325
+ this.scrollDispatcher = scrollDispatcher;
28326
+ this.cdr = cdr;
28327
+ this.extraClass = '';
28328
+ this.isOpen = false;
28329
+ this.isVisible = true;
28330
+ this.overlayPositions = [
28331
+ {
28332
+ originX: 'end',
28333
+ originY: 'top',
28334
+ overlayX: 'end',
28335
+ overlayY: 'top',
28336
+ },
28337
+ {
28338
+ originX: 'start',
28339
+ originY: 'top',
28340
+ overlayX: 'start',
28341
+ overlayY: 'top',
28342
+ },
28343
+ ];
28344
+ this.firstCheck = true;
28345
+ this._activePopin = true;
28346
+ }
28347
+ ngAfterViewInit() {
28348
+ if (!this.activePopin) {
28349
+ return;
28350
+ }
28351
+ if (this.cdkScrollContainer) {
28352
+ this.scrollDispatcher.register(this.cdkScrollContainer);
28353
+ }
28354
+ this.updateIntersectionObserver();
28355
+ }
28356
+ ngOnDestroy() {
28357
+ this.intersectionObserver?.disconnect();
28358
+ this.scrollDispatcher.deregister(this.cdkScrollContainer);
28359
+ }
28360
+ updateIntersectionObserver() {
28361
+ if (!this.scrollContainer || !this.anchorRef) {
28362
+ return;
28363
+ }
28364
+ if (this.intersectionObserver) {
28365
+ this.intersectionObserver?.disconnect();
28366
+ }
28367
+ this.intersectionObserver = new IntersectionObserver(([entry]) => {
28368
+ const visible = entry.intersectionRatio >= 1;
28369
+ // Ignore first visibility if first time opening it
28370
+ if (this.firstCheck && !visible) {
28371
+ this.firstCheck = false;
28372
+ return;
28373
+ }
28374
+ this.firstCheck = false;
28375
+ if (this.isVisible !== visible) {
28376
+ this.isVisible = visible;
28377
+ this.cdr.detectChanges();
28378
+ }
28379
+ }, {
28380
+ root: this.scrollContainer.nativeElement,
28381
+ threshold: 1.0,
28382
+ });
28383
+ this.intersectionObserver.observe(this.anchorRef.nativeElement);
28384
+ }
28385
+ openOverlay() {
28386
+ this.isOpen = true;
28387
+ }
28388
+ closeOverlay() {
28389
+ this.isOpen = false;
28390
+ }
28391
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellPopinComponent, deps: [{ token: i1$8.ScrollDispatcher }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
28392
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CellPopinComponent, isStandalone: true, selector: "gn-ui-cell-popin", inputs: { extraClass: "extraClass", cdkScrollContainer: "cdkScrollContainer", scrollContainer: "scrollContainer", activePopin: "activePopin" }, providers: [provideIcons({ iconoirReduce })], viewQueries: [{ propertyName: "anchorRef", first: true, predicate: ["anchorRef"], descendants: true }], ngImport: i0, template: "<div\n class=\"h-full flex items-center justify-center\"\n cdkOverlayOrigin\n #anchorRef\n #trigger=\"cdkOverlayOrigin\"\n [class]=\"extraClass\"\n data-cy=\"cell-popin\"\n>\n <ng-content select=\"[cellContent]\"></ng-content>\n <ng-template\n *ngIf=\"activePopin\"\n cdkConnectedOverlay\n [cdkConnectedOverlayPush]=\"false\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayWidth]=\"'auto'\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayGrowAfterOpen]=\"true\"\n (detach)=\"closeOverlay()\"\n >\n <div\n *ngIf=\"activePopin && isVisible\"\n class=\"bg-white shadow-lg border border-gray-300 relative\"\n data-cy=\"cell-popin-content\"\n >\n <ng-content select=\"[popinContent]\"></ng-content>\n <gn-ui-button\n data-cy=\"cell-popin-close\"\n [style.--gn-ui-button-background]=\"'bg-transparent'\"\n class=\"absolute top-2 right-2\"\n type=\"light\"\n (buttonClick)=\"closeOverlay()\"\n extraClass=\"w-10 h-8 px-1\"\n >\n <ng-icon name=\"iconoirReduce\" size=\"24\"></ng-icon>\n </gn-ui-button>\n </div>\n </ng-template>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1$8.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$8.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { 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"] }] }); }
28393
+ }
28394
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellPopinComponent, decorators: [{
28395
+ type: Component,
28396
+ args: [{ selector: 'gn-ui-cell-popin', standalone: true, imports: [
28397
+ CommonModule,
28398
+ MatButtonModule,
28399
+ OverlayModule,
28400
+ ButtonComponent,
28401
+ NgIconComponent,
28402
+ ], providers: [provideIcons({ iconoirReduce })], template: "<div\n class=\"h-full flex items-center justify-center\"\n cdkOverlayOrigin\n #anchorRef\n #trigger=\"cdkOverlayOrigin\"\n [class]=\"extraClass\"\n data-cy=\"cell-popin\"\n>\n <ng-content select=\"[cellContent]\"></ng-content>\n <ng-template\n *ngIf=\"activePopin\"\n cdkConnectedOverlay\n [cdkConnectedOverlayPush]=\"false\"\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayPositions]=\"overlayPositions\"\n [cdkConnectedOverlayWidth]=\"'auto'\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayGrowAfterOpen]=\"true\"\n (detach)=\"closeOverlay()\"\n >\n <div\n *ngIf=\"activePopin && isVisible\"\n class=\"bg-white shadow-lg border border-gray-300 relative\"\n data-cy=\"cell-popin-content\"\n >\n <ng-content select=\"[popinContent]\"></ng-content>\n <gn-ui-button\n data-cy=\"cell-popin-close\"\n [style.--gn-ui-button-background]=\"'bg-transparent'\"\n class=\"absolute top-2 right-2\"\n type=\"light\"\n (buttonClick)=\"closeOverlay()\"\n extraClass=\"w-10 h-8 px-1\"\n >\n <ng-icon name=\"iconoirReduce\" size=\"24\"></ng-icon>\n </gn-ui-button>\n </div>\n </ng-template>\n</div>\n" }]
28403
+ }], ctorParameters: () => [{ type: i1$8.ScrollDispatcher }, { type: i0.ChangeDetectorRef }], propDecorators: { extraClass: [{
28404
+ type: Input
28405
+ }], cdkScrollContainer: [{
28406
+ type: Input
28407
+ }], scrollContainer: [{
28408
+ type: Input
28409
+ }], anchorRef: [{
28410
+ type: ViewChild,
28411
+ args: ['anchorRef']
28412
+ }], activePopin: [{
28413
+ type: Input
28414
+ }] } });
28415
+
28416
+ class ExpandablePanelButtonComponent {
28417
+ constructor() {
28418
+ this.collapsed = true;
28419
+ }
28420
+ toggle() {
28421
+ this.collapsed = !this.collapsed;
28422
+ }
28423
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28424
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ExpandablePanelButtonComponent, isStandalone: true, selector: "gn-ui-expandable-panel-button", inputs: { titleTemplate: "titleTemplate", collapsed: "collapsed" }, ngImport: i0, template: "<button\n type=\"button\"\n class=\"px-4 bg-primary hover:bg-primary-darker text-white flex flex-row w-full items-center font-bold text-lg pointer-events-auto\"\n [style.height]=\"'55px'\"\n (click)=\"toggle()\"\n>\n <ng-container [ngTemplateOutlet]=\"titleTemplate\"></ng-container>\n <div class=\"ml-3 grow\"></div>\n <ng-icon *ngIf=\"collapsed\" name=\"matExpandMore\"></ng-icon>\n <ng-icon name=\"matExpandLess\" *ngIf=\"!collapsed\"></ng-icon>\n</button>\n<div\n class=\"content transition-all pointer-events-auto bg-white\"\n [style.height]=\"collapsed ? '0px' : 'calc(100% - 55px)'\"\n [ngClass]=\"collapsed ? 'overflow-hidden' : 'overflow-auto'\"\n>\n <ng-content></ng-content>\n</div>\n", styles: [":host{height:100%;position:absolute;inset:0;display:flex;flex-direction:column;justify-content:flex-end;pointer-events:none}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], viewProviders: [provideIcons({ matExpandMore, matExpandLess })], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28425
+ }
28426
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelButtonComponent, decorators: [{
28427
+ type: Component,
28428
+ args: [{ selector: 'gn-ui-expandable-panel-button', changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, NgIcon], viewProviders: [provideIcons({ matExpandMore, matExpandLess })], standalone: true, template: "<button\n type=\"button\"\n class=\"px-4 bg-primary hover:bg-primary-darker text-white flex flex-row w-full items-center font-bold text-lg pointer-events-auto\"\n [style.height]=\"'55px'\"\n (click)=\"toggle()\"\n>\n <ng-container [ngTemplateOutlet]=\"titleTemplate\"></ng-container>\n <div class=\"ml-3 grow\"></div>\n <ng-icon *ngIf=\"collapsed\" name=\"matExpandMore\"></ng-icon>\n <ng-icon name=\"matExpandLess\" *ngIf=\"!collapsed\"></ng-icon>\n</button>\n<div\n class=\"content transition-all pointer-events-auto bg-white\"\n [style.height]=\"collapsed ? '0px' : 'calc(100% - 55px)'\"\n [ngClass]=\"collapsed ? 'overflow-hidden' : 'overflow-auto'\"\n>\n <ng-content></ng-content>\n</div>\n", styles: [":host{height:100%;position:absolute;inset:0;display:flex;flex-direction:column;justify-content:flex-end;pointer-events:none}\n"] }]
28429
+ }], propDecorators: { titleTemplate: [{
28430
+ type: Input
28431
+ }], collapsed: [{
28432
+ type: Input
28433
+ }] } });
28434
+
28435
+ class ExpandablePanelComponent {
28436
+ constructor(changeDetector) {
28437
+ this.changeDetector = changeDetector;
28438
+ this.iconColor = '';
28439
+ this._collapsed = true;
28440
+ }
28441
+ ngAfterViewInit() {
28442
+ if (this.contentDiv) {
28443
+ this.contentObserver = new ResizeObserver(() => {
28444
+ this.changeDetector.detectChanges();
28445
+ });
28446
+ this.contentObserver.observe(this.contentDiv.nativeElement);
28447
+ }
28448
+ }
28449
+ set collapsed(value) {
28450
+ this._collapsed = value;
28451
+ }
28452
+ get collapsed() {
28453
+ return this._collapsed;
28454
+ }
28455
+ toggle() {
28456
+ this.collapsed = !this.collapsed;
28457
+ }
28458
+ ngOnDestroy() {
28459
+ if (this.contentObserver) {
28460
+ this.contentObserver.disconnect();
28461
+ }
28462
+ }
28463
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
28464
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ExpandablePanelComponent, isStandalone: true, selector: "gn-ui-expandable-panel", inputs: { title: "title", iconColor: "iconColor", collapsed: "collapsed" }, queries: [{ propertyName: "titleTemplate", first: true, predicate: ["titleTemplate"], descendants: true }], viewQueries: [{ propertyName: "contentDiv", first: true, predicate: ["contentDiv"], descendants: true }], ngImport: i0, template: "<div\n class=\"group flex items-center justify-between title border-b border-gray-100 cursor-pointer\"\n (click)=\"toggle()\"\n data-cy=\"expandable-panel-header\"\n>\n <div class=\"grow py-2.5\">\n <ng-container *ngIf=\"titleTemplate; else simpleTitle\">\n <div data-cy=\"expandable-panel-custom-title\">\n <ng-container *ngTemplateOutlet=\"titleTemplate\"></ng-container>\n </div>\n </ng-container>\n <ng-template #simpleTitle>\n <div\n class=\"font-medium text-black text-sm\"\n data-cy=\"expandable-panel-title\"\n >\n {{ title }}\n </div>\n </ng-template>\n </div>\n <div\n class=\"w-8 opacity-25 text-primary group-hover:opacity-100 transition-opacity flex items-center shrink-0\"\n >\n <ng-icon\n [name]=\"collapsed ? 'matAdd' : 'matRemove'\"\n [style.color]=\"iconColor\"\n ></ng-icon>\n </div>\n</div>\n<div\n class=\"content overflow-hidden transition-all duration-300\"\n [ngClass]=\"collapsed ? 'ease-out' : 'ease-in'\"\n #contentDiv\n *ngIf=\"!collapsed\"\n data-cy=\"expandable-panel-content\"\n>\n <ng-content></ng-content>\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.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NgIcon, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }], viewProviders: [provideIcons({ matAdd, matRemove })], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28465
+ }
28466
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelComponent, decorators: [{
28467
+ type: Component,
28468
+ args: [{ selector: 'gn-ui-expandable-panel', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, NgIcon], viewProviders: [provideIcons({ matAdd, matRemove })], template: "<div\n class=\"group flex items-center justify-between title border-b border-gray-100 cursor-pointer\"\n (click)=\"toggle()\"\n data-cy=\"expandable-panel-header\"\n>\n <div class=\"grow py-2.5\">\n <ng-container *ngIf=\"titleTemplate; else simpleTitle\">\n <div data-cy=\"expandable-panel-custom-title\">\n <ng-container *ngTemplateOutlet=\"titleTemplate\"></ng-container>\n </div>\n </ng-container>\n <ng-template #simpleTitle>\n <div\n class=\"font-medium text-black text-sm\"\n data-cy=\"expandable-panel-title\"\n >\n {{ title }}\n </div>\n </ng-template>\n </div>\n <div\n class=\"w-8 opacity-25 text-primary group-hover:opacity-100 transition-opacity flex items-center shrink-0\"\n >\n <ng-icon\n [name]=\"collapsed ? 'matAdd' : 'matRemove'\"\n [style.color]=\"iconColor\"\n ></ng-icon>\n </div>\n</div>\n<div\n class=\"content overflow-hidden transition-all duration-300\"\n [ngClass]=\"collapsed ? 'ease-out' : 'ease-in'\"\n #contentDiv\n *ngIf=\"!collapsed\"\n data-cy=\"expandable-panel-content\"\n>\n <ng-content></ng-content>\n</div>\n" }]
28469
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { title: [{
28470
+ type: Input
28471
+ }], iconColor: [{
28472
+ type: Input
28473
+ }], titleTemplate: [{
28474
+ type: ContentChild,
28475
+ args: ['titleTemplate']
28476
+ }], contentDiv: [{
28477
+ type: ViewChild,
28478
+ args: ['contentDiv']
28479
+ }], collapsed: [{
28480
+ type: Input
28481
+ }] } });
28482
+
28483
+ class FormFieldWrapperComponent {
28484
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28485
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormFieldWrapperComponent, isStandalone: true, selector: "gn-ui-form-field-wrapper", inputs: { label: "label", hint: "hint" }, ngImport: i0, template: "<div class=\"h-full flex flex-col\" *ngIf=\"label; else onlyContent\">\n <div class=\"flex-none w-full flex flex-row items-center\">\n <span class=\"flex-none font-bold\" translate=\"\">{{ label }}</span>\n <div class=\"flex-1 flex justify-end items-center\">\n <ng-content select=\"[form-field-interaction]\"></ng-content>\n <span\n *ngIf=\"hint\"\n class=\"material-symbols-outlined m-2 gn-ui-icon-small\"\n [matTooltip]=\"hint\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n <div class=\"flex-1 mt-2\">\n <ng-container *ngTemplateOutlet=\"onlyContent\"> </ng-container>\n </div>\n</div>\n\n<ng-template #onlyContent>\n <ng-content></ng-content>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: CommonModule }, { 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: "ngmodule", type: TranslateModule }, { kind: "directive", type: i1$1.TranslateDirective, selector: "[translate],[ngx-translate]", inputs: ["translate", "translateParams"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28486
+ }
28487
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldWrapperComponent, decorators: [{
28488
+ type: Component,
28489
+ args: [{ selector: 'gn-ui-form-field-wrapper', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [MatTooltipModule, CommonModule, TranslateModule], template: "<div class=\"h-full flex flex-col\" *ngIf=\"label; else onlyContent\">\n <div class=\"flex-none w-full flex flex-row items-center\">\n <span class=\"flex-none font-bold\" translate=\"\">{{ label }}</span>\n <div class=\"flex-1 flex justify-end items-center\">\n <ng-content select=\"[form-field-interaction]\"></ng-content>\n <span\n *ngIf=\"hint\"\n class=\"material-symbols-outlined m-2 gn-ui-icon-small\"\n [matTooltip]=\"hint\"\n matTooltipPosition=\"above\"\n >\n help\n </span>\n </div>\n </div>\n <div class=\"flex-1 mt-2\">\n <ng-container *ngTemplateOutlet=\"onlyContent\"> </ng-container>\n </div>\n</div>\n\n<ng-template #onlyContent>\n <ng-content></ng-content>\n</ng-template>\n" }]
28490
+ }], propDecorators: { label: [{
28491
+ type: Input
28492
+ }], hint: [{
28493
+ type: Input
28494
+ }] } });
28495
+
28496
+ class MaxLinesComponent {
28497
+ constructor(cdr) {
28498
+ this.cdr = cdr;
28499
+ this.maxLines = 6;
28500
+ this.isExpanded = false;
28501
+ this.maxHeight = '';
28502
+ this.showToggleButton = false;
28503
+ }
28504
+ ngAfterViewInit() {
28505
+ this.calculateMaxHeight();
28506
+ this.observer = new ResizeObserver((mutations) => {
28507
+ mutations.forEach(() => {
28508
+ this.calculateMaxHeight();
28509
+ });
28510
+ });
28511
+ this.observer.observe(this.container.nativeElement.children[0]);
28512
+ }
28513
+ toggleDisplay() {
28514
+ this.isExpanded = !this.isExpanded;
28515
+ this.calculateMaxHeight();
28516
+ }
28517
+ calculateMaxHeight() {
28518
+ const containerElement = this.container.nativeElement;
28519
+ const contentElement = containerElement.children[0];
28520
+ const contentHeight = contentElement.getBoundingClientRect().height;
28521
+ if (contentHeight) {
28522
+ if (contentHeight > this.maxLines * this.getLineHeight(contentElement)) {
28523
+ this.showToggleButton = true;
28524
+ this.maxHeight = this.isExpanded
28525
+ ? `${contentHeight}px`
28526
+ : `${this.maxLines * this.getLineHeight(contentElement)}px`;
28527
+ }
28528
+ else {
28529
+ this.showToggleButton = false;
28530
+ this.maxHeight = `${contentHeight}px`;
28531
+ }
28532
+ containerElement.setAttribute('style', `max-height: ${this.maxHeight}; overflow: hidden`);
28533
+ this.cdr.detectChanges();
28534
+ }
28535
+ }
28536
+ getLineHeight(element) {
28537
+ const computedStyle = window.getComputedStyle(element);
28538
+ const lineHeight = parseFloat(computedStyle.lineHeight);
28539
+ const fontSize = parseFloat(computedStyle.fontSize || '14');
28540
+ const result = isNaN(lineHeight) ? fontSize * 1.2 : lineHeight; // Use a default if line height is not specified
28541
+ return result;
28542
+ }
28543
+ ngOnDestroy() {
28544
+ if (!this.observer)
28545
+ return;
28546
+ this.observer.unobserve(this.container.nativeElement.children[0]);
28547
+ }
28548
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaxLinesComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
28549
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MaxLinesComponent, isStandalone: true, selector: "gn-ui-max-lines", inputs: { maxLines: "maxLines" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], ngImport: i0, template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300 relative\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n <div\n *ngIf=\"showToggleButton && !isExpanded\"\n class=\"absolute inset-x-0 bottom-0 bg-gradient-to-b from-transparent to-white h-10\"\n ></div>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-primary cursor-pointer pt-2.5\"\n data-cy=\"readMoreButton\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\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.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28550
+ }
28551
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaxLinesComponent, decorators: [{
28552
+ type: Component,
28553
+ args: [{ selector: 'gn-ui-max-lines', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, TranslateModule], template: "<div\n #container\n class=\"max-lines overflow-hidden transition-[max-height] duration-300 relative\"\n [ngClass]=\"isExpanded ? 'ease-in' : 'ease-out'\"\n [style.maxHeight]=\"maxHeight\"\n>\n <ng-content></ng-content>\n <div\n *ngIf=\"showToggleButton && !isExpanded\"\n class=\"absolute inset-x-0 bottom-0 bg-gradient-to-b from-transparent to-white h-10\"\n ></div>\n</div>\n<div\n *ngIf=\"showToggleButton\"\n (click)=\"toggleDisplay()\"\n class=\"text-primary cursor-pointer pt-2.5\"\n data-cy=\"readMoreButton\"\n>\n {{ (isExpanded ? 'ui.readLess' : 'ui.readMore') | translate }}\n</div>\n" }]
28554
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { maxLines: [{
28555
+ type: Input
28556
+ }], container: [{
28557
+ type: ViewChild,
28558
+ args: ['container']
28559
+ }] } });
28560
+
28561
+ class InteractiveTableColumnComponent {
28562
+ constructor() {
28563
+ this.grow = false;
28564
+ this.sortable = false;
28565
+ this.activeSort = null;
28566
+ this.sortChange = new EventEmitter();
28567
+ }
28568
+ handleSortChange() {
28569
+ this.activeSort = this.activeSort === 'asc' ? 'desc' : 'asc';
28570
+ this.sortChange.emit(this.activeSort);
28571
+ }
28572
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28573
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: InteractiveTableColumnComponent, isStandalone: true, selector: "gn-ui-interactive-table-column", inputs: { grow: "grow", width: "width", sortable: "sortable", activeSort: "activeSort" }, outputs: { sortChange: "sortChange" }, queries: [{ propertyName: "header", first: true, predicate: ["header"], descendants: true }, { propertyName: "cell", first: true, predicate: ["cell"], descendants: true }], ngImport: i0, template: "<span>empty</span>\n", styles: [""], dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28574
+ }
28575
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableColumnComponent, decorators: [{
28576
+ type: Component,
28577
+ args: [{ selector: 'gn-ui-interactive-table-column', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span>empty</span>\n" }]
28578
+ }], propDecorators: { header: [{
28579
+ type: ContentChild,
28580
+ args: ['header']
28581
+ }], cell: [{
28582
+ type: ContentChild,
28583
+ args: ['cell']
28584
+ }], grow: [{
28585
+ type: Input
28586
+ }], width: [{
28587
+ type: Input
28588
+ }], sortable: [{
28589
+ type: Input
28590
+ }], activeSort: [{
28591
+ type: Input
28592
+ }], sortChange: [{
28593
+ type: Output
28594
+ }] } });
28595
+
28596
+ marker('editor.record.lock.resourceType');
28597
+ marker('editor.record.lock.harvested');
28598
+ marker('editor.record.lock.owner');
28599
+ class InteractiveTableComponent {
28600
+ constructor() {
28601
+ this.items = [];
28602
+ this.canEditItem = () => of(true);
28603
+ this.isDraftPage = false;
28604
+ this.itemClick = new EventEmitter();
28605
+ }
28606
+ get gridStyle() {
28607
+ return {
28608
+ 'grid-template-columns': this.columns
28609
+ .map((column) => column.width
28610
+ ? column.width
28611
+ : column.grow
28612
+ ? `minmax(0px,1fr)`
28613
+ : `minmax(0px,max-content)`)
28614
+ .join(' '),
28615
+ };
28616
+ }
28617
+ getItemTitle(item) {
28618
+ if (!this.isDraftPage) {
28619
+ if (item.kind !== 'dataset') {
28620
+ return 'editor.record.lock.resourceType';
28621
+ }
28622
+ else if (item.extras?.isHarvested) {
28623
+ return 'editor.record.lock.harvested';
28624
+ }
28625
+ else if (!item.extras?.edit) {
28626
+ return 'editor.record.lock.owner';
28627
+ }
28628
+ }
28629
+ return '';
28630
+ }
28631
+ handleRowClick(item) {
28632
+ this.itemClick.emit(item);
28633
+ }
28634
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28635
+ 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 }); }
28636
+ }
28637
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, decorators: [{
28638
+ type: Component,
28639
+ 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"] }]
28640
+ }], propDecorators: { columns: [{
28641
+ type: ContentChildren,
28642
+ args: [InteractiveTableColumnComponent]
28643
+ }], items: [{
28644
+ type: Input
28645
+ }], canEditItem: [{
28646
+ type: Input
28647
+ }], isDraftPage: [{
28648
+ type: Input
28649
+ }], itemClick: [{
28650
+ type: Output
28651
+ }] } });
28652
+
28653
+ /**
28654
+ * This component will make a block that will stay sticky on the top of the page,
28655
+ * but will also shrink down to a minimum height when scrolling.
28656
+ * The ratio between minimum and nominal height is stored in the shrinkRatio
28657
+ * property, and can be used to change e.g. the opacity or size of child elements.
28658
+ * This component renders at z-index: 50 by default.
28659
+ * The first parent element with an overflow of `scroll` or `overflow` is considered
28660
+ * for scroll events.
28661
+ */
28662
+ class StickyHeaderComponent {
28663
+ constructor(changeDetector, hostEl, zone) {
28664
+ this.changeDetector = changeDetector;
28665
+ this.hostEl = hostEl;
28666
+ this.zone = zone;
28667
+ }
28668
+ ngAfterViewInit() {
28669
+ this.scrollSub = fromEvent(window, 'scroll', {
28670
+ passive: true,
28671
+ })
28672
+ .pipe(throttleTime(0, animationFrameScheduler, {
28673
+ leading: true,
28674
+ trailing: true,
28675
+ }))
28676
+ .subscribe(this.updateSize.bind(this));
28677
+ }
28678
+ ngOnInit() {
28679
+ this.placeholderEl = document.createElement('div');
28680
+ this.placeholderEl.style.position = 'absolute';
28681
+ this.placeholderEl.classList.add('sticky-header-placeholder');
28682
+ this.hostEl.nativeElement.insertAdjacentElement('beforebegin', this.placeholderEl);
28683
+ }
28684
+ ngAfterViewChecked() {
28685
+ this.updateSize();
28686
+ }
28687
+ ngOnDestroy() {
28688
+ this.scrollSub.unsubscribe();
28689
+ this.placeholderEl.remove();
28690
+ }
28691
+ updateSize() {
28692
+ this.zone.runOutsideAngular(() => {
28693
+ if (window.scrollY === this.parentScroll)
28694
+ return;
28695
+ this.parentScroll = window.scrollY;
28696
+ const offsetTop = Math.max(0, this.parentScroll - this.placeholderEl.offsetTop);
28697
+ const newHeightPx = Math.max(this.minHeightPx, this.fullHeightPx - offsetTop);
28698
+ this.innerContainer.nativeElement.style.transform = `translate(0, ${newHeightPx - this.fullHeightPx}px)`;
28699
+ this.expandRatio =
28700
+ (newHeightPx - this.minHeightPx) /
28701
+ (this.fullHeightPx - this.minHeightPx);
28702
+ this.changeDetector.detectChanges();
28703
+ });
28704
+ }
28705
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickyHeaderComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef, host: true }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
28706
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: StickyHeaderComponent, selector: "gn-ui-sticky-header", inputs: { minHeightPx: "minHeightPx", fullHeightPx: "fullHeightPx" }, queries: [{ propertyName: "template", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "outerContainer", first: true, predicate: ["outerContainer"], descendants: true }, { propertyName: "innerContainer", first: true, predicate: ["innerContainer"], descendants: true }], ngImport: i0, template: "<div\n #outerContainer\n class=\"sticky pointer-events-none z-50 top-0\"\n [style.height]=\"fullHeightPx + 'px'\"\n>\n <div\n #innerContainer\n class=\"relative pointer-events-auto\"\n [style.height]=\"fullHeightPx + 'px'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: expandRatio }\"\n ></ng-container>\n </div>\n</div>\n", styles: [""], dependencies: [{ kind: "directive", type: i1$2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28707
+ }
28708
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickyHeaderComponent, decorators: [{
28709
+ type: Component,
28710
+ args: [{ selector: 'gn-ui-sticky-header', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n #outerContainer\n class=\"sticky pointer-events-none z-50 top-0\"\n [style.height]=\"fullHeightPx + 'px'\"\n>\n <div\n #innerContainer\n class=\"relative pointer-events-auto\"\n [style.height]=\"fullHeightPx + 'px'\"\n >\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{ $implicit: expandRatio }\"\n ></ng-container>\n </div>\n</div>\n" }]
28711
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef, decorators: [{
28712
+ type: Host
28713
+ }] }, { type: i0.NgZone }], propDecorators: { minHeightPx: [{
28714
+ type: Input
28715
+ }], fullHeightPx: [{
28716
+ type: Input
28717
+ }], template: [{
28718
+ type: ContentChild,
28719
+ args: [TemplateRef]
28720
+ }], outerContainer: [{
28721
+ type: ViewChild,
28722
+ args: ['outerContainer']
28723
+ }], innerContainer: [{
28724
+ type: ViewChild,
28725
+ args: ['innerContainer']
28726
+ }] } });
28727
+
28728
+ class BlockListComponent {
28729
+ get pages() {
28730
+ return new Array(this.pagesCount).fill(0).map((_, i) => i);
28731
+ }
28732
+ get isFirstPage() {
28733
+ return this.currentPage_ === 0;
28734
+ }
28735
+ get isLastPage() {
28736
+ return this.currentPage_ === this.pagesCount - 1;
28737
+ }
28738
+ get pagesCount() {
28739
+ return this.blocks ? Math.ceil(this.blocks.length / this.pageSize) : 1;
28740
+ }
28741
+ get currentPage() {
28742
+ return this.currentPage_ + 1;
28743
+ }
28744
+ constructor(changeDetector) {
28745
+ this.changeDetector = changeDetector;
28746
+ this.pageSize = 4;
28747
+ this.containerClass = '';
28748
+ this.paginationContainerClass = 'w-full bottom-0 top-auto';
28749
+ this.minHeight = 0;
28750
+ this.listChanges = new EventEmitter();
28751
+ this.subComponentSize = 'M';
28752
+ this.currentPage_ = 0;
28753
+ this.refreshBlocksVisibility = () => {
28754
+ this.blocks.forEach((block, index) => {
28755
+ block.nativeElement.style.display =
28756
+ index >= this.currentPage_ * this.pageSize &&
28757
+ index < (this.currentPage_ + 1) * this.pageSize
28758
+ ? null
28759
+ : 'none';
28760
+ });
28761
+ };
28762
+ }
28763
+ ngAfterViewInit() {
28764
+ this.blocks.changes.subscribe(() => {
28765
+ this.updateSizes();
28766
+ this.refreshBlocksVisibility();
28767
+ this.goToPage(1);
28768
+ this.changeDetector.detectChanges();
28769
+ this.listChanges.emit(this);
28770
+ });
28771
+ this.updateSizes();
28772
+ this.refreshBlocksVisibility();
28773
+ // we store the first height as the min-height of the list container
28774
+ this.minHeight = this.blockContainer.nativeElement.clientHeight;
28775
+ this.changeDetector.detectChanges();
28776
+ this.listChanges.emit(this);
28777
+ }
28778
+ updateSizes() {
28779
+ this.subComponentSize = this.computeSubComponentSize();
28780
+ this.pageSize = this.computePageSize();
28781
+ }
28782
+ computeSubComponentSize() {
28783
+ if (!this.blocks)
28784
+ return 'M';
28785
+ const subComponentsCount = this.blocks.length;
28786
+ if (subComponentsCount <= 3)
28787
+ return 'L';
28788
+ if (subComponentsCount <= 12)
28789
+ return 'M';
28790
+ if (subComponentsCount <= 18)
28791
+ return 'S';
28792
+ return 'XS';
28793
+ }
28794
+ computePageSize() {
28795
+ switch (this.subComponentSize) {
28796
+ case 'L':
28797
+ return 3;
28798
+ case 'S':
28799
+ return 6;
28800
+ case 'XS':
28801
+ return 8;
28802
+ default:
28803
+ return 4;
28804
+ }
28805
+ }
28806
+ goToPage(pageIndex) {
28807
+ this.currentPage_ = Math.max(Math.min(pageIndex - 1, this.pagesCount - 1), 0);
28808
+ this.changeDetector.detectChanges();
28809
+ this.refreshBlocksVisibility();
28810
+ }
28811
+ goToPrevPage() {
28812
+ if (this.isFirstPage)
28813
+ return;
28814
+ this.goToPage(this.currentPage - 1);
28815
+ }
28816
+ goToNextPage() {
28817
+ if (this.isLastPage)
28818
+ return;
28819
+ this.goToPage(this.currentPage + 1);
28820
+ }
28821
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BlockListComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
28822
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: BlockListComponent, isStandalone: true, selector: "gn-ui-block-list", inputs: { containerClass: "containerClass", paginationContainerClass: "paginationContainerClass" }, outputs: { listChanges: "listChanges" }, queries: [{ propertyName: "blocks", predicate: ["block"], read: ElementRef }], viewQueries: [{ propertyName: "blockContainer", first: true, predicate: ["blockContainer"], descendants: true }], ngImport: i0, template: "<div\n class=\"grid gap-4 w-full md:grid-cols-2\"\n #blockContainer\n [ngClass]=\"[containerClass, 'size-' + subComponentSize]\"\n [ngStyle]=\"{ minHeight: minHeight + 'px' }\"\n>\n <ng-content></ng-content>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + paginationContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host .block-list-container ::ng-deep>*{flex-shrink:0}:host{position:relative}@media screen and (min-width: 769px){.size-L{grid-template-columns:repeat(1,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-M{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-S{grid-template-columns:repeat(3,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-XS{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1$2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: PaginationDotsComponent, selector: "gn-ui-pagination-dots", inputs: ["listComponent", "containerClass"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
28823
+ }
28824
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BlockListComponent, decorators: [{
28825
+ type: Component,
28826
+ args: [{ selector: 'gn-ui-block-list', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [CommonModule, PaginationDotsComponent], template: "<div\n class=\"grid gap-4 w-full md:grid-cols-2\"\n #blockContainer\n [ngClass]=\"[containerClass, 'size-' + subComponentSize]\"\n [ngStyle]=\"{ minHeight: minHeight + 'px' }\"\n>\n <ng-content></ng-content>\n</div>\n<gn-ui-pagination-dots\n [containerClass]=\"'absolute ' + paginationContainerClass\"\n [listComponent]=\"this\"\n></gn-ui-pagination-dots>\n", styles: [":host .block-list-container ::ng-deep>*{flex-shrink:0}:host{position:relative}@media screen and (min-width: 769px){.size-L{grid-template-columns:repeat(1,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-M{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-S{grid-template-columns:repeat(3,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}.size-XS{grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:minmax(0,min-content)}}\n"] }]
28827
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { containerClass: [{
28828
+ type: Input
28829
+ }], paginationContainerClass: [{
28830
+ type: Input
28831
+ }], blocks: [{
28832
+ type: ContentChildren,
28833
+ args: ['block', { read: ElementRef }]
28834
+ }], blockContainer: [{
28835
+ type: ViewChild,
28836
+ args: ['blockContainer']
28837
+ }], listChanges: [{
28838
+ type: Output
28839
+ }] } });
28840
+
28316
28841
  class SortableListComponent {
28317
28842
  constructor() {
28318
28843
  this.itemsOrderChange = new EventEmitter();
@@ -28487,34 +29012,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28487
29012
  }] });
28488
29013
 
28489
29014
  class TruncatedTextComponent {
28490
- constructor(cd, ngZone, viewportRuler) {
29015
+ constructor(cd, ngZone) {
28491
29016
  this.cd = cd;
28492
29017
  this.ngZone = ngZone;
28493
- this.viewportRuler = viewportRuler;
28494
29018
  this.text = '';
28495
29019
  this.extraClass = '';
28496
29020
  this.isTextTruncated = false;
28497
- this.isOpen = false;
28498
- this.overlayPosition = {
28499
- originX: 'end',
28500
- originY: 'top',
28501
- overlayX: 'end',
28502
- overlayY: 'top',
28503
- };
28504
29021
  this.resizeObserver = new ResizeObserver(() => {
28505
29022
  this.ngZone.run(() => this.checkTextTruncation());
28506
29023
  });
28507
29024
  this.mutationObserver = new MutationObserver(() => {
28508
29025
  this.ngZone.run(() => {
28509
29026
  this.checkTextTruncation();
28510
- this.close();
28511
29027
  });
28512
29028
  });
28513
- this.viewportSubscription = this.viewportRuler.change().subscribe(() => {
28514
- if (this.isOpen) {
28515
- this.updateOverlayPosition();
28516
- }
28517
- });
28518
29029
  }
28519
29030
  ngAfterViewInit() {
28520
29031
  const element = this.textElement.nativeElement;
@@ -28529,39 +29040,14 @@ class TruncatedTextComponent {
28529
29040
  ngOnDestroy() {
28530
29041
  this.resizeObserver?.disconnect();
28531
29042
  this.mutationObserver?.disconnect();
28532
- this.viewportSubscription?.unsubscribe();
28533
- this.close();
28534
- }
28535
- toggleOverlay() {
28536
- this.isOpen = !this.isOpen;
28537
- if (this.isOpen) {
28538
- this.updateOverlayPosition();
28539
- }
28540
- }
28541
- updateOverlayPosition() {
28542
- const element = this.textElement.nativeElement;
28543
- const rect = element.getBoundingClientRect();
28544
- const viewportWidth = this.viewportRuler.getViewportSize().width;
28545
- const isMobile = viewportWidth < 640;
28546
- const overlayWidth = isMobile ? 190 : 320;
28547
- const isNearLeftEdge = rect.left < overlayWidth;
28548
- this.overlayPosition = {
28549
- originX: isNearLeftEdge ? 'start' : 'end',
28550
- originY: 'top',
28551
- overlayX: isNearLeftEdge ? 'start' : 'end',
28552
- overlayY: 'top',
28553
- };
28554
- }
28555
- close() {
28556
- this.isOpen = false;
28557
29043
  }
28558
29044
  checkTextTruncation() {
28559
29045
  const element = this.textElement.nativeElement;
28560
29046
  this.isTextTruncated = element.scrollWidth > element.clientWidth;
28561
29047
  this.cd.detectChanges();
28562
29048
  }
28563
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TruncatedTextComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.NgZone }, { token: i1$8.ViewportRuler }], target: i0.ɵɵFactoryTarget.Component }); }
28564
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TruncatedTextComponent, isStandalone: true, selector: "gn-ui-truncated-text", inputs: { text: "text", extraClass: "extraClass" }, providers: [provideIcons({ iconoirExpand, iconoirReduce })], viewQueries: [{ propertyName: "textElement", first: true, predicate: ["textElement"], descendants: true }], ngImport: i0, template: "<div\n class=\"flex items-center justify-between w-full gap-2\"\n cdkOverlayOrigin\n [class]=\"extraClass\"\n #trigger=\"cdkOverlayOrigin\"\n>\n <span #textElement class=\"truncate\">\n {{ text }}\n </span>\n <gn-ui-button\n *ngIf=\"isTextTruncated\"\n type=\"outline\"\n extraClass=\"w-10 h-8 border rounded-lg\"\n (buttonClick)=\"toggleOverlay()\"\n >\n <ng-icon name=\"iconoirExpand\" size=\"24\"> </ng-icon>\n </gn-ui-button>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayPositions]=\"[overlayPosition]\"\n cdkConnectedOverlayPush\n [cdkConnectedOverlayWidth]=\"'auto'\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayGrowAfterOpen]=\"true\"\n (detach)=\"close()\"\n >\n <div class=\"bg-white shadow-lg border border-gray-300 flex\">\n <div class=\"sm:w-64 xs:w-32\">\n <p class=\"m-2\">{{ text }}</p>\n </div>\n <gn-ui-button\n class=\"m-2 flex-shrink-0\"\n type=\"light\"\n (buttonClick)=\"close()\"\n extraClass=\"w-10 h-8 px-1 bg-white\"\n >\n <ng-icon name=\"iconoirReduce\" size=\"24\"> </ng-icon>\n </gn-ui-button>\n </div>\n </ng-template>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1$8.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1$8.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { 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"] }] }); }
29049
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TruncatedTextComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
29050
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TruncatedTextComponent, isStandalone: true, selector: "gn-ui-truncated-text", inputs: { text: "text", extraClass: "extraClass", scrollContainer: "scrollContainer", cdkScrollContainer: "cdkScrollContainer" }, providers: [provideIcons({ iconoirExpand })], viewQueries: [{ propertyName: "textElement", first: true, predicate: ["textElement"], descendants: true }], ngImport: i0, template: "<gn-ui-cell-popin\n #popinRef\n [activePopin]=\"isTextTruncated\"\n [scrollContainer]=\"scrollContainer\"\n [cdkScrollContainer]=\"cdkScrollContainer\"\n>\n <div\n cellContent\n class=\"flex items-center justify-between w-full gap-2\"\n [class]=\"extraClass\"\n >\n <span #textElement class=\"truncate py-3 px-2\">\n {{ text }}\n </span>\n <gn-ui-button\n *ngIf=\"isTextTruncated\"\n type=\"outline\"\n extraClass=\"w-10 h-8 border rounded-lg mr-2\"\n (buttonClick)=\"popinRef.openOverlay()\"\n >\n <ng-icon name=\"iconoirExpand\" size=\"24\"> </ng-icon>\n </gn-ui-button>\n </div>\n <div popinContent class=\"sm:w-64 xs:w-32 py-4 pl-6 pr-9\">\n <p>{{ text }}</p>\n </div>\n</gn-ui-cell-popin>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: OverlayModule }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: CellPopinComponent, selector: "gn-ui-cell-popin", inputs: ["extraClass", "cdkScrollContainer", "scrollContainer", "activePopin"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }] }); }
28565
29051
  }
28566
29052
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TruncatedTextComponent, decorators: [{
28567
29053
  type: Component,
@@ -28571,12 +29057,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28571
29057
  MatButtonModule,
28572
29058
  OverlayModule,
28573
29059
  ButtonComponent,
29060
+ CellPopinComponent,
28574
29061
  NgIconComponent,
28575
- ], providers: [provideIcons({ iconoirExpand, iconoirReduce })], template: "<div\n class=\"flex items-center justify-between w-full gap-2\"\n cdkOverlayOrigin\n [class]=\"extraClass\"\n #trigger=\"cdkOverlayOrigin\"\n>\n <span #textElement class=\"truncate\">\n {{ text }}\n </span>\n <gn-ui-button\n *ngIf=\"isTextTruncated\"\n type=\"outline\"\n extraClass=\"w-10 h-8 border rounded-lg\"\n (buttonClick)=\"toggleOverlay()\"\n >\n <ng-icon name=\"iconoirExpand\" size=\"24\"> </ng-icon>\n </gn-ui-button>\n\n <ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"trigger\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n [cdkConnectedOverlayPositions]=\"[overlayPosition]\"\n cdkConnectedOverlayPush\n [cdkConnectedOverlayWidth]=\"'auto'\"\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\n [cdkConnectedOverlayGrowAfterOpen]=\"true\"\n (detach)=\"close()\"\n >\n <div class=\"bg-white shadow-lg border border-gray-300 flex\">\n <div class=\"sm:w-64 xs:w-32\">\n <p class=\"m-2\">{{ text }}</p>\n </div>\n <gn-ui-button\n class=\"m-2 flex-shrink-0\"\n type=\"light\"\n (buttonClick)=\"close()\"\n extraClass=\"w-10 h-8 px-1 bg-white\"\n >\n <ng-icon name=\"iconoirReduce\" size=\"24\"> </ng-icon>\n </gn-ui-button>\n </div>\n </ng-template>\n</div>\n" }]
28576
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i1$8.ViewportRuler }], propDecorators: { text: [{
29062
+ ], providers: [provideIcons({ iconoirExpand })], template: "<gn-ui-cell-popin\n #popinRef\n [activePopin]=\"isTextTruncated\"\n [scrollContainer]=\"scrollContainer\"\n [cdkScrollContainer]=\"cdkScrollContainer\"\n>\n <div\n cellContent\n class=\"flex items-center justify-between w-full gap-2\"\n [class]=\"extraClass\"\n >\n <span #textElement class=\"truncate py-3 px-2\">\n {{ text }}\n </span>\n <gn-ui-button\n *ngIf=\"isTextTruncated\"\n type=\"outline\"\n extraClass=\"w-10 h-8 border rounded-lg mr-2\"\n (buttonClick)=\"popinRef.openOverlay()\"\n >\n <ng-icon name=\"iconoirExpand\" size=\"24\"> </ng-icon>\n </gn-ui-button>\n </div>\n <div popinContent class=\"sm:w-64 xs:w-32 py-4 pl-6 pr-9\">\n <p>{{ text }}</p>\n </div>\n</gn-ui-cell-popin>\n" }]
29063
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }], propDecorators: { text: [{
28577
29064
  type: Input
28578
29065
  }], extraClass: [{
28579
29066
  type: Input
29067
+ }], scrollContainer: [{
29068
+ type: Input
29069
+ }], cdkScrollContainer: [{
29070
+ type: Input
28580
29071
  }], textElement: [{
28581
29072
  type: ViewChild,
28582
29073
  args: ['textElement']
@@ -29187,6 +29678,10 @@ marker('record.metadata.quality.updateFrequency.success');
29187
29678
  marker('record.metadata.quality.updateFrequency.failed');
29188
29679
  marker('record.metadata.quality.organisation.success');
29189
29680
  marker('record.metadata.quality.organisation.failed');
29681
+ marker('record.metadata.quality.capabilities.success');
29682
+ marker('record.metadata.quality.capabilities.failed');
29683
+ marker('record.metadata.quality.source.success');
29684
+ marker('record.metadata.quality.source.failed');
29190
29685
  class MetadataQualityItemComponent {
29191
29686
  get icon() {
29192
29687
  return this.value ? 'matCheck' : 'matWarningAmber';
@@ -29210,6 +29705,28 @@ class MetadataQualityComponent {
29210
29705
  constructor() {
29211
29706
  this.smaller = false;
29212
29707
  this.items = [];
29708
+ this.COMMON_CHECKS = {
29709
+ title: (metadata) => !!metadata?.title,
29710
+ description: (metadata) => !!metadata?.abstract,
29711
+ keywords: (metadata) => (metadata?.keywords?.length ?? 0) > 0,
29712
+ legalConstraints: (metadata) => (metadata?.legalConstraints?.length ?? 0) > 0,
29713
+ contact: (metadata) => !!metadata?.contacts?.[0]?.email,
29714
+ };
29715
+ this.SPECIFIC_CHECKS = {
29716
+ dataset: {
29717
+ updateFrequency: (metadata) => !!metadata?.updateFrequency,
29718
+ topic: (metadata) => (metadata?.topics?.length ?? 0) > 0,
29719
+ organisation: (metadata) => !!metadata?.contacts?.[0]?.organization?.name,
29720
+ },
29721
+ service: {
29722
+ capabilities: (metadata) => (metadata?.onlineResources ?? []).some((resource) => this.hasGetCapabilities(resource?.url?.href ?? '')),
29723
+ },
29724
+ reuse: {
29725
+ topic: (metadata) => (metadata?.topics?.length ?? 0) > 0,
29726
+ organisation: (metadata) => !!metadata?.contacts?.[0]?.organization?.name,
29727
+ source: (metadata) => !!metadata?.extras?.sourcesIdentifiers,
29728
+ },
29729
+ };
29213
29730
  }
29214
29731
  get qualityScore() {
29215
29732
  const qualityScore = this.metadata?.extras?.qualityScore;
@@ -29225,17 +29742,20 @@ class MetadataQualityComponent {
29225
29742
  this.items.push({ name, value });
29226
29743
  }
29227
29744
  }
29745
+ hasGetCapabilities(url) {
29746
+ return url.toLowerCase().includes('capabilities');
29747
+ }
29228
29748
  initialize() {
29229
- const contact = this.metadata?.contacts?.[0];
29230
29749
  this.items = [];
29231
- this.add('title', !!this.metadata?.title);
29232
- this.add('description', !!this.metadata?.abstract);
29233
- this.add('topic', this.metadata?.topics?.length > 0);
29234
- this.add('keywords', this.metadata?.keywords?.length > 0);
29235
- this.add('legalConstraints', this.metadata?.legalConstraints?.length > 0);
29236
- this.add('organisation', !!contact?.organization);
29237
- this.add('contact', !!contact?.email);
29238
- this.add('updateFrequency', !!this.metadata?.updateFrequency);
29750
+ Object.entries(this.COMMON_CHECKS).forEach(([name, check]) => {
29751
+ this.add(name, check(this.metadata));
29752
+ });
29753
+ const datasetType = this.metadata?.kind;
29754
+ if (datasetType && this.SPECIFIC_CHECKS[datasetType]) {
29755
+ Object.entries(this.SPECIFIC_CHECKS[datasetType]).forEach(([name, check]) => {
29756
+ this.add(name, check(this.metadata));
29757
+ });
29758
+ }
29239
29759
  }
29240
29760
  ngOnChanges(changes) {
29241
29761
  if (changes['metadata'] || changes['metadataQualityDisplay']) {
@@ -29279,6 +29799,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29279
29799
  type: Input
29280
29800
  }] } });
29281
29801
 
29802
+ class InternalLinkCardContactComponent {
29803
+ constructor() {
29804
+ this.size = 'M';
29805
+ }
29806
+ get organization() {
29807
+ return this.record.ownerOrganization;
29808
+ }
29809
+ get contacts() {
29810
+ return ((this.record.kind === 'dataset'
29811
+ ? this.record.contactsForResource
29812
+ : this.record.contacts) || []);
29813
+ }
29814
+ openExternalUrl(event, url) {
29815
+ event.stopPropagation();
29816
+ window.open(url, '_blank');
29817
+ }
29818
+ openMailto(event, email) {
29819
+ event.stopPropagation();
29820
+ window.open(`mailto:${email}`, '_blank');
29821
+ }
29822
+ copyToClipboard(event, text) {
29823
+ event.stopPropagation();
29824
+ navigator.clipboard.writeText(text);
29825
+ }
29826
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InternalLinkCardContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29827
+ 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: [
29828
+ provideIcons({
29829
+ iconoirInternet,
29830
+ matEmailOutline,
29831
+ matPhoneOutline,
29832
+ matLocationOnOutline,
29833
+ }),
29834
+ ], 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"] }] }); }
29835
+ }
29836
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InternalLinkCardContactComponent, decorators: [{
29837
+ type: Component,
29838
+ args: [{ selector: 'gn-ui-internal-link-card-contact', standalone: true, imports: [NgIf, ThumbnailComponent, NgIconComponent, TranslateModule], providers: [
29839
+ provideIcons({
29840
+ iconoirInternet,
29841
+ matEmailOutline,
29842
+ matPhoneOutline,
29843
+ matLocationOnOutline,
29844
+ }),
29845
+ ], 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" }]
29846
+ }], propDecorators: { record: [{
29847
+ type: Input
29848
+ }], size: [{
29849
+ type: Input
29850
+ }] } });
29851
+
29282
29852
  class InternalLinkCardComponent {
29283
29853
  set size(value) {
29284
29854
  this._size = value;
@@ -29320,28 +29890,19 @@ class InternalLinkCardComponent {
29320
29890
  this.abstract = removeWhitespace(stripHtml(this.record?.abstract));
29321
29891
  this.subscription.add(fromEvent(this.elementRef.nativeElement, 'click').subscribe(() => this.mdSelect.emit(this.record)));
29322
29892
  }
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
29893
  getTitleClass() {
29332
29894
  return this.titleClassMap[this._size];
29333
29895
  }
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');
29896
+ getAbstractClass() {
29897
+ const marginClass = ['S', 'XS'].includes(this.size) ? 'ml-2' : '';
29898
+ const clampClass = this.size === 'L' && !this.record.ownerOrganization?.name
29899
+ ? 'line-clamp-6'
29900
+ : 'line-clamp-2';
29901
+ return `${clampClass} ${marginClass}`.trim();
29341
29902
  }
29342
- copyToClipboard(event, text) {
29343
- event.stopPropagation();
29344
- navigator.clipboard.writeText(text);
29903
+ displayAbstract() {
29904
+ return (this.size === 'L' ||
29905
+ (['M', 'S'].includes(this.size) && !this.record.ownerOrganization?.name));
29345
29906
  }
29346
29907
  get shouldShowThumbnail() {
29347
29908
  return this.size === 'L' || this.size === 'M';
@@ -29351,40 +29912,34 @@ class InternalLinkCardComponent {
29351
29912
  provideIcons({
29352
29913
  iconoirInternet,
29353
29914
  matLocationSearchingOutline,
29354
- matEmailOutline,
29355
- matPhoneOutline,
29356
- matLocationOnOutline,
29357
29915
  }),
29358
29916
  provideNgIconsConfig({
29359
29917
  size: '1.2em',
29360
29918
  }),
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"] }] }); }
29919
+ ], 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
29920
  }
29363
29921
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InternalLinkCardComponent, decorators: [{
29364
29922
  type: Component,
29365
29923
  args: [{ selector: 'gn-ui-internal-link-card', standalone: true, imports: [
29366
29924
  NgClass,
29367
29925
  NgIf,
29368
- ThumbnailComponent,
29369
29926
  MetadataQualityComponent,
29370
29927
  NgTemplateOutlet,
29371
- NgIconComponent,
29372
29928
  TranslateModule,
29373
29929
  GeoDataBadgeComponent,
29374
29930
  KindBadgeComponent,
29375
29931
  MarkdownParserComponent,
29932
+ InternalLinkCardContactComponent,
29933
+ ThumbnailComponent,
29376
29934
  ], providers: [
29377
29935
  provideIcons({
29378
29936
  iconoirInternet,
29379
29937
  matLocationSearchingOutline,
29380
- matEmailOutline,
29381
- matPhoneOutline,
29382
- matLocationOnOutline,
29383
29938
  }),
29384
29939
  provideNgIconsConfig({
29385
29940
  size: '1.2em',
29386
29941
  }),
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" }]
29942
+ ], 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
29943
  }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { record: [{
29389
29944
  type: Input
29390
29945
  }], linkTarget: [{
@@ -31397,7 +31952,8 @@ class UiElementsModule {
31397
31952
  InternalLinkCardComponent,
31398
31953
  ServiceCapabilitiesComponent,
31399
31954
  KindBadgeComponent,
31400
- GeoDataBadgeComponent], exports: [ThumbnailComponent,
31955
+ GeoDataBadgeComponent,
31956
+ ScrollingModule], exports: [ThumbnailComponent,
31401
31957
  AvatarComponent,
31402
31958
  UserPreviewComponent,
31403
31959
  MarkdownParserComponent,
@@ -31430,7 +31986,8 @@ class UiElementsModule {
31430
31986
  InternalLinkCardComponent,
31431
31987
  ServiceCapabilitiesComponent,
31432
31988
  KindBadgeComponent,
31433
- GeoDataBadgeComponent] }); }
31989
+ GeoDataBadgeComponent,
31990
+ ScrollingModule] }); }
31434
31991
  }
31435
31992
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, decorators: [{
31436
31993
  type: NgModule,
@@ -31459,6 +32016,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31459
32016
  ServiceCapabilitiesComponent,
31460
32017
  KindBadgeComponent,
31461
32018
  GeoDataBadgeComponent,
32019
+ ScrollingModule,
31462
32020
  ],
31463
32021
  providers: [
31464
32022
  provideNgIconsConfig({
@@ -31548,48 +32106,130 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31548
32106
  type: Output
31549
32107
  }] } });
31550
32108
 
32109
+ marker('feature.catalog.attribute.type');
32110
+ marker('feature.catalog.attribute.name');
32111
+ marker('feature.catalog.attribute.code');
32112
+ marker('feature.catalog.attribute.definition');
32113
+ marker('feature.catalog.attribute.values');
31551
32114
  class FeatureCatalogListComponent {
31552
32115
  constructor() {
31553
- this.columns = [
31554
- {
31555
- key: 'type',
31556
- label: 'feature.catalog.attribute.type',
31557
- width: '19%',
31558
- },
31559
- {
31560
- key: 'name',
31561
- label: 'feature.catalog.attribute.name',
31562
- width: '32%',
31563
- },
31564
- {
31565
- key: 'code',
31566
- label: 'feature.catalog.attribute.code',
31567
- width: '24%',
31568
- },
31569
- {
31570
- key: 'title',
31571
- label: 'feature.catalog.attribute.description',
31572
- width: '25%',
31573
- },
32116
+ this.COLUMNS_DEFAULT = [
32117
+ { key: 'type', width: '17%' },
32118
+ { key: 'name', width: '32%' },
32119
+ { key: 'code', width: '17%' },
32120
+ { key: 'definition', width: 'minmax(0px, 1fr)' },
31574
32121
  ];
31575
- this.gridTemplateColumns = '';
32122
+ this.COLUMN_VALUES = {
32123
+ key: 'values',
32124
+ width: '73px',
32125
+ class: 'text-center',
32126
+ };
31576
32127
  }
31577
- ngOnInit() {
31578
- this.gridTemplateColumns = this.columns.map((col) => col.width).join(' ');
32128
+ getColumnsDefinition(attrs) {
32129
+ const hasValues = attrs.some((a) => a.values?.length > 0);
32130
+ return [...this.COLUMNS_DEFAULT, ...(hasValues ? [this.COLUMN_VALUES] : [])];
32131
+ }
32132
+ getGridTemplateColumns(attributes) {
32133
+ return this.getColumnsDefinition(attributes)
32134
+ .map((col) => col.width)
32135
+ .join(' ');
32136
+ }
32137
+ trackByColumn(_i, col) {
32138
+ return col.key;
31579
32139
  }
31580
32140
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureCatalogListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
31581
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FeatureCatalogListComponent, isStandalone: true, selector: "gn-ui-feature-catalog-list", inputs: { filteredFeatureCatalog: "filteredFeatureCatalog" }, ngImport: i0, template: "<div class=\"flex flex-col gap-2 py-5 px-5 h-[562px] overflow-y-auto\">\n <div\n *ngFor=\"let featureType of filteredFeatureCatalog?.featureTypes\"\n class=\"rounded shadow bg-white\"\n >\n <gn-ui-expandable-panel\n [collapsed]=\"filteredFeatureCatalog?.featureTypes?.length !== 1\"\n iconColor=\"black\"\n >\n <ng-template #titleTemplate>\n <div class=\"px-2\">\n <div class=\"text-lg font-bold\">{{ featureType.name }}</div>\n <div class=\"text-sm\" *ngIf=\"featureType.definition\">\n {{ featureType.definition }}\n </div>\n </div>\n </ng-template>\n <div\n class=\"grid gap-0\"\n [style.grid-template-columns]=\"gridTemplateColumns\"\n data-cy=\"feature-type-content\"\n >\n <div\n class=\"py-1 px-2 text-sm font-bold text-left border-t\"\n [class.border-l]=\"i > 0\"\n [class.border-gray-300]=\"i > 0\"\n *ngFor=\"let col of columns; let i = index\"\n data-test=\"column-label\"\n >\n {{ col.label | translate }}\n </div>\n <ng-container *ngFor=\"let row of featureType.attributes\">\n <div\n class=\"bg-white text-sm font-normal text-left border-t\"\n [class.border-l]=\"i > 0\"\n [class.border-gray-300]=\"i > 0\"\n *ngFor=\"let col of columns; let i = index\"\n >\n <gn-ui-truncated-text\n extraClass=\"py-3 px-2\"\n [text]=\"row[col.key]\"\n ></gn-ui-truncated-text>\n </div>\n </ng-container>\n </div>\n </gn-ui-expandable-panel>\n </div>\n</div>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "iconColor", "collapsed"] }, { kind: "component", type: TruncatedTextComponent, selector: "gn-ui-truncated-text", inputs: ["text", "extraClass"] }] }); }
32141
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FeatureCatalogListComponent, isStandalone: true, selector: "gn-ui-feature-catalog-list", inputs: { filteredFeatureCatalog: "filteredFeatureCatalog" }, providers: [provideIcons({ iconoirList })], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scrollContainer"], descendants: true }, { propertyName: "scrollable", first: true, predicate: CdkScrollable, descendants: true, static: true }, { propertyName: "panelComponent", first: true, predicate: ["expanel"], descendants: true, read: ExpandablePanelComponent, static: true }], ngImport: i0, template: "<div\n cdkScrollable\n class=\"h-[562px] relative overflow-y-auto overflow-hidden\"\n data-cy=\"feat-catalog-scrollable\"\n>\n <div #scrollContainer class=\"flex flex-col gap-2 py-5 px-5\">\n <div\n *ngFor=\"let featureType of filteredFeatureCatalog?.featureTypes\"\n class=\"rounded shadow bg-white\"\n >\n <gn-ui-expandable-panel\n #expanel\n [collapsed]=\"filteredFeatureCatalog?.featureTypes?.length !== 1\"\n iconColor=\"black\"\n >\n <ng-template #titleTemplate>\n <div class=\"px-2\">\n <div class=\"text-lg font-bold\">{{ featureType.name }}</div>\n <div class=\"text-sm\" *ngIf=\"featureType.definition\">\n {{ featureType.definition }}\n </div>\n </div>\n </ng-template>\n <div\n *ngIf=\"expanel && !expanel.collapsed\"\n class=\"grid gap-0\"\n [style.grid-template-columns]=\"\n getGridTemplateColumns(featureType.attributes)\n \"\n data-cy=\"feature-type-content\"\n >\n <div\n class=\"py-1 px-2 text-sm font-bold text-left border-t break-all\"\n [class.border-l]=\"i > 0\"\n [class.border-gray-300]=\"i > 0\"\n [ngClass]=\"col.class || ''\"\n *ngFor=\"\n let col of getColumnsDefinition(featureType.attributes);\n trackBy: trackByColumn;\n let i = index\n \"\n data-test=\"column-label\"\n >\n {{ 'feature.catalog.attribute.' + col.key | translate }}\n </div>\n <ng-container *ngIf=\"expanel && !expanel.collapsed\">\n <ng-container *ngFor=\"let row of featureType.attributes\">\n <div\n class=\"bg-white text-sm font-normal text-left border-t\"\n [class.border-l]=\"i > 0\"\n [class.border-gray-300]=\"i > 0\"\n *ngFor=\"\n let col of getColumnsDefinition(featureType.attributes);\n trackBy: trackByColumn;\n let i = index\n \"\n data-test=\"cell-content\"\n >\n <ng-container\n *ngIf=\"col.key === 'values'; then tplValues; else defaultTpl\"\n ></ng-container>\n\n <ng-template #defaultTpl>\n <gn-ui-truncated-text\n [scrollContainer]=\"scrollContainer\"\n [cdkScrollContainer]=\"scrollable\"\n [text]=\"row[col.key]\"\n ></gn-ui-truncated-text>\n </ng-template>\n\n <ng-template #tplValues>\n <gn-ui-cell-popin\n #popinRef\n [scrollContainer]=\"scrollContainer\"\n [cdkScrollContainer]=\"scrollable\"\n *ngIf=\"row.values?.length > 0\"\n >\n <div cellContent data-cy=\"values-cell-popin-trigger\">\n <gn-ui-button\n type=\"light\"\n extraClass=\"bg-transparent border-none\"\n (buttonClick)=\"popinRef.openOverlay()\"\n >\n <ng-icon name=\"iconoirList\" size=\"24\"></ng-icon>\n </gn-ui-button>\n </div>\n <div\n popinContent\n class=\"max-h-60 overflow-y-auto min-w-64 py-4 px-6\"\n style=\"scrollbar-width: thin\"\n >\n <ul class=\"list-disc list-inside mr-4\">\n <li *ngFor=\"let v of row.values\">\n {{ v.label || v.code }}\n </li>\n </ul>\n </div>\n </gn-ui-cell-popin>\n </ng-template>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </gn-ui-expandable-panel>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: CellPopinComponent, selector: "gn-ui-cell-popin", inputs: ["extraClass", "cdkScrollContainer", "scrollContainer", "activePopin"] }, { 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: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }, { kind: "component", type: ExpandablePanelComponent, selector: "gn-ui-expandable-panel", inputs: ["title", "iconColor", "collapsed"] }, { kind: "component", type: TruncatedTextComponent, selector: "gn-ui-truncated-text", inputs: ["text", "extraClass", "scrollContainer", "cdkScrollContainer"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i3$2.CdkScrollable, selector: "[cdk-scrollable], [cdkScrollable]" }] }); }
31582
32142
  }
31583
32143
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureCatalogListComponent, decorators: [{
31584
32144
  type: Component,
31585
32145
  args: [{ selector: 'gn-ui-feature-catalog-list', standalone: true, imports: [
32146
+ ButtonComponent,
32147
+ CellPopinComponent,
31586
32148
  CommonModule,
31587
32149
  TranslateModule,
31588
32150
  ExpandablePanelComponent,
31589
32151
  TruncatedTextComponent,
31590
- ], template: "<div class=\"flex flex-col gap-2 py-5 px-5 h-[562px] overflow-y-auto\">\n <div\n *ngFor=\"let featureType of filteredFeatureCatalog?.featureTypes\"\n class=\"rounded shadow bg-white\"\n >\n <gn-ui-expandable-panel\n [collapsed]=\"filteredFeatureCatalog?.featureTypes?.length !== 1\"\n iconColor=\"black\"\n >\n <ng-template #titleTemplate>\n <div class=\"px-2\">\n <div class=\"text-lg font-bold\">{{ featureType.name }}</div>\n <div class=\"text-sm\" *ngIf=\"featureType.definition\">\n {{ featureType.definition }}\n </div>\n </div>\n </ng-template>\n <div\n class=\"grid gap-0\"\n [style.grid-template-columns]=\"gridTemplateColumns\"\n data-cy=\"feature-type-content\"\n >\n <div\n class=\"py-1 px-2 text-sm font-bold text-left border-t\"\n [class.border-l]=\"i > 0\"\n [class.border-gray-300]=\"i > 0\"\n *ngFor=\"let col of columns; let i = index\"\n data-test=\"column-label\"\n >\n {{ col.label | translate }}\n </div>\n <ng-container *ngFor=\"let row of featureType.attributes\">\n <div\n class=\"bg-white text-sm font-normal text-left border-t\"\n [class.border-l]=\"i > 0\"\n [class.border-gray-300]=\"i > 0\"\n *ngFor=\"let col of columns; let i = index\"\n >\n <gn-ui-truncated-text\n extraClass=\"py-3 px-2\"\n [text]=\"row[col.key]\"\n ></gn-ui-truncated-text>\n </div>\n </ng-container>\n </div>\n </gn-ui-expandable-panel>\n </div>\n</div>\n" }]
32152
+ NgIconComponent,
32153
+ ScrollingModule,
32154
+ ], providers: [provideIcons({ iconoirList })], template: "<div\n cdkScrollable\n class=\"h-[562px] relative overflow-y-auto overflow-hidden\"\n data-cy=\"feat-catalog-scrollable\"\n>\n <div #scrollContainer class=\"flex flex-col gap-2 py-5 px-5\">\n <div\n *ngFor=\"let featureType of filteredFeatureCatalog?.featureTypes\"\n class=\"rounded shadow bg-white\"\n >\n <gn-ui-expandable-panel\n #expanel\n [collapsed]=\"filteredFeatureCatalog?.featureTypes?.length !== 1\"\n iconColor=\"black\"\n >\n <ng-template #titleTemplate>\n <div class=\"px-2\">\n <div class=\"text-lg font-bold\">{{ featureType.name }}</div>\n <div class=\"text-sm\" *ngIf=\"featureType.definition\">\n {{ featureType.definition }}\n </div>\n </div>\n </ng-template>\n <div\n *ngIf=\"expanel && !expanel.collapsed\"\n class=\"grid gap-0\"\n [style.grid-template-columns]=\"\n getGridTemplateColumns(featureType.attributes)\n \"\n data-cy=\"feature-type-content\"\n >\n <div\n class=\"py-1 px-2 text-sm font-bold text-left border-t break-all\"\n [class.border-l]=\"i > 0\"\n [class.border-gray-300]=\"i > 0\"\n [ngClass]=\"col.class || ''\"\n *ngFor=\"\n let col of getColumnsDefinition(featureType.attributes);\n trackBy: trackByColumn;\n let i = index\n \"\n data-test=\"column-label\"\n >\n {{ 'feature.catalog.attribute.' + col.key | translate }}\n </div>\n <ng-container *ngIf=\"expanel && !expanel.collapsed\">\n <ng-container *ngFor=\"let row of featureType.attributes\">\n <div\n class=\"bg-white text-sm font-normal text-left border-t\"\n [class.border-l]=\"i > 0\"\n [class.border-gray-300]=\"i > 0\"\n *ngFor=\"\n let col of getColumnsDefinition(featureType.attributes);\n trackBy: trackByColumn;\n let i = index\n \"\n data-test=\"cell-content\"\n >\n <ng-container\n *ngIf=\"col.key === 'values'; then tplValues; else defaultTpl\"\n ></ng-container>\n\n <ng-template #defaultTpl>\n <gn-ui-truncated-text\n [scrollContainer]=\"scrollContainer\"\n [cdkScrollContainer]=\"scrollable\"\n [text]=\"row[col.key]\"\n ></gn-ui-truncated-text>\n </ng-template>\n\n <ng-template #tplValues>\n <gn-ui-cell-popin\n #popinRef\n [scrollContainer]=\"scrollContainer\"\n [cdkScrollContainer]=\"scrollable\"\n *ngIf=\"row.values?.length > 0\"\n >\n <div cellContent data-cy=\"values-cell-popin-trigger\">\n <gn-ui-button\n type=\"light\"\n extraClass=\"bg-transparent border-none\"\n (buttonClick)=\"popinRef.openOverlay()\"\n >\n <ng-icon name=\"iconoirList\" size=\"24\"></ng-icon>\n </gn-ui-button>\n </div>\n <div\n popinContent\n class=\"max-h-60 overflow-y-auto min-w-64 py-4 px-6\"\n style=\"scrollbar-width: thin\"\n >\n <ul class=\"list-disc list-inside mr-4\">\n <li *ngFor=\"let v of row.values\">\n {{ v.label || v.code }}\n </li>\n </ul>\n </div>\n </gn-ui-cell-popin>\n </ng-template>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </gn-ui-expandable-panel>\n </div>\n </div>\n</div>\n" }]
31591
32155
  }], propDecorators: { filteredFeatureCatalog: [{
31592
32156
  type: Input
32157
+ }], scrollContainer: [{
32158
+ type: ViewChild,
32159
+ args: ['scrollContainer']
32160
+ }], scrollable: [{
32161
+ type: ViewChild,
32162
+ args: [CdkScrollable, { static: true }]
32163
+ }], panelComponent: [{
32164
+ type: ViewChild,
32165
+ args: ['expanel', { read: ExpandablePanelComponent, static: true }]
32166
+ }] } });
32167
+
32168
+ class ActionMenuComponent {
32169
+ constructor(dialog, cdr) {
32170
+ this.dialog = dialog;
32171
+ this.cdr = cdr;
32172
+ this.canDuplicate = true;
32173
+ this.canDelete = true;
32174
+ this.duplicate = new EventEmitter();
32175
+ this.delete = new EventEmitter();
32176
+ this.closeActionMenu = new EventEmitter();
32177
+ this.rollback = new EventEmitter();
32178
+ this.switch = new EventEmitter();
32179
+ this.sectionDisplayed = 'mainMenu';
32180
+ }
32181
+ displayMainMenu() {
32182
+ this.sectionDisplayed = 'mainMenu';
32183
+ this.cdr.markForCheck();
32184
+ }
32185
+ displayDeleteMenu() {
32186
+ switch (this.page) {
32187
+ case 'draft':
32188
+ this.sectionDisplayed = 'rollbackMenu';
32189
+ break;
32190
+ case 'record':
32191
+ this.delete.emit();
32192
+ break;
32193
+ case 'main':
32194
+ default:
32195
+ this.sectionDisplayed = 'deleteMenu';
32196
+ }
32197
+ this.cdr.markForCheck();
32198
+ }
32199
+ 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 }); }
32200
+ 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"] }] }); }
32201
+ }
32202
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ActionMenuComponent, decorators: [{
32203
+ type: Component,
32204
+ args: [{ selector: 'gn-ui-action-menu', standalone: true, imports: [
32205
+ CommonModule,
32206
+ ButtonComponent,
32207
+ MatMenuModule,
32208
+ MatDialogModule,
32209
+ ConfirmationDialogComponent,
32210
+ TranslateModule,
32211
+ ], 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" }]
32212
+ }], ctorParameters: () => [{ type: i1$a.MatDialog }, { type: i0.ChangeDetectorRef }], propDecorators: { canDuplicate: [{
32213
+ type: Input
32214
+ }], isDuplicating: [{
32215
+ type: Input
32216
+ }], canDelete: [{
32217
+ type: Input
32218
+ }], page: [{
32219
+ type: Input
32220
+ }], duplicate: [{
32221
+ type: Output
32222
+ }], delete: [{
32223
+ type: Output
32224
+ }], closeActionMenu: [{
32225
+ type: Output
32226
+ }], rollback: [{
32227
+ type: Output
32228
+ }], switch: [{
32229
+ type: Output
32230
+ }], trigger: [{
32231
+ type: ViewChild,
32232
+ args: [MatMenuTrigger]
31593
32233
  }] } });
31594
32234
 
31595
32235
  class UiSearchModule {
@@ -31617,7 +32257,8 @@ class UiSearchModule {
31617
32257
  MatCheckboxModule,
31618
32258
  RouterLink,
31619
32259
  InteractiveTableComponent, i2$2.NgIconsModule, KindBadgeComponent,
31620
- MetadataQualityComponent], exports: [RecordPreviewListComponent,
32260
+ MetadataQualityComponent,
32261
+ ActionMenuComponent], exports: [RecordPreviewListComponent,
31621
32262
  RecordPreviewCardComponent,
31622
32263
  RecordPreviewTextComponent,
31623
32264
  RecordPreviewTitleComponent,
@@ -31628,7 +32269,8 @@ class UiSearchModule {
31628
32269
  ResultsHitsNumberComponent,
31629
32270
  ResultsHitsSearchKindComponent,
31630
32271
  RecordPreviewFeedComponent,
31631
- RecordPreviewRowComponent] }); }
32272
+ RecordPreviewRowComponent,
32273
+ ActionMenuComponent] }); }
31632
32274
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiSearchModule, providers: [
31633
32275
  provideNgIconsConfig({
31634
32276
  size: '1.5em',
@@ -31655,7 +32297,8 @@ class UiSearchModule {
31655
32297
  matHomeWorkOutline,
31656
32298
  }),
31657
32299
  KindBadgeComponent,
31658
- MetadataQualityComponent, FacetsModule$1] }); }
32300
+ MetadataQualityComponent,
32301
+ ActionMenuComponent, FacetsModule$1] }); }
31659
32302
  }
31660
32303
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiSearchModule, decorators: [{
31661
32304
  type: NgModule,
@@ -31698,6 +32341,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31698
32341
  }),
31699
32342
  KindBadgeComponent,
31700
32343
  MetadataQualityComponent,
32344
+ ActionMenuComponent,
31701
32345
  ],
31702
32346
  exports: [
31703
32347
  RecordPreviewListComponent,
@@ -31712,6 +32356,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31712
32356
  ResultsHitsSearchKindComponent,
31713
32357
  RecordPreviewFeedComponent,
31714
32358
  RecordPreviewRowComponent,
32359
+ ActionMenuComponent,
31715
32360
  ],
31716
32361
  providers: [
31717
32362
  provideNgIconsConfig({
@@ -31722,76 +32367,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31722
32367
  }]
31723
32368
  }] });
31724
32369
 
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
32370
  class ResultsTableComponent {
31784
- constructor(overlay, viewContainerRef, cdr, dateService) {
32371
+ constructor(overlay, viewContainerRef, cdr, dateService, translateService) {
31785
32372
  this.overlay = overlay;
31786
32373
  this.viewContainerRef = viewContainerRef;
31787
32374
  this.cdr = cdr;
31788
32375
  this.dateService = dateService;
32376
+ this.translateService = translateService;
31789
32377
  this.records = [];
31790
32378
  this.selectedRecordsIdentifiers = [];
31791
32379
  this.sortOrder = null;
31792
32380
  this.hasDraft = () => false;
31793
32381
  this.canDuplicate = () => true;
31794
- this.canDelete = () => true;
32382
+ this.canDelete = () => of(true);
32383
+ this.canEdit = () => of(true);
31795
32384
  this.isDraftPage = false;
31796
32385
  this.isDuplicating = false;
31797
32386
  // emits the column (field) as well as the order
@@ -31868,9 +32457,13 @@ class ResultsTableComponent {
31868
32457
  return getBadgeColor(format);
31869
32458
  }
31870
32459
  handleRecordClick(item) {
31871
- if ((item?.extras?.edit || this.isDraftPage) && item.kind === 'dataset') {
31872
- this.recordClick.emit(item);
31873
- }
32460
+ this.canEdit(item)
32461
+ .pipe(take$1(1))
32462
+ .subscribe((canEdit) => {
32463
+ if (canEdit) {
32464
+ this.recordClick.emit(item);
32465
+ }
32466
+ });
31874
32467
  }
31875
32468
  handleDuplicate(item) {
31876
32469
  this.duplicateRecord.emit(item);
@@ -31906,8 +32499,18 @@ class ResultsTableComponent {
31906
32499
  handleRecordSelectedChange(selected, record) {
31907
32500
  this.recordsSelectedChange.emit([[record], selected]);
31908
32501
  }
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"] }] }); }
32502
+ isMultilingual(record) {
32503
+ return record.otherLanguages.length > 0;
32504
+ }
32505
+ getTxtHoverMultilingual(record) {
32506
+ return this.translateService.instant('dashboard.records.isMultilingual', {
32507
+ languages: [...[record.defaultLanguage], ...record.otherLanguages].join(', '),
32508
+ });
32509
+ }
32510
+ 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 }); }
32511
+ 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: [
32512
+ provideIcons({ iconoirUser, iconoirLock, iconoirTranslate, matMoreVert }),
32513
+ ], 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
32514
  }
31912
32515
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableComponent, decorators: [{
31913
32516
  type: Component,
@@ -31921,8 +32524,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31921
32524
  ActionMenuComponent,
31922
32525
  NgIconComponent,
31923
32526
  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: [{
32527
+ ], providers: [
32528
+ provideIcons({ iconoirUser, iconoirLock, iconoirTranslate, matMoreVert }),
32529
+ ], 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"] }]
32530
+ }], ctorParameters: () => [{ type: i1$8.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: DateService }, { type: i1$1.TranslateService }], propDecorators: { records: [{
31926
32531
  type: Input
31927
32532
  }], selectedRecordsIdentifiers: [{
31928
32533
  type: Input
@@ -31934,6 +32539,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31934
32539
  type: Input
31935
32540
  }], canDelete: [{
31936
32541
  type: Input
32542
+ }], canEdit: [{
32543
+ type: Input
31937
32544
  }], isDraftPage: [{
31938
32545
  type: Input
31939
32546
  }], isDuplicating: [{
@@ -32182,9 +32789,10 @@ const FIELDS_SUMMARY = [
32182
32789
  'userSavedCount',
32183
32790
  'cl_topic',
32184
32791
  'cl_maintenanceAndUpdateFrequency',
32185
- 'MD_LegalConstraintsUseLimitationObject',
32792
+ 'MD_LegalConstraints*Object',
32186
32793
  'qualityScore',
32187
32794
  'allKeywords',
32795
+ 'recordLink',
32188
32796
  ];
32189
32797
  const FIELDS_BRIEF = [
32190
32798
  ...FIELDS_SUMMARY,
@@ -33007,11 +33615,11 @@ class FuzzySearchComponent {
33007
33615
  this.isSearchActive.emit(event);
33008
33616
  }
33009
33617
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FuzzySearchComponent, deps: [{ token: SearchFacade }, { token: SearchService }, { token: RecordsRepositoryInterface }], target: i0.ɵɵFactoryTarget.Component }); }
33010
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FuzzySearchComponent, selector: "gn-ui-fuzzy-search", inputs: { autoFocus: "autoFocus", forceTrackPosition: "forceTrackPosition", enterButton: "enterButton" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted", isSearchActive: "isSearchActive" }, viewQueries: [{ propertyName: "autocomplete", first: true, predicate: AutocompleteComponent, descendants: true }], ngImport: i0, template: "<gn-ui-autocomplete\n [placeholder]=\"'search.field.any.placeholder' | translate\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n (inputSubmitted)=\"handleInputSubmission($event)\"\n (inputCleared)=\"handleInputCleared()\"\n (isSearchActive)=\"handleSearchActive($event)\"\n [value]=\"searchInputValue$ | async\"\n [preventCompleteOnSelection]=\"true\"\n [autoFocus]=\"autoFocus\"\n [allowSubmit]=\"true\"\n [forceTrackPosition]=\"forceTrackPosition\"\n [enterButton]=\"enterButton\"\n></gn-ui-autocomplete>\n", styles: [""], dependencies: [{ kind: "component", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: ["placeholder", "enterButton", "action", "value", "clearOnSelection", "preventCompleteOnSelection", "autoFocus", "minCharacterCount", "allowSubmit", "forceTrackPosition", "displayWithFn"], outputs: ["itemSelected", "inputSubmitted", "inputCleared", "isSearchActive"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33618
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FuzzySearchComponent, selector: "gn-ui-fuzzy-search", inputs: { autoFocus: "autoFocus", forceTrackPosition: "forceTrackPosition", enterButton: "enterButton", placeholder: "placeholder" }, outputs: { itemSelected: "itemSelected", inputSubmitted: "inputSubmitted", isSearchActive: "isSearchActive" }, viewQueries: [{ propertyName: "autocomplete", first: true, predicate: AutocompleteComponent, descendants: true }], ngImport: i0, template: "<gn-ui-autocomplete\n [placeholder]=\"placeholder ?? ('search.field.any.placeholder' | translate)\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n (inputSubmitted)=\"handleInputSubmission($event)\"\n (inputCleared)=\"handleInputCleared()\"\n (isSearchActive)=\"handleSearchActive($event)\"\n [value]=\"searchInputValue$ | async\"\n [preventCompleteOnSelection]=\"true\"\n [autoFocus]=\"autoFocus\"\n [allowSubmit]=\"true\"\n [forceTrackPosition]=\"forceTrackPosition\"\n [enterButton]=\"enterButton\"\n></gn-ui-autocomplete>\n", styles: [""], dependencies: [{ kind: "component", type: AutocompleteComponent, selector: "gn-ui-autocomplete", inputs: ["placeholder", "enterButton", "action", "value", "clearOnSelection", "preventCompleteOnSelection", "autoFocus", "minCharacterCount", "allowSubmit", "forceTrackPosition", "displayWithFn"], outputs: ["itemSelected", "inputSubmitted", "inputCleared", "isSearchActive"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "pipe", type: i1$1.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
33011
33619
  }
33012
33620
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FuzzySearchComponent, decorators: [{
33013
33621
  type: Component,
33014
- args: [{ selector: 'gn-ui-fuzzy-search', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-autocomplete\n [placeholder]=\"'search.field.any.placeholder' | translate\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n (inputSubmitted)=\"handleInputSubmission($event)\"\n (inputCleared)=\"handleInputCleared()\"\n (isSearchActive)=\"handleSearchActive($event)\"\n [value]=\"searchInputValue$ | async\"\n [preventCompleteOnSelection]=\"true\"\n [autoFocus]=\"autoFocus\"\n [allowSubmit]=\"true\"\n [forceTrackPosition]=\"forceTrackPosition\"\n [enterButton]=\"enterButton\"\n></gn-ui-autocomplete>\n" }]
33622
+ args: [{ selector: 'gn-ui-fuzzy-search', changeDetection: ChangeDetectionStrategy.OnPush, template: "<gn-ui-autocomplete\n [placeholder]=\"placeholder ?? ('search.field.any.placeholder' | translate)\"\n [displayWithFn]=\"displayWithFn\"\n [action]=\"autoCompleteAction\"\n (itemSelected)=\"handleItemSelection($event)\"\n (inputSubmitted)=\"handleInputSubmission($event)\"\n (inputCleared)=\"handleInputCleared()\"\n (isSearchActive)=\"handleSearchActive($event)\"\n [value]=\"searchInputValue$ | async\"\n [preventCompleteOnSelection]=\"true\"\n [autoFocus]=\"autoFocus\"\n [allowSubmit]=\"true\"\n [forceTrackPosition]=\"forceTrackPosition\"\n [enterButton]=\"enterButton\"\n></gn-ui-autocomplete>\n" }]
33015
33623
  }], ctorParameters: () => [{ type: SearchFacade }, { type: SearchService }, { type: RecordsRepositoryInterface }], propDecorators: { autocomplete: [{
33016
33624
  type: ViewChild,
33017
33625
  args: [AutocompleteComponent]
@@ -33021,6 +33629,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
33021
33629
  type: Input
33022
33630
  }], enterButton: [{
33023
33631
  type: Input
33632
+ }], placeholder: [{
33633
+ type: Input
33024
33634
  }], itemSelected: [{
33025
33635
  type: Output
33026
33636
  }], inputSubmitted: [{
@@ -34265,14 +34875,21 @@ class ResultsTableContainerComponent {
34265
34875
  this.recordsRepository = recordsRepository;
34266
34876
  this.notificationsService = notificationsService;
34267
34877
  this.translateService = translateService;
34268
- this.canDuplicate = () => true;
34269
- this.canDelete = () => true;
34270
34878
  this.recordClick = new EventEmitter();
34271
34879
  this.duplicateRecord = new EventEmitter();
34272
34880
  this.subscription = new Subscription();
34273
34881
  this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
34274
34882
  this.sortBy$ = this.searchFacade.sortBy$;
34275
34883
  this.hasDraft = (record) => this.recordsRepository.recordHasDraft(record.uniqueIdentifier);
34884
+ this.canDuplicate = (record) => {
34885
+ return this.recordsRepository.canDuplicate(record);
34886
+ };
34887
+ this.canDelete = (record) => {
34888
+ return this.recordsRepository.canDelete(record);
34889
+ };
34890
+ this.canEdit = (record) => {
34891
+ return this.recordsRepository.canEditIndexedRecord(record);
34892
+ };
34276
34893
  }
34277
34894
  handleRecordClick(item) {
34278
34895
  this.recordClick.emit(item);
@@ -34317,16 +34934,12 @@ class ResultsTableContainerComponent {
34317
34934
  this.subscription.unsubscribe();
34318
34935
  }
34319
34936
  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"] }] }); }
34937
+ 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
34938
  }
34322
34939
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableContainerComponent, decorators: [{
34323
34940
  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: [{
34941
+ 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" }]
34942
+ }], ctorParameters: () => [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }, { type: RecordsRepositoryInterface }, { type: NotificationsService }, { type: i1$1.TranslateService }], propDecorators: { isDuplicating: [{
34330
34943
  type: Input
34331
34944
  }], recordClick: [{
34332
34945
  type: Output
@@ -35963,7 +36576,7 @@ class AddLayerFromCatalogComponent {
35963
36576
  ADDLAYER: new ResultsLayoutConfigItem(AddLayerRecordPreviewComponent, 'py-2', '', 'flex flex-col divide-y divide-y-grey-50'),
35964
36577
  },
35965
36578
  },
35966
- ], ngImport: i0, template: "<div class=\"h-full text-sm\">\n <gn-ui-fuzzy-search></gn-ui-fuzzy-search>\n <gn-ui-results-list-container\n layout=\"ADDLAYER\"\n ></gn-ui-results-list-container>\n</div>\n", styles: ["::ng-deep .mat-tab-body-wrapper{flex-grow:1}\n"], dependencies: [{ kind: "ngmodule", type: FeatureSearchModule }, { kind: "component", type: FuzzySearchComponent, selector: "gn-ui-fuzzy-search", inputs: ["autoFocus", "forceTrackPosition", "enterButton"], outputs: ["itemSelected", "inputSubmitted", "isSearchActive"] }, { kind: "component", type: ResultsListContainerComponent, selector: "gn-ui-results-list-container", inputs: ["metadataQualityDisplay", "layout", "showMore"], outputs: ["mdSelect"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
36579
+ ], ngImport: i0, template: "<div class=\"h-full text-sm\">\n <gn-ui-fuzzy-search></gn-ui-fuzzy-search>\n <gn-ui-results-list-container\n layout=\"ADDLAYER\"\n ></gn-ui-results-list-container>\n</div>\n", styles: ["::ng-deep .mat-tab-body-wrapper{flex-grow:1}\n"], dependencies: [{ kind: "ngmodule", type: FeatureSearchModule }, { kind: "component", type: FuzzySearchComponent, selector: "gn-ui-fuzzy-search", inputs: ["autoFocus", "forceTrackPosition", "enterButton", "placeholder"], outputs: ["itemSelected", "inputSubmitted", "isSearchActive"] }, { kind: "component", type: ResultsListContainerComponent, selector: "gn-ui-results-list-container", inputs: ["metadataQualityDisplay", "layout", "showMore"], outputs: ["mdSelect"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
35967
36580
  }
35968
36581
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AddLayerFromCatalogComponent, decorators: [{
35969
36582
  type: Component,
@@ -36249,6 +36862,8 @@ const closeMetadata = createAction('[Metadata view] close');
36249
36862
  Related actions
36250
36863
  */
36251
36864
  const setRelated = createAction('[Metadata view] Set related records', props());
36865
+ const setSources = createAction('[Metadata view] Set sources', props());
36866
+ const setSourceOf = createAction('[Metadata view] Set has sources', props());
36252
36867
  /*
36253
36868
  ChartConfig actions
36254
36869
  */
@@ -36280,7 +36895,9 @@ var mdview_actions = /*#__PURE__*/Object.freeze({
36280
36895
  loadUserFeedbacksSuccess: loadUserFeedbacksSuccess,
36281
36896
  setChartConfig: setChartConfig,
36282
36897
  setIncompleteMetadata: setIncompleteMetadata,
36283
- setRelated: setRelated
36898
+ setRelated: setRelated,
36899
+ setSourceOf: setSourceOf,
36900
+ setSources: setSources
36284
36901
  });
36285
36902
 
36286
36903
  const METADATA_VIEW_FEATURE_STATE_KEY = 'metadataView';
@@ -36323,6 +36940,12 @@ on(loadFullMetadata, (state) => ({
36323
36940
  on(setRelated, (state, { related }) => ({
36324
36941
  ...state,
36325
36942
  related,
36943
+ })), on(setSources, (state, { sources }) => ({
36944
+ ...state,
36945
+ sources,
36946
+ })), on(setSourceOf, (state, { sourceOf }) => ({
36947
+ ...state,
36948
+ sourceOf,
36326
36949
  })),
36327
36950
  /*
36328
36951
  ChartConfig reducers
@@ -36384,6 +37007,8 @@ const getMetadataError = createSelector(getMdViewState, (state) => state.error);
36384
37007
  Related selectors
36385
37008
  */
36386
37009
  const getRelated = createSelector(getMdViewState, (state) => state.related);
37010
+ const getSources = createSelector(getMdViewState, (state) => state.sources);
37011
+ const getSourceOf = createSelector(getMdViewState, (state) => state.sourceOf);
36387
37012
  /*
36388
37013
  Metadata selectors
36389
37014
  */
@@ -37814,7 +38439,7 @@ class DataTableComponent {
37814
38439
  }
37815
38440
  }
37816
38441
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataTableComponent, deps: [{ token: i0.ElementRef }, { token: i0.ChangeDetectorRef }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
37817
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DataTableComponent, isStandalone: true, selector: "gn-ui-data-table", inputs: { featureAttributes: "featureAttributes", dataset: "dataset", activeId: "activeId" }, outputs: { selected: "selected" }, providers: [{ provide: MatPaginatorIntl, useClass: CustomMatPaginatorIntl }], viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"flex flex-col border border-gray-300 rounded-lg bg-white h-full\">\n <div class=\"flex-1 overflow-y-hidden overflow-x-auto rounded-lg relative\">\n <table\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n (matSortChange)=\"setSort($event)\"\n [matSortDisableClear]=\"true\"\n *ngrxLet=\"properties$ as properties\"\n >\n <ng-container\n *ngFor=\"let attr of _featureAttributes\"\n [matColumnDef]=\"attr.value\"\n >\n <th\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header\n class=\"text-sm text-black bg-white\"\n >\n {{ attr.label }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let element\"\n class=\"whitespace-nowrap pr-1 truncate\"\n >\n {{ element[attr.value] }}\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"properties; sticky: true\"></tr>\n <tr\n [id]=\"getRowEltId(row.id)\"\n mat-row\n *matRowDef=\"let row; columns: properties\"\n (click)=\"selected.emit(row)\"\n [class.active]=\"\n activeId !== undefined && activeId !== null && row.id === activeId\n \"\n ></tr>\n </table>\n <gn-ui-loading-mask\n *ngIf=\"loading$ | async\"\n class=\"sticky inset-0\"\n [message]=\"'table.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0 z-[100]\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n <div class=\"flex justify-between items-center overflow-hidden\">\n <div class=\"text-gray-900 px-4 py-2 text-sm\">\n <span class=\"count font-extrabold text-primary\">{{ count }}</span\n >&nbsp;<span translate>table.object.count</span>.\n </div>\n\n <mat-paginator\n class=\"my-[-16px]\"\n (page)=\"setPagination()\"\n [length]=\"count\"\n [pageSize]=\"10\"\n [showFirstLastButtons]=\"true\"\n [hidePageSize]=\"true\"\n ></mat-paginator>\n </div>\n</div>\n", styles: ["table{width:100%;background:#fff}th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding-right:20px}tr.mat-mdc-row,tr.mat-mdc-footer-row{height:36px}tr:hover{background:#f5f5f5}tr.mat-mdc-header-row{height:48px}[mat-header-cell]{color:#0000008a;font-size:12px;font-weight:500}tr{cursor:pointer}.active .mat-mdc-cell{color:var(--color-primary)}.mat-mdc-paginator{background:none}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i2$4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i2$4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2$4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i2$4.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2$4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2$4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i2$4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2$4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i2$4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i2$4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i3$2.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i3$2.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i4.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: ScrollingModule }, { 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: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "directive", type: LetDirective, selector: "[ngrxLet]", inputs: ["ngrxLet", "ngrxLetSuspenseTpl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
38442
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DataTableComponent, isStandalone: true, selector: "gn-ui-data-table", inputs: { featureAttributes: "featureAttributes", dataset: "dataset", activeId: "activeId" }, outputs: { selected: "selected" }, providers: [{ provide: MatPaginatorIntl, useClass: CustomMatPaginatorIntl }], viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div class=\"flex flex-col border border-gray-300 rounded-lg bg-white h-full\">\n <div class=\"flex-1 overflow-y-hidden overflow-x-auto rounded-lg relative\">\n <table\n mat-table\n [dataSource]=\"dataSource\"\n matSort\n (matSortChange)=\"setSort($event)\"\n [matSortDisableClear]=\"true\"\n *ngrxLet=\"properties$ as properties\"\n >\n <ng-container\n *ngFor=\"let attr of _featureAttributes\"\n [matColumnDef]=\"attr.value\"\n >\n <th\n mat-header-cell\n *matHeaderCellDef\n mat-sort-header\n class=\"text-sm text-black bg-white\"\n >\n {{ attr.label }}\n </th>\n <td\n mat-cell\n *matCellDef=\"let element\"\n class=\"whitespace-nowrap pr-1 truncate\"\n >\n {{ element[attr.value] }}\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"properties; sticky: true\"></tr>\n <tr\n [id]=\"getRowEltId(row.id)\"\n mat-row\n *matRowDef=\"let row; columns: properties\"\n (click)=\"selected.emit(row)\"\n [class.active]=\"\n activeId !== undefined && activeId !== null && row.id === activeId\n \"\n ></tr>\n </table>\n <gn-ui-loading-mask\n *ngIf=\"loading$ | async\"\n class=\"sticky inset-0\"\n [message]=\"'table.loading.data' | translate\"\n ></gn-ui-loading-mask>\n <gn-ui-popup-alert\n *ngIf=\"error\"\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"absolute m-2 inset-0 z-[100]\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n <div class=\"flex justify-between items-center overflow-hidden\">\n <div class=\"text-gray-900 px-4 py-2 text-sm\">\n <span class=\"count font-extrabold text-primary\">{{ count }}</span\n >&nbsp;<span translate>table.object.count</span>.\n </div>\n\n <mat-paginator\n class=\"my-[-16px]\"\n (page)=\"setPagination()\"\n [length]=\"count\"\n [pageSize]=\"10\"\n [showFirstLastButtons]=\"true\"\n [hidePageSize]=\"true\"\n ></mat-paginator>\n </div>\n</div>\n", styles: ["table{width:100%;background:#fff}th.mat-mdc-header-cell,td.mat-mdc-cell,td.mat-mdc-footer-cell{padding-right:20px}tr.mat-mdc-row,tr.mat-mdc-footer-row{height:36px}tr:hover{background:#f5f5f5}tr.mat-mdc-header-row{height:48px}[mat-header-cell]{color:#0000008a;font-size:12px;font-weight:500}tr{cursor:pointer}.active .mat-mdc-cell{color:var(--color-primary)}.mat-mdc-paginator{background:none}\n"], dependencies: [{ kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i2$4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i2$4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i2$4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i2$4.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i2$4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i2$4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i2$4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i2$4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i2$4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i2$4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: MatSortModule }, { kind: "directive", type: i3$3.MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "component", type: i3$3.MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "ngmodule", type: MatPaginatorModule }, { kind: "component", type: i4.MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }, { kind: "ngmodule", type: ScrollingModule }, { 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: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { kind: "directive", type: LetDirective, selector: "[ngrxLet]", inputs: ["ngrxLet", "ngrxLetSuspenseTpl"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
37818
38443
  }
37819
38444
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataTableComponent, decorators: [{
37820
38445
  type: Component,
@@ -38415,6 +39040,8 @@ class MdViewFacade {
38415
39040
  }));
38416
39041
  this.error$ = this.store.pipe(select(getMetadataError));
38417
39042
  this.related$ = this.store.pipe(select(getRelated));
39043
+ this.sources$ = this.store.pipe(select(getSources));
39044
+ this.sourceOf$ = this.store.pipe(select(getSourceOf));
38418
39045
  this.chartConfig$ = this.store.pipe(select(getChartConfig));
38419
39046
  this.allLinks$ = this.metadata$.pipe(map$1((record) => 'onlineResources' in record ? record.onlineResources : []), shareReplay(1));
38420
39047
  this.apiLinks$ = this.allLinks$.pipe(map$1((links) => links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.API))), shareReplay(1));
@@ -38516,6 +39143,12 @@ class MdViewEffects {
38516
39143
  this.loadRelatedRecords$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadataSuccess), switchMap$1(({ full }) => this.recordsRepository.getSimilarRecords(full)), map$1((related) => {
38517
39144
  return setRelated({ related });
38518
39145
  }), catchError((error) => of(setRelated({ related: null })))));
39146
+ this.loadSources$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadataSuccess), switchMap$1(({ full }) => this.recordsRepository.getSources(full)), map$1((sources) => {
39147
+ return setSources({ sources });
39148
+ }), catchError(() => of(setSources({ sources: null })))));
39149
+ this.loadSourceOf$ = createEffect(() => this.actions$.pipe(ofType(loadFullMetadataSuccess), switchMap$1(({ full }) => this.recordsRepository.getSourceOf(full)), map$1((sourceOf) => {
39150
+ return setSourceOf({ sourceOf });
39151
+ }), catchError(() => of(setSourceOf({ sourceOf: null })))));
38519
39152
  /*
38520
39153
  UserFeedback effects
38521
39154
  */
@@ -42726,17 +43359,256 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
42726
43359
  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
43360
  }], ctorParameters: () => [{ type: EditorFacade }] });
42728
43361
 
43362
+ const extraFlagMap = {
43363
+ ar: 'arab',
43364
+ en: 'gb',
43365
+ ko: 'kr',
43366
+ cs: 'cz',
43367
+ zh: 'cn',
43368
+ ca: 'es-ct',
43369
+ rm: 'ch',
43370
+ da: 'dk',
43371
+ sv: 'se',
43372
+ cy: 'gb-wls',
43373
+ hy: 'am',
43374
+ ka: 'ge',
43375
+ uk: 'ua',
43376
+ };
42729
43377
  class MultilingualPanelComponent {
42730
- constructor() {
42731
- this.translationsEnabled = false;
43378
+ set record(value) {
43379
+ this._record = value;
43380
+ this.isMultilingual = value.otherLanguages.length > 0;
43381
+ this.editTranslations = false;
43382
+ this.recordLanguages = [...value.otherLanguages, value.defaultLanguage];
43383
+ this.selectedLanguages = this.recordLanguages;
43384
+ this.formLanguage = value.defaultLanguage;
43385
+ }
43386
+ constructor(facade, dialog, translateService, recordsRepository, overlay, viewContainerRef, cdr) {
43387
+ this.facade = facade;
43388
+ this.dialog = dialog;
43389
+ this.translateService = translateService;
43390
+ this.recordsRepository = recordsRepository;
43391
+ this.overlay = overlay;
43392
+ this.viewContainerRef = viewContainerRef;
43393
+ this.cdr = cdr;
43394
+ this.selectedLanguages = [];
43395
+ this.recordLanguages = [];
43396
+ this.formLanguage = '';
43397
+ this.isActionMenuOpen = false;
43398
+ this.subscription = new Subscription();
43399
+ this.supportedLanguages$ = this.recordsRepository
43400
+ .getApplicationLanguages()
43401
+ .pipe(map$2((languages) => this.sortLanguages(languages)));
43402
+ }
43403
+ ngOnDestroy() {
43404
+ this.subscription.unsubscribe();
43405
+ }
43406
+ sortLanguages(languages) {
43407
+ return languages
43408
+ .map((lang) => {
43409
+ const label = this.translateService.instant('language.' + lang);
43410
+ const isTranslated = label !== 'language.' + lang;
43411
+ return {
43412
+ lang,
43413
+ label,
43414
+ isTranslated,
43415
+ };
43416
+ })
43417
+ .sort((a, b) => {
43418
+ if (a.isTranslated && !b.isTranslated)
43419
+ return -1;
43420
+ if (!a.isTranslated && b.isTranslated)
43421
+ return 1;
43422
+ return a.label.localeCompare(b.label);
43423
+ })
43424
+ .map((item) => item.lang);
43425
+ }
43426
+ toggleLanguageSelection() {
43427
+ this.editTranslations = !this.editTranslations;
43428
+ }
43429
+ getIconClass(lang) {
43430
+ return extraFlagMap[lang]
43431
+ ? `fi fi-${extraFlagMap[lang]} w-4 h-3`
43432
+ : `fi fi-${lang} w-4 h-3`;
43433
+ }
43434
+ switchMultilingual() {
43435
+ if (this.isMultilingual && this.selectedLanguages.length > 1) {
43436
+ this.confirmDeleteAction();
43437
+ }
43438
+ else {
43439
+ this.isMultilingual = true;
43440
+ this.editTranslations = true;
43441
+ }
43442
+ }
43443
+ getExtraClass(lang) {
43444
+ const baseClass = 'h-[34px] w-full font-bold justify-start hover:bg-white';
43445
+ if (this.selectedLanguages.includes(lang)) {
43446
+ return `${baseClass} bg-white border border-black`;
43447
+ }
43448
+ return baseClass;
43449
+ }
43450
+ toggleLanguage(lang) {
43451
+ if (this.selectedLanguages.includes(lang)) {
43452
+ this.removeSelectedLanguage(lang);
43453
+ }
43454
+ else {
43455
+ this.selectedLanguages.push(lang);
43456
+ }
43457
+ }
43458
+ removeSelectedLanguage(lang) {
43459
+ this.selectedLanguages = this.selectedLanguages.filter((language) => language !== lang);
43460
+ }
43461
+ validateTranslations() {
43462
+ const equalLength = this.selectedLanguages.length === this.recordLanguages.length;
43463
+ if (this.selectedLanguages.length < this.recordLanguages.length ||
43464
+ (equalLength && this.selectedLanguages !== this.recordLanguages)) {
43465
+ this.confirmDeleteAction(this.selectedLanguages);
43466
+ }
43467
+ else {
43468
+ this.updateTranslations();
43469
+ }
43470
+ }
43471
+ updateTranslations() {
43472
+ this.facade.updateRecordField('otherLanguages', this.selectedLanguages.filter((lang) => lang !== this.formLanguage));
43473
+ this.recordLanguages = this.selectedLanguages;
43474
+ this.editTranslations = false;
43475
+ }
43476
+ switchFormLang(lang) {
43477
+ // TO IMPLEMENT FURTHER
43478
+ }
43479
+ switchDefaultLang(lang) {
43480
+ this.formLanguage = lang;
43481
+ this.facade.updateRecordField('defaultLanguage', lang);
43482
+ this.facade.updateRecordField('otherLanguages', this.selectedLanguages.filter((lang) => lang !== this.formLanguage));
43483
+ this.closeActionMenu();
43484
+ }
43485
+ confirmDeleteAction(lang) {
43486
+ const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
43487
+ data: {
43488
+ title: this.translateService.instant('editor.record.multilingual.confirmation.title'),
43489
+ message: this.translateService.instant('editor.record.multilingual.confirmation.message'),
43490
+ confirmText: this.translateService.instant('editor.record.multilingual.confirmation.confirmText'),
43491
+ cancelText: this.translateService.instant('editor.record.multilingual.confirmation.cancelText'),
43492
+ },
43493
+ restoreFocus: true,
43494
+ });
43495
+ this.subscription.add(dialogRef.afterClosed().subscribe((confirmed) => {
43496
+ if (confirmed) {
43497
+ if (lang) {
43498
+ if (!Array.isArray(lang)) {
43499
+ this.removeSelectedLanguage(lang);
43500
+ this.closeActionMenu();
43501
+ }
43502
+ this.updateTranslations();
43503
+ }
43504
+ else {
43505
+ this.facade.updateRecordField('otherLanguages', []);
43506
+ this.isMultilingual = false;
43507
+ this.selectedLanguages = [];
43508
+ }
43509
+ }
43510
+ else {
43511
+ this.isMultilingual = true;
43512
+ this.selectedLanguages = this.recordLanguages;
43513
+ }
43514
+ this.editTranslations = false;
43515
+ }));
43516
+ }
43517
+ isFirstUnsupported(index) {
43518
+ const langs = this.sortLanguages(this.recordLanguages);
43519
+ return (langs[index].length === 3 &&
43520
+ langs.slice(0, index).every((lang) => lang.length !== 3));
43521
+ }
43522
+ isLangSupported(lang) {
43523
+ return lang.length === 2;
42732
43524
  }
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"] }] }); }
43525
+ getToggleTitle(lang) {
43526
+ if (lang === this._record.defaultLanguage) {
43527
+ return this.translateService.instant('editor.record.form.multilingual.forbidden');
43528
+ }
43529
+ return '';
43530
+ }
43531
+ openActionMenu(item, template) {
43532
+ this.isActionMenuOpen = true;
43533
+ const index = this.sortLanguages(this.selectedLanguages).indexOf(item);
43534
+ const buttonElement = this.actionMenuButtons.toArray()[index];
43535
+ const positionStrategy = this.overlay
43536
+ .position()
43537
+ .flexibleConnectedTo(buttonElement)
43538
+ .withFlexibleDimensions(true)
43539
+ .withPush(true)
43540
+ .withPositions([
43541
+ {
43542
+ originX: 'end',
43543
+ originY: 'bottom',
43544
+ overlayX: 'end',
43545
+ overlayY: 'top',
43546
+ },
43547
+ {
43548
+ originX: 'end',
43549
+ originY: 'top',
43550
+ overlayX: 'end',
43551
+ overlayY: 'bottom',
43552
+ },
43553
+ ]);
43554
+ this.overlayRef = this.overlay.create({
43555
+ hasBackdrop: true,
43556
+ backdropClass: 'cdk-overlay-transparent-backdrop',
43557
+ positionStrategy: positionStrategy,
43558
+ scrollStrategy: this.overlay.scrollStrategies.reposition(),
43559
+ });
43560
+ const portal = new TemplatePortal(template, this.viewContainerRef);
43561
+ this.overlayRef.attach(portal);
43562
+ this.subscription.add(this.overlayRef.backdropClick().subscribe(() => {
43563
+ this.closeActionMenu();
43564
+ }));
43565
+ }
43566
+ closeActionMenu() {
43567
+ if (this.overlayRef) {
43568
+ this.isActionMenuOpen = false;
43569
+ this.overlayRef.dispose();
43570
+ this.cdr.markForCheck();
43571
+ }
43572
+ }
43573
+ 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 }); }
43574
+ 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: [
43575
+ provideIcons({
43576
+ iconoirSettings,
43577
+ matMoreHorizOutline,
43578
+ iconoirCheckCircle,
43579
+ iconoirCircle,
43580
+ }),
43581
+ provideNgIconsConfig({
43582
+ size: '1.25em',
43583
+ }),
43584
+ ], 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
43585
  }
42736
43586
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MultilingualPanelComponent, decorators: [{
42737
43587
  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
- }] });
43588
+ args: [{ selector: 'gn-ui-multilingual-panel', standalone: true, imports: [
43589
+ CommonModule,
43590
+ CheckToggleComponent,
43591
+ TranslateModule,
43592
+ ButtonComponent,
43593
+ NgIconComponent,
43594
+ ActionMenuComponent,
43595
+ ], providers: [
43596
+ provideIcons({
43597
+ iconoirSettings,
43598
+ matMoreHorizOutline,
43599
+ iconoirCheckCircle,
43600
+ iconoirCircle,
43601
+ }),
43602
+ provideNgIconsConfig({
43603
+ size: '1.25em',
43604
+ }),
43605
+ ], 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" }]
43606
+ }], 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: [{
43607
+ type: Input
43608
+ }], actionMenuButtons: [{
43609
+ type: ViewChildren,
43610
+ args: ['actionMenuButton', { read: ElementRef }]
43611
+ }] } });
42740
43612
 
42741
43613
  const ROUTER_STATE_KEY = 'router';
42742
43614
  const ROUTER_ROUTE_SEARCH = 'search';
@@ -43139,7 +44011,7 @@ class DefaultRouterModule {
43139
44011
  };
43140
44012
  }
43141
44013
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DefaultRouterModule, deps: [{ token: RouterService }], target: i0.ɵɵFactoryTarget.NgModule }); }
43142
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: DefaultRouterModule, declarations: [SearchRouterContainerDirective], imports: [i1$3.StoreFeatureModule, i3$3.StoreRouterConnectingModule, i1$b.EffectsFeatureModule], exports: [SearchRouterContainerDirective] }); }
44014
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.13", ngImport: i0, type: DefaultRouterModule, declarations: [SearchRouterContainerDirective], imports: [i1$3.StoreFeatureModule, i3$4.StoreRouterConnectingModule, i1$b.EffectsFeatureModule], exports: [SearchRouterContainerDirective] }); }
43143
44015
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DefaultRouterModule, providers: [
43144
44016
  RouterFacade,
43145
44017
  {
@@ -43182,5 +44054,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
43182
44054
  * Generated bundle index. Do not edit.
43183
44055
  */
43184
44056
 
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 };
44057
+ export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, ActionMenuComponent, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, ApplicationBannerComponent, AuthService, AutocompleteComponent, AvailableServicesField, AvatarComponent, AvatarServiceInterface, BASEMAP_LAYERS, BadgeComponent, BaseConverter, BaseFileReader, BaseReader, BlockListComponent, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CarouselComponent, CatalogTitleComponent, CellPopinComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ClearError, ClearResults, ColorScaleComponent, ConfirmationDialogComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_GN4_LOGIN_URL, DEFAULT_GN4_LOGOUT_URL, DEFAULT_GN4_SETTINGS_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DO_NOT_USE_DEFAULT_BASEMAP, DataService, DataTableComponent, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangeDropdownComponent, DateRangePickerComponent, DateRangeSearchField, DateService, DcatApConverter, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EXTERNAL_VIEWER_OPEN_NEW_TAB, EXTERNAL_VIEWER_URL_TEMPLATE, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, 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
44058
  //# sourceMappingURL=geonetwork-ui.mjs.map