geonetwork-ui 2.6.0-dev.b1563a5e0 → 2.6.0-dev.c49d02679

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 (162) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +13 -2
  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/gn4-repository.mjs +53 -14
  9. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +7 -1
  10. package/esm2022/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.mjs +2 -1
  11. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  12. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  13. package/esm2022/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.mjs +266 -11
  14. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-from-catalog.component.mjs +1 -1
  15. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +49 -23
  16. package/esm2022/libs/feature/search/src/lib/constants.mjs +3 -2
  17. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +5 -3
  18. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +13 -10
  19. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +19 -34
  20. package/esm2022/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.mjs +59 -0
  21. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +35 -10
  22. package/esm2022/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.mjs +5 -1
  23. package/esm2022/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.mjs +50 -29
  24. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +7 -3
  25. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  26. package/esm2022/libs/ui/layout/src/lib/cell-popin/cell-popin.component.mjs +110 -0
  27. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +20 -10
  28. package/esm2022/libs/ui/layout/src/lib/truncated-text/truncated-text.component.mjs +15 -49
  29. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +2 -2
  30. package/esm2022/libs/ui/search/src/index.mjs +2 -1
  31. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +21 -12
  32. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +39 -18
  33. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +10 -4
  34. package/esm2022/libs/util/i18n/src/lib/i18n.constants.mjs +42 -1
  35. package/esm2022/libs/util/i18n/src/lib/language-codes.mjs +24 -2
  36. package/esm2022/translations/de.json +42 -6
  37. package/esm2022/translations/en.json +42 -6
  38. package/esm2022/translations/es.json +41 -5
  39. package/esm2022/translations/fr.json +42 -6
  40. package/esm2022/translations/it.json +41 -5
  41. package/esm2022/translations/nl.json +41 -5
  42. package/esm2022/translations/pt.json +41 -5
  43. package/fesm2022/geonetwork-ui.mjs +1573 -733
  44. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  45. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  46. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +0 -1
  47. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  48. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +1 -0
  49. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +1 -1
  50. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +1 -1
  51. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  52. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  53. package/libs/api/repository/src/lib/gn4/elasticsearch/constant.d.ts.map +1 -1
  54. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +10 -2
  55. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  56. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +2 -0
  57. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  58. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts +1 -0
  59. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts.map +1 -1
  60. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +20 -17
  61. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  62. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +4 -0
  63. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  64. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts +48 -3
  65. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts.map +1 -1
  66. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +13 -5
  67. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  68. package/libs/feature/search/src/lib/constants.d.ts.map +1 -1
  69. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +2 -1
  70. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  71. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +6 -5
  72. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  73. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts +3 -6
  74. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts.map +1 -1
  75. package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts +14 -0
  76. package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts.map +1 -0
  77. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts +3 -0
  78. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  79. package/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.d.ts.map +1 -1
  80. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts +20 -9
  81. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts.map +1 -1
  82. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +2 -1
  83. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  84. package/libs/ui/layout/src/index.d.ts +1 -0
  85. package/libs/ui/layout/src/index.d.ts.map +1 -1
  86. package/libs/ui/layout/src/lib/cell-popin/cell-popin.component.d.ts +28 -0
  87. package/libs/ui/layout/src/lib/cell-popin/cell-popin.component.d.ts.map +1 -0
  88. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +4 -2
  89. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -1
  90. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts +5 -10
  91. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts.map +1 -1
  92. package/libs/ui/search/src/index.d.ts +1 -0
  93. package/libs/ui/search/src/index.d.ts.map +1 -1
  94. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +4 -3
  95. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -1
  96. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +10 -4
  97. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  98. package/libs/ui/search/src/lib/ui-search.module.d.ts +2 -1
  99. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  100. package/libs/util/i18n/src/lib/i18n.constants.d.ts +1 -0
  101. package/libs/util/i18n/src/lib/i18n.constants.d.ts.map +1 -1
  102. package/libs/util/i18n/src/lib/language-codes.d.ts +23 -1
  103. package/libs/util/i18n/src/lib/language-codes.d.ts.map +1 -1
  104. package/package.json +1 -1
  105. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +1 -1
  106. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +18 -1
  107. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +0 -1
  108. package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +13 -3
  109. package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +5 -1
  110. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +6 -3
  111. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +4 -1
  112. package/src/libs/api/repository/src/lib/gn4/elasticsearch/constant.ts +1 -0
  113. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +70 -13
  114. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +11 -0
  115. package/src/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.ts +3 -0
  116. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +20 -14
  117. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +4 -0
  118. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +63 -0
  119. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.html +117 -11
  120. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.ts +316 -6
  121. package/src/libs/feature/record/src/lib/map-view/map-view.component.html +27 -9
  122. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +84 -27
  123. package/src/libs/feature/search/src/lib/constants.ts +2 -1
  124. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.html +1 -1
  125. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +1 -0
  126. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +1 -0
  127. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +13 -3
  128. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +7 -75
  129. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +20 -51
  130. package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.html +69 -0
  131. package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.ts +61 -0
  132. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +48 -9
  133. package/src/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.ts +4 -0
  134. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.html +96 -37
  135. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.ts +60 -29
  136. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +2 -0
  137. package/src/libs/ui/layout/src/index.ts +1 -0
  138. package/src/libs/ui/layout/src/lib/cell-popin/cell-popin.component.html +40 -0
  139. package/src/libs/ui/layout/src/lib/cell-popin/cell-popin.component.ts +141 -0
  140. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +3 -2
  141. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +13 -6
  142. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.html +25 -42
  143. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.ts +10 -49
  144. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +1 -1
  145. package/src/libs/ui/search/src/index.ts +1 -0
  146. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +16 -6
  147. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +15 -11
  148. package/src/libs/ui/search/src/lib/results-table/results-table.component.css +4 -0
  149. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +31 -27
  150. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +33 -15
  151. package/src/libs/ui/search/src/lib/ui-search.module.ts +3 -0
  152. package/src/libs/util/i18n/src/lib/i18n.constants.ts +42 -0
  153. package/src/libs/util/i18n/src/lib/language-codes.ts +23 -1
  154. package/tailwind.base.css +1 -1
  155. package/translations/de.json +42 -6
  156. package/translations/en.json +42 -6
  157. package/translations/es.json +41 -5
  158. package/translations/fr.json +42 -6
  159. package/translations/it.json +41 -5
  160. package/translations/nl.json +41 -5
  161. package/translations/pt.json +41 -5
  162. package/translations/sk.json +41 -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",
@@ -18937,6 +19035,7 @@ var de = {
18937
19035
  "map.navigation.message": "Bitte verwenden Sie STRG + Maus (oder zwei Finger auf einem Mobilgerät), um die Karte zu navigieren",
18938
19036
  "map.ogc.urlInput.hint": "",
18939
19037
  "map.select.layer": "Datenquelle",
19038
+ "map.select.style": "Style",
18940
19039
  "map.wfs.urlInput.hint": "Geben Sie die WFS URL ein",
18941
19040
  "map.wms.urlInput.hint": "Geben Sie die WMS URL ein",
18942
19041
  "multiselect.filter.placeholder": "Suche",
@@ -18964,6 +19063,7 @@ var de = {
18964
19063
  "record.action.duplicate": "",
18965
19064
  "record.action.duplicating": "",
18966
19065
  "record.action.rollback": "",
19066
+ "record.action.switchLang": "",
18967
19067
  "record.action.view": "Anzeigen",
18968
19068
  "record.card.metadata.contact": "",
18969
19069
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
@@ -19014,9 +19114,15 @@ var de = {
19014
19114
  "record.metadata.download": "Downloads",
19015
19115
  "record.metadata.feature.catalog": "",
19016
19116
  "record.metadata.formats": "Formate",
19117
+ "record.metadata.isGeographical": "Geographischer Datensatz",
19017
19118
  "record.metadata.keywords": "Stichworte",
19018
19119
  "record.metadata.languages": "Sprachen",
19019
19120
  "record.metadata.lastUpdate": "Zuletzt aktualisiert am {date}",
19121
+ "record.metadata.linked.datasets": "Verknüpfte Datensätze",
19122
+ "record.metadata.linked.records": "Verknüpfte Inhalte",
19123
+ "record.metadata.linked.reuses": "Verknüpfte Wiederverwendungen",
19124
+ "record.metadata.linked.services": "Verknüpfte Dienste",
19125
+ "record.metadata.linked.sourceDatasets": "Quelldatensätze",
19020
19126
  "record.metadata.links": "Links",
19021
19127
  "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
19022
19128
  "record.metadata.otherConstraints": "Zusätzliche Bedingungen",
@@ -19026,6 +19132,8 @@ var de = {
19026
19132
  "record.metadata.publication": "Veröffentlichungsdatum",
19027
19133
  "record.metadata.publications": "{count, plural, =0{Veröffentlichungsdatum} one{Veröffentlichungsdatum} other{Veröffentlichungen}}",
19028
19134
  "record.metadata.quality": "Metadatenqualität",
19135
+ "record.metadata.quality.capabilities.failed": "",
19136
+ "record.metadata.quality.capabilities.success": "",
19029
19137
  "record.metadata.quality.contact.failed": "Kontakt nicht angegeben",
19030
19138
  "record.metadata.quality.contact.success": "Kontakt angegeben",
19031
19139
  "record.metadata.quality.description.failed": "Beschreibung nicht angegeben",
@@ -19037,14 +19145,15 @@ var de = {
19037
19145
  "record.metadata.quality.legalConstraints.success": "Rechtliche Beschränkungen angegeben",
19038
19146
  "record.metadata.quality.organisation.failed": "Organisation nicht angegeben",
19039
19147
  "record.metadata.quality.organisation.success": "Organisation angegeben",
19148
+ "record.metadata.quality.source.failed": "",
19149
+ "record.metadata.quality.source.success": "",
19040
19150
  "record.metadata.quality.title.failed": "Titel nicht angegeben",
19041
19151
  "record.metadata.quality.title.success": "Titel angegeben",
19042
19152
  "record.metadata.quality.topic.failed": "Thema nicht angegeben",
19043
19153
  "record.metadata.quality.topic.success": "Thema angegeben",
19044
19154
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
19045
19155
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
19046
- "record.metadata.related": "Ähnliche Datensätze",
19047
- "record.metadata.related.contents": "",
19156
+ "record.metadata.related": "Entdecken Sie den Katalog",
19048
19157
  "record.metadata.ressources.and.links": "Ressourcen und Links",
19049
19158
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
19050
19159
  "record.metadata.status": "Status",
@@ -19056,7 +19165,6 @@ var de = {
19056
19165
  "record.metadata.temporalExtent.untilDate": "Bis {end}",
19057
19166
  "record.metadata.title": "Titel",
19058
19167
  "record.metadata.topics": "Kategorien",
19059
- "record.metadata.isGeographical": "Geographischer Datensatz",
19060
19168
  "record.metadata.uniqueId": "Eindeutige Kennung",
19061
19169
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
19062
19170
  "record.metadata.updatedOn": "Geändert am",
@@ -19176,7 +19284,6 @@ var de = {
19176
19284
  "tooltip.html.copy": "HTML kopieren",
19177
19285
  "tooltip.id.copy": "Eindeutige Kennung kopieren",
19178
19286
  "tooltip.url.copy": "URL kopieren",
19179
- "tooltip.url.open": "URL öffnen",
19180
19287
  "ui.readLess": "Weniger lesen",
19181
19288
  "ui.readMore": "Weiterlesen",
19182
19289
  "wfs.feature.limit": "Zu viele Features, um den WFS-Layer anzuzeigen!",
@@ -19223,6 +19330,7 @@ var en = {
19223
19330
  "dashboard.labels.mySpace": "My space",
19224
19331
  "dashboard.records.all": "Datasets",
19225
19332
  "dashboard.records.hasDraft": "draft",
19333
+ "dashboard.records.isMultilingual": "This record is multilingual ({languages})",
19226
19334
  "dashboard.records.myDraft": "My drafts",
19227
19335
  "dashboard.records.myRecords": "My datasets",
19228
19336
  "dashboard.records.search": "Search for \"{searchText}\"",
@@ -19397,9 +19505,13 @@ var en = {
19397
19505
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
19398
19506
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
19399
19507
  "editor.record.form.license.unknown": "Unknown or absent",
19508
+ "editor.record.form.multilingual.activate": "Activate the languages",
19509
+ "editor.record.form.multilingual.default": "Default",
19400
19510
  "editor.record.form.multilingual.enable": "Multilingual Mode",
19511
+ "editor.record.form.multilingual.forbidden": "You are not allowed to remove the default language",
19401
19512
  "editor.record.form.multilingual.open": "Open the multilingual panel",
19402
19513
  "editor.record.form.multilingual.title": "Translations",
19514
+ "editor.record.form.multilingual.validate": "Validate",
19403
19515
  "editor.record.form.page.accessAndContact": "Information for use",
19404
19516
  "editor.record.form.page.description": "Dataset description",
19405
19517
  "editor.record.form.page.resources": "Resources",
@@ -19429,8 +19541,13 @@ var en = {
19429
19541
  "editor.record.loadError.body": "The dataset could not be loaded:",
19430
19542
  "editor.record.loadError.closeMessage": "Understood",
19431
19543
  "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",
19544
+ "editor.record.lock.harvested": "Datasets harvested from an external catalog are not editable",
19545
+ "editor.record.lock.owner": "You are not an editor of the allowed groups",
19546
+ "editor.record.lock.resourceType": "Records of a type other than dataset are not editable",
19547
+ "editor.record.multilingual.confirmation.cancelText": "Keep the language(s)",
19548
+ "editor.record.multilingual.confirmation.confirmText": "Remove the language(s)",
19549
+ "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?",
19550
+ "editor.record.multilingual.confirmation.title": "Remove languages",
19434
19551
  "editor.record.onlineResource.protocol.other": "Other",
19435
19552
  "editor.record.onlineResourceError.body": "An error happened while adding the resource:",
19436
19553
  "editor.record.onlineResourceError.closeMessage": "Understood",
@@ -19477,6 +19594,11 @@ var en = {
19477
19594
  "facets.block.title.tag.default": "Tag",
19478
19595
  "facets.block.title.th_regions_tree.default": "Regions",
19479
19596
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Login</a> to access this feature</div>",
19597
+ "feature.catalog.attribute.code": "Code",
19598
+ "feature.catalog.attribute.definition": "Description",
19599
+ "feature.catalog.attribute.name": "Name",
19600
+ "feature.catalog.attribute.type": "Type",
19601
+ "feature.catalog.attribute.values": "Values",
19480
19602
  "input.file.dropFileLabel": "or drop it here",
19481
19603
  "input.file.orInputUrl": "or create a link to an external resource",
19482
19604
  "input.file.selectFileLabel": "Select a file ({sizeMB} MB max.)",
@@ -19491,20 +19613,32 @@ var en = {
19491
19613
  "input.image.uploadErrorLabel": "The image could not be uploaded",
19492
19614
  "input.image.uploadProgressCancel": "Cancel",
19493
19615
  "input.image.uploadProgressLabel": "Upload in progress...",
19616
+ "language.ar": "Arabic",
19617
+ "language.az": "Azerbaijani",
19494
19618
  "language.ca": "Catalan",
19495
19619
  "language.cs": "Czech",
19620
+ "language.cy": "Welsh",
19621
+ "language.da": "Danish",
19496
19622
  "language.de": "German",
19497
19623
  "language.en": "English",
19498
19624
  "language.es": "Spanish",
19499
19625
  "language.fi": "Finnish",
19500
19626
  "language.fr": "French",
19627
+ "language.hy": "Armenian",
19501
19628
  "language.is": "Icelandic",
19502
19629
  "language.it": "Italian",
19630
+ "language.ka": "Georgian",
19503
19631
  "language.ko": "Korean",
19504
19632
  "language.nl": "Dutch",
19633
+ "language.no": "Norwegian",
19634
+ "language.pl": "Polish",
19505
19635
  "language.pt": "Portuguese",
19636
+ "language.rm": "Romansh",
19506
19637
  "language.ru": "Russian",
19507
19638
  "language.sk": "Slovak",
19639
+ "language.sv": "Swedish",
19640
+ "language.tr": "Turkish",
19641
+ "language.uk": "Ukrainian",
19508
19642
  "language.zh": "Chinese",
19509
19643
  "map.add.layer": "Add a layer",
19510
19644
  "map.add.layer.catalog": "From the catalog",
@@ -19524,6 +19658,7 @@ var en = {
19524
19658
  "map.navigation.message": "Please use CTRL + mouse (or two fingers on mobile) to navigate the map",
19525
19659
  "map.ogc.urlInput.hint": "Enter OGC API service URL",
19526
19660
  "map.select.layer": "Data source",
19661
+ "map.select.style": "Style",
19527
19662
  "map.wfs.urlInput.hint": "Enter WFS service URL",
19528
19663
  "map.wms.urlInput.hint": "Enter WMS service URL",
19529
19664
  "multiselect.filter.placeholder": "Search",
@@ -19551,6 +19686,7 @@ var en = {
19551
19686
  "record.action.duplicate": "Duplicate",
19552
19687
  "record.action.duplicating": "Duplicating...",
19553
19688
  "record.action.rollback": "Rollback",
19689
+ "record.action.switchLang": "Switch to default",
19554
19690
  "record.action.view": "View",
19555
19691
  "record.card.metadata.contact": "Metadata Contact",
19556
19692
  "record.externalViewer.open": "Open in the external map viewer",
@@ -19601,9 +19737,15 @@ var en = {
19601
19737
  "record.metadata.download": "Downloads",
19602
19738
  "record.metadata.feature.catalog": "Feature catalog",
19603
19739
  "record.metadata.formats": "Formats",
19740
+ "record.metadata.isGeographical": "Geographical dataset",
19604
19741
  "record.metadata.keywords": "Keywords",
19605
19742
  "record.metadata.languages": "Languages",
19606
19743
  "record.metadata.lastUpdate": "Last updated on {date}",
19744
+ "record.metadata.linked.datasets": "Associated datasets",
19745
+ "record.metadata.linked.records": "Associated content",
19746
+ "record.metadata.linked.reuses": "Associated reuses",
19747
+ "record.metadata.linked.services": "Associated services",
19748
+ "record.metadata.linked.sourceDatasets": "Source datasets",
19607
19749
  "record.metadata.links": "Links",
19608
19750
  "record.metadata.noUsage": "No usage conditions specified for this dataset.",
19609
19751
  "record.metadata.otherConstraints": "Additional Conditions",
@@ -19613,6 +19755,8 @@ var en = {
19613
19755
  "record.metadata.publication": "Date of publication",
19614
19756
  "record.metadata.publications": "{count, plural, =0{publication} one{publication} other{publications}}",
19615
19757
  "record.metadata.quality": "Metadata Quality",
19758
+ "record.metadata.quality.capabilities.failed": "Capabilities URL is not specified",
19759
+ "record.metadata.quality.capabilities.success": "Capabilities URL is specified",
19616
19760
  "record.metadata.quality.contact.failed": "Contact is not specified",
19617
19761
  "record.metadata.quality.contact.success": "Contact is specified",
19618
19762
  "record.metadata.quality.description.failed": "Description is not specified",
@@ -19624,14 +19768,15 @@ var en = {
19624
19768
  "record.metadata.quality.legalConstraints.success": "Legal constraints are specified",
19625
19769
  "record.metadata.quality.organisation.failed": "Organisation is not specified",
19626
19770
  "record.metadata.quality.organisation.success": "Organisation is specified",
19771
+ "record.metadata.quality.source.failed": "No source dataset is specified",
19772
+ "record.metadata.quality.source.success": "A source dataset is specified",
19627
19773
  "record.metadata.quality.title.failed": "Title is not specified",
19628
19774
  "record.metadata.quality.title.success": "Title is specified",
19629
19775
  "record.metadata.quality.topic.failed": "Topic is not specified",
19630
19776
  "record.metadata.quality.topic.success": "Topic is specified",
19631
19777
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
19632
19778
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
19633
- "record.metadata.related": "Related records",
19634
- "record.metadata.related.contents": "Related content",
19779
+ "record.metadata.related": "Explore the catalog",
19635
19780
  "record.metadata.ressources.and.links": "Resources and links",
19636
19781
  "record.metadata.sheet": "Original metadata",
19637
19782
  "record.metadata.status": "Status",
@@ -19643,7 +19788,6 @@ var en = {
19643
19788
  "record.metadata.temporalExtent.untilDate": "Until { end }",
19644
19789
  "record.metadata.title": "Title",
19645
19790
  "record.metadata.topics": "Categories",
19646
- "record.metadata.isGeographical": "Geographical dataset",
19647
19791
  "record.metadata.uniqueId": "Unique Identifier",
19648
19792
  "record.metadata.updateFrequency": "Data Update Frequency",
19649
19793
  "record.metadata.updatedOn": "Updated on",
@@ -19763,7 +19907,6 @@ var en = {
19763
19907
  "tooltip.html.copy": "Copy HTML",
19764
19908
  "tooltip.id.copy": "Copy unique identifier",
19765
19909
  "tooltip.url.copy": "Copy URL",
19766
- "tooltip.url.open": "Open URL",
19767
19910
  "ui.readLess": "Read less",
19768
19911
  "ui.readMore": "Read more",
19769
19912
  "wfs.feature.limit": "Too many features to display the WFS layer!",
@@ -19810,6 +19953,7 @@ var es = {
19810
19953
  "dashboard.labels.mySpace": "Mi espacio",
19811
19954
  "dashboard.records.all": "Catálogo",
19812
19955
  "dashboard.records.hasDraft": "",
19956
+ "dashboard.records.isMultilingual": "Este registro es multilingüe ({languages})",
19813
19957
  "dashboard.records.myDraft": "Mis borradores",
19814
19958
  "dashboard.records.myRecords": "Mis Registros",
19815
19959
  "dashboard.records.search": "Buscar \"{searchText}\"",
@@ -19984,9 +20128,13 @@ var es = {
19984
20128
  "editor.record.form.license.odc-by": "",
19985
20129
  "editor.record.form.license.pddl": "",
19986
20130
  "editor.record.form.license.unknown": "",
20131
+ "editor.record.form.multilingual.activate": "",
20132
+ "editor.record.form.multilingual.default": "",
19987
20133
  "editor.record.form.multilingual.enable": "",
20134
+ "editor.record.form.multilingual.forbidden": "",
19988
20135
  "editor.record.form.multilingual.open": "",
19989
20136
  "editor.record.form.multilingual.title": "",
20137
+ "editor.record.form.multilingual.validate": "",
19990
20138
  "editor.record.form.page.accessAndContact": "",
19991
20139
  "editor.record.form.page.description": "",
19992
20140
  "editor.record.form.page.resources": "",
@@ -20016,8 +20164,13 @@ var es = {
20016
20164
  "editor.record.loadError.body": "",
20017
20165
  "editor.record.loadError.closeMessage": "",
20018
20166
  "editor.record.loadError.title": "",
20019
- "editor.record.lock.format": "",
20020
- "editor.record.lock.reason": "",
20167
+ "editor.record.lock.harvested": "",
20168
+ "editor.record.lock.owner": "",
20169
+ "editor.record.lock.resourceType": "",
20170
+ "editor.record.multilingual.confirmation.cancelText": "",
20171
+ "editor.record.multilingual.confirmation.confirmText": "",
20172
+ "editor.record.multilingual.confirmation.message": "",
20173
+ "editor.record.multilingual.confirmation.title": "",
20021
20174
  "editor.record.onlineResource.protocol.other": "",
20022
20175
  "editor.record.onlineResourceError.body": "",
20023
20176
  "editor.record.onlineResourceError.closeMessage": "",
@@ -20064,6 +20217,11 @@ var es = {
20064
20217
  "facets.block.title.tag.default": "",
20065
20218
  "facets.block.title.th_regions_tree.default": "",
20066
20219
  "favorite.not.authenticated.tooltip": "",
20220
+ "feature.catalog.attribute.code": "Código",
20221
+ "feature.catalog.attribute.definition": "Descripción",
20222
+ "feature.catalog.attribute.name": "Nombre",
20223
+ "feature.catalog.attribute.type": "Tipo",
20224
+ "feature.catalog.attribute.values": "Valores",
20067
20225
  "input.file.dropFileLabel": "",
20068
20226
  "input.file.orInputUrl": "",
20069
20227
  "input.file.selectFileLabel": "",
@@ -20078,20 +20236,32 @@ var es = {
20078
20236
  "input.image.uploadErrorLabel": "",
20079
20237
  "input.image.uploadProgressCancel": "",
20080
20238
  "input.image.uploadProgressLabel": "",
20239
+ "language.ar": "",
20240
+ "language.az": "",
20081
20241
  "language.ca": "Catalán",
20082
20242
  "language.cs": "Checo",
20243
+ "language.cy": "",
20244
+ "language.da": "",
20083
20245
  "language.de": "Alemán",
20084
20246
  "language.en": "Inglés",
20085
20247
  "language.es": "Español",
20086
20248
  "language.fi": "Finlandés",
20087
20249
  "language.fr": "Francés",
20250
+ "language.hy": "",
20088
20251
  "language.is": "Islandés",
20089
20252
  "language.it": "Italiano",
20253
+ "language.ka": "",
20090
20254
  "language.ko": "Coreano",
20091
20255
  "language.nl": "Neerlandés",
20256
+ "language.no": "",
20257
+ "language.pl": "",
20092
20258
  "language.pt": "Portugués",
20259
+ "language.rm": "",
20093
20260
  "language.ru": "Ruso",
20094
20261
  "language.sk": "Eslovaco",
20262
+ "language.sv": "",
20263
+ "language.tr": "",
20264
+ "language.uk": "",
20095
20265
  "language.zh": "Chino",
20096
20266
  "map.add.layer": "",
20097
20267
  "map.add.layer.catalog": "",
@@ -20111,6 +20281,7 @@ var es = {
20111
20281
  "map.navigation.message": "",
20112
20282
  "map.ogc.urlInput.hint": "",
20113
20283
  "map.select.layer": "",
20284
+ "map.select.style": "",
20114
20285
  "map.wfs.urlInput.hint": "",
20115
20286
  "map.wms.urlInput.hint": "",
20116
20287
  "multiselect.filter.placeholder": "",
@@ -20138,6 +20309,7 @@ var es = {
20138
20309
  "record.action.duplicate": "",
20139
20310
  "record.action.duplicating": "",
20140
20311
  "record.action.rollback": "",
20312
+ "record.action.switchLang": "",
20141
20313
  "record.action.view": "",
20142
20314
  "record.card.metadata.contact": "",
20143
20315
  "record.externalViewer.open": "",
@@ -20188,9 +20360,15 @@ var es = {
20188
20360
  "record.metadata.download": "",
20189
20361
  "record.metadata.feature.catalog": "",
20190
20362
  "record.metadata.formats": "",
20363
+ "record.metadata.isGeographical": "",
20191
20364
  "record.metadata.keywords": "",
20192
20365
  "record.metadata.languages": "",
20193
20366
  "record.metadata.lastUpdate": "",
20367
+ "record.metadata.linked.datasets": "",
20368
+ "record.metadata.linked.records": "",
20369
+ "record.metadata.linked.reuses": "",
20370
+ "record.metadata.linked.services": "",
20371
+ "record.metadata.linked.sourceDatasets": "",
20194
20372
  "record.metadata.links": "",
20195
20373
  "record.metadata.noUsage": "",
20196
20374
  "record.metadata.otherConstraints": "",
@@ -20200,6 +20378,8 @@ var es = {
20200
20378
  "record.metadata.publication": "",
20201
20379
  "record.metadata.publications": "{count, plural, =0{} one{} other{}}",
20202
20380
  "record.metadata.quality": "",
20381
+ "record.metadata.quality.capabilities.failed": "",
20382
+ "record.metadata.quality.capabilities.success": "",
20203
20383
  "record.metadata.quality.contact.failed": "",
20204
20384
  "record.metadata.quality.contact.success": "",
20205
20385
  "record.metadata.quality.description.failed": "",
@@ -20211,6 +20391,8 @@ var es = {
20211
20391
  "record.metadata.quality.legalConstraints.success": "",
20212
20392
  "record.metadata.quality.organisation.failed": "",
20213
20393
  "record.metadata.quality.organisation.success": "",
20394
+ "record.metadata.quality.source.failed": "",
20395
+ "record.metadata.quality.source.success": "",
20214
20396
  "record.metadata.quality.title.failed": "",
20215
20397
  "record.metadata.quality.title.success": "",
20216
20398
  "record.metadata.quality.topic.failed": "",
@@ -20218,7 +20400,6 @@ var es = {
20218
20400
  "record.metadata.quality.updateFrequency.failed": "",
20219
20401
  "record.metadata.quality.updateFrequency.success": "",
20220
20402
  "record.metadata.related": "",
20221
- "record.metadata.related.contents": "",
20222
20403
  "record.metadata.ressources.and.links": "Recursos y enlaces",
20223
20404
  "record.metadata.sheet": "",
20224
20405
  "record.metadata.status": "",
@@ -20230,7 +20411,6 @@ var es = {
20230
20411
  "record.metadata.temporalExtent.untilDate": "",
20231
20412
  "record.metadata.title": "",
20232
20413
  "record.metadata.topics": "",
20233
- "record.metadata.isGeographical": "",
20234
20414
  "record.metadata.uniqueId": "",
20235
20415
  "record.metadata.updateFrequency": "",
20236
20416
  "record.metadata.updatedOn": "",
@@ -20350,7 +20530,6 @@ var es = {
20350
20530
  "tooltip.html.copy": "",
20351
20531
  "tooltip.id.copy": "",
20352
20532
  "tooltip.url.copy": "",
20353
- "tooltip.url.open": "",
20354
20533
  "ui.readLess": "",
20355
20534
  "ui.readMore": "",
20356
20535
  "wfs.feature.limit": "",
@@ -20397,6 +20576,7 @@ var fr = {
20397
20576
  "dashboard.labels.mySpace": "Mon espace",
20398
20577
  "dashboard.records.all": "Jeux de données",
20399
20578
  "dashboard.records.hasDraft": "brouillon",
20579
+ "dashboard.records.isMultilingual": "Cet enregistrement est multilingue ({languages})",
20400
20580
  "dashboard.records.myDraft": "Mes brouillons",
20401
20581
  "dashboard.records.myRecords": "Mes jeux de données",
20402
20582
  "dashboard.records.search": "Résultats pour \"{searchText}\"",
@@ -20571,9 +20751,13 @@ var fr = {
20571
20751
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
20572
20752
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
20573
20753
  "editor.record.form.license.unknown": "Inconnue ou absente",
20754
+ "editor.record.form.multilingual.activate": "Activez les langues",
20755
+ "editor.record.form.multilingual.default": "Par défaut",
20574
20756
  "editor.record.form.multilingual.enable": "Mode Multilingue",
20757
+ "editor.record.form.multilingual.forbidden": "Vous ne pouvez pas supprimer le language par défaut",
20575
20758
  "editor.record.form.multilingual.open": "Ouvrir le menu multilingue",
20576
20759
  "editor.record.form.multilingual.title": "Traductions",
20760
+ "editor.record.form.multilingual.validate": "Valider",
20577
20761
  "editor.record.form.page.accessAndContact": "Informations pour l'utilisation",
20578
20762
  "editor.record.form.page.description": "Description du jeu de données",
20579
20763
  "editor.record.form.page.resources": "Ressources",
@@ -20603,8 +20787,13 @@ var fr = {
20603
20787
  "editor.record.loadError.body": "Le jeu de données n'a pas pu être chargé :",
20604
20788
  "editor.record.loadError.closeMessage": "Compris",
20605
20789
  "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.",
20790
+ "editor.record.lock.harvested": "Les jeux de données moissonnés ne sont pas éditables",
20791
+ "editor.record.lock.owner": "Vous n'êtes pas éditeur d'un des groupes autorisés",
20792
+ "editor.record.lock.resourceType": "Les fiches d'un type autre que jeu de données ne sont pas éditables",
20793
+ "editor.record.multilingual.confirmation.cancelText": "Garder le(s) language(s)",
20794
+ "editor.record.multilingual.confirmation.confirmText": "Supprimer le(s) language(s)",
20795
+ "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 ?",
20796
+ "editor.record.multilingual.confirmation.title": "Suppression de language(s)",
20608
20797
  "editor.record.onlineResource.protocol.other": "Autre",
20609
20798
  "editor.record.onlineResourceError.body": "Une erreur est survenue lors de l'ajout de la ressource :",
20610
20799
  "editor.record.onlineResourceError.closeMessage": "Compris",
@@ -20651,6 +20840,11 @@ var fr = {
20651
20840
  "facets.block.title.tag.default": "Tag",
20652
20841
  "facets.block.title.th_regions_tree.default": "Régions",
20653
20842
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Connectez-vous</a> pour avoir accès à cette fonctionnalité</div>",
20843
+ "feature.catalog.attribute.code": "Code",
20844
+ "feature.catalog.attribute.definition": "Description",
20845
+ "feature.catalog.attribute.name": "Nom",
20846
+ "feature.catalog.attribute.type": "Type",
20847
+ "feature.catalog.attribute.values": "Valeurs",
20654
20848
  "input.file.dropFileLabel": "ou glissez-le ici",
20655
20849
  "input.file.orInputUrl": "ou créez un lien vers une ressource externe",
20656
20850
  "input.file.selectFileLabel": "Sélectionnez un fichier ({sizeMB} Mo max.)",
@@ -20665,20 +20859,32 @@ var fr = {
20665
20859
  "input.image.uploadErrorLabel": "L'image n'a pas pu être chargée",
20666
20860
  "input.image.uploadProgressCancel": "Annuler",
20667
20861
  "input.image.uploadProgressLabel": "Chargement en cours...",
20862
+ "language.ar": "Arabe",
20863
+ "language.az": "Azéri",
20668
20864
  "language.ca": "Catalan",
20669
20865
  "language.cs": "Tchèque",
20866
+ "language.cy": "Gallois",
20867
+ "language.da": "Danois",
20670
20868
  "language.de": "Allemand",
20671
20869
  "language.en": "Anglais",
20672
20870
  "language.es": "Espagnol",
20673
20871
  "language.fi": "Finnois",
20674
20872
  "language.fr": "Français",
20873
+ "language.hy": "Arménien",
20675
20874
  "language.is": "Islandais",
20676
20875
  "language.it": "Italien",
20876
+ "language.ka": "Géorgien",
20677
20877
  "language.ko": "Coréen",
20678
20878
  "language.nl": "Néerlandais",
20879
+ "language.no": "Norvégien",
20880
+ "language.pl": "Polonais",
20679
20881
  "language.pt": "Portugais",
20882
+ "language.rm": "Romanche",
20680
20883
  "language.ru": "Russe",
20681
20884
  "language.sk": "Slovaque",
20885
+ "language.sv": "Suédois",
20886
+ "language.tr": "Turque",
20887
+ "language.uk": "Ukrainien",
20682
20888
  "language.zh": "Chinois",
20683
20889
  "map.add.layer": "Ajouter une couche",
20684
20890
  "map.add.layer.catalog": "Du catalogue",
@@ -20698,6 +20904,7 @@ var fr = {
20698
20904
  "map.navigation.message": "Veuillez utiliser CTRL + souris (ou deux doigts sur mobile) pour naviguer sur la carte",
20699
20905
  "map.ogc.urlInput.hint": "Entrez l'URL du service OGC API",
20700
20906
  "map.select.layer": "Source de données",
20907
+ "map.select.style": "Style",
20701
20908
  "map.wfs.urlInput.hint": "Entrez l'URL du service WFS",
20702
20909
  "map.wms.urlInput.hint": "Entrez l'URL du service WMS",
20703
20910
  "multiselect.filter.placeholder": "Rechercher",
@@ -20725,6 +20932,7 @@ var fr = {
20725
20932
  "record.action.duplicate": "Dupliquer",
20726
20933
  "record.action.duplicating": "Duplication...",
20727
20934
  "record.action.rollback": "Restaurer",
20935
+ "record.action.switchLang": "Marquer par défaut",
20728
20936
  "record.action.view": "Voir",
20729
20937
  "record.card.metadata.contact": "Contact de la métadonnée ",
20730
20938
  "record.externalViewer.open": "Ouvrir dans le visualiseur externe",
@@ -20775,9 +20983,15 @@ var fr = {
20775
20983
  "record.metadata.download": "Téléchargements",
20776
20984
  "record.metadata.feature.catalog": "Catalogue d'attributs",
20777
20985
  "record.metadata.formats": "Formats",
20986
+ "record.metadata.isGeographical": "Donnée géographique",
20778
20987
  "record.metadata.keywords": "Mots-clés",
20779
20988
  "record.metadata.languages": "Langues",
20780
20989
  "record.metadata.lastUpdate": "Mis à jour le {date}",
20990
+ "record.metadata.linked.datasets": "Jeux de données associés",
20991
+ "record.metadata.linked.records": "Contenus associés",
20992
+ "record.metadata.linked.reuses": "Réutilisations associées",
20993
+ "record.metadata.linked.services": "Services associés",
20994
+ "record.metadata.linked.sourceDatasets": "Jeux de données sources",
20781
20995
  "record.metadata.links": "Liens",
20782
20996
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
20783
20997
  "record.metadata.otherConstraints": "Limitations d'usage",
@@ -20787,6 +21001,8 @@ var fr = {
20787
21001
  "record.metadata.publication": "Date de publication",
20788
21002
  "record.metadata.publications": "{count, plural, =0{donnée} one{donnée} other{données}}",
20789
21003
  "record.metadata.quality": "Qualité des métadonnées",
21004
+ "record.metadata.quality.capabilities.failed": "Aucune URL de Capabilities n'est renseignée",
21005
+ "record.metadata.quality.capabilities.success": "Une URL de Capabilities est renseignée",
20790
21006
  "record.metadata.quality.contact.failed": "Le contact n'est pas renseigné",
20791
21007
  "record.metadata.quality.contact.success": "Le contact est renseigné",
20792
21008
  "record.metadata.quality.description.failed": "La description n'est pas renseignée",
@@ -20798,14 +21014,15 @@ var fr = {
20798
21014
  "record.metadata.quality.legalConstraints.success": "Les contraintes légales sont renseignées",
20799
21015
  "record.metadata.quality.organisation.failed": "Le producteur n'est pas renseigné",
20800
21016
  "record.metadata.quality.organisation.success": "Le producteur est renseigné",
21017
+ "record.metadata.quality.source.failed": "Aucun jeu de données source n'est renseigné",
21018
+ "record.metadata.quality.source.success": "Un jeu de données source est renseigné",
20801
21019
  "record.metadata.quality.title.failed": "Le titre n'est pas renseigné",
20802
21020
  "record.metadata.quality.title.success": "Le titre est renseigné",
20803
21021
  "record.metadata.quality.topic.failed": "Le thème n'est pas renseigné",
20804
21022
  "record.metadata.quality.topic.success": "Le thème est renseigné",
20805
21023
  "record.metadata.quality.updateFrequency.failed": "La fréquence de mise à jour n'est pas renseignée",
20806
21024
  "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é",
21025
+ "record.metadata.related": "Explorez le catalogue",
20809
21026
  "record.metadata.ressources.and.links": "Ressources et liens",
20810
21027
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
20811
21028
  "record.metadata.status": "Statut",
@@ -20817,7 +21034,6 @@ var fr = {
20817
21034
  "record.metadata.temporalExtent.untilDate": "Jusqu'au { end }",
20818
21035
  "record.metadata.title": "Intitulé",
20819
21036
  "record.metadata.topics": "Catégories",
20820
- "record.metadata.isGeographical": "Donnée géographique",
20821
21037
  "record.metadata.uniqueId": "Identificateur de ressource unique",
20822
21038
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
20823
21039
  "record.metadata.updatedOn": "Modifié le",
@@ -20937,7 +21153,6 @@ var fr = {
20937
21153
  "tooltip.html.copy": "Copier le HTML",
20938
21154
  "tooltip.id.copy": "Copier l'identifiant unique",
20939
21155
  "tooltip.url.copy": "Copier l'URL",
20940
- "tooltip.url.open": "Ouvrir l'URL",
20941
21156
  "ui.readLess": "Réduire",
20942
21157
  "ui.readMore": "Lire la suite",
20943
21158
  "wfs.feature.limit": "Trop d'objets pour afficher la couche WFS !",
@@ -20984,6 +21199,7 @@ var it = {
20984
21199
  "dashboard.labels.mySpace": "Il mio spazio",
20985
21200
  "dashboard.records.all": "Catalogo",
20986
21201
  "dashboard.records.hasDraft": "Bozza",
21202
+ "dashboard.records.isMultilingual": "Questo record è multilingue ({languages})",
20987
21203
  "dashboard.records.myDraft": "Le mie bozze",
20988
21204
  "dashboard.records.myRecords": "I miei dati",
20989
21205
  "dashboard.records.search": "Risultati per \"{searchText}\"",
@@ -21158,9 +21374,13 @@ var it = {
21158
21374
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
21159
21375
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
21160
21376
  "editor.record.form.license.unknown": "Sconosciuto o assente",
21377
+ "editor.record.form.multilingual.activate": "",
21378
+ "editor.record.form.multilingual.default": "",
21161
21379
  "editor.record.form.multilingual.enable": "Aprire il pannello multilingue",
21380
+ "editor.record.form.multilingual.forbidden": "",
21162
21381
  "editor.record.form.multilingual.open": "Modalità multilingue",
21163
21382
  "editor.record.form.multilingual.title": "Traduzioni",
21383
+ "editor.record.form.multilingual.validate": "",
21164
21384
  "editor.record.form.page.accessAndContact": "Informazioni per l'uso",
21165
21385
  "editor.record.form.page.description": "Descrizione del dataset",
21166
21386
  "editor.record.form.page.resources": "Risorse",
@@ -21190,8 +21410,13 @@ var it = {
21190
21410
  "editor.record.loadError.body": "Impossibile caricare il dataset:",
21191
21411
  "editor.record.loadError.closeMessage": "Capito",
21192
21412
  "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",
21413
+ "editor.record.lock.harvested": "",
21414
+ "editor.record.lock.owner": "Non è un editore di uno dei gruppi autorizzati",
21415
+ "editor.record.lock.resourceType": "I record con il formato 'servizio' o 'riutilizzo' non sono modificabili",
21416
+ "editor.record.multilingual.confirmation.cancelText": "",
21417
+ "editor.record.multilingual.confirmation.confirmText": "",
21418
+ "editor.record.multilingual.confirmation.message": "",
21419
+ "editor.record.multilingual.confirmation.title": "",
21195
21420
  "editor.record.onlineResource.protocol.other": "Altro",
21196
21421
  "editor.record.onlineResourceError.body": "Ha successo un'errore durante l'aggiunta della risorsa:",
21197
21422
  "editor.record.onlineResourceError.closeMessage": "Capito",
@@ -21238,6 +21463,11 @@ var it = {
21238
21463
  "facets.block.title.tag.default": "Tag",
21239
21464
  "facets.block.title.th_regions_tree.default": "Regioni",
21240
21465
  "favorite.not.authenticated.tooltip": "<div><a href=' {link} '>Login</a> per accedere a questa funzionalità</div>",
21466
+ "feature.catalog.attribute.code": "Codice",
21467
+ "feature.catalog.attribute.definition": "Descrizione",
21468
+ "feature.catalog.attribute.name": "Nome",
21469
+ "feature.catalog.attribute.type": "Tipo",
21470
+ "feature.catalog.attribute.values": "Valori",
21241
21471
  "input.file.dropFileLabel": "oppure trascinalo qui",
21242
21472
  "input.file.orInputUrl": "o collegamento a una risorsa esterna",
21243
21473
  "input.file.selectFileLabel": "Seleziona un file ({sizeMB} MB max.)",
@@ -21252,20 +21482,32 @@ var it = {
21252
21482
  "input.image.uploadErrorLabel": "Impossibile caricare l'immagine",
21253
21483
  "input.image.uploadProgressCancel": "Annulla",
21254
21484
  "input.image.uploadProgressLabel": "Caricamento...",
21485
+ "language.ar": "",
21486
+ "language.az": "",
21255
21487
  "language.ca": "Catalano",
21256
21488
  "language.cs": "Ceco",
21489
+ "language.cy": "",
21490
+ "language.da": "",
21257
21491
  "language.de": "Tedesco",
21258
21492
  "language.en": "Inglese",
21259
21493
  "language.es": "Spagnolo",
21260
21494
  "language.fi": "Finlandese",
21261
21495
  "language.fr": "Francese",
21496
+ "language.hy": "",
21262
21497
  "language.is": "Islandese",
21263
21498
  "language.it": "Italiano",
21499
+ "language.ka": "",
21264
21500
  "language.ko": "Coreano",
21265
21501
  "language.nl": "Olandese",
21502
+ "language.no": "",
21503
+ "language.pl": "",
21266
21504
  "language.pt": "Portoghese",
21505
+ "language.rm": "",
21267
21506
  "language.ru": "Russo",
21268
21507
  "language.sk": "Slovacco",
21508
+ "language.sv": "",
21509
+ "language.tr": "",
21510
+ "language.uk": "",
21269
21511
  "language.zh": "Cinese",
21270
21512
  "map.add.layer": "Aggiungere un layer",
21271
21513
  "map.add.layer.catalog": "Dal catalogo",
@@ -21285,6 +21527,7 @@ var it = {
21285
21527
  "map.navigation.message": "Si prega di utilizzare CTRL + mouse (o due dita su mobile) per navigare sulla mappa",
21286
21528
  "map.ogc.urlInput.hint": "Inserisci URL del servizio OGC API",
21287
21529
  "map.select.layer": "Sorgente dati",
21530
+ "map.select.style": "Style",
21288
21531
  "map.wfs.urlInput.hint": "Inserisci URL del servizio WFS",
21289
21532
  "map.wms.urlInput.hint": "Inserisci URL del servizio WMS",
21290
21533
  "multiselect.filter.placeholder": "Cerca",
@@ -21312,6 +21555,7 @@ var it = {
21312
21555
  "record.action.duplicate": "Duplicato",
21313
21556
  "record.action.duplicating": "Duplicazione",
21314
21557
  "record.action.rollback": "Annulla",
21558
+ "record.action.switchLang": "",
21315
21559
  "record.action.view": "Visualizza",
21316
21560
  "record.card.metadata.contact": "Contatto del metadata",
21317
21561
  "record.externalViewer.open": "Aprire nel visualizzatore esterno",
@@ -21362,9 +21606,15 @@ var it = {
21362
21606
  "record.metadata.download": "Download",
21363
21607
  "record.metadata.feature.catalog": "Catalogo dei oggetti",
21364
21608
  "record.metadata.formats": "Formati",
21609
+ "record.metadata.isGeographical": "Dati geografici",
21365
21610
  "record.metadata.keywords": "Parole chiave",
21366
21611
  "record.metadata.languages": "Lingue",
21367
21612
  "record.metadata.lastUpdate": "Ultimo aggiornamento il {date}",
21613
+ "record.metadata.linked.datasets": "",
21614
+ "record.metadata.linked.records": "",
21615
+ "record.metadata.linked.reuses": "",
21616
+ "record.metadata.linked.services": "",
21617
+ "record.metadata.linked.sourceDatasets": "",
21368
21618
  "record.metadata.links": "Collegamenti",
21369
21619
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
21370
21620
  "record.metadata.otherConstraints": "Limitazioni di uso",
@@ -21374,6 +21624,8 @@ var it = {
21374
21624
  "record.metadata.publication": "Data di pubblicazione",
21375
21625
  "record.metadata.publications": "{count, plural, =0{pubblicazione} one{pubblicazione} other{pubblicazioni}}",
21376
21626
  "record.metadata.quality": "Qualità dei metadati",
21627
+ "record.metadata.quality.capabilities.failed": "",
21628
+ "record.metadata.quality.capabilities.success": "",
21377
21629
  "record.metadata.quality.contact.failed": "Il contatto non è specificato",
21378
21630
  "record.metadata.quality.contact.success": "Il contatto è specificato",
21379
21631
  "record.metadata.quality.description.failed": "La descrizione non è specificata",
@@ -21385,6 +21637,8 @@ var it = {
21385
21637
  "record.metadata.quality.legalConstraints.success": "I vincoli legali sono specificate",
21386
21638
  "record.metadata.quality.organisation.failed": "Il produttore non è specificato",
21387
21639
  "record.metadata.quality.organisation.success": "Il produttore è specificato",
21640
+ "record.metadata.quality.source.failed": "",
21641
+ "record.metadata.quality.source.success": "",
21388
21642
  "record.metadata.quality.title.failed": "Il titolo non è specificato",
21389
21643
  "record.metadata.quality.title.success": "Il titolo è specificato",
21390
21644
  "record.metadata.quality.topic.failed": "Il tema non è specificato",
@@ -21392,7 +21646,6 @@ var it = {
21392
21646
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
21393
21647
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
21394
21648
  "record.metadata.related": "Vedi anche",
21395
- "record.metadata.related.contents": "Contenuti correlati",
21396
21649
  "record.metadata.ressources.and.links": "Risorse e collegamenti",
21397
21650
  "record.metadata.sheet": "Origine del metadata",
21398
21651
  "record.metadata.status": "Stato",
@@ -21404,7 +21657,6 @@ var it = {
21404
21657
  "record.metadata.temporalExtent.untilDate": "Fino a {end}",
21405
21658
  "record.metadata.title": "Titolo",
21406
21659
  "record.metadata.topics": "Categorie",
21407
- "record.metadata.isGeographical": "Dati geografici",
21408
21660
  "record.metadata.uniqueId": "Identificatore unico di risorsa",
21409
21661
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
21410
21662
  "record.metadata.updatedOn": "Modificato il",
@@ -21524,7 +21776,6 @@ var it = {
21524
21776
  "tooltip.html.copy": "Copiare il HTML",
21525
21777
  "tooltip.id.copy": "Copiare l'identificatore unico",
21526
21778
  "tooltip.url.copy": "Copiare l'URL",
21527
- "tooltip.url.open": "Aprire l'URL",
21528
21779
  "ui.readLess": "Ridurre",
21529
21780
  "ui.readMore": "Leggere di più",
21530
21781
  "wfs.feature.limit": "Troppi oggetti per visualizzare il WFS layer!",
@@ -21571,6 +21822,7 @@ var nl = {
21571
21822
  "dashboard.labels.mySpace": "Mijn ruimte",
21572
21823
  "dashboard.records.all": "Catalogus",
21573
21824
  "dashboard.records.hasDraft": "",
21825
+ "dashboard.records.isMultilingual": "Dit record is meertalig ({languages})",
21574
21826
  "dashboard.records.myDraft": "Mijn concepten",
21575
21827
  "dashboard.records.myRecords": "Mijn Records",
21576
21828
  "dashboard.records.search": "Zoeken naar \"{searchText}\"",
@@ -21745,9 +21997,13 @@ var nl = {
21745
21997
  "editor.record.form.license.odc-by": "",
21746
21998
  "editor.record.form.license.pddl": "",
21747
21999
  "editor.record.form.license.unknown": "",
22000
+ "editor.record.form.multilingual.activate": "",
22001
+ "editor.record.form.multilingual.default": "",
21748
22002
  "editor.record.form.multilingual.enable": "",
22003
+ "editor.record.form.multilingual.forbidden": "",
21749
22004
  "editor.record.form.multilingual.open": "",
21750
22005
  "editor.record.form.multilingual.title": "",
22006
+ "editor.record.form.multilingual.validate": "",
21751
22007
  "editor.record.form.page.accessAndContact": "",
21752
22008
  "editor.record.form.page.description": "",
21753
22009
  "editor.record.form.page.resources": "",
@@ -21777,8 +22033,13 @@ var nl = {
21777
22033
  "editor.record.loadError.body": "",
21778
22034
  "editor.record.loadError.closeMessage": "",
21779
22035
  "editor.record.loadError.title": "",
21780
- "editor.record.lock.format": "",
21781
- "editor.record.lock.reason": "",
22036
+ "editor.record.lock.harvested": "",
22037
+ "editor.record.lock.owner": "",
22038
+ "editor.record.lock.resourceType": "",
22039
+ "editor.record.multilingual.confirmation.cancelText": "",
22040
+ "editor.record.multilingual.confirmation.confirmText": "",
22041
+ "editor.record.multilingual.confirmation.message": "",
22042
+ "editor.record.multilingual.confirmation.title": "",
21782
22043
  "editor.record.onlineResource.protocol.other": "",
21783
22044
  "editor.record.onlineResourceError.body": "",
21784
22045
  "editor.record.onlineResourceError.closeMessage": "",
@@ -21825,6 +22086,11 @@ var nl = {
21825
22086
  "facets.block.title.tag.default": "",
21826
22087
  "facets.block.title.th_regions_tree.default": "",
21827
22088
  "favorite.not.authenticated.tooltip": "",
22089
+ "feature.catalog.attribute.code": "Code",
22090
+ "feature.catalog.attribute.definition": "Beschrijving",
22091
+ "feature.catalog.attribute.name": "Naam",
22092
+ "feature.catalog.attribute.type": "Type",
22093
+ "feature.catalog.attribute.values": "Waarden",
21828
22094
  "input.file.dropFileLabel": "",
21829
22095
  "input.file.orInputUrl": "",
21830
22096
  "input.file.selectFileLabel": "",
@@ -21839,20 +22105,32 @@ var nl = {
21839
22105
  "input.image.uploadErrorLabel": "",
21840
22106
  "input.image.uploadProgressCancel": "",
21841
22107
  "input.image.uploadProgressLabel": "",
22108
+ "language.ar": "",
22109
+ "language.az": "",
21842
22110
  "language.ca": "Catalaans",
21843
22111
  "language.cs": "Tsjechisch",
22112
+ "language.cy": "",
22113
+ "language.da": "",
21844
22114
  "language.de": "Duits",
21845
22115
  "language.en": "Engels",
21846
22116
  "language.es": "Spaans",
21847
22117
  "language.fi": "Fins",
21848
22118
  "language.fr": "Frans",
22119
+ "language.hy": "",
21849
22120
  "language.is": "IJslands",
21850
22121
  "language.it": "Italiaans",
22122
+ "language.ka": "",
21851
22123
  "language.ko": "Koreaans",
21852
22124
  "language.nl": "Nederlands",
22125
+ "language.no": "",
22126
+ "language.pl": "",
21853
22127
  "language.pt": "Portugees",
22128
+ "language.rm": "",
21854
22129
  "language.ru": "Russisch",
21855
22130
  "language.sk": "Slowaaks",
22131
+ "language.sv": "",
22132
+ "language.tr": "",
22133
+ "language.uk": "",
21856
22134
  "language.zh": "Chinees",
21857
22135
  "map.add.layer": "",
21858
22136
  "map.add.layer.catalog": "",
@@ -21872,6 +22150,7 @@ var nl = {
21872
22150
  "map.navigation.message": "",
21873
22151
  "map.ogc.urlInput.hint": "",
21874
22152
  "map.select.layer": "",
22153
+ "map.select.style": "",
21875
22154
  "map.wfs.urlInput.hint": "",
21876
22155
  "map.wms.urlInput.hint": "",
21877
22156
  "multiselect.filter.placeholder": "",
@@ -21899,6 +22178,7 @@ var nl = {
21899
22178
  "record.action.duplicate": "",
21900
22179
  "record.action.duplicating": "",
21901
22180
  "record.action.rollback": "",
22181
+ "record.action.switchLang": "",
21902
22182
  "record.action.view": "",
21903
22183
  "record.card.metadata.contact": "",
21904
22184
  "record.externalViewer.open": "",
@@ -21949,9 +22229,15 @@ var nl = {
21949
22229
  "record.metadata.download": "",
21950
22230
  "record.metadata.feature.catalog": "",
21951
22231
  "record.metadata.formats": "",
22232
+ "record.metadata.isGeographical": "",
21952
22233
  "record.metadata.keywords": "",
21953
22234
  "record.metadata.languages": "",
21954
22235
  "record.metadata.lastUpdate": "",
22236
+ "record.metadata.linked.datasets": "",
22237
+ "record.metadata.linked.records": "",
22238
+ "record.metadata.linked.reuses": "",
22239
+ "record.metadata.linked.services": "",
22240
+ "record.metadata.linked.sourceDatasets": "",
21955
22241
  "record.metadata.links": "",
21956
22242
  "record.metadata.noUsage": "",
21957
22243
  "record.metadata.otherConstraints": "",
@@ -21961,6 +22247,8 @@ var nl = {
21961
22247
  "record.metadata.publication": "",
21962
22248
  "record.metadata.publications": "{count, plural, =0{} one{} other{}}",
21963
22249
  "record.metadata.quality": "",
22250
+ "record.metadata.quality.capabilities.failed": "",
22251
+ "record.metadata.quality.capabilities.success": "",
21964
22252
  "record.metadata.quality.contact.failed": "",
21965
22253
  "record.metadata.quality.contact.success": "",
21966
22254
  "record.metadata.quality.description.failed": "",
@@ -21972,6 +22260,8 @@ var nl = {
21972
22260
  "record.metadata.quality.legalConstraints.success": "",
21973
22261
  "record.metadata.quality.organisation.failed": "",
21974
22262
  "record.metadata.quality.organisation.success": "",
22263
+ "record.metadata.quality.source.failed": "",
22264
+ "record.metadata.quality.source.success": "",
21975
22265
  "record.metadata.quality.title.failed": "",
21976
22266
  "record.metadata.quality.title.success": "",
21977
22267
  "record.metadata.quality.topic.failed": "",
@@ -21979,7 +22269,6 @@ var nl = {
21979
22269
  "record.metadata.quality.updateFrequency.failed": "",
21980
22270
  "record.metadata.quality.updateFrequency.success": "",
21981
22271
  "record.metadata.related": "",
21982
- "record.metadata.related.contents": "",
21983
22272
  "record.metadata.ressources.and.links": "Bronnen en links",
21984
22273
  "record.metadata.sheet": "",
21985
22274
  "record.metadata.status": "",
@@ -21991,7 +22280,6 @@ var nl = {
21991
22280
  "record.metadata.temporalExtent.untilDate": "",
21992
22281
  "record.metadata.title": "",
21993
22282
  "record.metadata.topics": "",
21994
- "record.metadata.isGeographical": "",
21995
22283
  "record.metadata.uniqueId": "",
21996
22284
  "record.metadata.updateFrequency": "",
21997
22285
  "record.metadata.updatedOn": "",
@@ -22111,7 +22399,6 @@ var nl = {
22111
22399
  "tooltip.html.copy": "",
22112
22400
  "tooltip.id.copy": "",
22113
22401
  "tooltip.url.copy": "",
22114
- "tooltip.url.open": "",
22115
22402
  "ui.readLess": "",
22116
22403
  "ui.readMore": "",
22117
22404
  "wfs.feature.limit": "",
@@ -22158,6 +22445,7 @@ var pt = {
22158
22445
  "dashboard.labels.mySpace": "Meu espaço",
22159
22446
  "dashboard.records.all": "Catálogo",
22160
22447
  "dashboard.records.hasDraft": "",
22448
+ "dashboard.records.isMultilingual": "Este registro é multilíngue ({languages})",
22161
22449
  "dashboard.records.myDraft": "Meus rascunhos",
22162
22450
  "dashboard.records.myRecords": "Meus Registros",
22163
22451
  "dashboard.records.search": "Buscar por \"{searchText}\"",
@@ -22332,9 +22620,13 @@ var pt = {
22332
22620
  "editor.record.form.license.odc-by": "",
22333
22621
  "editor.record.form.license.pddl": "",
22334
22622
  "editor.record.form.license.unknown": "",
22623
+ "editor.record.form.multilingual.activate": "",
22624
+ "editor.record.form.multilingual.default": "",
22335
22625
  "editor.record.form.multilingual.enable": "",
22626
+ "editor.record.form.multilingual.forbidden": "",
22336
22627
  "editor.record.form.multilingual.open": "",
22337
22628
  "editor.record.form.multilingual.title": "",
22629
+ "editor.record.form.multilingual.validate": "",
22338
22630
  "editor.record.form.page.accessAndContact": "",
22339
22631
  "editor.record.form.page.description": "",
22340
22632
  "editor.record.form.page.resources": "",
@@ -22364,8 +22656,13 @@ var pt = {
22364
22656
  "editor.record.loadError.body": "",
22365
22657
  "editor.record.loadError.closeMessage": "",
22366
22658
  "editor.record.loadError.title": "",
22367
- "editor.record.lock.format": "",
22368
- "editor.record.lock.reason": "",
22659
+ "editor.record.lock.harvested": "",
22660
+ "editor.record.lock.owner": "",
22661
+ "editor.record.lock.resourceType": "",
22662
+ "editor.record.multilingual.confirmation.cancelText": "",
22663
+ "editor.record.multilingual.confirmation.confirmText": "",
22664
+ "editor.record.multilingual.confirmation.message": "",
22665
+ "editor.record.multilingual.confirmation.title": "",
22369
22666
  "editor.record.onlineResource.protocol.other": "",
22370
22667
  "editor.record.onlineResourceError.body": "",
22371
22668
  "editor.record.onlineResourceError.closeMessage": "",
@@ -22412,6 +22709,11 @@ var pt = {
22412
22709
  "facets.block.title.tag.default": "",
22413
22710
  "facets.block.title.th_regions_tree.default": "",
22414
22711
  "favorite.not.authenticated.tooltip": "",
22712
+ "feature.catalog.attribute.code": "Código",
22713
+ "feature.catalog.attribute.definition": "Descrição",
22714
+ "feature.catalog.attribute.name": "Nome",
22715
+ "feature.catalog.attribute.type": "Tipo",
22716
+ "feature.catalog.attribute.values": "Valores",
22415
22717
  "input.file.dropFileLabel": "",
22416
22718
  "input.file.orInputUrl": "",
22417
22719
  "input.file.selectFileLabel": "",
@@ -22426,20 +22728,32 @@ var pt = {
22426
22728
  "input.image.uploadErrorLabel": "",
22427
22729
  "input.image.uploadProgressCancel": "",
22428
22730
  "input.image.uploadProgressLabel": "",
22731
+ "language.ar": "",
22732
+ "language.az": "",
22429
22733
  "language.ca": "Catalão",
22430
22734
  "language.cs": "Tcheco",
22735
+ "language.cy": "",
22736
+ "language.da": "",
22431
22737
  "language.de": "Alemão",
22432
22738
  "language.en": "Inglês",
22433
22739
  "language.es": "Espanhol",
22434
22740
  "language.fi": "Finlandês",
22435
22741
  "language.fr": "Francês",
22742
+ "language.hy": "",
22436
22743
  "language.is": "Islandês",
22437
22744
  "language.it": "Italiano",
22745
+ "language.ka": "",
22438
22746
  "language.ko": "Coreano",
22439
22747
  "language.nl": "Holandês",
22748
+ "language.no": "",
22749
+ "language.pl": "",
22440
22750
  "language.pt": "Português",
22751
+ "language.rm": "",
22441
22752
  "language.ru": "Russo",
22442
22753
  "language.sk": "Eslovaco",
22754
+ "language.sv": "",
22755
+ "language.tr": "",
22756
+ "language.uk": "",
22443
22757
  "language.zh": "Chinês",
22444
22758
  "map.add.layer": "",
22445
22759
  "map.add.layer.catalog": "",
@@ -22459,6 +22773,7 @@ var pt = {
22459
22773
  "map.navigation.message": "",
22460
22774
  "map.ogc.urlInput.hint": "",
22461
22775
  "map.select.layer": "",
22776
+ "map.select.style": "",
22462
22777
  "map.wfs.urlInput.hint": "",
22463
22778
  "map.wms.urlInput.hint": "",
22464
22779
  "multiselect.filter.placeholder": "",
@@ -22486,6 +22801,7 @@ var pt = {
22486
22801
  "record.action.duplicate": "",
22487
22802
  "record.action.duplicating": "",
22488
22803
  "record.action.rollback": "",
22804
+ "record.action.switchLang": "",
22489
22805
  "record.action.view": "",
22490
22806
  "record.card.metadata.contact": "",
22491
22807
  "record.externalViewer.open": "",
@@ -22536,9 +22852,15 @@ var pt = {
22536
22852
  "record.metadata.download": "",
22537
22853
  "record.metadata.feature.catalog": "",
22538
22854
  "record.metadata.formats": "",
22855
+ "record.metadata.isGeographical": "",
22539
22856
  "record.metadata.keywords": "",
22540
22857
  "record.metadata.languages": "",
22541
22858
  "record.metadata.lastUpdate": "",
22859
+ "record.metadata.linked.datasets": "",
22860
+ "record.metadata.linked.records": "",
22861
+ "record.metadata.linked.reuses": "",
22862
+ "record.metadata.linked.services": "",
22863
+ "record.metadata.linked.sourceDatasets": "",
22542
22864
  "record.metadata.links": "",
22543
22865
  "record.metadata.noUsage": "",
22544
22866
  "record.metadata.otherConstraints": "",
@@ -22548,6 +22870,8 @@ var pt = {
22548
22870
  "record.metadata.publication": "",
22549
22871
  "record.metadata.publications": "{count, plural, =0{} one{} other{}}",
22550
22872
  "record.metadata.quality": "",
22873
+ "record.metadata.quality.capabilities.failed": "",
22874
+ "record.metadata.quality.capabilities.success": "",
22551
22875
  "record.metadata.quality.contact.failed": "",
22552
22876
  "record.metadata.quality.contact.success": "",
22553
22877
  "record.metadata.quality.description.failed": "",
@@ -22559,6 +22883,8 @@ var pt = {
22559
22883
  "record.metadata.quality.legalConstraints.success": "",
22560
22884
  "record.metadata.quality.organisation.failed": "",
22561
22885
  "record.metadata.quality.organisation.success": "",
22886
+ "record.metadata.quality.source.failed": "",
22887
+ "record.metadata.quality.source.success": "",
22562
22888
  "record.metadata.quality.title.failed": "",
22563
22889
  "record.metadata.quality.title.success": "",
22564
22890
  "record.metadata.quality.topic.failed": "",
@@ -22566,7 +22892,6 @@ var pt = {
22566
22892
  "record.metadata.quality.updateFrequency.failed": "",
22567
22893
  "record.metadata.quality.updateFrequency.success": "",
22568
22894
  "record.metadata.related": "",
22569
- "record.metadata.related.contents": "",
22570
22895
  "record.metadata.ressources.and.links": "Recursos e links",
22571
22896
  "record.metadata.sheet": "",
22572
22897
  "record.metadata.status": "",
@@ -22578,7 +22903,6 @@ var pt = {
22578
22903
  "record.metadata.temporalExtent.untilDate": "",
22579
22904
  "record.metadata.title": "",
22580
22905
  "record.metadata.topics": "",
22581
- "record.metadata.isGeographical": "",
22582
22906
  "record.metadata.uniqueId": "",
22583
22907
  "record.metadata.updateFrequency": "",
22584
22908
  "record.metadata.updatedOn": "",
@@ -22698,7 +23022,6 @@ var pt = {
22698
23022
  "tooltip.html.copy": "",
22699
23023
  "tooltip.id.copy": "",
22700
23024
  "tooltip.url.copy": "",
22701
- "tooltip.url.open": "",
22702
23025
  "ui.readLess": "",
22703
23026
  "ui.readMore": "",
22704
23027
  "wfs.feature.limit": "",
@@ -22816,10 +23139,18 @@ class Gn4FieldMapper {
22816
23139
  const langList = getAsArray(selectField(source, 'resourceLanguage'));
22817
23140
  const languages = langList.map((lang) => LANG_3_TO_2_MAPPER[lang]);
22818
23141
  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
23142
  return {
22821
23143
  ...output,
22822
23144
  defaultLanguage,
23145
+ };
23146
+ },
23147
+ otherLanguage: (output, source) => {
23148
+ const langList = getAsArray(selectField(source, 'otherLanguage'));
23149
+ const languages = langList.map((lang) => LANG_3_TO_2_MAPPER[lang]);
23150
+ const defaultLanguage = output.defaultLanguage ?? languages[0] ?? null;
23151
+ const otherLanguages = languages.filter((lang) => lang !== defaultLanguage);
23152
+ return {
23153
+ ...output,
22823
23154
  otherLanguages,
22824
23155
  };
22825
23156
  },
@@ -22924,6 +23255,9 @@ class Gn4FieldMapper {
22924
23255
  isPublishedToAll: (output, source) => this.addExtra({
22925
23256
  isPublishedToAll: selectField(source, 'isPublishedToAll'),
22926
23257
  }, output),
23258
+ isHarvested: (output, source) => this.addExtra({
23259
+ isHarvested: selectField(source, 'isHarvested') !== 'false',
23260
+ }, output),
22927
23261
  edit: (output, source) => this.addExtra({
22928
23262
  edit: selectField(source, 'edit'),
22929
23263
  }, output),
@@ -23213,6 +23547,7 @@ const ES_SOURCE_SUMMARY = [
23213
23547
  'cl_maintenanceAndUpdateFrequency',
23214
23548
  'tag',
23215
23549
  'MD_LegalConstraintsUseLimitationObject',
23550
+ 'MD_LegalConstraintsOtherConstraintsObject',
23216
23551
  'qualityScore',
23217
23552
  ];
23218
23553
  const ES_QUERY_FIELDS_PRIORITY = {
@@ -23736,16 +24071,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
23736
24071
  args: [METADATA_LANGUAGE]
23737
24072
  }] }] });
23738
24073
 
24074
+ class Gn4SettingsService {
24075
+ constructor(siteApiService) {
24076
+ this.siteApiService = siteApiService;
24077
+ this.identicon$ = this.getSettingsSetValueByKey('system/users/identicon');
24078
+ this.allowEditHarvested$ = this.getSettingsSetValueByKey('system/harvester/enableEditing');
24079
+ }
24080
+ getSettingsSetValueByKey(key) {
24081
+ return this.siteApiService.getSettingsSet(null, [key]).pipe(map$1((v) => v[key]), shareReplay({ bufferSize: 1, refCount: true }));
24082
+ }
24083
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, deps: [{ token: SiteApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
24084
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, providedIn: 'root' }); }
24085
+ }
24086
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, decorators: [{
24087
+ type: Injectable,
24088
+ args: [{
24089
+ providedIn: 'root',
24090
+ }]
24091
+ }], ctorParameters: () => [{ type: SiteApiService }] });
24092
+
23739
24093
  const minPublicationApiVersion = '4.2.5';
23740
24094
  const TEMPORARY_ID_PREFIX = 'TEMP-ID-';
23741
24095
  class Gn4Repository {
23742
- constructor(httpClient, gn4SearchApi, gn4SearchHelper, gn4Mapper, gn4RecordsApi, platformService) {
24096
+ constructor(httpClient, gn4SearchApi, gn4SearchHelper, gn4Mapper, gn4RecordsApi, platformService, gn4LanguagesApi, settingsService) {
23743
24097
  this.httpClient = httpClient;
23744
24098
  this.gn4SearchApi = gn4SearchApi;
23745
24099
  this.gn4SearchHelper = gn4SearchHelper;
23746
24100
  this.gn4Mapper = gn4Mapper;
23747
24101
  this.gn4RecordsApi = gn4RecordsApi;
23748
24102
  this.platformService = platformService;
24103
+ this.gn4LanguagesApi = gn4LanguagesApi;
24104
+ this.settingsService = settingsService;
23749
24105
  this._draftsChanged = new Subject();
23750
24106
  this.draftsChanged$ = this._draftsChanged.asObservable();
23751
24107
  }
@@ -23783,12 +24139,21 @@ class Gn4Repository {
23783
24139
  name: featureType.typeName || '',
23784
24140
  definition: featureType.definition || '',
23785
24141
  attributes: Array.isArray(featureType.attributeTable)
23786
- ? featureType.attributeTable.map((attr) => ({
23787
- name: attr.name,
23788
- code: attr.code,
23789
- title: attr.definition,
23790
- type: attr.type,
23791
- }))
24142
+ ? featureType.attributeTable.map((attr) => {
24143
+ const values = attr.values
24144
+ ?.filter((v) => v.code || v.label)
24145
+ .map((v) => ({
24146
+ code: v.code,
24147
+ label: v.label,
24148
+ }));
24149
+ return {
24150
+ name: attr.name,
24151
+ code: attr.code,
24152
+ definition: attr.definition,
24153
+ type: attr.type,
24154
+ ...(values?.length > 0 ? { values } : {}),
24155
+ };
24156
+ })
23792
24157
  : [],
23793
24158
  })),
23794
24159
  };
@@ -23851,11 +24216,29 @@ class Gn4Repository {
23851
24216
  ? this.getRecord(uniqueIdentifier).pipe(map$1((record) => record.extras['isPublishedToAll']))
23852
24217
  : of(true);
23853
24218
  }
23854
- canEditRecord(uniqueIdentifier) {
23855
- return this.getRecord(uniqueIdentifier).pipe(map$1((record) => {
23856
- return record.extras['edit'];
24219
+ canDuplicate(record) {
24220
+ return record.kind === 'dataset';
24221
+ }
24222
+ canDelete(record) {
24223
+ return this.settingsService.allowEditHarvested$.pipe(map$1((allowEditHarvested) => {
24224
+ return (record.extras['edit'] &&
24225
+ (!record.extras['isHarvested'] || allowEditHarvested));
23857
24226
  }));
23858
24227
  }
24228
+ canEdit(record, allowEditHarvested) {
24229
+ return (record.kind === 'dataset' &&
24230
+ record.extras['edit'] &&
24231
+ (!record.extras['isHarvested'] || allowEditHarvested));
24232
+ }
24233
+ canEditRecord(uniqueIdentifier) {
24234
+ return combineLatest([
24235
+ this.getRecord(uniqueIdentifier),
24236
+ this.settingsService.allowEditHarvested$,
24237
+ ]).pipe(map$1(([record, allowEditHarvested]) => record ? this.canEdit(record, allowEditHarvested) : false));
24238
+ }
24239
+ canEditIndexedRecord(record) {
24240
+ return this.settingsService.allowEditHarvested$.pipe(map$1((allowEditHarvested) => this.canEdit(record, allowEditHarvested)));
24241
+ }
23859
24242
  openRecordForEdition(uniqueIdentifier) {
23860
24243
  const draft$ = of(this.getRecordFromLocalStorage(uniqueIdentifier));
23861
24244
  const recordAsXml$ = this.getRecordAsXml(uniqueIdentifier);
@@ -23970,6 +24353,13 @@ class Gn4Repository {
23970
24353
  }));
23971
24354
  }));
23972
24355
  }
24356
+ getApplicationLanguages() {
24357
+ return this.gn4LanguagesApi
24358
+ .getApplicationLanguages()
24359
+ .pipe(map$1((languages) => languages
24360
+ .map((lang) => LANG_3_TO_2_MAPPER[lang.id ?? ''])
24361
+ .filter((code) => !!code)));
24362
+ }
23973
24363
  getRecordAsXml(uniqueIdentifier) {
23974
24364
  return this.gn4RecordsApi
23975
24365
  .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
@@ -24010,12 +24400,12 @@ class Gn4Repository {
24010
24400
  removeRecordFromLocalStorage(recordId) {
24011
24401
  window.localStorage.removeItem(this.getLocalStorageKeyForRecord(recordId));
24012
24402
  }
24013
- 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 }); }
24403
+ 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 }); }
24014
24404
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4Repository }); }
24015
24405
  }
24016
24406
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4Repository, decorators: [{
24017
24407
  type: Injectable
24018
- }], ctorParameters: () => [{ type: i1.HttpClient }, { type: SearchApiService }, { type: ElasticsearchService }, { type: Gn4Converter }, { type: RecordsApiService }, { type: PlatformServiceInterface }] });
24408
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: SearchApiService }, { type: ElasticsearchService }, { type: Gn4Converter }, { type: RecordsApiService }, { type: PlatformServiceInterface }, { type: LanguagesApiService }, { type: Gn4SettingsService }] });
24019
24409
 
24020
24410
  const IMAGE_URL$1 = '/geonetwork/images/harvesting/';
24021
24411
  class OrganizationsFromMetadataService {
@@ -24294,24 +24684,6 @@ const ORGANIZATIONS_STRATEGY = new InjectionToken('organizations-strategy', {
24294
24684
  factory: () => 'metadata',
24295
24685
  });
24296
24686
 
24297
- class Gn4SettingsService {
24298
- constructor(siteApiService) {
24299
- this.siteApiService = siteApiService;
24300
- this.identicon$ = this.getSettingsSetValueByKey('system/users/identicon');
24301
- }
24302
- getSettingsSetValueByKey(key) {
24303
- return this.siteApiService.getSettingsSet(null, [key]).pipe(map$1((v) => v[key]), shareReplay({ bufferSize: 1, refCount: true }));
24304
- }
24305
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, deps: [{ token: SiteApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
24306
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, providedIn: 'root' }); }
24307
- }
24308
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, decorators: [{
24309
- type: Injectable,
24310
- args: [{
24311
- providedIn: 'root',
24312
- }]
24313
- }], ctorParameters: () => [{ type: SiteApiService }] });
24314
-
24315
24687
  const DEFAULT_GN4_LOGIN_URL = `/geonetwork/srv/\${lang3}/catalog.signin?redirect=\${current_url}`;
24316
24688
  const LOGIN_URL = new InjectionToken('loginUrl');
24317
24689
  const DEFAULT_GN4_LOGOUT_URL = `/geonetwork/signout`;
@@ -25433,7 +25805,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25433
25805
  }] });
25434
25806
 
25435
25807
  var name = "geonetwork-ui";
25436
- var version = "2.6.0-dev.b1563a5e0";
25808
+ var version = "2.6.0-dev.c49d02679";
25437
25809
  var engines = {
25438
25810
  node: ">=20"
25439
25811
  };
@@ -25558,6 +25930,9 @@ class Gn4PlatformService {
25558
25930
  throw new Error(`Gn4 API version is not compatible.\nMinimum: ${minApiVersion}\nYour version: ${version}`);
25559
25931
  }
25560
25932
  }), shareReplay(1));
25933
+ this.allowEditHarvestedMd$ = this.settings$.pipe(map$1((info) => {
25934
+ return info['system/harvester/enableEditing'];
25935
+ }), shareReplay(1));
25561
25936
  /**
25562
25937
  * A map of already loaded thesauri (groups of keywords); the key is a URI
25563
25938
  * @private
@@ -25578,6 +25953,9 @@ class Gn4PlatformService {
25578
25953
  getApiVersion() {
25579
25954
  return this.apiVersion$;
25580
25955
  }
25956
+ getAllowEditHarvestedMd() {
25957
+ return this.allowEditHarvestedMd$;
25958
+ }
25581
25959
  getMe() {
25582
25960
  return this.me$;
25583
25961
  }
@@ -26010,422 +26388,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
26010
26388
  type: Output
26011
26389
  }] } });
26012
26390
 
26013
- class ExpandablePanelButtonComponent {
26014
- constructor() {
26015
- this.collapsed = true;
26016
- }
26017
- toggle() {
26018
- this.collapsed = !this.collapsed;
26019
- }
26020
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26021
- 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 }); }
26022
- }
26023
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelButtonComponent, decorators: [{
26024
- type: Component,
26025
- 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"] }]
26026
- }], propDecorators: { titleTemplate: [{
26027
- type: Input
26028
- }], collapsed: [{
26029
- type: Input
26030
- }] } });
26031
-
26032
- class ExpandablePanelComponent {
26033
- constructor(changeDetector) {
26034
- this.changeDetector = changeDetector;
26035
- this.iconColor = '';
26036
- this._collapsed = true;
26037
- }
26038
- ngAfterViewInit() {
26039
- if (this.contentDiv) {
26040
- this.contentObserver = new ResizeObserver(() => {
26041
- this.changeDetector.detectChanges();
26042
- });
26043
- this.contentObserver.observe(this.contentDiv.nativeElement);
26044
- }
26045
- }
26046
- set collapsed(value) {
26047
- this._collapsed = value;
26048
- }
26049
- get collapsed() {
26050
- return this._collapsed;
26051
- }
26052
- toggle() {
26053
- this.collapsed = !this.collapsed;
26054
- }
26055
- ngOnDestroy() {
26056
- if (this.contentObserver) {
26057
- this.contentObserver.disconnect();
26058
- }
26059
- }
26060
- 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 }); }
26061
- 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 }); }
26062
- }
26063
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelComponent, decorators: [{
26064
- type: Component,
26065
- 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" }]
26066
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { title: [{
26067
- type: Input
26068
- }], iconColor: [{
26069
- type: Input
26070
- }], titleTemplate: [{
26071
- type: ContentChild,
26072
- args: ['titleTemplate']
26073
- }], contentDiv: [{
26074
- type: ViewChild,
26075
- args: ['contentDiv']
26076
- }], collapsed: [{
26077
- type: Input
26078
- }] } });
26079
-
26080
- class FormFieldWrapperComponent {
26081
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26082
- 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 }); }
26083
- }
26084
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldWrapperComponent, decorators: [{
26085
- type: Component,
26086
- 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" }]
26087
- }], propDecorators: { label: [{
26088
- type: Input
26089
- }], hint: [{
26090
- type: Input
26091
- }] } });
26092
-
26093
- class MaxLinesComponent {
26094
- constructor(cdr) {
26095
- this.cdr = cdr;
26096
- this.maxLines = 6;
26097
- this.isExpanded = false;
26098
- this.maxHeight = '';
26099
- this.showToggleButton = false;
26100
- }
26101
- ngAfterViewInit() {
26102
- this.calculateMaxHeight();
26103
- this.observer = new ResizeObserver((mutations) => {
26104
- mutations.forEach(() => {
26105
- this.calculateMaxHeight();
26106
- });
26107
- });
26108
- this.observer.observe(this.container.nativeElement.children[0]);
26109
- }
26110
- toggleDisplay() {
26111
- this.isExpanded = !this.isExpanded;
26112
- this.calculateMaxHeight();
26113
- }
26114
- calculateMaxHeight() {
26115
- const containerElement = this.container.nativeElement;
26116
- const contentElement = containerElement.children[0];
26117
- const contentHeight = contentElement.getBoundingClientRect().height;
26118
- if (contentHeight) {
26119
- if (contentHeight > this.maxLines * this.getLineHeight(contentElement)) {
26120
- this.showToggleButton = true;
26121
- this.maxHeight = this.isExpanded
26122
- ? `${contentHeight}px`
26123
- : `${this.maxLines * this.getLineHeight(contentElement)}px`;
26124
- }
26125
- else {
26126
- this.showToggleButton = false;
26127
- this.maxHeight = `${contentHeight}px`;
26128
- }
26129
- containerElement.setAttribute('style', `max-height: ${this.maxHeight}; overflow: hidden`);
26130
- this.cdr.detectChanges();
26131
- }
26132
- }
26133
- getLineHeight(element) {
26134
- const computedStyle = window.getComputedStyle(element);
26135
- const lineHeight = parseFloat(computedStyle.lineHeight);
26136
- const fontSize = parseFloat(computedStyle.fontSize || '14');
26137
- const result = isNaN(lineHeight) ? fontSize * 1.2 : lineHeight; // Use a default if line height is not specified
26138
- return result;
26139
- }
26140
- ngOnDestroy() {
26141
- if (!this.observer)
26142
- return;
26143
- this.observer.unobserve(this.container.nativeElement.children[0]);
26144
- }
26145
- 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 }); }
26146
- 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 }); }
26147
- }
26148
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaxLinesComponent, decorators: [{
26149
- type: Component,
26150
- 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" }]
26151
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { maxLines: [{
26152
- type: Input
26153
- }], container: [{
26154
- type: ViewChild,
26155
- args: ['container']
26156
- }] } });
26157
-
26158
- class InteractiveTableColumnComponent {
26159
- constructor() {
26160
- this.grow = false;
26161
- this.sortable = false;
26162
- this.activeSort = null;
26163
- this.sortChange = new EventEmitter();
26164
- }
26165
- handleSortChange() {
26166
- this.activeSort = this.activeSort === 'asc' ? 'desc' : 'asc';
26167
- this.sortChange.emit(this.activeSort);
26168
- }
26169
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26170
- 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 }); }
26171
- }
26172
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableColumnComponent, decorators: [{
26173
- type: Component,
26174
- args: [{ selector: 'gn-ui-interactive-table-column', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span>empty</span>\n" }]
26175
- }], propDecorators: { header: [{
26176
- type: ContentChild,
26177
- args: ['header']
26178
- }], cell: [{
26179
- type: ContentChild,
26180
- args: ['cell']
26181
- }], grow: [{
26182
- type: Input
26183
- }], width: [{
26184
- type: Input
26185
- }], sortable: [{
26186
- type: Input
26187
- }], activeSort: [{
26188
- type: Input
26189
- }], sortChange: [{
26190
- type: Output
26191
- }] } });
26192
-
26193
- marker('editor.record.lock.reason');
26194
- marker('editor.record.lock.format');
26195
- class InteractiveTableComponent {
26196
- constructor() {
26197
- this.items = [];
26198
- this.isDraftPage = false;
26199
- this.itemClick = new EventEmitter();
26200
- }
26201
- get gridStyle() {
26202
- return {
26203
- 'grid-template-columns': this.columns
26204
- .map((column) => column.width
26205
- ? column.width
26206
- : column.grow
26207
- ? `minmax(0px,1fr)`
26208
- : `minmax(0px,max-content)`)
26209
- .join(' '),
26210
- };
26211
- }
26212
- getItemTitle(item) {
26213
- if (!item.extras?.edit && !this.isDraftPage && item.kind === 'dataset') {
26214
- return 'editor.record.lock.reason';
26215
- }
26216
- else if (item.kind !== 'dataset') {
26217
- return 'editor.record.lock.format';
26218
- }
26219
- return '';
26220
- }
26221
- handleRowClick(item) {
26222
- this.itemClick.emit(item);
26223
- }
26224
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26225
- 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 }); }
26226
- }
26227
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, decorators: [{
26228
- type: Component,
26229
- 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"] }]
26230
- }], propDecorators: { columns: [{
26231
- type: ContentChildren,
26232
- args: [InteractiveTableColumnComponent]
26233
- }], items: [{
26234
- type: Input
26235
- }], isDraftPage: [{
26236
- type: Input
26237
- }], itemClick: [{
26238
- type: Output
26239
- }] } });
26240
-
26241
- /**
26242
- * This component will make a block that will stay sticky on the top of the page,
26243
- * but will also shrink down to a minimum height when scrolling.
26244
- * The ratio between minimum and nominal height is stored in the shrinkRatio
26245
- * property, and can be used to change e.g. the opacity or size of child elements.
26246
- * This component renders at z-index: 50 by default.
26247
- * The first parent element with an overflow of `scroll` or `overflow` is considered
26248
- * for scroll events.
26249
- */
26250
- class StickyHeaderComponent {
26251
- constructor(changeDetector, hostEl, zone) {
26252
- this.changeDetector = changeDetector;
26253
- this.hostEl = hostEl;
26254
- this.zone = zone;
26255
- }
26256
- ngAfterViewInit() {
26257
- this.scrollSub = fromEvent(window, 'scroll', {
26258
- passive: true,
26259
- })
26260
- .pipe(throttleTime(0, animationFrameScheduler, {
26261
- leading: true,
26262
- trailing: true,
26263
- }))
26264
- .subscribe(this.updateSize.bind(this));
26265
- }
26266
- ngOnInit() {
26267
- this.placeholderEl = document.createElement('div');
26268
- this.placeholderEl.style.position = 'absolute';
26269
- this.placeholderEl.classList.add('sticky-header-placeholder');
26270
- this.hostEl.nativeElement.insertAdjacentElement('beforebegin', this.placeholderEl);
26271
- }
26272
- ngAfterViewChecked() {
26273
- this.updateSize();
26274
- }
26275
- ngOnDestroy() {
26276
- this.scrollSub.unsubscribe();
26277
- this.placeholderEl.remove();
26278
- }
26279
- updateSize() {
26280
- this.zone.runOutsideAngular(() => {
26281
- if (window.scrollY === this.parentScroll)
26282
- return;
26283
- this.parentScroll = window.scrollY;
26284
- const offsetTop = Math.max(0, this.parentScroll - this.placeholderEl.offsetTop);
26285
- const newHeightPx = Math.max(this.minHeightPx, this.fullHeightPx - offsetTop);
26286
- this.innerContainer.nativeElement.style.transform = `translate(0, ${newHeightPx - this.fullHeightPx}px)`;
26287
- this.expandRatio =
26288
- (newHeightPx - this.minHeightPx) /
26289
- (this.fullHeightPx - this.minHeightPx);
26290
- this.changeDetector.detectChanges();
26291
- });
26292
- }
26293
- 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 }); }
26294
- 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 }); }
26295
- }
26296
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickyHeaderComponent, decorators: [{
26297
- type: Component,
26298
- 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" }]
26299
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef, decorators: [{
26300
- type: Host
26301
- }] }, { type: i0.NgZone }], propDecorators: { minHeightPx: [{
26302
- type: Input
26303
- }], fullHeightPx: [{
26304
- type: Input
26305
- }], template: [{
26306
- type: ContentChild,
26307
- args: [TemplateRef]
26308
- }], outerContainer: [{
26309
- type: ViewChild,
26310
- args: ['outerContainer']
26311
- }], innerContainer: [{
26312
- type: ViewChild,
26313
- args: ['innerContainer']
26314
- }] } });
26315
-
26316
- class BlockListComponent {
26317
- get pages() {
26318
- return new Array(this.pagesCount).fill(0).map((_, i) => i);
26319
- }
26320
- get isFirstPage() {
26321
- return this.currentPage_ === 0;
26322
- }
26323
- get isLastPage() {
26324
- return this.currentPage_ === this.pagesCount - 1;
26325
- }
26326
- get pagesCount() {
26327
- return this.blocks ? Math.ceil(this.blocks.length / this.pageSize) : 1;
26328
- }
26329
- get currentPage() {
26330
- return this.currentPage_ + 1;
26331
- }
26332
- constructor(changeDetector) {
26333
- this.changeDetector = changeDetector;
26334
- this.pageSize = 4;
26335
- this.containerClass = '';
26336
- this.paginationContainerClass = 'w-full bottom-0 top-auto';
26337
- this.minHeight = 0;
26338
- this.listChanges = new EventEmitter();
26339
- this.subComponentSize = 'M';
26340
- this.currentPage_ = 0;
26341
- this.refreshBlocksVisibility = () => {
26342
- this.blocks.forEach((block, index) => {
26343
- block.nativeElement.style.display =
26344
- index >= this.currentPage_ * this.pageSize &&
26345
- index < (this.currentPage_ + 1) * this.pageSize
26346
- ? null
26347
- : 'none';
26348
- });
26349
- };
26350
- }
26351
- ngAfterViewInit() {
26352
- this.blocks.changes.subscribe(() => {
26353
- this.updateSizes();
26354
- this.refreshBlocksVisibility();
26355
- this.goToPage(1);
26356
- this.changeDetector.detectChanges();
26357
- this.listChanges.emit(this);
26358
- });
26359
- this.updateSizes();
26360
- this.refreshBlocksVisibility();
26361
- // we store the first height as the min-height of the list container
26362
- this.minHeight = this.blockContainer.nativeElement.clientHeight;
26363
- this.changeDetector.detectChanges();
26364
- this.listChanges.emit(this);
26365
- }
26366
- updateSizes() {
26367
- this.subComponentSize = this.computeSubComponentSize();
26368
- this.pageSize = this.computePageSize();
26369
- }
26370
- computeSubComponentSize() {
26371
- if (!this.blocks)
26372
- return 'M';
26373
- const subComponentsCount = this.blocks.length;
26374
- if (subComponentsCount <= 3)
26375
- return 'L';
26376
- if (subComponentsCount <= 12)
26377
- return 'M';
26378
- if (subComponentsCount <= 18)
26379
- return 'S';
26380
- return 'XS';
26381
- }
26382
- computePageSize() {
26383
- switch (this.subComponentSize) {
26384
- case 'L':
26385
- return 3;
26386
- case 'S':
26387
- return 6;
26388
- case 'XS':
26389
- return 8;
26390
- default:
26391
- return 4;
26392
- }
26393
- }
26394
- goToPage(pageIndex) {
26395
- this.currentPage_ = Math.max(Math.min(pageIndex - 1, this.pagesCount - 1), 0);
26396
- this.changeDetector.detectChanges();
26397
- this.refreshBlocksVisibility();
26398
- }
26399
- goToPrevPage() {
26400
- if (this.isFirstPage)
26401
- return;
26402
- this.goToPage(this.currentPage - 1);
26403
- }
26404
- goToNextPage() {
26405
- if (this.isLastPage)
26406
- return;
26407
- this.goToPage(this.currentPage + 1);
26408
- }
26409
- 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 }); }
26410
- 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 }); }
26411
- }
26412
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BlockListComponent, decorators: [{
26413
- type: Component,
26414
- 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"] }]
26415
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { containerClass: [{
26416
- type: Input
26417
- }], paginationContainerClass: [{
26418
- type: Input
26419
- }], blocks: [{
26420
- type: ContentChildren,
26421
- args: ['block', { read: ElementRef }]
26422
- }], blockContainer: [{
26423
- type: ViewChild,
26424
- args: ['blockContainer']
26425
- }], listChanges: [{
26426
- type: Output
26427
- }] } });
26428
-
26429
26391
  class ColorScaleComponent {
26430
26392
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ColorScaleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26431
26393
  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: [""] }); }
@@ -28358,6 +28320,531 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28358
28320
  type: Output
28359
28321
  }] } });
28360
28322
 
28323
+ class CellPopinComponent {
28324
+ set activePopin(active) {
28325
+ this._activePopin = !!active;
28326
+ this.updateIntersectionObserver();
28327
+ }
28328
+ get activePopin() {
28329
+ return this._activePopin;
28330
+ }
28331
+ constructor(scrollDispatcher, cdr) {
28332
+ this.scrollDispatcher = scrollDispatcher;
28333
+ this.cdr = cdr;
28334
+ this.extraClass = '';
28335
+ this.isOpen = false;
28336
+ this.isVisible = true;
28337
+ this.overlayPositions = [
28338
+ {
28339
+ originX: 'end',
28340
+ originY: 'top',
28341
+ overlayX: 'end',
28342
+ overlayY: 'top',
28343
+ },
28344
+ {
28345
+ originX: 'start',
28346
+ originY: 'top',
28347
+ overlayX: 'start',
28348
+ overlayY: 'top',
28349
+ },
28350
+ ];
28351
+ this.firstCheck = true;
28352
+ this._activePopin = true;
28353
+ }
28354
+ ngAfterViewInit() {
28355
+ if (!this.activePopin) {
28356
+ return;
28357
+ }
28358
+ if (this.cdkScrollContainer) {
28359
+ this.scrollDispatcher.register(this.cdkScrollContainer);
28360
+ }
28361
+ this.updateIntersectionObserver();
28362
+ }
28363
+ ngOnDestroy() {
28364
+ this.intersectionObserver?.disconnect();
28365
+ this.scrollDispatcher.deregister(this.cdkScrollContainer);
28366
+ }
28367
+ updateIntersectionObserver() {
28368
+ if (!this.scrollContainer || !this.anchorRef) {
28369
+ return;
28370
+ }
28371
+ if (this.intersectionObserver) {
28372
+ this.intersectionObserver?.disconnect();
28373
+ }
28374
+ this.intersectionObserver = new IntersectionObserver(([entry]) => {
28375
+ const visible = entry.intersectionRatio >= 1;
28376
+ // Ignore first visibility if first time opening it
28377
+ if (this.firstCheck && !visible) {
28378
+ this.firstCheck = false;
28379
+ return;
28380
+ }
28381
+ this.firstCheck = false;
28382
+ if (this.isVisible !== visible) {
28383
+ this.isVisible = visible;
28384
+ this.cdr.detectChanges();
28385
+ }
28386
+ }, {
28387
+ root: this.scrollContainer.nativeElement,
28388
+ threshold: 1.0,
28389
+ });
28390
+ this.intersectionObserver.observe(this.anchorRef.nativeElement);
28391
+ }
28392
+ openOverlay() {
28393
+ this.isOpen = true;
28394
+ }
28395
+ closeOverlay() {
28396
+ this.isOpen = false;
28397
+ }
28398
+ 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 }); }
28399
+ 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"] }] }); }
28400
+ }
28401
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellPopinComponent, decorators: [{
28402
+ type: Component,
28403
+ args: [{ selector: 'gn-ui-cell-popin', standalone: true, imports: [
28404
+ CommonModule,
28405
+ MatButtonModule,
28406
+ OverlayModule,
28407
+ ButtonComponent,
28408
+ NgIconComponent,
28409
+ ], 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" }]
28410
+ }], ctorParameters: () => [{ type: i1$8.ScrollDispatcher }, { type: i0.ChangeDetectorRef }], propDecorators: { extraClass: [{
28411
+ type: Input
28412
+ }], cdkScrollContainer: [{
28413
+ type: Input
28414
+ }], scrollContainer: [{
28415
+ type: Input
28416
+ }], anchorRef: [{
28417
+ type: ViewChild,
28418
+ args: ['anchorRef']
28419
+ }], activePopin: [{
28420
+ type: Input
28421
+ }] } });
28422
+
28423
+ class ExpandablePanelButtonComponent {
28424
+ constructor() {
28425
+ this.collapsed = true;
28426
+ }
28427
+ toggle() {
28428
+ this.collapsed = !this.collapsed;
28429
+ }
28430
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28431
+ 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 }); }
28432
+ }
28433
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelButtonComponent, decorators: [{
28434
+ type: Component,
28435
+ 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"] }]
28436
+ }], propDecorators: { titleTemplate: [{
28437
+ type: Input
28438
+ }], collapsed: [{
28439
+ type: Input
28440
+ }] } });
28441
+
28442
+ class ExpandablePanelComponent {
28443
+ constructor(changeDetector) {
28444
+ this.changeDetector = changeDetector;
28445
+ this.iconColor = '';
28446
+ this._collapsed = true;
28447
+ }
28448
+ ngAfterViewInit() {
28449
+ if (this.contentDiv) {
28450
+ this.contentObserver = new ResizeObserver(() => {
28451
+ this.changeDetector.detectChanges();
28452
+ });
28453
+ this.contentObserver.observe(this.contentDiv.nativeElement);
28454
+ }
28455
+ }
28456
+ set collapsed(value) {
28457
+ this._collapsed = value;
28458
+ }
28459
+ get collapsed() {
28460
+ return this._collapsed;
28461
+ }
28462
+ toggle() {
28463
+ this.collapsed = !this.collapsed;
28464
+ }
28465
+ ngOnDestroy() {
28466
+ if (this.contentObserver) {
28467
+ this.contentObserver.disconnect();
28468
+ }
28469
+ }
28470
+ 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 }); }
28471
+ 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 }); }
28472
+ }
28473
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelComponent, decorators: [{
28474
+ type: Component,
28475
+ 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" }]
28476
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { title: [{
28477
+ type: Input
28478
+ }], iconColor: [{
28479
+ type: Input
28480
+ }], titleTemplate: [{
28481
+ type: ContentChild,
28482
+ args: ['titleTemplate']
28483
+ }], contentDiv: [{
28484
+ type: ViewChild,
28485
+ args: ['contentDiv']
28486
+ }], collapsed: [{
28487
+ type: Input
28488
+ }] } });
28489
+
28490
+ class FormFieldWrapperComponent {
28491
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28492
+ 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 }); }
28493
+ }
28494
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldWrapperComponent, decorators: [{
28495
+ type: Component,
28496
+ 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" }]
28497
+ }], propDecorators: { label: [{
28498
+ type: Input
28499
+ }], hint: [{
28500
+ type: Input
28501
+ }] } });
28502
+
28503
+ class MaxLinesComponent {
28504
+ constructor(cdr) {
28505
+ this.cdr = cdr;
28506
+ this.maxLines = 6;
28507
+ this.isExpanded = false;
28508
+ this.maxHeight = '';
28509
+ this.showToggleButton = false;
28510
+ }
28511
+ ngAfterViewInit() {
28512
+ this.calculateMaxHeight();
28513
+ this.observer = new ResizeObserver((mutations) => {
28514
+ mutations.forEach(() => {
28515
+ this.calculateMaxHeight();
28516
+ });
28517
+ });
28518
+ this.observer.observe(this.container.nativeElement.children[0]);
28519
+ }
28520
+ toggleDisplay() {
28521
+ this.isExpanded = !this.isExpanded;
28522
+ this.calculateMaxHeight();
28523
+ }
28524
+ calculateMaxHeight() {
28525
+ const containerElement = this.container.nativeElement;
28526
+ const contentElement = containerElement.children[0];
28527
+ const contentHeight = contentElement.getBoundingClientRect().height;
28528
+ if (contentHeight) {
28529
+ if (contentHeight > this.maxLines * this.getLineHeight(contentElement)) {
28530
+ this.showToggleButton = true;
28531
+ this.maxHeight = this.isExpanded
28532
+ ? `${contentHeight}px`
28533
+ : `${this.maxLines * this.getLineHeight(contentElement)}px`;
28534
+ }
28535
+ else {
28536
+ this.showToggleButton = false;
28537
+ this.maxHeight = `${contentHeight}px`;
28538
+ }
28539
+ containerElement.setAttribute('style', `max-height: ${this.maxHeight}; overflow: hidden`);
28540
+ this.cdr.detectChanges();
28541
+ }
28542
+ }
28543
+ getLineHeight(element) {
28544
+ const computedStyle = window.getComputedStyle(element);
28545
+ const lineHeight = parseFloat(computedStyle.lineHeight);
28546
+ const fontSize = parseFloat(computedStyle.fontSize || '14');
28547
+ const result = isNaN(lineHeight) ? fontSize * 1.2 : lineHeight; // Use a default if line height is not specified
28548
+ return result;
28549
+ }
28550
+ ngOnDestroy() {
28551
+ if (!this.observer)
28552
+ return;
28553
+ this.observer.unobserve(this.container.nativeElement.children[0]);
28554
+ }
28555
+ 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 }); }
28556
+ 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 }); }
28557
+ }
28558
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaxLinesComponent, decorators: [{
28559
+ type: Component,
28560
+ 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" }]
28561
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { maxLines: [{
28562
+ type: Input
28563
+ }], container: [{
28564
+ type: ViewChild,
28565
+ args: ['container']
28566
+ }] } });
28567
+
28568
+ class InteractiveTableColumnComponent {
28569
+ constructor() {
28570
+ this.grow = false;
28571
+ this.sortable = false;
28572
+ this.activeSort = null;
28573
+ this.sortChange = new EventEmitter();
28574
+ }
28575
+ handleSortChange() {
28576
+ this.activeSort = this.activeSort === 'asc' ? 'desc' : 'asc';
28577
+ this.sortChange.emit(this.activeSort);
28578
+ }
28579
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28580
+ 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 }); }
28581
+ }
28582
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableColumnComponent, decorators: [{
28583
+ type: Component,
28584
+ args: [{ selector: 'gn-ui-interactive-table-column', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span>empty</span>\n" }]
28585
+ }], propDecorators: { header: [{
28586
+ type: ContentChild,
28587
+ args: ['header']
28588
+ }], cell: [{
28589
+ type: ContentChild,
28590
+ args: ['cell']
28591
+ }], grow: [{
28592
+ type: Input
28593
+ }], width: [{
28594
+ type: Input
28595
+ }], sortable: [{
28596
+ type: Input
28597
+ }], activeSort: [{
28598
+ type: Input
28599
+ }], sortChange: [{
28600
+ type: Output
28601
+ }] } });
28602
+
28603
+ marker('editor.record.lock.resourceType');
28604
+ marker('editor.record.lock.harvested');
28605
+ marker('editor.record.lock.owner');
28606
+ class InteractiveTableComponent {
28607
+ constructor() {
28608
+ this.items = [];
28609
+ this.canEditItem = () => of(true);
28610
+ this.isDraftPage = false;
28611
+ this.itemClick = new EventEmitter();
28612
+ }
28613
+ get gridStyle() {
28614
+ return {
28615
+ 'grid-template-columns': this.columns
28616
+ .map((column) => column.width
28617
+ ? column.width
28618
+ : column.grow
28619
+ ? `minmax(0px,1fr)`
28620
+ : `minmax(0px,max-content)`)
28621
+ .join(' '),
28622
+ };
28623
+ }
28624
+ getItemTitle(item) {
28625
+ if (!this.isDraftPage) {
28626
+ if (item.kind !== 'dataset') {
28627
+ return 'editor.record.lock.resourceType';
28628
+ }
28629
+ else if (item.extras?.isHarvested) {
28630
+ return 'editor.record.lock.harvested';
28631
+ }
28632
+ else if (!item.extras?.edit) {
28633
+ return 'editor.record.lock.owner';
28634
+ }
28635
+ }
28636
+ return '';
28637
+ }
28638
+ handleRowClick(item) {
28639
+ this.itemClick.emit(item);
28640
+ }
28641
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28642
+ 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 }); }
28643
+ }
28644
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, decorators: [{
28645
+ type: Component,
28646
+ 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"] }]
28647
+ }], propDecorators: { columns: [{
28648
+ type: ContentChildren,
28649
+ args: [InteractiveTableColumnComponent]
28650
+ }], items: [{
28651
+ type: Input
28652
+ }], canEditItem: [{
28653
+ type: Input
28654
+ }], isDraftPage: [{
28655
+ type: Input
28656
+ }], itemClick: [{
28657
+ type: Output
28658
+ }] } });
28659
+
28660
+ /**
28661
+ * This component will make a block that will stay sticky on the top of the page,
28662
+ * but will also shrink down to a minimum height when scrolling.
28663
+ * The ratio between minimum and nominal height is stored in the shrinkRatio
28664
+ * property, and can be used to change e.g. the opacity or size of child elements.
28665
+ * This component renders at z-index: 50 by default.
28666
+ * The first parent element with an overflow of `scroll` or `overflow` is considered
28667
+ * for scroll events.
28668
+ */
28669
+ class StickyHeaderComponent {
28670
+ constructor(changeDetector, hostEl, zone) {
28671
+ this.changeDetector = changeDetector;
28672
+ this.hostEl = hostEl;
28673
+ this.zone = zone;
28674
+ }
28675
+ ngAfterViewInit() {
28676
+ this.scrollSub = fromEvent(window, 'scroll', {
28677
+ passive: true,
28678
+ })
28679
+ .pipe(throttleTime(0, animationFrameScheduler, {
28680
+ leading: true,
28681
+ trailing: true,
28682
+ }))
28683
+ .subscribe(this.updateSize.bind(this));
28684
+ }
28685
+ ngOnInit() {
28686
+ this.placeholderEl = document.createElement('div');
28687
+ this.placeholderEl.style.position = 'absolute';
28688
+ this.placeholderEl.classList.add('sticky-header-placeholder');
28689
+ this.hostEl.nativeElement.insertAdjacentElement('beforebegin', this.placeholderEl);
28690
+ }
28691
+ ngAfterViewChecked() {
28692
+ this.updateSize();
28693
+ }
28694
+ ngOnDestroy() {
28695
+ this.scrollSub.unsubscribe();
28696
+ this.placeholderEl.remove();
28697
+ }
28698
+ updateSize() {
28699
+ this.zone.runOutsideAngular(() => {
28700
+ if (window.scrollY === this.parentScroll)
28701
+ return;
28702
+ this.parentScroll = window.scrollY;
28703
+ const offsetTop = Math.max(0, this.parentScroll - this.placeholderEl.offsetTop);
28704
+ const newHeightPx = Math.max(this.minHeightPx, this.fullHeightPx - offsetTop);
28705
+ this.innerContainer.nativeElement.style.transform = `translate(0, ${newHeightPx - this.fullHeightPx}px)`;
28706
+ this.expandRatio =
28707
+ (newHeightPx - this.minHeightPx) /
28708
+ (this.fullHeightPx - this.minHeightPx);
28709
+ this.changeDetector.detectChanges();
28710
+ });
28711
+ }
28712
+ 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 }); }
28713
+ 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 }); }
28714
+ }
28715
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickyHeaderComponent, decorators: [{
28716
+ type: Component,
28717
+ 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" }]
28718
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef, decorators: [{
28719
+ type: Host
28720
+ }] }, { type: i0.NgZone }], propDecorators: { minHeightPx: [{
28721
+ type: Input
28722
+ }], fullHeightPx: [{
28723
+ type: Input
28724
+ }], template: [{
28725
+ type: ContentChild,
28726
+ args: [TemplateRef]
28727
+ }], outerContainer: [{
28728
+ type: ViewChild,
28729
+ args: ['outerContainer']
28730
+ }], innerContainer: [{
28731
+ type: ViewChild,
28732
+ args: ['innerContainer']
28733
+ }] } });
28734
+
28735
+ class BlockListComponent {
28736
+ get pages() {
28737
+ return new Array(this.pagesCount).fill(0).map((_, i) => i);
28738
+ }
28739
+ get isFirstPage() {
28740
+ return this.currentPage_ === 0;
28741
+ }
28742
+ get isLastPage() {
28743
+ return this.currentPage_ === this.pagesCount - 1;
28744
+ }
28745
+ get pagesCount() {
28746
+ return this.blocks ? Math.ceil(this.blocks.length / this.pageSize) : 1;
28747
+ }
28748
+ get currentPage() {
28749
+ return this.currentPage_ + 1;
28750
+ }
28751
+ constructor(changeDetector) {
28752
+ this.changeDetector = changeDetector;
28753
+ this.pageSize = 4;
28754
+ this.containerClass = '';
28755
+ this.paginationContainerClass = 'w-full bottom-0 top-auto';
28756
+ this.minHeight = 0;
28757
+ this.listChanges = new EventEmitter();
28758
+ this.subComponentSize = 'M';
28759
+ this.currentPage_ = 0;
28760
+ this.refreshBlocksVisibility = () => {
28761
+ this.blocks.forEach((block, index) => {
28762
+ block.nativeElement.style.display =
28763
+ index >= this.currentPage_ * this.pageSize &&
28764
+ index < (this.currentPage_ + 1) * this.pageSize
28765
+ ? null
28766
+ : 'none';
28767
+ });
28768
+ };
28769
+ }
28770
+ ngAfterViewInit() {
28771
+ this.blocks.changes.subscribe(() => {
28772
+ this.updateSizes();
28773
+ this.refreshBlocksVisibility();
28774
+ this.goToPage(1);
28775
+ this.changeDetector.detectChanges();
28776
+ this.listChanges.emit(this);
28777
+ });
28778
+ this.updateSizes();
28779
+ this.refreshBlocksVisibility();
28780
+ // we store the first height as the min-height of the list container
28781
+ this.minHeight = this.blockContainer.nativeElement.clientHeight;
28782
+ this.changeDetector.detectChanges();
28783
+ this.listChanges.emit(this);
28784
+ }
28785
+ updateSizes() {
28786
+ this.subComponentSize = this.computeSubComponentSize();
28787
+ this.pageSize = this.computePageSize();
28788
+ }
28789
+ computeSubComponentSize() {
28790
+ if (!this.blocks)
28791
+ return 'M';
28792
+ const subComponentsCount = this.blocks.length;
28793
+ if (subComponentsCount <= 3)
28794
+ return 'L';
28795
+ if (subComponentsCount <= 12)
28796
+ return 'M';
28797
+ if (subComponentsCount <= 18)
28798
+ return 'S';
28799
+ return 'XS';
28800
+ }
28801
+ computePageSize() {
28802
+ switch (this.subComponentSize) {
28803
+ case 'L':
28804
+ return 3;
28805
+ case 'S':
28806
+ return 6;
28807
+ case 'XS':
28808
+ return 8;
28809
+ default:
28810
+ return 4;
28811
+ }
28812
+ }
28813
+ goToPage(pageIndex) {
28814
+ this.currentPage_ = Math.max(Math.min(pageIndex - 1, this.pagesCount - 1), 0);
28815
+ this.changeDetector.detectChanges();
28816
+ this.refreshBlocksVisibility();
28817
+ }
28818
+ goToPrevPage() {
28819
+ if (this.isFirstPage)
28820
+ return;
28821
+ this.goToPage(this.currentPage - 1);
28822
+ }
28823
+ goToNextPage() {
28824
+ if (this.isLastPage)
28825
+ return;
28826
+ this.goToPage(this.currentPage + 1);
28827
+ }
28828
+ 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 }); }
28829
+ 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 }); }
28830
+ }
28831
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BlockListComponent, decorators: [{
28832
+ type: Component,
28833
+ 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"] }]
28834
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { containerClass: [{
28835
+ type: Input
28836
+ }], paginationContainerClass: [{
28837
+ type: Input
28838
+ }], blocks: [{
28839
+ type: ContentChildren,
28840
+ args: ['block', { read: ElementRef }]
28841
+ }], blockContainer: [{
28842
+ type: ViewChild,
28843
+ args: ['blockContainer']
28844
+ }], listChanges: [{
28845
+ type: Output
28846
+ }] } });
28847
+
28361
28848
  class SortableListComponent {
28362
28849
  constructor() {
28363
28850
  this.itemsOrderChange = new EventEmitter();
@@ -28532,34 +29019,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28532
29019
  }] });
28533
29020
 
28534
29021
  class TruncatedTextComponent {
28535
- constructor(cd, ngZone, viewportRuler) {
29022
+ constructor(cd, ngZone) {
28536
29023
  this.cd = cd;
28537
29024
  this.ngZone = ngZone;
28538
- this.viewportRuler = viewportRuler;
28539
29025
  this.text = '';
28540
29026
  this.extraClass = '';
28541
29027
  this.isTextTruncated = false;
28542
- this.isOpen = false;
28543
- this.overlayPosition = {
28544
- originX: 'end',
28545
- originY: 'top',
28546
- overlayX: 'end',
28547
- overlayY: 'top',
28548
- };
28549
29028
  this.resizeObserver = new ResizeObserver(() => {
28550
29029
  this.ngZone.run(() => this.checkTextTruncation());
28551
29030
  });
28552
29031
  this.mutationObserver = new MutationObserver(() => {
28553
29032
  this.ngZone.run(() => {
28554
29033
  this.checkTextTruncation();
28555
- this.close();
28556
29034
  });
28557
29035
  });
28558
- this.viewportSubscription = this.viewportRuler.change().subscribe(() => {
28559
- if (this.isOpen) {
28560
- this.updateOverlayPosition();
28561
- }
28562
- });
28563
29036
  }
28564
29037
  ngAfterViewInit() {
28565
29038
  const element = this.textElement.nativeElement;
@@ -28574,39 +29047,14 @@ class TruncatedTextComponent {
28574
29047
  ngOnDestroy() {
28575
29048
  this.resizeObserver?.disconnect();
28576
29049
  this.mutationObserver?.disconnect();
28577
- this.viewportSubscription?.unsubscribe();
28578
- this.close();
28579
- }
28580
- toggleOverlay() {
28581
- this.isOpen = !this.isOpen;
28582
- if (this.isOpen) {
28583
- this.updateOverlayPosition();
28584
- }
28585
- }
28586
- updateOverlayPosition() {
28587
- const element = this.textElement.nativeElement;
28588
- const rect = element.getBoundingClientRect();
28589
- const viewportWidth = this.viewportRuler.getViewportSize().width;
28590
- const isMobile = viewportWidth < 640;
28591
- const overlayWidth = isMobile ? 190 : 320;
28592
- const isNearLeftEdge = rect.left < overlayWidth;
28593
- this.overlayPosition = {
28594
- originX: isNearLeftEdge ? 'start' : 'end',
28595
- originY: 'top',
28596
- overlayX: isNearLeftEdge ? 'start' : 'end',
28597
- overlayY: 'top',
28598
- };
28599
- }
28600
- close() {
28601
- this.isOpen = false;
28602
29050
  }
28603
29051
  checkTextTruncation() {
28604
29052
  const element = this.textElement.nativeElement;
28605
29053
  this.isTextTruncated = element.scrollWidth > element.clientWidth;
28606
29054
  this.cd.detectChanges();
28607
29055
  }
28608
- 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 }); }
28609
- 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"] }] }); }
29056
+ 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 }); }
29057
+ 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"] }] }); }
28610
29058
  }
28611
29059
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TruncatedTextComponent, decorators: [{
28612
29060
  type: Component,
@@ -28616,12 +29064,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28616
29064
  MatButtonModule,
28617
29065
  OverlayModule,
28618
29066
  ButtonComponent,
29067
+ CellPopinComponent,
28619
29068
  NgIconComponent,
28620
- ], 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" }]
28621
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i1$8.ViewportRuler }], propDecorators: { text: [{
29069
+ ], 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" }]
29070
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }], propDecorators: { text: [{
28622
29071
  type: Input
28623
29072
  }], extraClass: [{
28624
29073
  type: Input
29074
+ }], scrollContainer: [{
29075
+ type: Input
29076
+ }], cdkScrollContainer: [{
29077
+ type: Input
28625
29078
  }], textElement: [{
28626
29079
  type: ViewChild,
28627
29080
  args: ['textElement']
@@ -29232,6 +29685,10 @@ marker('record.metadata.quality.updateFrequency.success');
29232
29685
  marker('record.metadata.quality.updateFrequency.failed');
29233
29686
  marker('record.metadata.quality.organisation.success');
29234
29687
  marker('record.metadata.quality.organisation.failed');
29688
+ marker('record.metadata.quality.capabilities.success');
29689
+ marker('record.metadata.quality.capabilities.failed');
29690
+ marker('record.metadata.quality.source.success');
29691
+ marker('record.metadata.quality.source.failed');
29235
29692
  class MetadataQualityItemComponent {
29236
29693
  get icon() {
29237
29694
  return this.value ? 'matCheck' : 'matWarningAmber';
@@ -29255,6 +29712,28 @@ class MetadataQualityComponent {
29255
29712
  constructor() {
29256
29713
  this.smaller = false;
29257
29714
  this.items = [];
29715
+ this.COMMON_CHECKS = {
29716
+ title: (metadata) => !!metadata?.title,
29717
+ description: (metadata) => !!metadata?.abstract,
29718
+ keywords: (metadata) => (metadata?.keywords?.length ?? 0) > 0,
29719
+ legalConstraints: (metadata) => (metadata?.legalConstraints?.length ?? 0) > 0,
29720
+ contact: (metadata) => !!metadata?.contacts?.[0]?.email,
29721
+ };
29722
+ this.SPECIFIC_CHECKS = {
29723
+ dataset: {
29724
+ updateFrequency: (metadata) => !!metadata?.updateFrequency,
29725
+ topic: (metadata) => (metadata?.topics?.length ?? 0) > 0,
29726
+ organisation: (metadata) => !!metadata?.contacts?.[0]?.organization?.name,
29727
+ },
29728
+ service: {
29729
+ capabilities: (metadata) => (metadata?.onlineResources ?? []).some((resource) => this.hasGetCapabilities(resource?.url?.href ?? '')),
29730
+ },
29731
+ reuse: {
29732
+ topic: (metadata) => (metadata?.topics?.length ?? 0) > 0,
29733
+ organisation: (metadata) => !!metadata?.contacts?.[0]?.organization?.name,
29734
+ source: (metadata) => !!metadata?.extras?.sourcesIdentifiers,
29735
+ },
29736
+ };
29258
29737
  }
29259
29738
  get qualityScore() {
29260
29739
  const qualityScore = this.metadata?.extras?.qualityScore;
@@ -29270,17 +29749,20 @@ class MetadataQualityComponent {
29270
29749
  this.items.push({ name, value });
29271
29750
  }
29272
29751
  }
29752
+ hasGetCapabilities(url) {
29753
+ return url.toLowerCase().includes('capabilities');
29754
+ }
29273
29755
  initialize() {
29274
- const contact = this.metadata?.contacts?.[0];
29275
29756
  this.items = [];
29276
- this.add('title', !!this.metadata?.title);
29277
- this.add('description', !!this.metadata?.abstract);
29278
- this.add('topic', this.metadata?.topics?.length > 0);
29279
- this.add('keywords', this.metadata?.keywords?.length > 0);
29280
- this.add('legalConstraints', this.metadata?.legalConstraints?.length > 0);
29281
- this.add('organisation', !!contact?.organization);
29282
- this.add('contact', !!contact?.email);
29283
- this.add('updateFrequency', !!this.metadata?.updateFrequency);
29757
+ Object.entries(this.COMMON_CHECKS).forEach(([name, check]) => {
29758
+ this.add(name, check(this.metadata));
29759
+ });
29760
+ const datasetType = this.metadata?.kind;
29761
+ if (datasetType && this.SPECIFIC_CHECKS[datasetType]) {
29762
+ Object.entries(this.SPECIFIC_CHECKS[datasetType]).forEach(([name, check]) => {
29763
+ this.add(name, check(this.metadata));
29764
+ });
29765
+ }
29284
29766
  }
29285
29767
  ngOnChanges(changes) {
29286
29768
  if (changes['metadata'] || changes['metadataQualityDisplay']) {
@@ -29324,6 +29806,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29324
29806
  type: Input
29325
29807
  }] } });
29326
29808
 
29809
+ class InternalLinkCardContactComponent {
29810
+ constructor() {
29811
+ this.size = 'M';
29812
+ }
29813
+ get organization() {
29814
+ return this.record.ownerOrganization;
29815
+ }
29816
+ get contacts() {
29817
+ return ((this.record.kind === 'dataset'
29818
+ ? this.record.contactsForResource
29819
+ : this.record.contacts) || []);
29820
+ }
29821
+ openExternalUrl(event, url) {
29822
+ event.stopPropagation();
29823
+ window.open(url, '_blank');
29824
+ }
29825
+ openMailto(event, email) {
29826
+ event.stopPropagation();
29827
+ window.open(`mailto:${email}`, '_blank');
29828
+ }
29829
+ copyToClipboard(event, text) {
29830
+ event.stopPropagation();
29831
+ navigator.clipboard.writeText(text);
29832
+ }
29833
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InternalLinkCardContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29834
+ 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: [
29835
+ provideIcons({
29836
+ iconoirInternet,
29837
+ matEmailOutline,
29838
+ matPhoneOutline,
29839
+ matLocationOnOutline,
29840
+ }),
29841
+ ], 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"] }] }); }
29842
+ }
29843
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InternalLinkCardContactComponent, decorators: [{
29844
+ type: Component,
29845
+ args: [{ selector: 'gn-ui-internal-link-card-contact', standalone: true, imports: [NgIf, ThumbnailComponent, NgIconComponent, TranslateModule], providers: [
29846
+ provideIcons({
29847
+ iconoirInternet,
29848
+ matEmailOutline,
29849
+ matPhoneOutline,
29850
+ matLocationOnOutline,
29851
+ }),
29852
+ ], 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" }]
29853
+ }], propDecorators: { record: [{
29854
+ type: Input
29855
+ }], size: [{
29856
+ type: Input
29857
+ }] } });
29858
+
29327
29859
  class InternalLinkCardComponent {
29328
29860
  set size(value) {
29329
29861
  this._size = value;
@@ -29365,28 +29897,19 @@ class InternalLinkCardComponent {
29365
29897
  this.abstract = removeWhitespace(stripHtml(this.record?.abstract));
29366
29898
  this.subscription.add(fromEvent(this.elementRef.nativeElement, 'click').subscribe(() => this.mdSelect.emit(this.record)));
29367
29899
  }
29368
- get organization() {
29369
- return this.record.ownerOrganization;
29370
- }
29371
- get contacts() {
29372
- return ((this.record.kind === 'dataset'
29373
- ? this.record.contactsForResource
29374
- : this.record.contacts) || []);
29375
- }
29376
29900
  getTitleClass() {
29377
29901
  return this.titleClassMap[this._size];
29378
29902
  }
29379
- openExternalUrl(event, url) {
29380
- event.stopPropagation();
29381
- window.open(url, '_blank');
29382
- }
29383
- openMailto(event, email) {
29384
- event.stopPropagation();
29385
- window.open(`mailto:${email}`, '_blank');
29903
+ getAbstractClass() {
29904
+ const marginClass = ['S', 'XS'].includes(this.size) ? 'ml-2' : '';
29905
+ const clampClass = this.size === 'L' && !this.record.ownerOrganization?.name
29906
+ ? 'line-clamp-6'
29907
+ : 'line-clamp-2';
29908
+ return `${clampClass} ${marginClass}`.trim();
29386
29909
  }
29387
- copyToClipboard(event, text) {
29388
- event.stopPropagation();
29389
- navigator.clipboard.writeText(text);
29910
+ displayAbstract() {
29911
+ return (this.size === 'L' ||
29912
+ (['M', 'S'].includes(this.size) && !this.record.ownerOrganization?.name));
29390
29913
  }
29391
29914
  get shouldShowThumbnail() {
29392
29915
  return this.size === 'L' || this.size === 'M';
@@ -29396,40 +29919,34 @@ class InternalLinkCardComponent {
29396
29919
  provideIcons({
29397
29920
  iconoirInternet,
29398
29921
  matLocationSearchingOutline,
29399
- matEmailOutline,
29400
- matPhoneOutline,
29401
- matLocationOnOutline,
29402
29922
  }),
29403
29923
  provideNgIconsConfig({
29404
29924
  size: '1.2em',
29405
29925
  }),
29406
- ], 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"] }] }); }
29926
+ ], 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"] }] }); }
29407
29927
  }
29408
29928
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InternalLinkCardComponent, decorators: [{
29409
29929
  type: Component,
29410
29930
  args: [{ selector: 'gn-ui-internal-link-card', standalone: true, imports: [
29411
29931
  NgClass,
29412
29932
  NgIf,
29413
- ThumbnailComponent,
29414
29933
  MetadataQualityComponent,
29415
29934
  NgTemplateOutlet,
29416
- NgIconComponent,
29417
29935
  TranslateModule,
29418
29936
  GeoDataBadgeComponent,
29419
29937
  KindBadgeComponent,
29420
29938
  MarkdownParserComponent,
29939
+ InternalLinkCardContactComponent,
29940
+ ThumbnailComponent,
29421
29941
  ], providers: [
29422
29942
  provideIcons({
29423
29943
  iconoirInternet,
29424
29944
  matLocationSearchingOutline,
29425
- matEmailOutline,
29426
- matPhoneOutline,
29427
- matLocationOnOutline,
29428
29945
  }),
29429
29946
  provideNgIconsConfig({
29430
29947
  size: '1.2em',
29431
29948
  }),
29432
- ], 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" }]
29949
+ ], 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" }]
29433
29950
  }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { record: [{
29434
29951
  type: Input
29435
29952
  }], linkTarget: [{
@@ -31442,7 +31959,8 @@ class UiElementsModule {
31442
31959
  InternalLinkCardComponent,
31443
31960
  ServiceCapabilitiesComponent,
31444
31961
  KindBadgeComponent,
31445
- GeoDataBadgeComponent], exports: [ThumbnailComponent,
31962
+ GeoDataBadgeComponent,
31963
+ ScrollingModule], exports: [ThumbnailComponent,
31446
31964
  AvatarComponent,
31447
31965
  UserPreviewComponent,
31448
31966
  MarkdownParserComponent,
@@ -31475,7 +31993,8 @@ class UiElementsModule {
31475
31993
  InternalLinkCardComponent,
31476
31994
  ServiceCapabilitiesComponent,
31477
31995
  KindBadgeComponent,
31478
- GeoDataBadgeComponent] }); }
31996
+ GeoDataBadgeComponent,
31997
+ ScrollingModule] }); }
31479
31998
  }
31480
31999
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, decorators: [{
31481
32000
  type: NgModule,
@@ -31504,6 +32023,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31504
32023
  ServiceCapabilitiesComponent,
31505
32024
  KindBadgeComponent,
31506
32025
  GeoDataBadgeComponent,
32026
+ ScrollingModule,
31507
32027
  ],
31508
32028
  providers: [
31509
32029
  provideNgIconsConfig({
@@ -31593,48 +32113,130 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31593
32113
  type: Output
31594
32114
  }] } });
31595
32115
 
32116
+ marker('feature.catalog.attribute.type');
32117
+ marker('feature.catalog.attribute.name');
32118
+ marker('feature.catalog.attribute.code');
32119
+ marker('feature.catalog.attribute.definition');
32120
+ marker('feature.catalog.attribute.values');
31596
32121
  class FeatureCatalogListComponent {
31597
32122
  constructor() {
31598
- this.columns = [
31599
- {
31600
- key: 'type',
31601
- label: 'feature.catalog.attribute.type',
31602
- width: '19%',
31603
- },
31604
- {
31605
- key: 'name',
31606
- label: 'feature.catalog.attribute.name',
31607
- width: '32%',
31608
- },
31609
- {
31610
- key: 'code',
31611
- label: 'feature.catalog.attribute.code',
31612
- width: '24%',
31613
- },
31614
- {
31615
- key: 'title',
31616
- label: 'feature.catalog.attribute.description',
31617
- width: '25%',
31618
- },
32123
+ this.COLUMNS_DEFAULT = [
32124
+ { key: 'type', width: '17%' },
32125
+ { key: 'name', width: '32%' },
32126
+ { key: 'code', width: '17%' },
32127
+ { key: 'definition', width: 'minmax(0px, 1fr)' },
31619
32128
  ];
31620
- this.gridTemplateColumns = '';
32129
+ this.COLUMN_VALUES = {
32130
+ key: 'values',
32131
+ width: '73px',
32132
+ class: 'text-center',
32133
+ };
31621
32134
  }
31622
- ngOnInit() {
31623
- this.gridTemplateColumns = this.columns.map((col) => col.width).join(' ');
32135
+ getColumnsDefinition(attrs) {
32136
+ const hasValues = attrs.some((a) => a.values?.length > 0);
32137
+ return [...this.COLUMNS_DEFAULT, ...(hasValues ? [this.COLUMN_VALUES] : [])];
32138
+ }
32139
+ getGridTemplateColumns(attributes) {
32140
+ return this.getColumnsDefinition(attributes)
32141
+ .map((col) => col.width)
32142
+ .join(' ');
32143
+ }
32144
+ trackByColumn(_i, col) {
32145
+ return col.key;
31624
32146
  }
31625
32147
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureCatalogListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
31626
- 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"] }] }); }
32148
+ 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]" }] }); }
31627
32149
  }
31628
32150
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureCatalogListComponent, decorators: [{
31629
32151
  type: Component,
31630
32152
  args: [{ selector: 'gn-ui-feature-catalog-list', standalone: true, imports: [
32153
+ ButtonComponent,
32154
+ CellPopinComponent,
31631
32155
  CommonModule,
31632
32156
  TranslateModule,
31633
32157
  ExpandablePanelComponent,
31634
32158
  TruncatedTextComponent,
31635
- ], 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" }]
32159
+ NgIconComponent,
32160
+ ScrollingModule,
32161
+ ], 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" }]
31636
32162
  }], propDecorators: { filteredFeatureCatalog: [{
31637
32163
  type: Input
32164
+ }], scrollContainer: [{
32165
+ type: ViewChild,
32166
+ args: ['scrollContainer']
32167
+ }], scrollable: [{
32168
+ type: ViewChild,
32169
+ args: [CdkScrollable, { static: true }]
32170
+ }], panelComponent: [{
32171
+ type: ViewChild,
32172
+ args: ['expanel', { read: ExpandablePanelComponent, static: true }]
32173
+ }] } });
32174
+
32175
+ class ActionMenuComponent {
32176
+ constructor(dialog, cdr) {
32177
+ this.dialog = dialog;
32178
+ this.cdr = cdr;
32179
+ this.canDuplicate = true;
32180
+ this.canDelete = true;
32181
+ this.duplicate = new EventEmitter();
32182
+ this.delete = new EventEmitter();
32183
+ this.closeActionMenu = new EventEmitter();
32184
+ this.rollback = new EventEmitter();
32185
+ this.switch = new EventEmitter();
32186
+ this.sectionDisplayed = 'mainMenu';
32187
+ }
32188
+ displayMainMenu() {
32189
+ this.sectionDisplayed = 'mainMenu';
32190
+ this.cdr.markForCheck();
32191
+ }
32192
+ displayDeleteMenu() {
32193
+ switch (this.page) {
32194
+ case 'draft':
32195
+ this.sectionDisplayed = 'rollbackMenu';
32196
+ break;
32197
+ case 'record':
32198
+ this.delete.emit();
32199
+ break;
32200
+ case 'main':
32201
+ default:
32202
+ this.sectionDisplayed = 'deleteMenu';
32203
+ }
32204
+ this.cdr.markForCheck();
32205
+ }
32206
+ 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 }); }
32207
+ 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"] }] }); }
32208
+ }
32209
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ActionMenuComponent, decorators: [{
32210
+ type: Component,
32211
+ args: [{ selector: 'gn-ui-action-menu', standalone: true, imports: [
32212
+ CommonModule,
32213
+ ButtonComponent,
32214
+ MatMenuModule,
32215
+ MatDialogModule,
32216
+ ConfirmationDialogComponent,
32217
+ TranslateModule,
32218
+ ], 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" }]
32219
+ }], ctorParameters: () => [{ type: i1$a.MatDialog }, { type: i0.ChangeDetectorRef }], propDecorators: { canDuplicate: [{
32220
+ type: Input
32221
+ }], isDuplicating: [{
32222
+ type: Input
32223
+ }], canDelete: [{
32224
+ type: Input
32225
+ }], page: [{
32226
+ type: Input
32227
+ }], duplicate: [{
32228
+ type: Output
32229
+ }], delete: [{
32230
+ type: Output
32231
+ }], closeActionMenu: [{
32232
+ type: Output
32233
+ }], rollback: [{
32234
+ type: Output
32235
+ }], switch: [{
32236
+ type: Output
32237
+ }], trigger: [{
32238
+ type: ViewChild,
32239
+ args: [MatMenuTrigger]
31638
32240
  }] } });
31639
32241
 
31640
32242
  class UiSearchModule {
@@ -31662,7 +32264,8 @@ class UiSearchModule {
31662
32264
  MatCheckboxModule,
31663
32265
  RouterLink,
31664
32266
  InteractiveTableComponent, i2$2.NgIconsModule, KindBadgeComponent,
31665
- MetadataQualityComponent], exports: [RecordPreviewListComponent,
32267
+ MetadataQualityComponent,
32268
+ ActionMenuComponent], exports: [RecordPreviewListComponent,
31666
32269
  RecordPreviewCardComponent,
31667
32270
  RecordPreviewTextComponent,
31668
32271
  RecordPreviewTitleComponent,
@@ -31673,7 +32276,8 @@ class UiSearchModule {
31673
32276
  ResultsHitsNumberComponent,
31674
32277
  ResultsHitsSearchKindComponent,
31675
32278
  RecordPreviewFeedComponent,
31676
- RecordPreviewRowComponent] }); }
32279
+ RecordPreviewRowComponent,
32280
+ ActionMenuComponent] }); }
31677
32281
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiSearchModule, providers: [
31678
32282
  provideNgIconsConfig({
31679
32283
  size: '1.5em',
@@ -31700,7 +32304,8 @@ class UiSearchModule {
31700
32304
  matHomeWorkOutline,
31701
32305
  }),
31702
32306
  KindBadgeComponent,
31703
- MetadataQualityComponent, FacetsModule$1] }); }
32307
+ MetadataQualityComponent,
32308
+ ActionMenuComponent, FacetsModule$1] }); }
31704
32309
  }
31705
32310
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiSearchModule, decorators: [{
31706
32311
  type: NgModule,
@@ -31743,6 +32348,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31743
32348
  }),
31744
32349
  KindBadgeComponent,
31745
32350
  MetadataQualityComponent,
32351
+ ActionMenuComponent,
31746
32352
  ],
31747
32353
  exports: [
31748
32354
  RecordPreviewListComponent,
@@ -31757,6 +32363,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31757
32363
  ResultsHitsSearchKindComponent,
31758
32364
  RecordPreviewFeedComponent,
31759
32365
  RecordPreviewRowComponent,
32366
+ ActionMenuComponent,
31760
32367
  ],
31761
32368
  providers: [
31762
32369
  provideNgIconsConfig({
@@ -31767,76 +32374,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31767
32374
  }]
31768
32375
  }] });
31769
32376
 
31770
- class ActionMenuComponent {
31771
- constructor(dialog, cdr) {
31772
- this.dialog = dialog;
31773
- this.cdr = cdr;
31774
- this.duplicate = new EventEmitter();
31775
- this.delete = new EventEmitter();
31776
- this.closeActionMenu = new EventEmitter();
31777
- this.rollback = new EventEmitter();
31778
- this.sectionDisplayed = 'mainMenu';
31779
- }
31780
- openMenu() {
31781
- this.trigger.openMenu();
31782
- }
31783
- displayMainMenu() {
31784
- this.sectionDisplayed = 'mainMenu';
31785
- this.cdr.markForCheck();
31786
- }
31787
- displayDeleteMenu() {
31788
- if (this.isDraftPage) {
31789
- this.sectionDisplayed = 'rollbackMenu';
31790
- }
31791
- else {
31792
- this.sectionDisplayed = 'deleteMenu';
31793
- }
31794
- this.cdr.markForCheck();
31795
- }
31796
- 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 }); }
31797
- 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"] }] }); }
31798
- }
31799
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ActionMenuComponent, decorators: [{
31800
- type: Component,
31801
- args: [{ selector: 'gn-ui-action-menu', standalone: true, imports: [
31802
- CommonModule,
31803
- ButtonComponent,
31804
- MatMenuModule,
31805
- MatDialogModule,
31806
- ConfirmationDialogComponent,
31807
- TranslateModule,
31808
- ], 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" }]
31809
- }], ctorParameters: () => [{ type: i1$a.MatDialog }, { type: i0.ChangeDetectorRef }], propDecorators: { canDuplicate: [{
31810
- type: Input
31811
- }], canDelete: [{
31812
- type: Input
31813
- }], isDraftPage: [{
31814
- type: Input
31815
- }], duplicate: [{
31816
- type: Output
31817
- }], delete: [{
31818
- type: Output
31819
- }], closeActionMenu: [{
31820
- type: Output
31821
- }], rollback: [{
31822
- type: Output
31823
- }], trigger: [{
31824
- type: ViewChild,
31825
- args: [MatMenuTrigger]
31826
- }] } });
31827
-
31828
32377
  class ResultsTableComponent {
31829
- constructor(overlay, viewContainerRef, cdr, dateService) {
32378
+ constructor(overlay, viewContainerRef, cdr, dateService, translateService) {
31830
32379
  this.overlay = overlay;
31831
32380
  this.viewContainerRef = viewContainerRef;
31832
32381
  this.cdr = cdr;
31833
32382
  this.dateService = dateService;
32383
+ this.translateService = translateService;
31834
32384
  this.records = [];
31835
32385
  this.selectedRecordsIdentifiers = [];
31836
32386
  this.sortOrder = null;
31837
32387
  this.hasDraft = () => false;
31838
32388
  this.canDuplicate = () => true;
31839
- this.canDelete = () => true;
32389
+ this.canDelete = () => of(true);
32390
+ this.canEdit = () => of(true);
31840
32391
  this.isDraftPage = false;
31841
32392
  this.isDuplicating = false;
31842
32393
  // emits the column (field) as well as the order
@@ -31913,9 +32464,13 @@ class ResultsTableComponent {
31913
32464
  return getBadgeColor(format);
31914
32465
  }
31915
32466
  handleRecordClick(item) {
31916
- if ((item?.extras?.edit || this.isDraftPage) && item.kind === 'dataset') {
31917
- this.recordClick.emit(item);
31918
- }
32467
+ this.canEdit(item)
32468
+ .pipe(take$1(1))
32469
+ .subscribe((canEdit) => {
32470
+ if (canEdit) {
32471
+ this.recordClick.emit(item);
32472
+ }
32473
+ });
31919
32474
  }
31920
32475
  handleDuplicate(item) {
31921
32476
  this.duplicateRecord.emit(item);
@@ -31951,8 +32506,18 @@ class ResultsTableComponent {
31951
32506
  handleRecordSelectedChange(selected, record) {
31952
32507
  this.recordsSelectedChange.emit([[record], selected]);
31953
32508
  }
31954
- 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 }); }
31955
- 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"] }] }); }
32509
+ isMultilingual(record) {
32510
+ return record.otherLanguages.length > 0;
32511
+ }
32512
+ getTxtHoverMultilingual(record) {
32513
+ return this.translateService.instant('dashboard.records.isMultilingual', {
32514
+ languages: [...[record.defaultLanguage], ...record.otherLanguages].join(', '),
32515
+ });
32516
+ }
32517
+ 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 }); }
32518
+ 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: [
32519
+ provideIcons({ iconoirUser, iconoirLock, iconoirTranslate, matMoreVert }),
32520
+ ], 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"] }] }); }
31956
32521
  }
31957
32522
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableComponent, decorators: [{
31958
32523
  type: Component,
@@ -31966,8 +32531,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31966
32531
  ActionMenuComponent,
31967
32532
  NgIconComponent,
31968
32533
  CdkOverlayOrigin,
31969
- ], 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" }]
31970
- }], ctorParameters: () => [{ type: i1$8.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: DateService }], propDecorators: { records: [{
32534
+ ], providers: [
32535
+ provideIcons({ iconoirUser, iconoirLock, iconoirTranslate, matMoreVert }),
32536
+ ], 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"] }]
32537
+ }], ctorParameters: () => [{ type: i1$8.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: DateService }, { type: i1$1.TranslateService }], propDecorators: { records: [{
31971
32538
  type: Input
31972
32539
  }], selectedRecordsIdentifiers: [{
31973
32540
  type: Input
@@ -31979,6 +32546,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31979
32546
  type: Input
31980
32547
  }], canDelete: [{
31981
32548
  type: Input
32549
+ }], canEdit: [{
32550
+ type: Input
31982
32551
  }], isDraftPage: [{
31983
32552
  type: Input
31984
32553
  }], isDuplicating: [{
@@ -32227,9 +32796,10 @@ const FIELDS_SUMMARY = [
32227
32796
  'userSavedCount',
32228
32797
  'cl_topic',
32229
32798
  'cl_maintenanceAndUpdateFrequency',
32230
- 'MD_LegalConstraintsUseLimitationObject',
32799
+ 'MD_LegalConstraints*Object',
32231
32800
  'qualityScore',
32232
32801
  'allKeywords',
32802
+ 'recordLink',
32233
32803
  ];
32234
32804
  const FIELDS_BRIEF = [
32235
32805
  ...FIELDS_SUMMARY,
@@ -33052,11 +33622,11 @@ class FuzzySearchComponent {
33052
33622
  this.isSearchActive.emit(event);
33053
33623
  }
33054
33624
  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 }); }
33055
- 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 }); }
33625
+ 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 }); }
33056
33626
  }
33057
33627
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FuzzySearchComponent, decorators: [{
33058
33628
  type: Component,
33059
- 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" }]
33629
+ 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" }]
33060
33630
  }], ctorParameters: () => [{ type: SearchFacade }, { type: SearchService }, { type: RecordsRepositoryInterface }], propDecorators: { autocomplete: [{
33061
33631
  type: ViewChild,
33062
33632
  args: [AutocompleteComponent]
@@ -33066,6 +33636,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
33066
33636
  type: Input
33067
33637
  }], enterButton: [{
33068
33638
  type: Input
33639
+ }], placeholder: [{
33640
+ type: Input
33069
33641
  }], itemSelected: [{
33070
33642
  type: Output
33071
33643
  }], inputSubmitted: [{
@@ -34310,14 +34882,21 @@ class ResultsTableContainerComponent {
34310
34882
  this.recordsRepository = recordsRepository;
34311
34883
  this.notificationsService = notificationsService;
34312
34884
  this.translateService = translateService;
34313
- this.canDuplicate = () => true;
34314
- this.canDelete = () => true;
34315
34885
  this.recordClick = new EventEmitter();
34316
34886
  this.duplicateRecord = new EventEmitter();
34317
34887
  this.subscription = new Subscription();
34318
34888
  this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
34319
34889
  this.sortBy$ = this.searchFacade.sortBy$;
34320
34890
  this.hasDraft = (record) => this.recordsRepository.recordHasDraft(record.uniqueIdentifier);
34891
+ this.canDuplicate = (record) => {
34892
+ return this.recordsRepository.canDuplicate(record);
34893
+ };
34894
+ this.canDelete = (record) => {
34895
+ return this.recordsRepository.canDelete(record);
34896
+ };
34897
+ this.canEdit = (record) => {
34898
+ return this.recordsRepository.canEditIndexedRecord(record);
34899
+ };
34321
34900
  }
34322
34901
  handleRecordClick(item) {
34323
34902
  this.recordClick.emit(item);
@@ -34362,16 +34941,12 @@ class ResultsTableContainerComponent {
34362
34941
  this.subscription.unsubscribe();
34363
34942
  }
34364
34943
  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 }); }
34365
- 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"] }] }); }
34944
+ 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"] }] }); }
34366
34945
  }
34367
34946
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableContainerComponent, decorators: [{
34368
34947
  type: Component,
34369
- 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" }]
34370
- }], ctorParameters: () => [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }, { type: RecordsRepositoryInterface }, { type: NotificationsService }, { type: i1$1.TranslateService }], propDecorators: { canDuplicate: [{
34371
- type: Input
34372
- }], canDelete: [{
34373
- type: Input
34374
- }], isDuplicating: [{
34948
+ 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" }]
34949
+ }], ctorParameters: () => [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }, { type: RecordsRepositoryInterface }, { type: NotificationsService }, { type: i1$1.TranslateService }], propDecorators: { isDuplicating: [{
34375
34950
  type: Input
34376
34951
  }], recordClick: [{
34377
34952
  type: Output
@@ -36008,7 +36583,7 @@ class AddLayerFromCatalogComponent {
36008
36583
  ADDLAYER: new ResultsLayoutConfigItem(AddLayerRecordPreviewComponent, 'py-2', '', 'flex flex-col divide-y divide-y-grey-50'),
36009
36584
  },
36010
36585
  },
36011
- ], 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 }); }
36586
+ ], 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 }); }
36012
36587
  }
36013
36588
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AddLayerFromCatalogComponent, decorators: [{
36014
36589
  type: Component,
@@ -37871,7 +38446,7 @@ class DataTableComponent {
37871
38446
  }
37872
38447
  }
37873
38448
  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 }); }
37874
- 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 }); }
38449
+ 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 }); }
37875
38450
  }
37876
38451
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataTableComponent, decorators: [{
37877
38452
  type: Component,
@@ -39580,15 +40155,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
39580
40155
  marker('map.dropdown.placeholder');
39581
40156
  marker('wfs.feature.limit');
39582
40157
  marker('dataset.error.restrictedAccess');
40158
+ marker('map.select.style');
39583
40159
  class MapViewComponent {
39584
40160
  set exceedsLimit(value) {
39585
40161
  this.excludeWfs$.next(value);
39586
40162
  }
40163
+ selectLinkToDisplay(i) {
40164
+ this.selectedLinkIndex$.next(i);
40165
+ }
40166
+ selectStyleToDisplay(i) {
40167
+ this.selectedStyleIndex$.next(i);
40168
+ }
39587
40169
  toggleLegend() {
39588
40170
  this.showLegend = !this.showLegend;
39589
40171
  }
39590
- onLegendStatusChange(status) {
39591
- this.legendExists = status;
40172
+ onLegendStatusChange(v) {
40173
+ this.legendExists = v;
39592
40174
  }
39593
40175
  constructor(mdViewFacade, mapUtils, dataService, changeRef, translateService) {
39594
40176
  this.mdViewFacade = mdViewFacade;
@@ -39601,20 +40183,15 @@ class MapViewComponent {
39601
40183
  this.hidePreview = false;
39602
40184
  this.showLegend = true;
39603
40185
  this.legendExists = false;
40186
+ this.loading = false;
40187
+ this.error = null;
39604
40188
  this.compatibleMapLinks$ = combineLatest([
39605
40189
  this.mdViewFacade.mapApiLinks$,
39606
40190
  this.mdViewFacade.geoDataLinksWithGeometry$,
39607
- ]).pipe(switchMap$1(async ([mapApiLinks, geoDataLinksWithGeometry]) => {
39608
- // looking for TMS links to process
39609
- let processedMapApiLinks = await Promise.all(mapApiLinks.map((link) => {
39610
- if (link.type === 'service' && link.accessServiceProtocol === 'tms') {
39611
- return this.dataService.getGeodataLinksFromTms(link);
39612
- }
39613
- return link;
39614
- }));
39615
- processedMapApiLinks = processedMapApiLinks.flat();
39616
- return [...processedMapApiLinks, ...geoDataLinksWithGeometry];
39617
- }), shareReplay(1));
40191
+ ]).pipe(map$1(([mapApiLinks, geoDataLinksWithGeometry]) => [
40192
+ ...mapApiLinks,
40193
+ ...geoDataLinksWithGeometry,
40194
+ ]), shareReplay(1));
39618
40195
  this.dropdownChoices$ = this.compatibleMapLinks$.pipe(map$1((links) => links.length
39619
40196
  ? links.map((link, index) => ({
39620
40197
  label: getLinkLabel(link),
@@ -39622,12 +40199,39 @@ class MapViewComponent {
39622
40199
  }))
39623
40200
  : [{ label: 'map.dropdown.placeholder', value: 0 }]));
39624
40201
  this.selectedLinkIndex$ = new BehaviorSubject(0);
39625
- this.loading = false;
39626
- this.error = null;
39627
- this.selectedLink$ = combineLatest([
40202
+ this.selectedStyleIndex$ = new BehaviorSubject(0);
40203
+ this.selectedSourceLink$ = combineLatest([
39628
40204
  this.compatibleMapLinks$,
39629
40205
  this.selectedLinkIndex$.pipe(distinctUntilChanged()),
39630
- ]).pipe(map$1(([links, index]) => links[index]));
40206
+ ]).pipe(map$1(([links, idx]) => links[idx]), shareReplay(1));
40207
+ this.styleLinks$ = this.selectedSourceLink$.pipe(switchMap$1((src) => {
40208
+ if (src &&
40209
+ src.type === 'service' &&
40210
+ src.accessServiceProtocol === 'tms') {
40211
+ return from(this.dataService.getGeodataLinksFromTms(src, false)).pipe(
40212
+ // We need to check for maplibre-style links because when a TMS service has no styles,
40213
+ // getGeodataLinksFromTms returns the original TMS link, which isn't a maplibre-style link
40214
+ map$1((links) => links?.filter((link) => link.type === 'service' &&
40215
+ link.accessServiceProtocol === 'maplibre-style') || []));
40216
+ }
40217
+ return of([]);
40218
+ }), tap$1(() => this.selectedStyleIndex$.next(0)), shareReplay(1));
40219
+ this.styleDropdownChoices$ = this.styleLinks$.pipe(map$1((links) => links.length
40220
+ ? links.map((link, index) => ({
40221
+ label: getLinkLabel(link),
40222
+ value: index,
40223
+ }))
40224
+ : [
40225
+ {
40226
+ label: '\u00A0\u00A0\u00A0\u00A0',
40227
+ value: 0,
40228
+ },
40229
+ ]));
40230
+ this.selectedLink$ = combineLatest([
40231
+ this.selectedSourceLink$,
40232
+ this.styleLinks$,
40233
+ this.selectedStyleIndex$.pipe(distinctUntilChanged()),
40234
+ ]).pipe(map$1(([src, styles, styleIdx]) => (styles.length ? styles[styleIdx] : src)), shareReplay(1));
39631
40235
  this.currentLayers$ = combineLatest([this.selectedLink$, this.excludeWfs$]).pipe(switchMap$1(([link, excludeWfs]) => {
39632
40236
  if (!link) {
39633
40237
  return of([]);
@@ -39745,9 +40349,6 @@ class MapViewComponent {
39745
40349
  }
39746
40350
  return throwError(() => 'protocol not supported');
39747
40351
  }
39748
- selectLinkToDisplay(link) {
39749
- this.selectedLinkIndex$.next(link);
39750
- }
39751
40352
  handleError(error) {
39752
40353
  if (error instanceof FetchError) {
39753
40354
  this.error = this.translateService.instant(`dataset.error.${error.type}`, {
@@ -39767,7 +40368,7 @@ class MapViewComponent {
39767
40368
  this.changeRef.detectChanges();
39768
40369
  }
39769
40370
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapViewComponent, deps: [{ token: MdViewFacade }, { token: MapUtilsService }, { token: DataService }, { token: i0.ChangeDetectorRef }, { token: i1$1.TranslateService }], target: i0.ɵɵFactoryTarget.Component }); }
39770
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapViewComponent, isStandalone: true, selector: "gn-ui-map-view", inputs: { exceedsLimit: "exceedsLimit", displaySource: "displaySource" }, viewQueries: [{ propertyName: "mapContainer", first: true, predicate: ["mapContainer"], descendants: true }], ngImport: i0, template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n <div class=\"grow min-w-0\">\n <gn-ui-dropdown-selector\n [ngClass]=\"{ hidden: !displaySource }\"\n class=\"w-full\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n </div>\n <div class=\"self-end\">\n <gn-ui-external-viewer-button\n extraClass=\"w-[44px] h-[44px]\"\n [link]=\"selectedLink$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n </div>\n <ng-container *ngIf=\"hidePreview; else mapView\">\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n </ng-container>\n <ng-template #mapView>\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n (sourceLoadError)=\"onSourceLoadError($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail\n [featureCatalog]=\"mdViewFacade.featureCatalog$ | async\"\n [feature]=\"selection\"\n ></gn-ui-feature-detail>\n </div>\n\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\">Legend</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n\n <gn-ui-button\n *ngIf=\"!showLegend && legendExists && !selection\"\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n >\n Legend\n </gn-ui-button>\n\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'map.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\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n </ng-template>\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: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick", "sourceLoadError"] }, { kind: "component", type: FeatureDetailComponent, selector: "gn-ui-feature-detail", inputs: ["feature", "featureCatalog"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { 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: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ExternalViewerButtonComponent, selector: "gn-ui-external-viewer-button", inputs: ["link", "extraClass"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: MapLegendComponent, selector: "gn-ui-map-legend", inputs: ["context"], outputs: ["legendStatusChange"] }], viewProviders: [provideIcons({ matClose })], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
40371
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MapViewComponent, isStandalone: true, selector: "gn-ui-map-view", inputs: { exceedsLimit: "exceedsLimit", displaySource: "displaySource" }, viewQueries: [{ propertyName: "mapContainer", first: true, predicate: ["mapContainer"], descendants: true }], ngImport: i0, template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n <gn-ui-dropdown-selector\n *ngIf=\"displaySource\"\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n\n <ng-container *ngIf=\"(styleLinks$ | async)?.length > 0; else styleDisabled\">\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.style' | translate\"\n [choices]=\"styleDropdownChoices$ | async\"\n (selectValue)=\"selectStyleToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n </ng-container>\n <ng-template #styleDisabled>\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0 text-gray-400\"\n extraBtnClass=\"font-sans font-bold text-gray-400\"\n [title]=\"'map.select.style' | translate\"\n [choices]=\"styleDropdownChoices$ | async\"\n [disabled]=\"true\"\n ></gn-ui-dropdown-selector>\n </ng-template>\n\n <div class=\"self-end md:ml-2\">\n <gn-ui-external-viewer-button\n extraClass=\"w-[44px] h-[44px]\"\n [link]=\"selectedLink$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n </div>\n <ng-container *ngIf=\"hidePreview; else mapView\">\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n </ng-container>\n <ng-template #mapView>\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n (sourceLoadError)=\"onSourceLoadError($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail\n [featureCatalog]=\"mdViewFacade.featureCatalog$ | async\"\n [feature]=\"selection\"\n ></gn-ui-feature-detail>\n </div>\n\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\">Legend</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n\n <gn-ui-button\n *ngIf=\"!showLegend && legendExists && !selection\"\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n >\n Legend\n </gn-ui-button>\n\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'map.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\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n </ng-template>\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: "pipe", type: i1$2.AsyncPipe, name: "async" }, { kind: "component", type: DropdownSelectorComponent, selector: "gn-ui-dropdown-selector", inputs: ["title", "showTitle", "ariaName", "choices", "selected", "maxRows", "extraBtnClass", "minWidth", "disabled"], outputs: ["selectValue"] }, { kind: "component", type: MapContainerComponent, selector: "gn-ui-map-container", inputs: ["context"], outputs: ["featuresClick", "featuresHover", "mapClick", "sourceLoadError"] }, { kind: "component", type: FeatureDetailComponent, selector: "gn-ui-feature-detail", inputs: ["feature", "featureCatalog"] }, { kind: "component", type: PopupAlertComponent, selector: "gn-ui-popup-alert", inputs: ["icon", "type", "position"] }, { 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: LoadingMaskComponent, selector: "gn-ui-loading-mask", inputs: ["message"] }, { kind: "component", type: NgIconComponent, selector: "ng-icon", inputs: ["name", "svg", "size", "strokeWidth", "color"] }, { kind: "component", type: ExternalViewerButtonComponent, selector: "gn-ui-external-viewer-button", inputs: ["link", "extraClass"] }, { kind: "component", type: ButtonComponent, selector: "gn-ui-button", inputs: ["type", "disabled", "extraClass"], outputs: ["buttonClick"] }, { kind: "component", type: MapLegendComponent, selector: "gn-ui-map-legend", inputs: ["context"], outputs: ["legendStatusChange"] }], viewProviders: [provideIcons({ matClose })], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
39771
40372
  }
39772
40373
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapViewComponent, decorators: [{
39773
40374
  type: Component,
@@ -39783,7 +40384,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
39783
40384
  ExternalViewerButtonComponent,
39784
40385
  ButtonComponent,
39785
40386
  MapLegendComponent,
39786
- ], viewProviders: [provideIcons({ matClose })], template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n <div class=\"grow min-w-0\">\n <gn-ui-dropdown-selector\n [ngClass]=\"{ hidden: !displaySource }\"\n class=\"w-full\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n </div>\n <div class=\"self-end\">\n <gn-ui-external-viewer-button\n extraClass=\"w-[44px] h-[44px]\"\n [link]=\"selectedLink$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n </div>\n <ng-container *ngIf=\"hidePreview; else mapView\">\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n </ng-container>\n <ng-template #mapView>\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n (sourceLoadError)=\"onSourceLoadError($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail\n [featureCatalog]=\"mdViewFacade.featureCatalog$ | async\"\n [feature]=\"selection\"\n ></gn-ui-feature-detail>\n </div>\n\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\">Legend</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n\n <gn-ui-button\n *ngIf=\"!showLegend && legendExists && !selection\"\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n >\n Legend\n </gn-ui-button>\n\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'map.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\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n </ng-template>\n</div>\n" }]
40387
+ ], viewProviders: [provideIcons({ matClose })], template: "<div class=\"w-full h-full flex flex-col gap-[13px]\">\n <div\n class=\"flex flex-col md:flex-row gap-4 py-4 px-5 bg-white border border-color-border rounded-lg mt-6\"\n >\n <gn-ui-dropdown-selector\n *ngIf=\"displaySource\"\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.layer' | translate\"\n [choices]=\"dropdownChoices$ | async\"\n (selectValue)=\"selectLinkToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n\n <ng-container *ngIf=\"(styleLinks$ | async)?.length > 0; else styleDisabled\">\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0\"\n extraBtnClass=\"font-sans font-bold\"\n [title]=\"'map.select.style' | translate\"\n [choices]=\"styleDropdownChoices$ | async\"\n (selectValue)=\"selectStyleToDisplay($event)\"\n ></gn-ui-dropdown-selector>\n </ng-container>\n <ng-template #styleDisabled>\n <gn-ui-dropdown-selector\n class=\"w-full md:flex-1 md:min-w-0 text-gray-400\"\n extraBtnClass=\"font-sans font-bold text-gray-400\"\n [title]=\"'map.select.style' | translate\"\n [choices]=\"styleDropdownChoices$ | async\"\n [disabled]=\"true\"\n ></gn-ui-dropdown-selector>\n </ng-template>\n\n <div class=\"self-end md:ml-2\">\n <gn-ui-external-viewer-button\n extraClass=\"w-[44px] h-[44px]\"\n [link]=\"selectedLink$ | async\"\n >\n </gn-ui-external-viewer-button>\n </div>\n </div>\n <ng-container *ngIf=\"hidePreview; else mapView\">\n <gn-ui-popup-alert\n type=\"warning\"\n icon=\"matErrorOutlineOutline\"\n class=\"block h-12 p-1\"\n >\n <span translate>record.feature.limit</span>\n </gn-ui-popup-alert>\n </ng-container>\n <ng-template #mapView>\n <div\n class=\"relative w-full h-full bg-white border border-gray-300 rounded-lg overflow-hidden\"\n >\n <gn-ui-map-container\n #mapContainer\n [context]=\"mapContext$ | async\"\n (featuresClick)=\"onMapFeatureSelect($event)\"\n (sourceLoadError)=\"onSourceLoadError($event)\"\n ></gn-ui-map-container>\n <div\n class=\"top-[1em] right-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [class.hidden]=\"!selection\"\n >\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"resetSelection()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"absolute right-[0.5em] ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n <gn-ui-feature-detail\n [featureCatalog]=\"mdViewFacade.featureCatalog$ | async\"\n [feature]=\"selection\"\n ></gn-ui-feature-detail>\n </div>\n\n <div\n class=\"top-[1em] p-3 bg-white absolute overflow-y-auto overflow-x-hidden max-h-72 w-56\"\n [ngClass]=\"{ 'right-[1em]': !selection, 'right-[16em]': selection }\"\n [hidden]=\"!showLegend || !legendExists\"\n >\n <div class=\"flex justify-between items-center mb-2\">\n <div class=\"text-primary font-bold\">Legend</div>\n <gn-ui-button\n type=\"light\"\n (buttonClick)=\"toggleLegend()\"\n style=\"\n --gn-ui-button-padding: 0px;\n --gn-ui-button-width: 24px;\n --gn-ui-button-height: 24px;\n \"\n extraClass=\"ml-[8px] mr-[10px]\"\n >\n <ng-icon name=\"matClose\" class=\"align-middle text-sm\"></ng-icon>\n </gn-ui-button>\n </div>\n <gn-ui-map-legend\n [context]=\"mapContext$ | async\"\n (legendStatusChange)=\"onLegendStatusChange($event)\"\n ></gn-ui-map-legend>\n </div>\n\n <gn-ui-button\n *ngIf=\"!showLegend && legendExists && !selection\"\n type=\"outline\"\n (buttonClick)=\"toggleLegend()\"\n extraClass=\"absolute top-[1em] right-[1em] rounded p-1 text-xs bg-white\"\n >\n Legend\n </gn-ui-button>\n\n <gn-ui-loading-mask\n *ngIf=\"loading\"\n class=\"absolute inset-0\"\n [message]=\"'map.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\"\n >\n <span translate>{{ error }}</span>\n </gn-ui-popup-alert>\n </div>\n </ng-template>\n</div>\n" }]
39787
40388
  }], ctorParameters: () => [{ type: MdViewFacade }, { type: MapUtilsService }, { type: DataService }, { type: i0.ChangeDetectorRef }, { type: i1$1.TranslateService }], propDecorators: { exceedsLimit: [{
39788
40389
  type: Input
39789
40390
  }], displaySource: [{
@@ -42791,17 +43392,256 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
42791
43392
  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" }]
42792
43393
  }], ctorParameters: () => [{ type: EditorFacade }] });
42793
43394
 
43395
+ const extraFlagMap = {
43396
+ ar: 'arab',
43397
+ en: 'gb',
43398
+ ko: 'kr',
43399
+ cs: 'cz',
43400
+ zh: 'cn',
43401
+ ca: 'es-ct',
43402
+ rm: 'ch',
43403
+ da: 'dk',
43404
+ sv: 'se',
43405
+ cy: 'gb-wls',
43406
+ hy: 'am',
43407
+ ka: 'ge',
43408
+ uk: 'ua',
43409
+ };
42794
43410
  class MultilingualPanelComponent {
42795
- constructor() {
42796
- this.translationsEnabled = false;
43411
+ set record(value) {
43412
+ this._record = value;
43413
+ this.isMultilingual = value.otherLanguages.length > 0;
43414
+ this.editTranslations = false;
43415
+ this.recordLanguages = [...value.otherLanguages, value.defaultLanguage];
43416
+ this.selectedLanguages = this.recordLanguages;
43417
+ this.formLanguage = value.defaultLanguage;
43418
+ }
43419
+ constructor(facade, dialog, translateService, recordsRepository, overlay, viewContainerRef, cdr) {
43420
+ this.facade = facade;
43421
+ this.dialog = dialog;
43422
+ this.translateService = translateService;
43423
+ this.recordsRepository = recordsRepository;
43424
+ this.overlay = overlay;
43425
+ this.viewContainerRef = viewContainerRef;
43426
+ this.cdr = cdr;
43427
+ this.selectedLanguages = [];
43428
+ this.recordLanguages = [];
43429
+ this.formLanguage = '';
43430
+ this.isActionMenuOpen = false;
43431
+ this.subscription = new Subscription();
43432
+ this.supportedLanguages$ = this.recordsRepository
43433
+ .getApplicationLanguages()
43434
+ .pipe(map$2((languages) => this.sortLanguages(languages)));
43435
+ }
43436
+ ngOnDestroy() {
43437
+ this.subscription.unsubscribe();
43438
+ }
43439
+ sortLanguages(languages) {
43440
+ return languages
43441
+ .map((lang) => {
43442
+ const label = this.translateService.instant('language.' + lang);
43443
+ const isTranslated = label !== 'language.' + lang;
43444
+ return {
43445
+ lang,
43446
+ label,
43447
+ isTranslated,
43448
+ };
43449
+ })
43450
+ .sort((a, b) => {
43451
+ if (a.isTranslated && !b.isTranslated)
43452
+ return -1;
43453
+ if (!a.isTranslated && b.isTranslated)
43454
+ return 1;
43455
+ return a.label.localeCompare(b.label);
43456
+ })
43457
+ .map((item) => item.lang);
43458
+ }
43459
+ toggleLanguageSelection() {
43460
+ this.editTranslations = !this.editTranslations;
43461
+ }
43462
+ getIconClass(lang) {
43463
+ return extraFlagMap[lang]
43464
+ ? `fi fi-${extraFlagMap[lang]} w-4 h-3`
43465
+ : `fi fi-${lang} w-4 h-3`;
43466
+ }
43467
+ switchMultilingual() {
43468
+ if (this.isMultilingual && this.selectedLanguages.length > 1) {
43469
+ this.confirmDeleteAction();
43470
+ }
43471
+ else {
43472
+ this.isMultilingual = true;
43473
+ this.editTranslations = true;
43474
+ }
43475
+ }
43476
+ getExtraClass(lang) {
43477
+ const baseClass = 'h-[34px] w-full font-bold justify-start hover:bg-white';
43478
+ if (this.selectedLanguages.includes(lang)) {
43479
+ return `${baseClass} bg-white border border-black`;
43480
+ }
43481
+ return baseClass;
43482
+ }
43483
+ toggleLanguage(lang) {
43484
+ if (this.selectedLanguages.includes(lang)) {
43485
+ this.removeSelectedLanguage(lang);
43486
+ }
43487
+ else {
43488
+ this.selectedLanguages.push(lang);
43489
+ }
43490
+ }
43491
+ removeSelectedLanguage(lang) {
43492
+ this.selectedLanguages = this.selectedLanguages.filter((language) => language !== lang);
43493
+ }
43494
+ validateTranslations() {
43495
+ const equalLength = this.selectedLanguages.length === this.recordLanguages.length;
43496
+ if (this.selectedLanguages.length < this.recordLanguages.length ||
43497
+ (equalLength && this.selectedLanguages !== this.recordLanguages)) {
43498
+ this.confirmDeleteAction(this.selectedLanguages);
43499
+ }
43500
+ else {
43501
+ this.updateTranslations();
43502
+ }
43503
+ }
43504
+ updateTranslations() {
43505
+ this.facade.updateRecordField('otherLanguages', this.selectedLanguages.filter((lang) => lang !== this.formLanguage));
43506
+ this.recordLanguages = this.selectedLanguages;
43507
+ this.editTranslations = false;
43508
+ }
43509
+ switchFormLang(lang) {
43510
+ // TO IMPLEMENT FURTHER
43511
+ }
43512
+ switchDefaultLang(lang) {
43513
+ this.formLanguage = lang;
43514
+ this.facade.updateRecordField('defaultLanguage', lang);
43515
+ this.facade.updateRecordField('otherLanguages', this.selectedLanguages.filter((lang) => lang !== this.formLanguage));
43516
+ this.closeActionMenu();
43517
+ }
43518
+ confirmDeleteAction(lang) {
43519
+ const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
43520
+ data: {
43521
+ title: this.translateService.instant('editor.record.multilingual.confirmation.title'),
43522
+ message: this.translateService.instant('editor.record.multilingual.confirmation.message'),
43523
+ confirmText: this.translateService.instant('editor.record.multilingual.confirmation.confirmText'),
43524
+ cancelText: this.translateService.instant('editor.record.multilingual.confirmation.cancelText'),
43525
+ },
43526
+ restoreFocus: true,
43527
+ });
43528
+ this.subscription.add(dialogRef.afterClosed().subscribe((confirmed) => {
43529
+ if (confirmed) {
43530
+ if (lang) {
43531
+ if (!Array.isArray(lang)) {
43532
+ this.removeSelectedLanguage(lang);
43533
+ this.closeActionMenu();
43534
+ }
43535
+ this.updateTranslations();
43536
+ }
43537
+ else {
43538
+ this.facade.updateRecordField('otherLanguages', []);
43539
+ this.isMultilingual = false;
43540
+ this.selectedLanguages = [];
43541
+ }
43542
+ }
43543
+ else {
43544
+ this.isMultilingual = true;
43545
+ this.selectedLanguages = this.recordLanguages;
43546
+ }
43547
+ this.editTranslations = false;
43548
+ }));
43549
+ }
43550
+ isFirstUnsupported(index) {
43551
+ const langs = this.sortLanguages(this.recordLanguages);
43552
+ return (langs[index].length === 3 &&
43553
+ langs.slice(0, index).every((lang) => lang.length !== 3));
43554
+ }
43555
+ isLangSupported(lang) {
43556
+ return lang.length === 2;
42797
43557
  }
42798
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MultilingualPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
42799
- 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"] }] }); }
43558
+ getToggleTitle(lang) {
43559
+ if (lang === this._record.defaultLanguage) {
43560
+ return this.translateService.instant('editor.record.form.multilingual.forbidden');
43561
+ }
43562
+ return '';
43563
+ }
43564
+ openActionMenu(item, template) {
43565
+ this.isActionMenuOpen = true;
43566
+ const index = this.sortLanguages(this.selectedLanguages).indexOf(item);
43567
+ const buttonElement = this.actionMenuButtons.toArray()[index];
43568
+ const positionStrategy = this.overlay
43569
+ .position()
43570
+ .flexibleConnectedTo(buttonElement)
43571
+ .withFlexibleDimensions(true)
43572
+ .withPush(true)
43573
+ .withPositions([
43574
+ {
43575
+ originX: 'end',
43576
+ originY: 'bottom',
43577
+ overlayX: 'end',
43578
+ overlayY: 'top',
43579
+ },
43580
+ {
43581
+ originX: 'end',
43582
+ originY: 'top',
43583
+ overlayX: 'end',
43584
+ overlayY: 'bottom',
43585
+ },
43586
+ ]);
43587
+ this.overlayRef = this.overlay.create({
43588
+ hasBackdrop: true,
43589
+ backdropClass: 'cdk-overlay-transparent-backdrop',
43590
+ positionStrategy: positionStrategy,
43591
+ scrollStrategy: this.overlay.scrollStrategies.reposition(),
43592
+ });
43593
+ const portal = new TemplatePortal(template, this.viewContainerRef);
43594
+ this.overlayRef.attach(portal);
43595
+ this.subscription.add(this.overlayRef.backdropClick().subscribe(() => {
43596
+ this.closeActionMenu();
43597
+ }));
43598
+ }
43599
+ closeActionMenu() {
43600
+ if (this.overlayRef) {
43601
+ this.isActionMenuOpen = false;
43602
+ this.overlayRef.dispose();
43603
+ this.cdr.markForCheck();
43604
+ }
43605
+ }
43606
+ 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 }); }
43607
+ 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: [
43608
+ provideIcons({
43609
+ iconoirSettings,
43610
+ matMoreHorizOutline,
43611
+ iconoirCheckCircle,
43612
+ iconoirCircle,
43613
+ }),
43614
+ provideNgIconsConfig({
43615
+ size: '1.25em',
43616
+ }),
43617
+ ], 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"] }] }); }
42800
43618
  }
42801
43619
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MultilingualPanelComponent, decorators: [{
42802
43620
  type: Component,
42803
- 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" }]
42804
- }] });
43621
+ args: [{ selector: 'gn-ui-multilingual-panel', standalone: true, imports: [
43622
+ CommonModule,
43623
+ CheckToggleComponent,
43624
+ TranslateModule,
43625
+ ButtonComponent,
43626
+ NgIconComponent,
43627
+ ActionMenuComponent,
43628
+ ], providers: [
43629
+ provideIcons({
43630
+ iconoirSettings,
43631
+ matMoreHorizOutline,
43632
+ iconoirCheckCircle,
43633
+ iconoirCircle,
43634
+ }),
43635
+ provideNgIconsConfig({
43636
+ size: '1.25em',
43637
+ }),
43638
+ ], 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" }]
43639
+ }], 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: [{
43640
+ type: Input
43641
+ }], actionMenuButtons: [{
43642
+ type: ViewChildren,
43643
+ args: ['actionMenuButton', { read: ElementRef }]
43644
+ }] } });
42805
43645
 
42806
43646
  const ROUTER_STATE_KEY = 'router';
42807
43647
  const ROUTER_ROUTE_SEARCH = 'search';
@@ -43204,7 +44044,7 @@ class DefaultRouterModule {
43204
44044
  };
43205
44045
  }
43206
44046
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DefaultRouterModule, deps: [{ token: RouterService }], target: i0.ɵɵFactoryTarget.NgModule }); }
43207
- 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] }); }
44047
+ 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] }); }
43208
44048
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DefaultRouterModule, providers: [
43209
44049
  RouterFacade,
43210
44050
  {
@@ -43247,5 +44087,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
43247
44087
  * Generated bundle index. Do not edit.
43248
44088
  */
43249
44089
 
43250
- 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 };
44090
+ 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 };
43251
44091
  //# sourceMappingURL=geonetwork-ui.mjs.map