geonetwork-ui 2.6.0-dev.600519f47 → 2.6.0-dev.609dd7257

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 (138) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +4 -1
  2. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/constant.mjs +4 -2
  3. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +2 -2
  4. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +45 -15
  5. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +7 -1
  6. package/esm2022/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.mjs +2 -1
  7. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  8. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  9. package/esm2022/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.mjs +4 -3
  10. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-from-catalog.component.mjs +1 -1
  11. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +49 -23
  12. package/esm2022/libs/feature/search/src/lib/constants.mjs +3 -2
  13. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +5 -3
  14. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +13 -10
  15. package/esm2022/libs/ui/elements/src/index.mjs +1 -2
  16. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +19 -34
  17. package/esm2022/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.mjs +59 -0
  18. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +35 -10
  19. package/esm2022/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.mjs +5 -1
  20. package/esm2022/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.mjs +50 -29
  21. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +7 -3
  22. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  23. package/esm2022/libs/ui/layout/src/lib/cell-popin/cell-popin.component.mjs +110 -0
  24. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +20 -10
  25. package/esm2022/libs/ui/layout/src/lib/truncated-text/truncated-text.component.mjs +15 -49
  26. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +2 -2
  27. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +5 -3
  28. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +16 -8
  29. package/esm2022/translations/de.json +20 -6
  30. package/esm2022/translations/en.json +20 -6
  31. package/esm2022/translations/es.json +19 -5
  32. package/esm2022/translations/fr.json +20 -6
  33. package/esm2022/translations/it.json +22 -8
  34. package/esm2022/translations/nl.json +19 -5
  35. package/esm2022/translations/pt.json +19 -5
  36. package/fesm2022/geonetwork-ui.mjs +1003 -711
  37. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  38. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  39. package/libs/api/repository/src/lib/gn4/elasticsearch/constant.d.ts.map +1 -1
  40. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  41. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +8 -2
  42. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  43. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +2 -0
  44. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  45. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts +1 -0
  46. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts.map +1 -1
  47. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +20 -17
  48. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  49. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +3 -0
  50. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  51. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts.map +1 -1
  52. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +13 -5
  53. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  54. package/libs/feature/search/src/lib/constants.d.ts.map +1 -1
  55. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +2 -1
  56. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  57. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +6 -5
  58. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  59. package/libs/ui/elements/src/index.d.ts +0 -1
  60. package/libs/ui/elements/src/index.d.ts.map +1 -1
  61. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts +3 -6
  62. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts.map +1 -1
  63. package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts +14 -0
  64. package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts.map +1 -0
  65. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts +3 -0
  66. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  67. package/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.d.ts.map +1 -1
  68. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts +20 -9
  69. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts.map +1 -1
  70. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +2 -1
  71. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  72. package/libs/ui/layout/src/index.d.ts +1 -0
  73. package/libs/ui/layout/src/index.d.ts.map +1 -1
  74. package/libs/ui/layout/src/lib/cell-popin/cell-popin.component.d.ts +28 -0
  75. package/libs/ui/layout/src/lib/cell-popin/cell-popin.component.d.ts.map +1 -0
  76. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +4 -2
  77. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -1
  78. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts +5 -10
  79. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts.map +1 -1
  80. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +2 -1
  81. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -1
  82. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +5 -3
  83. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  84. package/package.json +1 -1
  85. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +7 -0
  86. package/src/libs/api/repository/src/lib/gn4/elasticsearch/constant.ts +3 -1
  87. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +1 -1
  88. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +57 -14
  89. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +11 -0
  90. package/src/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.ts +3 -0
  91. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +20 -14
  92. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +3 -0
  93. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +61 -0
  94. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.html +1 -1
  95. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.ts +1 -0
  96. package/src/libs/feature/record/src/lib/map-view/map-view.component.html +27 -9
  97. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +84 -27
  98. package/src/libs/feature/search/src/lib/constants.ts +2 -1
  99. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.html +1 -1
  100. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +1 -0
  101. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +1 -0
  102. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +13 -3
  103. package/src/libs/ui/elements/src/index.ts +0 -1
  104. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +8 -76
  105. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +20 -51
  106. package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.html +69 -0
  107. package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.ts +61 -0
  108. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +48 -9
  109. package/src/libs/ui/elements/src/lib/metadata-quality-item/metadata-quality-item.component.ts +4 -0
  110. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.html +96 -37
  111. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.ts +60 -29
  112. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +2 -0
  113. package/src/libs/ui/layout/src/index.ts +1 -0
  114. package/src/libs/ui/layout/src/lib/cell-popin/cell-popin.component.html +40 -0
  115. package/src/libs/ui/layout/src/lib/cell-popin/cell-popin.component.ts +141 -0
  116. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +2 -2
  117. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +13 -6
  118. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.html +25 -42
  119. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.ts +10 -49
  120. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +1 -1
  121. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +6 -4
  122. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +1 -0
  123. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +14 -20
  124. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +13 -5
  125. package/translations/de.json +20 -6
  126. package/translations/en.json +20 -6
  127. package/translations/es.json +19 -5
  128. package/translations/fr.json +20 -6
  129. package/translations/it.json +22 -8
  130. package/translations/nl.json +19 -5
  131. package/translations/pt.json +19 -5
  132. package/translations/sk.json +19 -5
  133. package/esm2022/libs/ui/elements/src/lib/related-record-card/related-record-card.component.mjs +0 -56
  134. package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts +0 -19
  135. package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts.map +0 -1
  136. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.css +0 -0
  137. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.html +0 -9
  138. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.ts +0 -61
@@ -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, iconoirTranslate, iconoirImport, iconoirLightBulbOn, iconoirArrowLeft, iconoirAttachment, iconoirRefresh, iconoirCheckCircle, iconoirCircle } 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';
@@ -42,25 +41,26 @@ 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
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';
63
- import { RouterLink, RouterModule, RouteReuseStrategy } from '@angular/router';
63
+ import { RouterModule, RouterLink, RouteReuseStrategy } from '@angular/router';
64
64
  import { marked } from 'marked';
65
65
  import Duration from 'duration-relativetimeformat';
66
66
  import * as basicLightbox from 'basiclightbox';
@@ -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
 
@@ -18917,8 +18918,9 @@ var de = {
18917
18918
  "editor.record.loadError.body": "Der Datensatz konnte nicht geladen werden:",
18918
18919
  "editor.record.loadError.closeMessage": "Verstanden",
18919
18920
  "editor.record.loadError.title": "Fehler beim Laden des Datensatzes",
18920
- "editor.record.lock.format": "",
18921
- "editor.record.lock.reason": "",
18921
+ "editor.record.lock.harvested": "",
18922
+ "editor.record.lock.owner": "",
18923
+ "editor.record.lock.resourceType": "",
18922
18924
  "editor.record.multilingual.confirmation.cancelText": "",
18923
18925
  "editor.record.multilingual.confirmation.confirmText": "",
18924
18926
  "editor.record.multilingual.confirmation.message": "",
@@ -18969,6 +18971,11 @@ var de = {
18969
18971
  "facets.block.title.tag.default": "Stichwort",
18970
18972
  "facets.block.title.th_regions_tree.default": "Regionen",
18971
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",
18972
18979
  "input.file.dropFileLabel": "",
18973
18980
  "input.file.orInputUrl": "",
18974
18981
  "input.file.selectFileLabel": "",
@@ -19028,6 +19035,7 @@ var de = {
19028
19035
  "map.navigation.message": "Bitte verwenden Sie STRG + Maus (oder zwei Finger auf einem Mobilgerät), um die Karte zu navigieren",
19029
19036
  "map.ogc.urlInput.hint": "",
19030
19037
  "map.select.layer": "Datenquelle",
19038
+ "map.select.style": "Style",
19031
19039
  "map.wfs.urlInput.hint": "Geben Sie die WFS URL ein",
19032
19040
  "map.wms.urlInput.hint": "Geben Sie die WMS URL ein",
19033
19041
  "multiselect.filter.placeholder": "Suche",
@@ -19106,9 +19114,15 @@ var de = {
19106
19114
  "record.metadata.download": "Downloads",
19107
19115
  "record.metadata.feature.catalog": "",
19108
19116
  "record.metadata.formats": "Formate",
19117
+ "record.metadata.isGeographical": "Geographischer Datensatz",
19109
19118
  "record.metadata.keywords": "Stichworte",
19110
19119
  "record.metadata.languages": "Sprachen",
19111
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",
19112
19126
  "record.metadata.links": "Links",
19113
19127
  "record.metadata.noUsage": "Für diesen Datensatz sind keine Nutzungsbedingungen angegeben.",
19114
19128
  "record.metadata.otherConstraints": "Zusätzliche Bedingungen",
@@ -19118,6 +19132,8 @@ var de = {
19118
19132
  "record.metadata.publication": "Veröffentlichungsdatum",
19119
19133
  "record.metadata.publications": "{count, plural, =0{Veröffentlichungsdatum} one{Veröffentlichungsdatum} other{Veröffentlichungen}}",
19120
19134
  "record.metadata.quality": "Metadatenqualität",
19135
+ "record.metadata.quality.capabilities.failed": "",
19136
+ "record.metadata.quality.capabilities.success": "",
19121
19137
  "record.metadata.quality.contact.failed": "Kontakt nicht angegeben",
19122
19138
  "record.metadata.quality.contact.success": "Kontakt angegeben",
19123
19139
  "record.metadata.quality.description.failed": "Beschreibung nicht angegeben",
@@ -19129,14 +19145,15 @@ var de = {
19129
19145
  "record.metadata.quality.legalConstraints.success": "Rechtliche Beschränkungen angegeben",
19130
19146
  "record.metadata.quality.organisation.failed": "Organisation nicht angegeben",
19131
19147
  "record.metadata.quality.organisation.success": "Organisation angegeben",
19148
+ "record.metadata.quality.source.failed": "",
19149
+ "record.metadata.quality.source.success": "",
19132
19150
  "record.metadata.quality.title.failed": "Titel nicht angegeben",
19133
19151
  "record.metadata.quality.title.success": "Titel angegeben",
19134
19152
  "record.metadata.quality.topic.failed": "Thema nicht angegeben",
19135
19153
  "record.metadata.quality.topic.success": "Thema angegeben",
19136
19154
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
19137
19155
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
19138
- "record.metadata.related": "Ähnliche Datensätze",
19139
- "record.metadata.related.contents": "",
19156
+ "record.metadata.related": "Entdecken Sie den Katalog",
19140
19157
  "record.metadata.ressources.and.links": "Ressourcen und Links",
19141
19158
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
19142
19159
  "record.metadata.status": "Status",
@@ -19148,7 +19165,6 @@ var de = {
19148
19165
  "record.metadata.temporalExtent.untilDate": "Bis {end}",
19149
19166
  "record.metadata.title": "Titel",
19150
19167
  "record.metadata.topics": "Kategorien",
19151
- "record.metadata.isGeographical": "Geographischer Datensatz",
19152
19168
  "record.metadata.uniqueId": "Eindeutige Kennung",
19153
19169
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
19154
19170
  "record.metadata.updatedOn": "Geändert am",
@@ -19268,7 +19284,6 @@ var de = {
19268
19284
  "tooltip.html.copy": "HTML kopieren",
19269
19285
  "tooltip.id.copy": "Eindeutige Kennung kopieren",
19270
19286
  "tooltip.url.copy": "URL kopieren",
19271
- "tooltip.url.open": "URL öffnen",
19272
19287
  "ui.readLess": "Weniger lesen",
19273
19288
  "ui.readMore": "Weiterlesen",
19274
19289
  "wfs.feature.limit": "Zu viele Features, um den WFS-Layer anzuzeigen!",
@@ -19526,8 +19541,9 @@ var en = {
19526
19541
  "editor.record.loadError.body": "The dataset could not be loaded:",
19527
19542
  "editor.record.loadError.closeMessage": "Understood",
19528
19543
  "editor.record.loadError.title": "Error loading dataset",
19529
- "editor.record.lock.format": "Record with the format 'service' or 'reuse' are not editable",
19530
- "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",
19531
19547
  "editor.record.multilingual.confirmation.cancelText": "Keep the language(s)",
19532
19548
  "editor.record.multilingual.confirmation.confirmText": "Remove the language(s)",
19533
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?",
@@ -19578,6 +19594,11 @@ var en = {
19578
19594
  "facets.block.title.tag.default": "Tag",
19579
19595
  "facets.block.title.th_regions_tree.default": "Regions",
19580
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",
19581
19602
  "input.file.dropFileLabel": "or drop it here",
19582
19603
  "input.file.orInputUrl": "or create a link to an external resource",
19583
19604
  "input.file.selectFileLabel": "Select a file ({sizeMB} MB max.)",
@@ -19637,6 +19658,7 @@ var en = {
19637
19658
  "map.navigation.message": "Please use CTRL + mouse (or two fingers on mobile) to navigate the map",
19638
19659
  "map.ogc.urlInput.hint": "Enter OGC API service URL",
19639
19660
  "map.select.layer": "Data source",
19661
+ "map.select.style": "Style",
19640
19662
  "map.wfs.urlInput.hint": "Enter WFS service URL",
19641
19663
  "map.wms.urlInput.hint": "Enter WMS service URL",
19642
19664
  "multiselect.filter.placeholder": "Search",
@@ -19715,9 +19737,15 @@ var en = {
19715
19737
  "record.metadata.download": "Downloads",
19716
19738
  "record.metadata.feature.catalog": "Feature catalog",
19717
19739
  "record.metadata.formats": "Formats",
19740
+ "record.metadata.isGeographical": "Geographical dataset",
19718
19741
  "record.metadata.keywords": "Keywords",
19719
19742
  "record.metadata.languages": "Languages",
19720
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",
19721
19749
  "record.metadata.links": "Links",
19722
19750
  "record.metadata.noUsage": "No usage conditions specified for this dataset.",
19723
19751
  "record.metadata.otherConstraints": "Additional Conditions",
@@ -19727,6 +19755,8 @@ var en = {
19727
19755
  "record.metadata.publication": "Date of publication",
19728
19756
  "record.metadata.publications": "{count, plural, =0{publication} one{publication} other{publications}}",
19729
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",
19730
19760
  "record.metadata.quality.contact.failed": "Contact is not specified",
19731
19761
  "record.metadata.quality.contact.success": "Contact is specified",
19732
19762
  "record.metadata.quality.description.failed": "Description is not specified",
@@ -19738,14 +19768,15 @@ var en = {
19738
19768
  "record.metadata.quality.legalConstraints.success": "Legal constraints are specified",
19739
19769
  "record.metadata.quality.organisation.failed": "Organisation is not specified",
19740
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",
19741
19773
  "record.metadata.quality.title.failed": "Title is not specified",
19742
19774
  "record.metadata.quality.title.success": "Title is specified",
19743
19775
  "record.metadata.quality.topic.failed": "Topic is not specified",
19744
19776
  "record.metadata.quality.topic.success": "Topic is specified",
19745
19777
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
19746
19778
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
19747
- "record.metadata.related": "Related records",
19748
- "record.metadata.related.contents": "Related content",
19779
+ "record.metadata.related": "Explore the catalog",
19749
19780
  "record.metadata.ressources.and.links": "Resources and links",
19750
19781
  "record.metadata.sheet": "Original metadata",
19751
19782
  "record.metadata.status": "Status",
@@ -19757,7 +19788,6 @@ var en = {
19757
19788
  "record.metadata.temporalExtent.untilDate": "Until { end }",
19758
19789
  "record.metadata.title": "Title",
19759
19790
  "record.metadata.topics": "Categories",
19760
- "record.metadata.isGeographical": "Geographical dataset",
19761
19791
  "record.metadata.uniqueId": "Unique Identifier",
19762
19792
  "record.metadata.updateFrequency": "Data Update Frequency",
19763
19793
  "record.metadata.updatedOn": "Updated on",
@@ -19877,7 +19907,6 @@ var en = {
19877
19907
  "tooltip.html.copy": "Copy HTML",
19878
19908
  "tooltip.id.copy": "Copy unique identifier",
19879
19909
  "tooltip.url.copy": "Copy URL",
19880
- "tooltip.url.open": "Open URL",
19881
19910
  "ui.readLess": "Read less",
19882
19911
  "ui.readMore": "Read more",
19883
19912
  "wfs.feature.limit": "Too many features to display the WFS layer!",
@@ -20135,8 +20164,9 @@ var es = {
20135
20164
  "editor.record.loadError.body": "",
20136
20165
  "editor.record.loadError.closeMessage": "",
20137
20166
  "editor.record.loadError.title": "",
20138
- "editor.record.lock.format": "",
20139
- "editor.record.lock.reason": "",
20167
+ "editor.record.lock.harvested": "",
20168
+ "editor.record.lock.owner": "",
20169
+ "editor.record.lock.resourceType": "",
20140
20170
  "editor.record.multilingual.confirmation.cancelText": "",
20141
20171
  "editor.record.multilingual.confirmation.confirmText": "",
20142
20172
  "editor.record.multilingual.confirmation.message": "",
@@ -20187,6 +20217,11 @@ var es = {
20187
20217
  "facets.block.title.tag.default": "",
20188
20218
  "facets.block.title.th_regions_tree.default": "",
20189
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",
20190
20225
  "input.file.dropFileLabel": "",
20191
20226
  "input.file.orInputUrl": "",
20192
20227
  "input.file.selectFileLabel": "",
@@ -20246,6 +20281,7 @@ var es = {
20246
20281
  "map.navigation.message": "",
20247
20282
  "map.ogc.urlInput.hint": "",
20248
20283
  "map.select.layer": "",
20284
+ "map.select.style": "",
20249
20285
  "map.wfs.urlInput.hint": "",
20250
20286
  "map.wms.urlInput.hint": "",
20251
20287
  "multiselect.filter.placeholder": "",
@@ -20324,9 +20360,15 @@ var es = {
20324
20360
  "record.metadata.download": "",
20325
20361
  "record.metadata.feature.catalog": "",
20326
20362
  "record.metadata.formats": "",
20363
+ "record.metadata.isGeographical": "",
20327
20364
  "record.metadata.keywords": "",
20328
20365
  "record.metadata.languages": "",
20329
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": "",
20330
20372
  "record.metadata.links": "",
20331
20373
  "record.metadata.noUsage": "",
20332
20374
  "record.metadata.otherConstraints": "",
@@ -20336,6 +20378,8 @@ var es = {
20336
20378
  "record.metadata.publication": "",
20337
20379
  "record.metadata.publications": "{count, plural, =0{} one{} other{}}",
20338
20380
  "record.metadata.quality": "",
20381
+ "record.metadata.quality.capabilities.failed": "",
20382
+ "record.metadata.quality.capabilities.success": "",
20339
20383
  "record.metadata.quality.contact.failed": "",
20340
20384
  "record.metadata.quality.contact.success": "",
20341
20385
  "record.metadata.quality.description.failed": "",
@@ -20347,6 +20391,8 @@ var es = {
20347
20391
  "record.metadata.quality.legalConstraints.success": "",
20348
20392
  "record.metadata.quality.organisation.failed": "",
20349
20393
  "record.metadata.quality.organisation.success": "",
20394
+ "record.metadata.quality.source.failed": "",
20395
+ "record.metadata.quality.source.success": "",
20350
20396
  "record.metadata.quality.title.failed": "",
20351
20397
  "record.metadata.quality.title.success": "",
20352
20398
  "record.metadata.quality.topic.failed": "",
@@ -20354,7 +20400,6 @@ var es = {
20354
20400
  "record.metadata.quality.updateFrequency.failed": "",
20355
20401
  "record.metadata.quality.updateFrequency.success": "",
20356
20402
  "record.metadata.related": "",
20357
- "record.metadata.related.contents": "",
20358
20403
  "record.metadata.ressources.and.links": "Recursos y enlaces",
20359
20404
  "record.metadata.sheet": "",
20360
20405
  "record.metadata.status": "",
@@ -20366,7 +20411,6 @@ var es = {
20366
20411
  "record.metadata.temporalExtent.untilDate": "",
20367
20412
  "record.metadata.title": "",
20368
20413
  "record.metadata.topics": "",
20369
- "record.metadata.isGeographical": "",
20370
20414
  "record.metadata.uniqueId": "",
20371
20415
  "record.metadata.updateFrequency": "",
20372
20416
  "record.metadata.updatedOn": "",
@@ -20486,7 +20530,6 @@ var es = {
20486
20530
  "tooltip.html.copy": "",
20487
20531
  "tooltip.id.copy": "",
20488
20532
  "tooltip.url.copy": "",
20489
- "tooltip.url.open": "",
20490
20533
  "ui.readLess": "",
20491
20534
  "ui.readMore": "",
20492
20535
  "wfs.feature.limit": "",
@@ -20744,8 +20787,9 @@ var fr = {
20744
20787
  "editor.record.loadError.body": "Le jeu de données n'a pas pu être chargé :",
20745
20788
  "editor.record.loadError.closeMessage": "Compris",
20746
20789
  "editor.record.loadError.title": "Erreur lors du chargement",
20747
- "editor.record.lock.format": "Les jeux de données de type 'service' et 'reuse' ne sont pas éditables",
20748
- "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",
20749
20793
  "editor.record.multilingual.confirmation.cancelText": "Garder le(s) language(s)",
20750
20794
  "editor.record.multilingual.confirmation.confirmText": "Supprimer le(s) language(s)",
20751
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,6 +20840,11 @@ var fr = {
20796
20840
  "facets.block.title.tag.default": "Tag",
20797
20841
  "facets.block.title.th_regions_tree.default": "Régions",
20798
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",
20799
20848
  "input.file.dropFileLabel": "ou glissez-le ici",
20800
20849
  "input.file.orInputUrl": "ou créez un lien vers une ressource externe",
20801
20850
  "input.file.selectFileLabel": "Sélectionnez un fichier ({sizeMB} Mo max.)",
@@ -20855,6 +20904,7 @@ var fr = {
20855
20904
  "map.navigation.message": "Veuillez utiliser CTRL + souris (ou deux doigts sur mobile) pour naviguer sur la carte",
20856
20905
  "map.ogc.urlInput.hint": "Entrez l'URL du service OGC API",
20857
20906
  "map.select.layer": "Source de données",
20907
+ "map.select.style": "Style",
20858
20908
  "map.wfs.urlInput.hint": "Entrez l'URL du service WFS",
20859
20909
  "map.wms.urlInput.hint": "Entrez l'URL du service WMS",
20860
20910
  "multiselect.filter.placeholder": "Rechercher",
@@ -20933,9 +20983,15 @@ var fr = {
20933
20983
  "record.metadata.download": "Téléchargements",
20934
20984
  "record.metadata.feature.catalog": "Catalogue d'attributs",
20935
20985
  "record.metadata.formats": "Formats",
20986
+ "record.metadata.isGeographical": "Donnée géographique",
20936
20987
  "record.metadata.keywords": "Mots-clés",
20937
20988
  "record.metadata.languages": "Langues",
20938
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",
20939
20995
  "record.metadata.links": "Liens",
20940
20996
  "record.metadata.noUsage": "Aucune condition d'utilisation spécifiée pour ces données",
20941
20997
  "record.metadata.otherConstraints": "Limitations d'usage",
@@ -20945,6 +21001,8 @@ var fr = {
20945
21001
  "record.metadata.publication": "Date de publication",
20946
21002
  "record.metadata.publications": "{count, plural, =0{donnée} one{donnée} other{données}}",
20947
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",
20948
21006
  "record.metadata.quality.contact.failed": "Le contact n'est pas renseigné",
20949
21007
  "record.metadata.quality.contact.success": "Le contact est renseigné",
20950
21008
  "record.metadata.quality.description.failed": "La description n'est pas renseignée",
@@ -20956,14 +21014,15 @@ var fr = {
20956
21014
  "record.metadata.quality.legalConstraints.success": "Les contraintes légales sont renseignées",
20957
21015
  "record.metadata.quality.organisation.failed": "Le producteur n'est pas renseigné",
20958
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é",
20959
21019
  "record.metadata.quality.title.failed": "Le titre n'est pas renseigné",
20960
21020
  "record.metadata.quality.title.success": "Le titre est renseigné",
20961
21021
  "record.metadata.quality.topic.failed": "Le thème n'est pas renseigné",
20962
21022
  "record.metadata.quality.topic.success": "Le thème est renseigné",
20963
21023
  "record.metadata.quality.updateFrequency.failed": "La fréquence de mise à jour n'est pas renseignée",
20964
21024
  "record.metadata.quality.updateFrequency.success": "La fréquence de mise à jour est renseignée",
20965
- "record.metadata.related": "Voir aussi",
20966
- "record.metadata.related.contents": "Contenu associé",
21025
+ "record.metadata.related": "Explorez le catalogue",
20967
21026
  "record.metadata.ressources.and.links": "Ressources et liens",
20968
21027
  "record.metadata.sheet": "Fiche de métadonnées d'origine",
20969
21028
  "record.metadata.status": "Statut",
@@ -20975,7 +21034,6 @@ var fr = {
20975
21034
  "record.metadata.temporalExtent.untilDate": "Jusqu'au { end }",
20976
21035
  "record.metadata.title": "Intitulé",
20977
21036
  "record.metadata.topics": "Catégories",
20978
- "record.metadata.isGeographical": "Donnée géographique",
20979
21037
  "record.metadata.uniqueId": "Identificateur de ressource unique",
20980
21038
  "record.metadata.updateFrequency": "Fréquence de mise à jour des données",
20981
21039
  "record.metadata.updatedOn": "Modifié le",
@@ -21095,7 +21153,6 @@ var fr = {
21095
21153
  "tooltip.html.copy": "Copier le HTML",
21096
21154
  "tooltip.id.copy": "Copier l'identifiant unique",
21097
21155
  "tooltip.url.copy": "Copier l'URL",
21098
- "tooltip.url.open": "Ouvrir l'URL",
21099
21156
  "ui.readLess": "Réduire",
21100
21157
  "ui.readMore": "Lire la suite",
21101
21158
  "wfs.feature.limit": "Trop d'objets pour afficher la couche WFS !",
@@ -21317,12 +21374,12 @@ var it = {
21317
21374
  "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
21318
21375
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
21319
21376
  "editor.record.form.license.unknown": "Sconosciuto o assente",
21320
- "editor.record.form.multilingual.enable": "Aprire il pannello multilingue",
21321
- "editor.record.form.multilingual.open": "Modalità multilingue",
21322
- "editor.record.form.multilingual.title": "Traduzioni",
21323
21377
  "editor.record.form.multilingual.activate": "",
21324
21378
  "editor.record.form.multilingual.default": "",
21379
+ "editor.record.form.multilingual.enable": "Aprire il pannello multilingue",
21325
21380
  "editor.record.form.multilingual.forbidden": "",
21381
+ "editor.record.form.multilingual.open": "Modalità multilingue",
21382
+ "editor.record.form.multilingual.title": "Traduzioni",
21326
21383
  "editor.record.form.multilingual.validate": "",
21327
21384
  "editor.record.form.page.accessAndContact": "Informazioni per l'uso",
21328
21385
  "editor.record.form.page.description": "Descrizione del dataset",
@@ -21353,8 +21410,9 @@ var it = {
21353
21410
  "editor.record.loadError.body": "Impossibile caricare il dataset:",
21354
21411
  "editor.record.loadError.closeMessage": "Capito",
21355
21412
  "editor.record.loadError.title": "Errore durante il caricamento",
21356
- "editor.record.lock.format": "I record con il formato 'servizio' o 'riutilizzo' non sono modificabili",
21357
- "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",
21358
21416
  "editor.record.multilingual.confirmation.cancelText": "",
21359
21417
  "editor.record.multilingual.confirmation.confirmText": "",
21360
21418
  "editor.record.multilingual.confirmation.message": "",
@@ -21405,6 +21463,11 @@ var it = {
21405
21463
  "facets.block.title.tag.default": "Tag",
21406
21464
  "facets.block.title.th_regions_tree.default": "Regioni",
21407
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",
21408
21471
  "input.file.dropFileLabel": "oppure trascinalo qui",
21409
21472
  "input.file.orInputUrl": "o collegamento a una risorsa esterna",
21410
21473
  "input.file.selectFileLabel": "Seleziona un file ({sizeMB} MB max.)",
@@ -21464,6 +21527,7 @@ var it = {
21464
21527
  "map.navigation.message": "Si prega di utilizzare CTRL + mouse (o due dita su mobile) per navigare sulla mappa",
21465
21528
  "map.ogc.urlInput.hint": "Inserisci URL del servizio OGC API",
21466
21529
  "map.select.layer": "Sorgente dati",
21530
+ "map.select.style": "Style",
21467
21531
  "map.wfs.urlInput.hint": "Inserisci URL del servizio WFS",
21468
21532
  "map.wms.urlInput.hint": "Inserisci URL del servizio WMS",
21469
21533
  "multiselect.filter.placeholder": "Cerca",
@@ -21542,9 +21606,15 @@ var it = {
21542
21606
  "record.metadata.download": "Download",
21543
21607
  "record.metadata.feature.catalog": "Catalogo dei oggetti",
21544
21608
  "record.metadata.formats": "Formati",
21609
+ "record.metadata.isGeographical": "Dati geografici",
21545
21610
  "record.metadata.keywords": "Parole chiave",
21546
21611
  "record.metadata.languages": "Lingue",
21547
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": "",
21548
21618
  "record.metadata.links": "Collegamenti",
21549
21619
  "record.metadata.noUsage": "Nessuna condizione d'uso specificata per questi dati",
21550
21620
  "record.metadata.otherConstraints": "Limitazioni di uso",
@@ -21554,6 +21624,8 @@ var it = {
21554
21624
  "record.metadata.publication": "Data di pubblicazione",
21555
21625
  "record.metadata.publications": "{count, plural, =0{pubblicazione} one{pubblicazione} other{pubblicazioni}}",
21556
21626
  "record.metadata.quality": "Qualità dei metadati",
21627
+ "record.metadata.quality.capabilities.failed": "",
21628
+ "record.metadata.quality.capabilities.success": "",
21557
21629
  "record.metadata.quality.contact.failed": "Il contatto non è specificato",
21558
21630
  "record.metadata.quality.contact.success": "Il contatto è specificato",
21559
21631
  "record.metadata.quality.description.failed": "La descrizione non è specificata",
@@ -21565,6 +21637,8 @@ var it = {
21565
21637
  "record.metadata.quality.legalConstraints.success": "I vincoli legali sono specificate",
21566
21638
  "record.metadata.quality.organisation.failed": "Il produttore non è specificato",
21567
21639
  "record.metadata.quality.organisation.success": "Il produttore è specificato",
21640
+ "record.metadata.quality.source.failed": "",
21641
+ "record.metadata.quality.source.success": "",
21568
21642
  "record.metadata.quality.title.failed": "Il titolo non è specificato",
21569
21643
  "record.metadata.quality.title.success": "Il titolo è specificato",
21570
21644
  "record.metadata.quality.topic.failed": "Il tema non è specificato",
@@ -21572,7 +21646,6 @@ var it = {
21572
21646
  "record.metadata.quality.updateFrequency.failed": "La frequenza di aggiornamento non è specificata",
21573
21647
  "record.metadata.quality.updateFrequency.success": "La frequenza di aggiornamento è specificata",
21574
21648
  "record.metadata.related": "Vedi anche",
21575
- "record.metadata.related.contents": "Contenuti correlati",
21576
21649
  "record.metadata.ressources.and.links": "Risorse e collegamenti",
21577
21650
  "record.metadata.sheet": "Origine del metadata",
21578
21651
  "record.metadata.status": "Stato",
@@ -21584,7 +21657,6 @@ var it = {
21584
21657
  "record.metadata.temporalExtent.untilDate": "Fino a {end}",
21585
21658
  "record.metadata.title": "Titolo",
21586
21659
  "record.metadata.topics": "Categorie",
21587
- "record.metadata.isGeographical": "Dati geografici",
21588
21660
  "record.metadata.uniqueId": "Identificatore unico di risorsa",
21589
21661
  "record.metadata.updateFrequency": "Frequenza di aggiornamento dei dati",
21590
21662
  "record.metadata.updatedOn": "Modificato il",
@@ -21704,7 +21776,6 @@ var it = {
21704
21776
  "tooltip.html.copy": "Copiare il HTML",
21705
21777
  "tooltip.id.copy": "Copiare l'identificatore unico",
21706
21778
  "tooltip.url.copy": "Copiare l'URL",
21707
- "tooltip.url.open": "Aprire l'URL",
21708
21779
  "ui.readLess": "Ridurre",
21709
21780
  "ui.readMore": "Leggere di più",
21710
21781
  "wfs.feature.limit": "Troppi oggetti per visualizzare il WFS layer!",
@@ -21962,8 +22033,9 @@ var nl = {
21962
22033
  "editor.record.loadError.body": "",
21963
22034
  "editor.record.loadError.closeMessage": "",
21964
22035
  "editor.record.loadError.title": "",
21965
- "editor.record.lock.format": "",
21966
- "editor.record.lock.reason": "",
22036
+ "editor.record.lock.harvested": "",
22037
+ "editor.record.lock.owner": "",
22038
+ "editor.record.lock.resourceType": "",
21967
22039
  "editor.record.multilingual.confirmation.cancelText": "",
21968
22040
  "editor.record.multilingual.confirmation.confirmText": "",
21969
22041
  "editor.record.multilingual.confirmation.message": "",
@@ -22014,6 +22086,11 @@ var nl = {
22014
22086
  "facets.block.title.tag.default": "",
22015
22087
  "facets.block.title.th_regions_tree.default": "",
22016
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",
22017
22094
  "input.file.dropFileLabel": "",
22018
22095
  "input.file.orInputUrl": "",
22019
22096
  "input.file.selectFileLabel": "",
@@ -22073,6 +22150,7 @@ var nl = {
22073
22150
  "map.navigation.message": "",
22074
22151
  "map.ogc.urlInput.hint": "",
22075
22152
  "map.select.layer": "",
22153
+ "map.select.style": "",
22076
22154
  "map.wfs.urlInput.hint": "",
22077
22155
  "map.wms.urlInput.hint": "",
22078
22156
  "multiselect.filter.placeholder": "",
@@ -22151,9 +22229,15 @@ var nl = {
22151
22229
  "record.metadata.download": "",
22152
22230
  "record.metadata.feature.catalog": "",
22153
22231
  "record.metadata.formats": "",
22232
+ "record.metadata.isGeographical": "",
22154
22233
  "record.metadata.keywords": "",
22155
22234
  "record.metadata.languages": "",
22156
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": "",
22157
22241
  "record.metadata.links": "",
22158
22242
  "record.metadata.noUsage": "",
22159
22243
  "record.metadata.otherConstraints": "",
@@ -22163,6 +22247,8 @@ var nl = {
22163
22247
  "record.metadata.publication": "",
22164
22248
  "record.metadata.publications": "{count, plural, =0{} one{} other{}}",
22165
22249
  "record.metadata.quality": "",
22250
+ "record.metadata.quality.capabilities.failed": "",
22251
+ "record.metadata.quality.capabilities.success": "",
22166
22252
  "record.metadata.quality.contact.failed": "",
22167
22253
  "record.metadata.quality.contact.success": "",
22168
22254
  "record.metadata.quality.description.failed": "",
@@ -22174,6 +22260,8 @@ var nl = {
22174
22260
  "record.metadata.quality.legalConstraints.success": "",
22175
22261
  "record.metadata.quality.organisation.failed": "",
22176
22262
  "record.metadata.quality.organisation.success": "",
22263
+ "record.metadata.quality.source.failed": "",
22264
+ "record.metadata.quality.source.success": "",
22177
22265
  "record.metadata.quality.title.failed": "",
22178
22266
  "record.metadata.quality.title.success": "",
22179
22267
  "record.metadata.quality.topic.failed": "",
@@ -22181,7 +22269,6 @@ var nl = {
22181
22269
  "record.metadata.quality.updateFrequency.failed": "",
22182
22270
  "record.metadata.quality.updateFrequency.success": "",
22183
22271
  "record.metadata.related": "",
22184
- "record.metadata.related.contents": "",
22185
22272
  "record.metadata.ressources.and.links": "Bronnen en links",
22186
22273
  "record.metadata.sheet": "",
22187
22274
  "record.metadata.status": "",
@@ -22193,7 +22280,6 @@ var nl = {
22193
22280
  "record.metadata.temporalExtent.untilDate": "",
22194
22281
  "record.metadata.title": "",
22195
22282
  "record.metadata.topics": "",
22196
- "record.metadata.isGeographical": "",
22197
22283
  "record.metadata.uniqueId": "",
22198
22284
  "record.metadata.updateFrequency": "",
22199
22285
  "record.metadata.updatedOn": "",
@@ -22313,7 +22399,6 @@ var nl = {
22313
22399
  "tooltip.html.copy": "",
22314
22400
  "tooltip.id.copy": "",
22315
22401
  "tooltip.url.copy": "",
22316
- "tooltip.url.open": "",
22317
22402
  "ui.readLess": "",
22318
22403
  "ui.readMore": "",
22319
22404
  "wfs.feature.limit": "",
@@ -22571,8 +22656,9 @@ var pt = {
22571
22656
  "editor.record.loadError.body": "",
22572
22657
  "editor.record.loadError.closeMessage": "",
22573
22658
  "editor.record.loadError.title": "",
22574
- "editor.record.lock.format": "",
22575
- "editor.record.lock.reason": "",
22659
+ "editor.record.lock.harvested": "",
22660
+ "editor.record.lock.owner": "",
22661
+ "editor.record.lock.resourceType": "",
22576
22662
  "editor.record.multilingual.confirmation.cancelText": "",
22577
22663
  "editor.record.multilingual.confirmation.confirmText": "",
22578
22664
  "editor.record.multilingual.confirmation.message": "",
@@ -22623,6 +22709,11 @@ var pt = {
22623
22709
  "facets.block.title.tag.default": "",
22624
22710
  "facets.block.title.th_regions_tree.default": "",
22625
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",
22626
22717
  "input.file.dropFileLabel": "",
22627
22718
  "input.file.orInputUrl": "",
22628
22719
  "input.file.selectFileLabel": "",
@@ -22682,6 +22773,7 @@ var pt = {
22682
22773
  "map.navigation.message": "",
22683
22774
  "map.ogc.urlInput.hint": "",
22684
22775
  "map.select.layer": "",
22776
+ "map.select.style": "",
22685
22777
  "map.wfs.urlInput.hint": "",
22686
22778
  "map.wms.urlInput.hint": "",
22687
22779
  "multiselect.filter.placeholder": "",
@@ -22760,9 +22852,15 @@ var pt = {
22760
22852
  "record.metadata.download": "",
22761
22853
  "record.metadata.feature.catalog": "",
22762
22854
  "record.metadata.formats": "",
22855
+ "record.metadata.isGeographical": "",
22763
22856
  "record.metadata.keywords": "",
22764
22857
  "record.metadata.languages": "",
22765
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": "",
22766
22864
  "record.metadata.links": "",
22767
22865
  "record.metadata.noUsage": "",
22768
22866
  "record.metadata.otherConstraints": "",
@@ -22772,6 +22870,8 @@ var pt = {
22772
22870
  "record.metadata.publication": "",
22773
22871
  "record.metadata.publications": "{count, plural, =0{} one{} other{}}",
22774
22872
  "record.metadata.quality": "",
22873
+ "record.metadata.quality.capabilities.failed": "",
22874
+ "record.metadata.quality.capabilities.success": "",
22775
22875
  "record.metadata.quality.contact.failed": "",
22776
22876
  "record.metadata.quality.contact.success": "",
22777
22877
  "record.metadata.quality.description.failed": "",
@@ -22783,6 +22883,8 @@ var pt = {
22783
22883
  "record.metadata.quality.legalConstraints.success": "",
22784
22884
  "record.metadata.quality.organisation.failed": "",
22785
22885
  "record.metadata.quality.organisation.success": "",
22886
+ "record.metadata.quality.source.failed": "",
22887
+ "record.metadata.quality.source.success": "",
22786
22888
  "record.metadata.quality.title.failed": "",
22787
22889
  "record.metadata.quality.title.success": "",
22788
22890
  "record.metadata.quality.topic.failed": "",
@@ -22790,7 +22892,6 @@ var pt = {
22790
22892
  "record.metadata.quality.updateFrequency.failed": "",
22791
22893
  "record.metadata.quality.updateFrequency.success": "",
22792
22894
  "record.metadata.related": "",
22793
- "record.metadata.related.contents": "",
22794
22895
  "record.metadata.ressources.and.links": "Recursos e links",
22795
22896
  "record.metadata.sheet": "",
22796
22897
  "record.metadata.status": "",
@@ -22802,7 +22903,6 @@ var pt = {
22802
22903
  "record.metadata.temporalExtent.untilDate": "",
22803
22904
  "record.metadata.title": "",
22804
22905
  "record.metadata.topics": "",
22805
- "record.metadata.isGeographical": "",
22806
22906
  "record.metadata.uniqueId": "",
22807
22907
  "record.metadata.updateFrequency": "",
22808
22908
  "record.metadata.updatedOn": "",
@@ -22922,7 +23022,6 @@ var pt = {
22922
23022
  "tooltip.html.copy": "",
22923
23023
  "tooltip.id.copy": "",
22924
23024
  "tooltip.url.copy": "",
22925
- "tooltip.url.open": "",
22926
23025
  "ui.readLess": "",
22927
23026
  "ui.readMore": "",
22928
23027
  "wfs.feature.limit": "",
@@ -23156,6 +23255,9 @@ class Gn4FieldMapper {
23156
23255
  isPublishedToAll: (output, source) => this.addExtra({
23157
23256
  isPublishedToAll: selectField(source, 'isPublishedToAll'),
23158
23257
  }, output),
23258
+ isHarvested: (output, source) => this.addExtra({
23259
+ isHarvested: selectField(source, 'isHarvested') !== 'false',
23260
+ }, output),
23159
23261
  edit: (output, source) => this.addExtra({
23160
23262
  edit: selectField(source, 'edit'),
23161
23263
  }, output),
@@ -23444,8 +23546,10 @@ const ES_SOURCE_SUMMARY = [
23444
23546
  'cl_topic',
23445
23547
  'cl_maintenanceAndUpdateFrequency',
23446
23548
  'tag',
23447
- 'MD_LegalConstraintsUseLimitationObject',
23549
+ 'MD_LegalConstraints*Object',
23448
23550
  'qualityScore',
23551
+ 'allKeywords',
23552
+ 'recordLink',
23449
23553
  ];
23450
23554
  const ES_QUERY_FIELDS_PRIORITY = {
23451
23555
  'resourceTitleObject.${searchLang}': 5,
@@ -23545,7 +23649,7 @@ class ElasticsearchService {
23545
23649
  },
23546
23650
  };
23547
23651
  }
23548
- getRelatedRecordPayload(record, size = 6, _source = [...ES_SOURCE_SUMMARY, 'allKeywords', 'createDate']) {
23652
+ getRelatedRecordPayload(record, size = 6, _source = [...ES_SOURCE_SUMMARY, 'createDate']) {
23549
23653
  return {
23550
23654
  query: {
23551
23655
  bool: {
@@ -23968,10 +24072,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
23968
24072
  args: [METADATA_LANGUAGE]
23969
24073
  }] }] });
23970
24074
 
24075
+ class Gn4SettingsService {
24076
+ constructor(siteApiService) {
24077
+ this.siteApiService = siteApiService;
24078
+ this.identicon$ = this.getSettingsSetValueByKey('system/users/identicon');
24079
+ this.allowEditHarvested$ = this.getSettingsSetValueByKey('system/harvester/enableEditing');
24080
+ }
24081
+ getSettingsSetValueByKey(key) {
24082
+ return this.siteApiService.getSettingsSet(null, [key]).pipe(map$1((v) => v[key]), shareReplay({ bufferSize: 1, refCount: true }));
24083
+ }
24084
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, deps: [{ token: SiteApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
24085
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, providedIn: 'root' }); }
24086
+ }
24087
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, decorators: [{
24088
+ type: Injectable,
24089
+ args: [{
24090
+ providedIn: 'root',
24091
+ }]
24092
+ }], ctorParameters: () => [{ type: SiteApiService }] });
24093
+
23971
24094
  const minPublicationApiVersion = '4.2.5';
23972
24095
  const TEMPORARY_ID_PREFIX = 'TEMP-ID-';
23973
24096
  class Gn4Repository {
23974
- constructor(httpClient, gn4SearchApi, gn4SearchHelper, gn4Mapper, gn4RecordsApi, platformService, gn4LanguagesApi) {
24097
+ constructor(httpClient, gn4SearchApi, gn4SearchHelper, gn4Mapper, gn4RecordsApi, platformService, gn4LanguagesApi, settingsService) {
23975
24098
  this.httpClient = httpClient;
23976
24099
  this.gn4SearchApi = gn4SearchApi;
23977
24100
  this.gn4SearchHelper = gn4SearchHelper;
@@ -23979,6 +24102,7 @@ class Gn4Repository {
23979
24102
  this.gn4RecordsApi = gn4RecordsApi;
23980
24103
  this.platformService = platformService;
23981
24104
  this.gn4LanguagesApi = gn4LanguagesApi;
24105
+ this.settingsService = settingsService;
23982
24106
  this._draftsChanged = new Subject();
23983
24107
  this.draftsChanged$ = this._draftsChanged.asObservable();
23984
24108
  }
@@ -24016,12 +24140,21 @@ class Gn4Repository {
24016
24140
  name: featureType.typeName || '',
24017
24141
  definition: featureType.definition || '',
24018
24142
  attributes: Array.isArray(featureType.attributeTable)
24019
- ? featureType.attributeTable.map((attr) => ({
24020
- name: attr.name,
24021
- code: attr.code,
24022
- title: attr.definition,
24023
- type: attr.type,
24024
- }))
24143
+ ? featureType.attributeTable.map((attr) => {
24144
+ const values = attr.values
24145
+ ?.filter((v) => v.code || v.label)
24146
+ .map((v) => ({
24147
+ code: v.code,
24148
+ label: v.label,
24149
+ }));
24150
+ return {
24151
+ name: attr.name,
24152
+ code: attr.code,
24153
+ definition: attr.definition,
24154
+ type: attr.type,
24155
+ ...(values?.length > 0 ? { values } : {}),
24156
+ };
24157
+ })
24025
24158
  : [],
24026
24159
  })),
24027
24160
  };
@@ -24084,11 +24217,29 @@ class Gn4Repository {
24084
24217
  ? this.getRecord(uniqueIdentifier).pipe(map$1((record) => record.extras['isPublishedToAll']))
24085
24218
  : of(true);
24086
24219
  }
24087
- canEditRecord(uniqueIdentifier) {
24088
- return this.getRecord(uniqueIdentifier).pipe(map$1((record) => {
24089
- return record.extras['edit'];
24220
+ canDuplicate(record) {
24221
+ return record.kind === 'dataset';
24222
+ }
24223
+ canDelete(record) {
24224
+ return this.settingsService.allowEditHarvested$.pipe(map$1((allowEditHarvested) => {
24225
+ return (record.extras['edit'] &&
24226
+ (!record.extras['isHarvested'] || allowEditHarvested));
24090
24227
  }));
24091
24228
  }
24229
+ canEdit(record, allowEditHarvested) {
24230
+ return (record.kind === 'dataset' &&
24231
+ record.extras['edit'] &&
24232
+ (!record.extras['isHarvested'] || allowEditHarvested));
24233
+ }
24234
+ canEditRecord(uniqueIdentifier) {
24235
+ return combineLatest([
24236
+ this.getRecord(uniqueIdentifier),
24237
+ this.settingsService.allowEditHarvested$,
24238
+ ]).pipe(map$1(([record, allowEditHarvested]) => record ? this.canEdit(record, allowEditHarvested) : false));
24239
+ }
24240
+ canEditIndexedRecord(record) {
24241
+ return this.settingsService.allowEditHarvested$.pipe(map$1((allowEditHarvested) => this.canEdit(record, allowEditHarvested)));
24242
+ }
24092
24243
  openRecordForEdition(uniqueIdentifier) {
24093
24244
  const draft$ = of(this.getRecordFromLocalStorage(uniqueIdentifier));
24094
24245
  const recordAsXml$ = this.getRecordAsXml(uniqueIdentifier);
@@ -24250,12 +24401,12 @@ class Gn4Repository {
24250
24401
  removeRecordFromLocalStorage(recordId) {
24251
24402
  window.localStorage.removeItem(this.getLocalStorageKeyForRecord(recordId));
24252
24403
  }
24253
- 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 }], target: i0.ɵɵFactoryTarget.Injectable }); }
24404
+ 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 }); }
24254
24405
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4Repository }); }
24255
24406
  }
24256
24407
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4Repository, decorators: [{
24257
24408
  type: Injectable
24258
- }], ctorParameters: () => [{ type: i1.HttpClient }, { type: SearchApiService }, { type: ElasticsearchService }, { type: Gn4Converter }, { type: RecordsApiService }, { type: PlatformServiceInterface }, { type: LanguagesApiService }] });
24409
+ }], ctorParameters: () => [{ type: i1.HttpClient }, { type: SearchApiService }, { type: ElasticsearchService }, { type: Gn4Converter }, { type: RecordsApiService }, { type: PlatformServiceInterface }, { type: LanguagesApiService }, { type: Gn4SettingsService }] });
24259
24410
 
24260
24411
  const IMAGE_URL$1 = '/geonetwork/images/harvesting/';
24261
24412
  class OrganizationsFromMetadataService {
@@ -24534,24 +24685,6 @@ const ORGANIZATIONS_STRATEGY = new InjectionToken('organizations-strategy', {
24534
24685
  factory: () => 'metadata',
24535
24686
  });
24536
24687
 
24537
- class Gn4SettingsService {
24538
- constructor(siteApiService) {
24539
- this.siteApiService = siteApiService;
24540
- this.identicon$ = this.getSettingsSetValueByKey('system/users/identicon');
24541
- }
24542
- getSettingsSetValueByKey(key) {
24543
- return this.siteApiService.getSettingsSet(null, [key]).pipe(map$1((v) => v[key]), shareReplay({ bufferSize: 1, refCount: true }));
24544
- }
24545
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, deps: [{ token: SiteApiService }], target: i0.ɵɵFactoryTarget.Injectable }); }
24546
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, providedIn: 'root' }); }
24547
- }
24548
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: Gn4SettingsService, decorators: [{
24549
- type: Injectable,
24550
- args: [{
24551
- providedIn: 'root',
24552
- }]
24553
- }], ctorParameters: () => [{ type: SiteApiService }] });
24554
-
24555
24688
  const DEFAULT_GN4_LOGIN_URL = `/geonetwork/srv/\${lang3}/catalog.signin?redirect=\${current_url}`;
24556
24689
  const LOGIN_URL = new InjectionToken('loginUrl');
24557
24690
  const DEFAULT_GN4_LOGOUT_URL = `/geonetwork/signout`;
@@ -25673,7 +25806,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
25673
25806
  }] });
25674
25807
 
25675
25808
  var name = "geonetwork-ui";
25676
- var version = "2.6.0-dev.600519f47";
25809
+ var version = "2.6.0-dev.609dd7257";
25677
25810
  var engines = {
25678
25811
  node: ">=20"
25679
25812
  };
@@ -25798,6 +25931,9 @@ class Gn4PlatformService {
25798
25931
  throw new Error(`Gn4 API version is not compatible.\nMinimum: ${minApiVersion}\nYour version: ${version}`);
25799
25932
  }
25800
25933
  }), shareReplay(1));
25934
+ this.allowEditHarvestedMd$ = this.settings$.pipe(map$1((info) => {
25935
+ return info['system/harvester/enableEditing'];
25936
+ }), shareReplay(1));
25801
25937
  /**
25802
25938
  * A map of already loaded thesauri (groups of keywords); the key is a URI
25803
25939
  * @private
@@ -25818,6 +25954,9 @@ class Gn4PlatformService {
25818
25954
  getApiVersion() {
25819
25955
  return this.apiVersion$;
25820
25956
  }
25957
+ getAllowEditHarvestedMd() {
25958
+ return this.allowEditHarvestedMd$;
25959
+ }
25821
25960
  getMe() {
25822
25961
  return this.me$;
25823
25962
  }
@@ -26250,422 +26389,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
26250
26389
  type: Output
26251
26390
  }] } });
26252
26391
 
26253
- class ExpandablePanelButtonComponent {
26254
- constructor() {
26255
- this.collapsed = true;
26256
- }
26257
- toggle() {
26258
- this.collapsed = !this.collapsed;
26259
- }
26260
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26261
- 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 }); }
26262
- }
26263
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelButtonComponent, decorators: [{
26264
- type: Component,
26265
- 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"] }]
26266
- }], propDecorators: { titleTemplate: [{
26267
- type: Input
26268
- }], collapsed: [{
26269
- type: Input
26270
- }] } });
26271
-
26272
- class ExpandablePanelComponent {
26273
- constructor(changeDetector) {
26274
- this.changeDetector = changeDetector;
26275
- this.iconColor = '';
26276
- this._collapsed = true;
26277
- }
26278
- ngAfterViewInit() {
26279
- if (this.contentDiv) {
26280
- this.contentObserver = new ResizeObserver(() => {
26281
- this.changeDetector.detectChanges();
26282
- });
26283
- this.contentObserver.observe(this.contentDiv.nativeElement);
26284
- }
26285
- }
26286
- set collapsed(value) {
26287
- this._collapsed = value;
26288
- }
26289
- get collapsed() {
26290
- return this._collapsed;
26291
- }
26292
- toggle() {
26293
- this.collapsed = !this.collapsed;
26294
- }
26295
- ngOnDestroy() {
26296
- if (this.contentObserver) {
26297
- this.contentObserver.disconnect();
26298
- }
26299
- }
26300
- 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 }); }
26301
- 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 }); }
26302
- }
26303
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelComponent, decorators: [{
26304
- type: Component,
26305
- 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" }]
26306
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { title: [{
26307
- type: Input
26308
- }], iconColor: [{
26309
- type: Input
26310
- }], titleTemplate: [{
26311
- type: ContentChild,
26312
- args: ['titleTemplate']
26313
- }], contentDiv: [{
26314
- type: ViewChild,
26315
- args: ['contentDiv']
26316
- }], collapsed: [{
26317
- type: Input
26318
- }] } });
26319
-
26320
- class FormFieldWrapperComponent {
26321
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26322
- 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 }); }
26323
- }
26324
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldWrapperComponent, decorators: [{
26325
- type: Component,
26326
- 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" }]
26327
- }], propDecorators: { label: [{
26328
- type: Input
26329
- }], hint: [{
26330
- type: Input
26331
- }] } });
26332
-
26333
- class MaxLinesComponent {
26334
- constructor(cdr) {
26335
- this.cdr = cdr;
26336
- this.maxLines = 6;
26337
- this.isExpanded = false;
26338
- this.maxHeight = '';
26339
- this.showToggleButton = false;
26340
- }
26341
- ngAfterViewInit() {
26342
- this.calculateMaxHeight();
26343
- this.observer = new ResizeObserver((mutations) => {
26344
- mutations.forEach(() => {
26345
- this.calculateMaxHeight();
26346
- });
26347
- });
26348
- this.observer.observe(this.container.nativeElement.children[0]);
26349
- }
26350
- toggleDisplay() {
26351
- this.isExpanded = !this.isExpanded;
26352
- this.calculateMaxHeight();
26353
- }
26354
- calculateMaxHeight() {
26355
- const containerElement = this.container.nativeElement;
26356
- const contentElement = containerElement.children[0];
26357
- const contentHeight = contentElement.getBoundingClientRect().height;
26358
- if (contentHeight) {
26359
- if (contentHeight > this.maxLines * this.getLineHeight(contentElement)) {
26360
- this.showToggleButton = true;
26361
- this.maxHeight = this.isExpanded
26362
- ? `${contentHeight}px`
26363
- : `${this.maxLines * this.getLineHeight(contentElement)}px`;
26364
- }
26365
- else {
26366
- this.showToggleButton = false;
26367
- this.maxHeight = `${contentHeight}px`;
26368
- }
26369
- containerElement.setAttribute('style', `max-height: ${this.maxHeight}; overflow: hidden`);
26370
- this.cdr.detectChanges();
26371
- }
26372
- }
26373
- getLineHeight(element) {
26374
- const computedStyle = window.getComputedStyle(element);
26375
- const lineHeight = parseFloat(computedStyle.lineHeight);
26376
- const fontSize = parseFloat(computedStyle.fontSize || '14');
26377
- const result = isNaN(lineHeight) ? fontSize * 1.2 : lineHeight; // Use a default if line height is not specified
26378
- return result;
26379
- }
26380
- ngOnDestroy() {
26381
- if (!this.observer)
26382
- return;
26383
- this.observer.unobserve(this.container.nativeElement.children[0]);
26384
- }
26385
- 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 }); }
26386
- 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 }); }
26387
- }
26388
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaxLinesComponent, decorators: [{
26389
- type: Component,
26390
- 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" }]
26391
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { maxLines: [{
26392
- type: Input
26393
- }], container: [{
26394
- type: ViewChild,
26395
- args: ['container']
26396
- }] } });
26397
-
26398
- class InteractiveTableColumnComponent {
26399
- constructor() {
26400
- this.grow = false;
26401
- this.sortable = false;
26402
- this.activeSort = null;
26403
- this.sortChange = new EventEmitter();
26404
- }
26405
- handleSortChange() {
26406
- this.activeSort = this.activeSort === 'asc' ? 'desc' : 'asc';
26407
- this.sortChange.emit(this.activeSort);
26408
- }
26409
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26410
- 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 }); }
26411
- }
26412
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableColumnComponent, decorators: [{
26413
- type: Component,
26414
- args: [{ selector: 'gn-ui-interactive-table-column', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span>empty</span>\n" }]
26415
- }], propDecorators: { header: [{
26416
- type: ContentChild,
26417
- args: ['header']
26418
- }], cell: [{
26419
- type: ContentChild,
26420
- args: ['cell']
26421
- }], grow: [{
26422
- type: Input
26423
- }], width: [{
26424
- type: Input
26425
- }], sortable: [{
26426
- type: Input
26427
- }], activeSort: [{
26428
- type: Input
26429
- }], sortChange: [{
26430
- type: Output
26431
- }] } });
26432
-
26433
- marker('editor.record.lock.reason');
26434
- marker('editor.record.lock.format');
26435
- class InteractiveTableComponent {
26436
- constructor() {
26437
- this.items = [];
26438
- this.isDraftPage = false;
26439
- this.itemClick = new EventEmitter();
26440
- }
26441
- get gridStyle() {
26442
- return {
26443
- 'grid-template-columns': this.columns
26444
- .map((column) => column.width
26445
- ? column.width
26446
- : column.grow
26447
- ? `minmax(0px,1fr)`
26448
- : `minmax(0px,max-content)`)
26449
- .join(' '),
26450
- };
26451
- }
26452
- getItemTitle(item) {
26453
- if (!item.extras?.edit && !this.isDraftPage && item.kind === 'dataset') {
26454
- return 'editor.record.lock.reason';
26455
- }
26456
- else if (item.kind !== 'dataset') {
26457
- return 'editor.record.lock.format';
26458
- }
26459
- return '';
26460
- }
26461
- handleRowClick(item) {
26462
- this.itemClick.emit(item);
26463
- }
26464
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26465
- 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 [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 (!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 }); }
26466
- }
26467
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, decorators: [{
26468
- type: Component,
26469
- 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 (!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"] }]
26470
- }], propDecorators: { columns: [{
26471
- type: ContentChildren,
26472
- args: [InteractiveTableColumnComponent]
26473
- }], items: [{
26474
- type: Input
26475
- }], isDraftPage: [{
26476
- type: Input
26477
- }], itemClick: [{
26478
- type: Output
26479
- }] } });
26480
-
26481
- /**
26482
- * This component will make a block that will stay sticky on the top of the page,
26483
- * but will also shrink down to a minimum height when scrolling.
26484
- * The ratio between minimum and nominal height is stored in the shrinkRatio
26485
- * property, and can be used to change e.g. the opacity or size of child elements.
26486
- * This component renders at z-index: 50 by default.
26487
- * The first parent element with an overflow of `scroll` or `overflow` is considered
26488
- * for scroll events.
26489
- */
26490
- class StickyHeaderComponent {
26491
- constructor(changeDetector, hostEl, zone) {
26492
- this.changeDetector = changeDetector;
26493
- this.hostEl = hostEl;
26494
- this.zone = zone;
26495
- }
26496
- ngAfterViewInit() {
26497
- this.scrollSub = fromEvent(window, 'scroll', {
26498
- passive: true,
26499
- })
26500
- .pipe(throttleTime(0, animationFrameScheduler, {
26501
- leading: true,
26502
- trailing: true,
26503
- }))
26504
- .subscribe(this.updateSize.bind(this));
26505
- }
26506
- ngOnInit() {
26507
- this.placeholderEl = document.createElement('div');
26508
- this.placeholderEl.style.position = 'absolute';
26509
- this.placeholderEl.classList.add('sticky-header-placeholder');
26510
- this.hostEl.nativeElement.insertAdjacentElement('beforebegin', this.placeholderEl);
26511
- }
26512
- ngAfterViewChecked() {
26513
- this.updateSize();
26514
- }
26515
- ngOnDestroy() {
26516
- this.scrollSub.unsubscribe();
26517
- this.placeholderEl.remove();
26518
- }
26519
- updateSize() {
26520
- this.zone.runOutsideAngular(() => {
26521
- if (window.scrollY === this.parentScroll)
26522
- return;
26523
- this.parentScroll = window.scrollY;
26524
- const offsetTop = Math.max(0, this.parentScroll - this.placeholderEl.offsetTop);
26525
- const newHeightPx = Math.max(this.minHeightPx, this.fullHeightPx - offsetTop);
26526
- this.innerContainer.nativeElement.style.transform = `translate(0, ${newHeightPx - this.fullHeightPx}px)`;
26527
- this.expandRatio =
26528
- (newHeightPx - this.minHeightPx) /
26529
- (this.fullHeightPx - this.minHeightPx);
26530
- this.changeDetector.detectChanges();
26531
- });
26532
- }
26533
- 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 }); }
26534
- 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 }); }
26535
- }
26536
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickyHeaderComponent, decorators: [{
26537
- type: Component,
26538
- 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" }]
26539
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef, decorators: [{
26540
- type: Host
26541
- }] }, { type: i0.NgZone }], propDecorators: { minHeightPx: [{
26542
- type: Input
26543
- }], fullHeightPx: [{
26544
- type: Input
26545
- }], template: [{
26546
- type: ContentChild,
26547
- args: [TemplateRef]
26548
- }], outerContainer: [{
26549
- type: ViewChild,
26550
- args: ['outerContainer']
26551
- }], innerContainer: [{
26552
- type: ViewChild,
26553
- args: ['innerContainer']
26554
- }] } });
26555
-
26556
- class BlockListComponent {
26557
- get pages() {
26558
- return new Array(this.pagesCount).fill(0).map((_, i) => i);
26559
- }
26560
- get isFirstPage() {
26561
- return this.currentPage_ === 0;
26562
- }
26563
- get isLastPage() {
26564
- return this.currentPage_ === this.pagesCount - 1;
26565
- }
26566
- get pagesCount() {
26567
- return this.blocks ? Math.ceil(this.blocks.length / this.pageSize) : 1;
26568
- }
26569
- get currentPage() {
26570
- return this.currentPage_ + 1;
26571
- }
26572
- constructor(changeDetector) {
26573
- this.changeDetector = changeDetector;
26574
- this.pageSize = 4;
26575
- this.containerClass = '';
26576
- this.paginationContainerClass = 'w-full bottom-0 top-auto';
26577
- this.minHeight = 0;
26578
- this.listChanges = new EventEmitter();
26579
- this.subComponentSize = 'M';
26580
- this.currentPage_ = 0;
26581
- this.refreshBlocksVisibility = () => {
26582
- this.blocks.forEach((block, index) => {
26583
- block.nativeElement.style.display =
26584
- index >= this.currentPage_ * this.pageSize &&
26585
- index < (this.currentPage_ + 1) * this.pageSize
26586
- ? null
26587
- : 'none';
26588
- });
26589
- };
26590
- }
26591
- ngAfterViewInit() {
26592
- this.blocks.changes.subscribe(() => {
26593
- this.updateSizes();
26594
- this.refreshBlocksVisibility();
26595
- this.goToPage(1);
26596
- this.changeDetector.detectChanges();
26597
- this.listChanges.emit(this);
26598
- });
26599
- this.updateSizes();
26600
- this.refreshBlocksVisibility();
26601
- // we store the first height as the min-height of the list container
26602
- this.minHeight = this.blockContainer.nativeElement.clientHeight;
26603
- this.changeDetector.detectChanges();
26604
- this.listChanges.emit(this);
26605
- }
26606
- updateSizes() {
26607
- this.subComponentSize = this.computeSubComponentSize();
26608
- this.pageSize = this.computePageSize();
26609
- }
26610
- computeSubComponentSize() {
26611
- if (!this.blocks)
26612
- return 'M';
26613
- const subComponentsCount = this.blocks.length;
26614
- if (subComponentsCount <= 3)
26615
- return 'L';
26616
- if (subComponentsCount <= 12)
26617
- return 'M';
26618
- if (subComponentsCount <= 18)
26619
- return 'S';
26620
- return 'XS';
26621
- }
26622
- computePageSize() {
26623
- switch (this.subComponentSize) {
26624
- case 'L':
26625
- return 3;
26626
- case 'S':
26627
- return 6;
26628
- case 'XS':
26629
- return 8;
26630
- default:
26631
- return 4;
26632
- }
26633
- }
26634
- goToPage(pageIndex) {
26635
- this.currentPage_ = Math.max(Math.min(pageIndex - 1, this.pagesCount - 1), 0);
26636
- this.changeDetector.detectChanges();
26637
- this.refreshBlocksVisibility();
26638
- }
26639
- goToPrevPage() {
26640
- if (this.isFirstPage)
26641
- return;
26642
- this.goToPage(this.currentPage - 1);
26643
- }
26644
- goToNextPage() {
26645
- if (this.isLastPage)
26646
- return;
26647
- this.goToPage(this.currentPage + 1);
26648
- }
26649
- 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 }); }
26650
- 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 }); }
26651
- }
26652
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BlockListComponent, decorators: [{
26653
- type: Component,
26654
- 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"] }]
26655
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { containerClass: [{
26656
- type: Input
26657
- }], paginationContainerClass: [{
26658
- type: Input
26659
- }], blocks: [{
26660
- type: ContentChildren,
26661
- args: ['block', { read: ElementRef }]
26662
- }], blockContainer: [{
26663
- type: ViewChild,
26664
- args: ['blockContainer']
26665
- }], listChanges: [{
26666
- type: Output
26667
- }] } });
26668
-
26669
26392
  class ColorScaleComponent {
26670
26393
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ColorScaleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
26671
26394
  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: [""] }); }
@@ -28598,6 +28321,531 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28598
28321
  type: Output
28599
28322
  }] } });
28600
28323
 
28324
+ class CellPopinComponent {
28325
+ set activePopin(active) {
28326
+ this._activePopin = !!active;
28327
+ this.updateIntersectionObserver();
28328
+ }
28329
+ get activePopin() {
28330
+ return this._activePopin;
28331
+ }
28332
+ constructor(scrollDispatcher, cdr) {
28333
+ this.scrollDispatcher = scrollDispatcher;
28334
+ this.cdr = cdr;
28335
+ this.extraClass = '';
28336
+ this.isOpen = false;
28337
+ this.isVisible = true;
28338
+ this.overlayPositions = [
28339
+ {
28340
+ originX: 'end',
28341
+ originY: 'top',
28342
+ overlayX: 'end',
28343
+ overlayY: 'top',
28344
+ },
28345
+ {
28346
+ originX: 'start',
28347
+ originY: 'top',
28348
+ overlayX: 'start',
28349
+ overlayY: 'top',
28350
+ },
28351
+ ];
28352
+ this.firstCheck = true;
28353
+ this._activePopin = true;
28354
+ }
28355
+ ngAfterViewInit() {
28356
+ if (!this.activePopin) {
28357
+ return;
28358
+ }
28359
+ if (this.cdkScrollContainer) {
28360
+ this.scrollDispatcher.register(this.cdkScrollContainer);
28361
+ }
28362
+ this.updateIntersectionObserver();
28363
+ }
28364
+ ngOnDestroy() {
28365
+ this.intersectionObserver?.disconnect();
28366
+ this.scrollDispatcher.deregister(this.cdkScrollContainer);
28367
+ }
28368
+ updateIntersectionObserver() {
28369
+ if (!this.scrollContainer || !this.anchorRef) {
28370
+ return;
28371
+ }
28372
+ if (this.intersectionObserver) {
28373
+ this.intersectionObserver?.disconnect();
28374
+ }
28375
+ this.intersectionObserver = new IntersectionObserver(([entry]) => {
28376
+ const visible = entry.intersectionRatio >= 1;
28377
+ // Ignore first visibility if first time opening it
28378
+ if (this.firstCheck && !visible) {
28379
+ this.firstCheck = false;
28380
+ return;
28381
+ }
28382
+ this.firstCheck = false;
28383
+ if (this.isVisible !== visible) {
28384
+ this.isVisible = visible;
28385
+ this.cdr.detectChanges();
28386
+ }
28387
+ }, {
28388
+ root: this.scrollContainer.nativeElement,
28389
+ threshold: 1.0,
28390
+ });
28391
+ this.intersectionObserver.observe(this.anchorRef.nativeElement);
28392
+ }
28393
+ openOverlay() {
28394
+ this.isOpen = true;
28395
+ }
28396
+ closeOverlay() {
28397
+ this.isOpen = false;
28398
+ }
28399
+ 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 }); }
28400
+ 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"] }] }); }
28401
+ }
28402
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CellPopinComponent, decorators: [{
28403
+ type: Component,
28404
+ args: [{ selector: 'gn-ui-cell-popin', standalone: true, imports: [
28405
+ CommonModule,
28406
+ MatButtonModule,
28407
+ OverlayModule,
28408
+ ButtonComponent,
28409
+ NgIconComponent,
28410
+ ], 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" }]
28411
+ }], ctorParameters: () => [{ type: i1$8.ScrollDispatcher }, { type: i0.ChangeDetectorRef }], propDecorators: { extraClass: [{
28412
+ type: Input
28413
+ }], cdkScrollContainer: [{
28414
+ type: Input
28415
+ }], scrollContainer: [{
28416
+ type: Input
28417
+ }], anchorRef: [{
28418
+ type: ViewChild,
28419
+ args: ['anchorRef']
28420
+ }], activePopin: [{
28421
+ type: Input
28422
+ }] } });
28423
+
28424
+ class ExpandablePanelButtonComponent {
28425
+ constructor() {
28426
+ this.collapsed = true;
28427
+ }
28428
+ toggle() {
28429
+ this.collapsed = !this.collapsed;
28430
+ }
28431
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelButtonComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28432
+ 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 }); }
28433
+ }
28434
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelButtonComponent, decorators: [{
28435
+ type: Component,
28436
+ 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"] }]
28437
+ }], propDecorators: { titleTemplate: [{
28438
+ type: Input
28439
+ }], collapsed: [{
28440
+ type: Input
28441
+ }] } });
28442
+
28443
+ class ExpandablePanelComponent {
28444
+ constructor(changeDetector) {
28445
+ this.changeDetector = changeDetector;
28446
+ this.iconColor = '';
28447
+ this._collapsed = true;
28448
+ }
28449
+ ngAfterViewInit() {
28450
+ if (this.contentDiv) {
28451
+ this.contentObserver = new ResizeObserver(() => {
28452
+ this.changeDetector.detectChanges();
28453
+ });
28454
+ this.contentObserver.observe(this.contentDiv.nativeElement);
28455
+ }
28456
+ }
28457
+ set collapsed(value) {
28458
+ this._collapsed = value;
28459
+ }
28460
+ get collapsed() {
28461
+ return this._collapsed;
28462
+ }
28463
+ toggle() {
28464
+ this.collapsed = !this.collapsed;
28465
+ }
28466
+ ngOnDestroy() {
28467
+ if (this.contentObserver) {
28468
+ this.contentObserver.disconnect();
28469
+ }
28470
+ }
28471
+ 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 }); }
28472
+ 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 }); }
28473
+ }
28474
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandablePanelComponent, decorators: [{
28475
+ type: Component,
28476
+ 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" }]
28477
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { title: [{
28478
+ type: Input
28479
+ }], iconColor: [{
28480
+ type: Input
28481
+ }], titleTemplate: [{
28482
+ type: ContentChild,
28483
+ args: ['titleTemplate']
28484
+ }], contentDiv: [{
28485
+ type: ViewChild,
28486
+ args: ['contentDiv']
28487
+ }], collapsed: [{
28488
+ type: Input
28489
+ }] } });
28490
+
28491
+ class FormFieldWrapperComponent {
28492
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldWrapperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28493
+ 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 }); }
28494
+ }
28495
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormFieldWrapperComponent, decorators: [{
28496
+ type: Component,
28497
+ 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" }]
28498
+ }], propDecorators: { label: [{
28499
+ type: Input
28500
+ }], hint: [{
28501
+ type: Input
28502
+ }] } });
28503
+
28504
+ class MaxLinesComponent {
28505
+ constructor(cdr) {
28506
+ this.cdr = cdr;
28507
+ this.maxLines = 6;
28508
+ this.isExpanded = false;
28509
+ this.maxHeight = '';
28510
+ this.showToggleButton = false;
28511
+ }
28512
+ ngAfterViewInit() {
28513
+ this.calculateMaxHeight();
28514
+ this.observer = new ResizeObserver((mutations) => {
28515
+ mutations.forEach(() => {
28516
+ this.calculateMaxHeight();
28517
+ });
28518
+ });
28519
+ this.observer.observe(this.container.nativeElement.children[0]);
28520
+ }
28521
+ toggleDisplay() {
28522
+ this.isExpanded = !this.isExpanded;
28523
+ this.calculateMaxHeight();
28524
+ }
28525
+ calculateMaxHeight() {
28526
+ const containerElement = this.container.nativeElement;
28527
+ const contentElement = containerElement.children[0];
28528
+ const contentHeight = contentElement.getBoundingClientRect().height;
28529
+ if (contentHeight) {
28530
+ if (contentHeight > this.maxLines * this.getLineHeight(contentElement)) {
28531
+ this.showToggleButton = true;
28532
+ this.maxHeight = this.isExpanded
28533
+ ? `${contentHeight}px`
28534
+ : `${this.maxLines * this.getLineHeight(contentElement)}px`;
28535
+ }
28536
+ else {
28537
+ this.showToggleButton = false;
28538
+ this.maxHeight = `${contentHeight}px`;
28539
+ }
28540
+ containerElement.setAttribute('style', `max-height: ${this.maxHeight}; overflow: hidden`);
28541
+ this.cdr.detectChanges();
28542
+ }
28543
+ }
28544
+ getLineHeight(element) {
28545
+ const computedStyle = window.getComputedStyle(element);
28546
+ const lineHeight = parseFloat(computedStyle.lineHeight);
28547
+ const fontSize = parseFloat(computedStyle.fontSize || '14');
28548
+ const result = isNaN(lineHeight) ? fontSize * 1.2 : lineHeight; // Use a default if line height is not specified
28549
+ return result;
28550
+ }
28551
+ ngOnDestroy() {
28552
+ if (!this.observer)
28553
+ return;
28554
+ this.observer.unobserve(this.container.nativeElement.children[0]);
28555
+ }
28556
+ 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 }); }
28557
+ 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 }); }
28558
+ }
28559
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaxLinesComponent, decorators: [{
28560
+ type: Component,
28561
+ 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" }]
28562
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { maxLines: [{
28563
+ type: Input
28564
+ }], container: [{
28565
+ type: ViewChild,
28566
+ args: ['container']
28567
+ }] } });
28568
+
28569
+ class InteractiveTableColumnComponent {
28570
+ constructor() {
28571
+ this.grow = false;
28572
+ this.sortable = false;
28573
+ this.activeSort = null;
28574
+ this.sortChange = new EventEmitter();
28575
+ }
28576
+ handleSortChange() {
28577
+ this.activeSort = this.activeSort === 'asc' ? 'desc' : 'asc';
28578
+ this.sortChange.emit(this.activeSort);
28579
+ }
28580
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableColumnComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28581
+ 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 }); }
28582
+ }
28583
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableColumnComponent, decorators: [{
28584
+ type: Component,
28585
+ args: [{ selector: 'gn-ui-interactive-table-column', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<span>empty</span>\n" }]
28586
+ }], propDecorators: { header: [{
28587
+ type: ContentChild,
28588
+ args: ['header']
28589
+ }], cell: [{
28590
+ type: ContentChild,
28591
+ args: ['cell']
28592
+ }], grow: [{
28593
+ type: Input
28594
+ }], width: [{
28595
+ type: Input
28596
+ }], sortable: [{
28597
+ type: Input
28598
+ }], activeSort: [{
28599
+ type: Input
28600
+ }], sortChange: [{
28601
+ type: Output
28602
+ }] } });
28603
+
28604
+ marker('editor.record.lock.resourceType');
28605
+ marker('editor.record.lock.harvested');
28606
+ marker('editor.record.lock.owner');
28607
+ class InteractiveTableComponent {
28608
+ constructor() {
28609
+ this.items = [];
28610
+ this.canEditItem = () => of(true);
28611
+ this.isDraftPage = false;
28612
+ this.itemClick = new EventEmitter();
28613
+ }
28614
+ get gridStyle() {
28615
+ return {
28616
+ 'grid-template-columns': this.columns
28617
+ .map((column) => column.width
28618
+ ? column.width
28619
+ : column.grow
28620
+ ? `minmax(0px,1fr)`
28621
+ : `minmax(0px,max-content)`)
28622
+ .join(' '),
28623
+ };
28624
+ }
28625
+ getItemTitle(item) {
28626
+ if (!this.isDraftPage) {
28627
+ if (item.kind !== 'dataset') {
28628
+ return 'editor.record.lock.resourceType';
28629
+ }
28630
+ else if (item.extras?.isHarvested) {
28631
+ return 'editor.record.lock.harvested';
28632
+ }
28633
+ else if (!item.extras?.edit) {
28634
+ return 'editor.record.lock.owner';
28635
+ }
28636
+ }
28637
+ return '';
28638
+ }
28639
+ handleRowClick(item) {
28640
+ this.itemClick.emit(item);
28641
+ }
28642
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
28643
+ 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 }); }
28644
+ }
28645
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InteractiveTableComponent, decorators: [{
28646
+ type: Component,
28647
+ 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"] }]
28648
+ }], propDecorators: { columns: [{
28649
+ type: ContentChildren,
28650
+ args: [InteractiveTableColumnComponent]
28651
+ }], items: [{
28652
+ type: Input
28653
+ }], canEditItem: [{
28654
+ type: Input
28655
+ }], isDraftPage: [{
28656
+ type: Input
28657
+ }], itemClick: [{
28658
+ type: Output
28659
+ }] } });
28660
+
28661
+ /**
28662
+ * This component will make a block that will stay sticky on the top of the page,
28663
+ * but will also shrink down to a minimum height when scrolling.
28664
+ * The ratio between minimum and nominal height is stored in the shrinkRatio
28665
+ * property, and can be used to change e.g. the opacity or size of child elements.
28666
+ * This component renders at z-index: 50 by default.
28667
+ * The first parent element with an overflow of `scroll` or `overflow` is considered
28668
+ * for scroll events.
28669
+ */
28670
+ class StickyHeaderComponent {
28671
+ constructor(changeDetector, hostEl, zone) {
28672
+ this.changeDetector = changeDetector;
28673
+ this.hostEl = hostEl;
28674
+ this.zone = zone;
28675
+ }
28676
+ ngAfterViewInit() {
28677
+ this.scrollSub = fromEvent(window, 'scroll', {
28678
+ passive: true,
28679
+ })
28680
+ .pipe(throttleTime(0, animationFrameScheduler, {
28681
+ leading: true,
28682
+ trailing: true,
28683
+ }))
28684
+ .subscribe(this.updateSize.bind(this));
28685
+ }
28686
+ ngOnInit() {
28687
+ this.placeholderEl = document.createElement('div');
28688
+ this.placeholderEl.style.position = 'absolute';
28689
+ this.placeholderEl.classList.add('sticky-header-placeholder');
28690
+ this.hostEl.nativeElement.insertAdjacentElement('beforebegin', this.placeholderEl);
28691
+ }
28692
+ ngAfterViewChecked() {
28693
+ this.updateSize();
28694
+ }
28695
+ ngOnDestroy() {
28696
+ this.scrollSub.unsubscribe();
28697
+ this.placeholderEl.remove();
28698
+ }
28699
+ updateSize() {
28700
+ this.zone.runOutsideAngular(() => {
28701
+ if (window.scrollY === this.parentScroll)
28702
+ return;
28703
+ this.parentScroll = window.scrollY;
28704
+ const offsetTop = Math.max(0, this.parentScroll - this.placeholderEl.offsetTop);
28705
+ const newHeightPx = Math.max(this.minHeightPx, this.fullHeightPx - offsetTop);
28706
+ this.innerContainer.nativeElement.style.transform = `translate(0, ${newHeightPx - this.fullHeightPx}px)`;
28707
+ this.expandRatio =
28708
+ (newHeightPx - this.minHeightPx) /
28709
+ (this.fullHeightPx - this.minHeightPx);
28710
+ this.changeDetector.detectChanges();
28711
+ });
28712
+ }
28713
+ 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 }); }
28714
+ 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 }); }
28715
+ }
28716
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: StickyHeaderComponent, decorators: [{
28717
+ type: Component,
28718
+ 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" }]
28719
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef, decorators: [{
28720
+ type: Host
28721
+ }] }, { type: i0.NgZone }], propDecorators: { minHeightPx: [{
28722
+ type: Input
28723
+ }], fullHeightPx: [{
28724
+ type: Input
28725
+ }], template: [{
28726
+ type: ContentChild,
28727
+ args: [TemplateRef]
28728
+ }], outerContainer: [{
28729
+ type: ViewChild,
28730
+ args: ['outerContainer']
28731
+ }], innerContainer: [{
28732
+ type: ViewChild,
28733
+ args: ['innerContainer']
28734
+ }] } });
28735
+
28736
+ class BlockListComponent {
28737
+ get pages() {
28738
+ return new Array(this.pagesCount).fill(0).map((_, i) => i);
28739
+ }
28740
+ get isFirstPage() {
28741
+ return this.currentPage_ === 0;
28742
+ }
28743
+ get isLastPage() {
28744
+ return this.currentPage_ === this.pagesCount - 1;
28745
+ }
28746
+ get pagesCount() {
28747
+ return this.blocks ? Math.ceil(this.blocks.length / this.pageSize) : 1;
28748
+ }
28749
+ get currentPage() {
28750
+ return this.currentPage_ + 1;
28751
+ }
28752
+ constructor(changeDetector) {
28753
+ this.changeDetector = changeDetector;
28754
+ this.pageSize = 4;
28755
+ this.containerClass = '';
28756
+ this.paginationContainerClass = 'w-full bottom-0 top-auto';
28757
+ this.minHeight = 0;
28758
+ this.listChanges = new EventEmitter();
28759
+ this.subComponentSize = 'M';
28760
+ this.currentPage_ = 0;
28761
+ this.refreshBlocksVisibility = () => {
28762
+ this.blocks.forEach((block, index) => {
28763
+ block.nativeElement.style.display =
28764
+ index >= this.currentPage_ * this.pageSize &&
28765
+ index < (this.currentPage_ + 1) * this.pageSize
28766
+ ? null
28767
+ : 'none';
28768
+ });
28769
+ };
28770
+ }
28771
+ ngAfterViewInit() {
28772
+ this.blocks.changes.subscribe(() => {
28773
+ this.updateSizes();
28774
+ this.refreshBlocksVisibility();
28775
+ this.goToPage(1);
28776
+ this.changeDetector.detectChanges();
28777
+ this.listChanges.emit(this);
28778
+ });
28779
+ this.updateSizes();
28780
+ this.refreshBlocksVisibility();
28781
+ // we store the first height as the min-height of the list container
28782
+ this.minHeight = this.blockContainer.nativeElement.clientHeight;
28783
+ this.changeDetector.detectChanges();
28784
+ this.listChanges.emit(this);
28785
+ }
28786
+ updateSizes() {
28787
+ this.subComponentSize = this.computeSubComponentSize();
28788
+ this.pageSize = this.computePageSize();
28789
+ }
28790
+ computeSubComponentSize() {
28791
+ if (!this.blocks)
28792
+ return 'M';
28793
+ const subComponentsCount = this.blocks.length;
28794
+ if (subComponentsCount <= 3)
28795
+ return 'L';
28796
+ if (subComponentsCount <= 12)
28797
+ return 'M';
28798
+ if (subComponentsCount <= 18)
28799
+ return 'S';
28800
+ return 'XS';
28801
+ }
28802
+ computePageSize() {
28803
+ switch (this.subComponentSize) {
28804
+ case 'L':
28805
+ return 3;
28806
+ case 'S':
28807
+ return 6;
28808
+ case 'XS':
28809
+ return 8;
28810
+ default:
28811
+ return 4;
28812
+ }
28813
+ }
28814
+ goToPage(pageIndex) {
28815
+ this.currentPage_ = Math.max(Math.min(pageIndex - 1, this.pagesCount - 1), 0);
28816
+ this.changeDetector.detectChanges();
28817
+ this.refreshBlocksVisibility();
28818
+ }
28819
+ goToPrevPage() {
28820
+ if (this.isFirstPage)
28821
+ return;
28822
+ this.goToPage(this.currentPage - 1);
28823
+ }
28824
+ goToNextPage() {
28825
+ if (this.isLastPage)
28826
+ return;
28827
+ this.goToPage(this.currentPage + 1);
28828
+ }
28829
+ 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 }); }
28830
+ 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 }); }
28831
+ }
28832
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: BlockListComponent, decorators: [{
28833
+ type: Component,
28834
+ 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"] }]
28835
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { containerClass: [{
28836
+ type: Input
28837
+ }], paginationContainerClass: [{
28838
+ type: Input
28839
+ }], blocks: [{
28840
+ type: ContentChildren,
28841
+ args: ['block', { read: ElementRef }]
28842
+ }], blockContainer: [{
28843
+ type: ViewChild,
28844
+ args: ['blockContainer']
28845
+ }], listChanges: [{
28846
+ type: Output
28847
+ }] } });
28848
+
28601
28849
  class SortableListComponent {
28602
28850
  constructor() {
28603
28851
  this.itemsOrderChange = new EventEmitter();
@@ -28772,34 +29020,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28772
29020
  }] });
28773
29021
 
28774
29022
  class TruncatedTextComponent {
28775
- constructor(cd, ngZone, viewportRuler) {
29023
+ constructor(cd, ngZone) {
28776
29024
  this.cd = cd;
28777
29025
  this.ngZone = ngZone;
28778
- this.viewportRuler = viewportRuler;
28779
29026
  this.text = '';
28780
29027
  this.extraClass = '';
28781
29028
  this.isTextTruncated = false;
28782
- this.isOpen = false;
28783
- this.overlayPosition = {
28784
- originX: 'end',
28785
- originY: 'top',
28786
- overlayX: 'end',
28787
- overlayY: 'top',
28788
- };
28789
29029
  this.resizeObserver = new ResizeObserver(() => {
28790
29030
  this.ngZone.run(() => this.checkTextTruncation());
28791
29031
  });
28792
29032
  this.mutationObserver = new MutationObserver(() => {
28793
29033
  this.ngZone.run(() => {
28794
29034
  this.checkTextTruncation();
28795
- this.close();
28796
29035
  });
28797
29036
  });
28798
- this.viewportSubscription = this.viewportRuler.change().subscribe(() => {
28799
- if (this.isOpen) {
28800
- this.updateOverlayPosition();
28801
- }
28802
- });
28803
29037
  }
28804
29038
  ngAfterViewInit() {
28805
29039
  const element = this.textElement.nativeElement;
@@ -28814,39 +29048,14 @@ class TruncatedTextComponent {
28814
29048
  ngOnDestroy() {
28815
29049
  this.resizeObserver?.disconnect();
28816
29050
  this.mutationObserver?.disconnect();
28817
- this.viewportSubscription?.unsubscribe();
28818
- this.close();
28819
- }
28820
- toggleOverlay() {
28821
- this.isOpen = !this.isOpen;
28822
- if (this.isOpen) {
28823
- this.updateOverlayPosition();
28824
- }
28825
- }
28826
- updateOverlayPosition() {
28827
- const element = this.textElement.nativeElement;
28828
- const rect = element.getBoundingClientRect();
28829
- const viewportWidth = this.viewportRuler.getViewportSize().width;
28830
- const isMobile = viewportWidth < 640;
28831
- const overlayWidth = isMobile ? 190 : 320;
28832
- const isNearLeftEdge = rect.left < overlayWidth;
28833
- this.overlayPosition = {
28834
- originX: isNearLeftEdge ? 'start' : 'end',
28835
- originY: 'top',
28836
- overlayX: isNearLeftEdge ? 'start' : 'end',
28837
- overlayY: 'top',
28838
- };
28839
- }
28840
- close() {
28841
- this.isOpen = false;
28842
29051
  }
28843
29052
  checkTextTruncation() {
28844
29053
  const element = this.textElement.nativeElement;
28845
29054
  this.isTextTruncated = element.scrollWidth > element.clientWidth;
28846
29055
  this.cd.detectChanges();
28847
29056
  }
28848
- 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 }); }
28849
- 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"] }] }); }
29057
+ 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 }); }
29058
+ 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"] }] }); }
28850
29059
  }
28851
29060
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TruncatedTextComponent, decorators: [{
28852
29061
  type: Component,
@@ -28856,12 +29065,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
28856
29065
  MatButtonModule,
28857
29066
  OverlayModule,
28858
29067
  ButtonComponent,
29068
+ CellPopinComponent,
28859
29069
  NgIconComponent,
28860
- ], 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" }]
28861
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }, { type: i1$8.ViewportRuler }], propDecorators: { text: [{
29070
+ ], 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" }]
29071
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i0.NgZone }], propDecorators: { text: [{
28862
29072
  type: Input
28863
29073
  }], extraClass: [{
28864
29074
  type: Input
29075
+ }], scrollContainer: [{
29076
+ type: Input
29077
+ }], cdkScrollContainer: [{
29078
+ type: Input
28865
29079
  }], textElement: [{
28866
29080
  type: ViewChild,
28867
29081
  args: ['textElement']
@@ -29472,6 +29686,10 @@ marker('record.metadata.quality.updateFrequency.success');
29472
29686
  marker('record.metadata.quality.updateFrequency.failed');
29473
29687
  marker('record.metadata.quality.organisation.success');
29474
29688
  marker('record.metadata.quality.organisation.failed');
29689
+ marker('record.metadata.quality.capabilities.success');
29690
+ marker('record.metadata.quality.capabilities.failed');
29691
+ marker('record.metadata.quality.source.success');
29692
+ marker('record.metadata.quality.source.failed');
29475
29693
  class MetadataQualityItemComponent {
29476
29694
  get icon() {
29477
29695
  return this.value ? 'matCheck' : 'matWarningAmber';
@@ -29495,6 +29713,28 @@ class MetadataQualityComponent {
29495
29713
  constructor() {
29496
29714
  this.smaller = false;
29497
29715
  this.items = [];
29716
+ this.COMMON_CHECKS = {
29717
+ title: (metadata) => !!metadata?.title,
29718
+ description: (metadata) => !!metadata?.abstract,
29719
+ keywords: (metadata) => (metadata?.keywords?.length ?? 0) > 0,
29720
+ legalConstraints: (metadata) => (metadata?.legalConstraints?.length ?? 0) > 0,
29721
+ contact: (metadata) => !!metadata?.contacts?.[0]?.email,
29722
+ };
29723
+ this.SPECIFIC_CHECKS = {
29724
+ dataset: {
29725
+ updateFrequency: (metadata) => !!metadata?.updateFrequency,
29726
+ topic: (metadata) => (metadata?.topics?.length ?? 0) > 0,
29727
+ organisation: (metadata) => !!metadata?.contacts?.[0]?.organization?.name,
29728
+ },
29729
+ service: {
29730
+ capabilities: (metadata) => (metadata?.onlineResources ?? []).some((resource) => this.hasGetCapabilities(resource?.url?.href ?? '')),
29731
+ },
29732
+ reuse: {
29733
+ topic: (metadata) => (metadata?.topics?.length ?? 0) > 0,
29734
+ organisation: (metadata) => !!metadata?.contacts?.[0]?.organization?.name,
29735
+ source: (metadata) => !!metadata?.extras?.sourcesIdentifiers,
29736
+ },
29737
+ };
29498
29738
  }
29499
29739
  get qualityScore() {
29500
29740
  const qualityScore = this.metadata?.extras?.qualityScore;
@@ -29510,17 +29750,20 @@ class MetadataQualityComponent {
29510
29750
  this.items.push({ name, value });
29511
29751
  }
29512
29752
  }
29753
+ hasGetCapabilities(url) {
29754
+ return url.toLowerCase().includes('capabilities');
29755
+ }
29513
29756
  initialize() {
29514
- const contact = this.metadata?.contacts?.[0];
29515
29757
  this.items = [];
29516
- this.add('title', !!this.metadata?.title);
29517
- this.add('description', !!this.metadata?.abstract);
29518
- this.add('topic', this.metadata?.topics?.length > 0);
29519
- this.add('keywords', this.metadata?.keywords?.length > 0);
29520
- this.add('legalConstraints', this.metadata?.legalConstraints?.length > 0);
29521
- this.add('organisation', !!contact?.organization);
29522
- this.add('contact', !!contact?.email);
29523
- this.add('updateFrequency', !!this.metadata?.updateFrequency);
29758
+ Object.entries(this.COMMON_CHECKS).forEach(([name, check]) => {
29759
+ this.add(name, check(this.metadata));
29760
+ });
29761
+ const datasetType = this.metadata?.kind;
29762
+ if (datasetType && this.SPECIFIC_CHECKS[datasetType]) {
29763
+ Object.entries(this.SPECIFIC_CHECKS[datasetType]).forEach(([name, check]) => {
29764
+ this.add(name, check(this.metadata));
29765
+ });
29766
+ }
29524
29767
  }
29525
29768
  ngOnChanges(changes) {
29526
29769
  if (changes['metadata'] || changes['metadataQualityDisplay']) {
@@ -29564,6 +29807,56 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
29564
29807
  type: Input
29565
29808
  }] } });
29566
29809
 
29810
+ class InternalLinkCardContactComponent {
29811
+ constructor() {
29812
+ this.size = 'M';
29813
+ }
29814
+ get organization() {
29815
+ return this.record.ownerOrganization;
29816
+ }
29817
+ get contacts() {
29818
+ return ((this.record.kind === 'dataset'
29819
+ ? this.record.contactsForResource
29820
+ : this.record.contacts) || []);
29821
+ }
29822
+ openExternalUrl(event, url) {
29823
+ event.stopPropagation();
29824
+ window.open(url, '_blank');
29825
+ }
29826
+ openMailto(event, email) {
29827
+ event.stopPropagation();
29828
+ window.open(`mailto:${email}`, '_blank');
29829
+ }
29830
+ copyToClipboard(event, text) {
29831
+ event.stopPropagation();
29832
+ navigator.clipboard.writeText(text);
29833
+ }
29834
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InternalLinkCardContactComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29835
+ 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: [
29836
+ provideIcons({
29837
+ iconoirInternet,
29838
+ matEmailOutline,
29839
+ matPhoneOutline,
29840
+ matLocationOnOutline,
29841
+ }),
29842
+ ], 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"] }] }); }
29843
+ }
29844
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InternalLinkCardContactComponent, decorators: [{
29845
+ type: Component,
29846
+ args: [{ selector: 'gn-ui-internal-link-card-contact', standalone: true, imports: [NgIf, ThumbnailComponent, NgIconComponent, TranslateModule], providers: [
29847
+ provideIcons({
29848
+ iconoirInternet,
29849
+ matEmailOutline,
29850
+ matPhoneOutline,
29851
+ matLocationOnOutline,
29852
+ }),
29853
+ ], 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" }]
29854
+ }], propDecorators: { record: [{
29855
+ type: Input
29856
+ }], size: [{
29857
+ type: Input
29858
+ }] } });
29859
+
29567
29860
  class InternalLinkCardComponent {
29568
29861
  set size(value) {
29569
29862
  this._size = value;
@@ -29605,28 +29898,19 @@ class InternalLinkCardComponent {
29605
29898
  this.abstract = removeWhitespace(stripHtml(this.record?.abstract));
29606
29899
  this.subscription.add(fromEvent(this.elementRef.nativeElement, 'click').subscribe(() => this.mdSelect.emit(this.record)));
29607
29900
  }
29608
- get organization() {
29609
- return this.record.ownerOrganization;
29610
- }
29611
- get contacts() {
29612
- return ((this.record.kind === 'dataset'
29613
- ? this.record.contactsForResource
29614
- : this.record.contacts) || []);
29615
- }
29616
29901
  getTitleClass() {
29617
29902
  return this.titleClassMap[this._size];
29618
29903
  }
29619
- openExternalUrl(event, url) {
29620
- event.stopPropagation();
29621
- window.open(url, '_blank');
29622
- }
29623
- openMailto(event, email) {
29624
- event.stopPropagation();
29625
- window.open(`mailto:${email}`, '_blank');
29904
+ getAbstractClass() {
29905
+ const marginClass = ['S', 'XS'].includes(this.size) ? 'ml-2' : '';
29906
+ const clampClass = this.size === 'L' && !this.record.ownerOrganization?.name
29907
+ ? 'line-clamp-6'
29908
+ : 'line-clamp-2';
29909
+ return `${clampClass} ${marginClass}`.trim();
29626
29910
  }
29627
- copyToClipboard(event, text) {
29628
- event.stopPropagation();
29629
- navigator.clipboard.writeText(text);
29911
+ displayAbstract() {
29912
+ return (this.size === 'L' ||
29913
+ (['M', 'S'].includes(this.size) && !this.record.ownerOrganization?.name));
29630
29914
  }
29631
29915
  get shouldShowThumbnail() {
29632
29916
  return this.size === 'L' || this.size === 'M';
@@ -29636,40 +29920,34 @@ class InternalLinkCardComponent {
29636
29920
  provideIcons({
29637
29921
  iconoirInternet,
29638
29922
  matLocationSearchingOutline,
29639
- matEmailOutline,
29640
- matPhoneOutline,
29641
- matLocationOnOutline,
29642
29923
  }),
29643
29924
  provideNgIconsConfig({
29644
29925
  size: '1.2em',
29645
29926
  }),
29646
- ], 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"] }] }); }
29927
+ ], 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 w-0\">\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"] }] }); }
29647
29928
  }
29648
29929
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: InternalLinkCardComponent, decorators: [{
29649
29930
  type: Component,
29650
29931
  args: [{ selector: 'gn-ui-internal-link-card', standalone: true, imports: [
29651
29932
  NgClass,
29652
29933
  NgIf,
29653
- ThumbnailComponent,
29654
29934
  MetadataQualityComponent,
29655
29935
  NgTemplateOutlet,
29656
- NgIconComponent,
29657
29936
  TranslateModule,
29658
29937
  GeoDataBadgeComponent,
29659
29938
  KindBadgeComponent,
29660
29939
  MarkdownParserComponent,
29940
+ InternalLinkCardContactComponent,
29941
+ ThumbnailComponent,
29661
29942
  ], providers: [
29662
29943
  provideIcons({
29663
29944
  iconoirInternet,
29664
29945
  matLocationSearchingOutline,
29665
- matEmailOutline,
29666
- matPhoneOutline,
29667
- matLocationOnOutline,
29668
29946
  }),
29669
29947
  provideNgIconsConfig({
29670
29948
  size: '1.2em',
29671
29949
  }),
29672
- ], 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" }]
29950
+ ], 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 w-0\">\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" }]
29673
29951
  }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { record: [{
29674
29952
  type: Input
29675
29953
  }], linkTarget: [{
@@ -31319,52 +31597,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31319
31597
  type: Input
31320
31598
  }] } });
31321
31599
 
31322
- class RelatedRecordCardComponent {
31323
- constructor() {
31324
- this.linkHref = null;
31325
- this.extraClass = '';
31326
- this.baseClasses = [
31327
- 'w-72',
31328
- 'h-96',
31329
- 'overflow-hidden',
31330
- 'rounded-lg',
31331
- 'bg-white',
31332
- 'cursor-pointer',
31333
- 'block',
31334
- 'hover:-translate-y-2 ',
31335
- 'duration-[180ms]',
31336
- ].join(' ');
31337
- }
31338
- get classList() {
31339
- return `${this.baseClasses} ${this.extraClass}`;
31340
- }
31341
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RelatedRecordCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
31342
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: RelatedRecordCardComponent, isStandalone: true, selector: "gn-ui-related-record-card", inputs: { linkHref: "linkHref", record: "record", extraClass: "extraClass", favoriteTemplate: "favoriteTemplate", metadataQualityDisplay: "metadataQualityDisplay", size: "size" }, ngImport: i0, template: "<gn-ui-internal-link-card\n [linkHref]=\"linkHref\"\n [linkTarget]=\"'_blank'\"\n [record]=\"record\"\n [favoriteTemplate]=\"favoriteTemplate\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n [size]=\"size\"\n>\n</gn-ui-internal-link-card>\n", styles: [""], dependencies: [{ kind: "component", type: InternalLinkCardComponent, selector: "gn-ui-internal-link-card", inputs: ["record", "linkTarget", "linkHref", "metadataQualityDisplay", "favoriteTemplate", "size"], outputs: ["mdSelect"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "ngmodule", type: TranslateModule }], viewProviders: [provideIcons({ matOpenInNew })], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
31343
- }
31344
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RelatedRecordCardComponent, decorators: [{
31345
- type: Component,
31346
- args: [{ selector: 'gn-ui-related-record-card', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
31347
- InternalLinkCardComponent,
31348
- ThumbnailComponent,
31349
- RouterLink,
31350
- MatTooltipModule,
31351
- NgIcon,
31352
- TranslateModule,
31353
- ], standalone: true, viewProviders: [provideIcons({ matOpenInNew })], template: "<gn-ui-internal-link-card\n [linkHref]=\"linkHref\"\n [linkTarget]=\"'_blank'\"\n [record]=\"record\"\n [favoriteTemplate]=\"favoriteTemplate\"\n [metadataQualityDisplay]=\"metadataQualityDisplay\"\n [size]=\"size\"\n>\n</gn-ui-internal-link-card>\n" }]
31354
- }], ctorParameters: () => [], propDecorators: { linkHref: [{
31355
- type: Input
31356
- }], record: [{
31357
- type: Input
31358
- }], extraClass: [{
31359
- type: Input
31360
- }], favoriteTemplate: [{
31361
- type: Input
31362
- }], metadataQualityDisplay: [{
31363
- type: Input
31364
- }], size: [{
31365
- type: Input
31366
- }] } });
31367
-
31368
31600
  class TimeSincePipe {
31369
31601
  constructor(translate) {
31370
31602
  this.translate = translate;
@@ -31682,7 +31914,8 @@ class UiElementsModule {
31682
31914
  InternalLinkCardComponent,
31683
31915
  ServiceCapabilitiesComponent,
31684
31916
  KindBadgeComponent,
31685
- GeoDataBadgeComponent], exports: [ThumbnailComponent,
31917
+ GeoDataBadgeComponent,
31918
+ ScrollingModule], exports: [ThumbnailComponent,
31686
31919
  AvatarComponent,
31687
31920
  UserPreviewComponent,
31688
31921
  MarkdownParserComponent,
@@ -31715,7 +31948,8 @@ class UiElementsModule {
31715
31948
  InternalLinkCardComponent,
31716
31949
  ServiceCapabilitiesComponent,
31717
31950
  KindBadgeComponent,
31718
- GeoDataBadgeComponent] }); }
31951
+ GeoDataBadgeComponent,
31952
+ ScrollingModule] }); }
31719
31953
  }
31720
31954
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: UiElementsModule, decorators: [{
31721
31955
  type: NgModule,
@@ -31744,6 +31978,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31744
31978
  ServiceCapabilitiesComponent,
31745
31979
  KindBadgeComponent,
31746
31980
  GeoDataBadgeComponent,
31981
+ ScrollingModule,
31747
31982
  ],
31748
31983
  providers: [
31749
31984
  provideNgIconsConfig({
@@ -31833,48 +32068,63 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31833
32068
  type: Output
31834
32069
  }] } });
31835
32070
 
32071
+ marker('feature.catalog.attribute.type');
32072
+ marker('feature.catalog.attribute.name');
32073
+ marker('feature.catalog.attribute.code');
32074
+ marker('feature.catalog.attribute.definition');
32075
+ marker('feature.catalog.attribute.values');
31836
32076
  class FeatureCatalogListComponent {
31837
32077
  constructor() {
31838
- this.columns = [
31839
- {
31840
- key: 'type',
31841
- label: 'feature.catalog.attribute.type',
31842
- width: '19%',
31843
- },
31844
- {
31845
- key: 'name',
31846
- label: 'feature.catalog.attribute.name',
31847
- width: '32%',
31848
- },
31849
- {
31850
- key: 'code',
31851
- label: 'feature.catalog.attribute.code',
31852
- width: '24%',
31853
- },
31854
- {
31855
- key: 'title',
31856
- label: 'feature.catalog.attribute.description',
31857
- width: '25%',
31858
- },
32078
+ this.COLUMNS_DEFAULT = [
32079
+ { key: 'type', width: '17%' },
32080
+ { key: 'name', width: '32%' },
32081
+ { key: 'code', width: '17%' },
32082
+ { key: 'definition', width: 'minmax(0px, 1fr)' },
31859
32083
  ];
31860
- this.gridTemplateColumns = '';
32084
+ this.COLUMN_VALUES = {
32085
+ key: 'values',
32086
+ width: '73px',
32087
+ class: 'text-center',
32088
+ };
31861
32089
  }
31862
- ngOnInit() {
31863
- this.gridTemplateColumns = this.columns.map((col) => col.width).join(' ');
32090
+ getColumnsDefinition(attrs) {
32091
+ const hasValues = attrs.some((a) => a.values?.length > 0);
32092
+ return [...this.COLUMNS_DEFAULT, ...(hasValues ? [this.COLUMN_VALUES] : [])];
32093
+ }
32094
+ getGridTemplateColumns(attributes) {
32095
+ return this.getColumnsDefinition(attributes)
32096
+ .map((col) => col.width)
32097
+ .join(' ');
32098
+ }
32099
+ trackByColumn(_i, col) {
32100
+ return col.key;
31864
32101
  }
31865
32102
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureCatalogListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
31866
- 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"] }] }); }
32103
+ 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]" }] }); }
31867
32104
  }
31868
32105
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FeatureCatalogListComponent, decorators: [{
31869
32106
  type: Component,
31870
32107
  args: [{ selector: 'gn-ui-feature-catalog-list', standalone: true, imports: [
32108
+ ButtonComponent,
32109
+ CellPopinComponent,
31871
32110
  CommonModule,
31872
32111
  TranslateModule,
31873
32112
  ExpandablePanelComponent,
31874
32113
  TruncatedTextComponent,
31875
- ], 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" }]
32114
+ NgIconComponent,
32115
+ ScrollingModule,
32116
+ ], 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" }]
31876
32117
  }], propDecorators: { filteredFeatureCatalog: [{
31877
32118
  type: Input
32119
+ }], scrollContainer: [{
32120
+ type: ViewChild,
32121
+ args: ['scrollContainer']
32122
+ }], scrollable: [{
32123
+ type: ViewChild,
32124
+ args: [CdkScrollable, { static: true }]
32125
+ }], panelComponent: [{
32126
+ type: ViewChild,
32127
+ args: ['expanel', { read: ExpandablePanelComponent, static: true }]
31878
32128
  }] } });
31879
32129
 
31880
32130
  class ActionMenuComponent {
@@ -31909,7 +32159,7 @@ class ActionMenuComponent {
31909
32159
  this.cdr.markForCheck();
31910
32160
  }
31911
32161
  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 }); }
31912
- 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", 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=\"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 *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"] }] }); }
32162
+ 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"] }] }); }
31913
32163
  }
31914
32164
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ActionMenuComponent, decorators: [{
31915
32165
  type: Component,
@@ -31920,9 +32170,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31920
32170
  MatDialogModule,
31921
32171
  ConfirmationDialogComponent,
31922
32172
  TranslateModule,
31923
- ], 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=\"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 *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" }]
32173
+ ], 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" }]
31924
32174
  }], ctorParameters: () => [{ type: i1$a.MatDialog }, { type: i0.ChangeDetectorRef }], propDecorators: { canDuplicate: [{
31925
32175
  type: Input
32176
+ }], isDuplicating: [{
32177
+ type: Input
31926
32178
  }], canDelete: [{
31927
32179
  type: Input
31928
32180
  }], page: [{
@@ -32089,7 +32341,8 @@ class ResultsTableComponent {
32089
32341
  this.sortOrder = null;
32090
32342
  this.hasDraft = () => false;
32091
32343
  this.canDuplicate = () => true;
32092
- this.canDelete = () => true;
32344
+ this.canDelete = () => of(true);
32345
+ this.canEdit = () => of(true);
32093
32346
  this.isDraftPage = false;
32094
32347
  this.isDuplicating = false;
32095
32348
  // emits the column (field) as well as the order
@@ -32166,9 +32419,13 @@ class ResultsTableComponent {
32166
32419
  return getBadgeColor(format);
32167
32420
  }
32168
32421
  handleRecordClick(item) {
32169
- if ((item?.extras?.edit || this.isDraftPage) && item.kind === 'dataset') {
32170
- this.recordClick.emit(item);
32171
- }
32422
+ this.canEdit(item)
32423
+ .pipe(take$1(1))
32424
+ .subscribe((canEdit) => {
32425
+ if (canEdit) {
32426
+ this.recordClick.emit(item);
32427
+ }
32428
+ });
32172
32429
  }
32173
32430
  handleDuplicate(item) {
32174
32431
  this.duplicateRecord.emit(item);
@@ -32213,9 +32470,9 @@ class ResultsTableComponent {
32213
32470
  });
32214
32471
  }
32215
32472
  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 }); }
32216
- 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: [
32473
+ 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: [
32217
32474
  provideIcons({ iconoirUser, iconoirLock, iconoirTranslate, matMoreVert }),
32218
- ], 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 <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 [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 </div>\n <ng-template #template>\n <gn-ui-action-menu\n [canDuplicate]=\"canDuplicate(item) && !isDuplicating\"\n [canDelete]=\"canDelete(item)\"\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.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", "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"] }] }); }
32475
+ ], 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"] }] }); }
32219
32476
  }
32220
32477
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableComponent, decorators: [{
32221
32478
  type: Component,
@@ -32231,7 +32488,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
32231
32488
  CdkOverlayOrigin,
32232
32489
  ], providers: [
32233
32490
  provideIcons({ iconoirUser, iconoirLock, iconoirTranslate, matMoreVert }),
32234
- ], 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 <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 [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 </div>\n <ng-template #template>\n <gn-ui-action-menu\n [canDuplicate]=\"canDuplicate(item) && !isDuplicating\"\n [canDelete]=\"canDelete(item)\"\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"] }]
32491
+ ], 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"] }]
32235
32492
  }], ctorParameters: () => [{ type: i1$8.Overlay }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: DateService }, { type: i1$1.TranslateService }], propDecorators: { records: [{
32236
32493
  type: Input
32237
32494
  }], selectedRecordsIdentifiers: [{
@@ -32244,6 +32501,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
32244
32501
  type: Input
32245
32502
  }], canDelete: [{
32246
32503
  type: Input
32504
+ }], canEdit: [{
32505
+ type: Input
32247
32506
  }], isDraftPage: [{
32248
32507
  type: Input
32249
32508
  }], isDuplicating: [{
@@ -32492,9 +32751,10 @@ const FIELDS_SUMMARY = [
32492
32751
  'userSavedCount',
32493
32752
  'cl_topic',
32494
32753
  'cl_maintenanceAndUpdateFrequency',
32495
- 'MD_LegalConstraintsUseLimitationObject',
32754
+ 'MD_LegalConstraints*Object',
32496
32755
  'qualityScore',
32497
32756
  'allKeywords',
32757
+ 'recordLink',
32498
32758
  ];
32499
32759
  const FIELDS_BRIEF = [
32500
32760
  ...FIELDS_SUMMARY,
@@ -33317,11 +33577,11 @@ class FuzzySearchComponent {
33317
33577
  this.isSearchActive.emit(event);
33318
33578
  }
33319
33579
  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 }); }
33320
- 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 }); }
33580
+ 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 }); }
33321
33581
  }
33322
33582
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FuzzySearchComponent, decorators: [{
33323
33583
  type: Component,
33324
- 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" }]
33584
+ 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" }]
33325
33585
  }], ctorParameters: () => [{ type: SearchFacade }, { type: SearchService }, { type: RecordsRepositoryInterface }], propDecorators: { autocomplete: [{
33326
33586
  type: ViewChild,
33327
33587
  args: [AutocompleteComponent]
@@ -33331,6 +33591,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
33331
33591
  type: Input
33332
33592
  }], enterButton: [{
33333
33593
  type: Input
33594
+ }], placeholder: [{
33595
+ type: Input
33334
33596
  }], itemSelected: [{
33335
33597
  type: Output
33336
33598
  }], inputSubmitted: [{
@@ -34575,14 +34837,21 @@ class ResultsTableContainerComponent {
34575
34837
  this.recordsRepository = recordsRepository;
34576
34838
  this.notificationsService = notificationsService;
34577
34839
  this.translateService = translateService;
34578
- this.canDuplicate = () => true;
34579
- this.canDelete = () => true;
34580
34840
  this.recordClick = new EventEmitter();
34581
34841
  this.duplicateRecord = new EventEmitter();
34582
34842
  this.subscription = new Subscription();
34583
34843
  this.selectedRecords$ = this.selectionService.selectedRecordsIdentifiers$;
34584
34844
  this.sortBy$ = this.searchFacade.sortBy$;
34585
34845
  this.hasDraft = (record) => this.recordsRepository.recordHasDraft(record.uniqueIdentifier);
34846
+ this.canDuplicate = (record) => {
34847
+ return this.recordsRepository.canDuplicate(record);
34848
+ };
34849
+ this.canDelete = (record) => {
34850
+ return this.recordsRepository.canDelete(record);
34851
+ };
34852
+ this.canEdit = (record) => {
34853
+ return this.recordsRepository.canEditIndexedRecord(record);
34854
+ };
34586
34855
  }
34587
34856
  handleRecordClick(item) {
34588
34857
  this.recordClick.emit(item);
@@ -34627,16 +34896,12 @@ class ResultsTableContainerComponent {
34627
34896
  this.subscription.unsubscribe();
34628
34897
  }
34629
34898
  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 }); }
34630
- 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"] }] }); }
34899
+ 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"] }] }); }
34631
34900
  }
34632
34901
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ResultsTableContainerComponent, decorators: [{
34633
34902
  type: Component,
34634
- 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" }]
34635
- }], ctorParameters: () => [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }, { type: RecordsRepositoryInterface }, { type: NotificationsService }, { type: i1$1.TranslateService }], propDecorators: { canDuplicate: [{
34636
- type: Input
34637
- }], canDelete: [{
34638
- type: Input
34639
- }], isDuplicating: [{
34903
+ 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" }]
34904
+ }], ctorParameters: () => [{ type: SearchFacade }, { type: SearchService }, { type: SelectionService }, { type: RecordsRepositoryInterface }, { type: NotificationsService }, { type: i1$1.TranslateService }], propDecorators: { isDuplicating: [{
34640
34905
  type: Input
34641
34906
  }], recordClick: [{
34642
34907
  type: Output
@@ -36273,7 +36538,7 @@ class AddLayerFromCatalogComponent {
36273
36538
  ADDLAYER: new ResultsLayoutConfigItem(AddLayerRecordPreviewComponent, 'py-2', '', 'flex flex-col divide-y divide-y-grey-50'),
36274
36539
  },
36275
36540
  },
36276
- ], 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 }); }
36541
+ ], 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 }); }
36277
36542
  }
36278
36543
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AddLayerFromCatalogComponent, decorators: [{
36279
36544
  type: Component,
@@ -38136,7 +38401,7 @@ class DataTableComponent {
38136
38401
  }
38137
38402
  }
38138
38403
  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 }); }
38139
- 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 }); }
38404
+ 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 }); }
38140
38405
  }
38141
38406
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataTableComponent, decorators: [{
38142
38407
  type: Component,
@@ -39845,15 +40110,22 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
39845
40110
  marker('map.dropdown.placeholder');
39846
40111
  marker('wfs.feature.limit');
39847
40112
  marker('dataset.error.restrictedAccess');
40113
+ marker('map.select.style');
39848
40114
  class MapViewComponent {
39849
40115
  set exceedsLimit(value) {
39850
40116
  this.excludeWfs$.next(value);
39851
40117
  }
40118
+ selectLinkToDisplay(i) {
40119
+ this.selectedLinkIndex$.next(i);
40120
+ }
40121
+ selectStyleToDisplay(i) {
40122
+ this.selectedStyleIndex$.next(i);
40123
+ }
39852
40124
  toggleLegend() {
39853
40125
  this.showLegend = !this.showLegend;
39854
40126
  }
39855
- onLegendStatusChange(status) {
39856
- this.legendExists = status;
40127
+ onLegendStatusChange(v) {
40128
+ this.legendExists = v;
39857
40129
  }
39858
40130
  constructor(mdViewFacade, mapUtils, dataService, changeRef, translateService) {
39859
40131
  this.mdViewFacade = mdViewFacade;
@@ -39866,20 +40138,15 @@ class MapViewComponent {
39866
40138
  this.hidePreview = false;
39867
40139
  this.showLegend = true;
39868
40140
  this.legendExists = false;
40141
+ this.loading = false;
40142
+ this.error = null;
39869
40143
  this.compatibleMapLinks$ = combineLatest([
39870
40144
  this.mdViewFacade.mapApiLinks$,
39871
40145
  this.mdViewFacade.geoDataLinksWithGeometry$,
39872
- ]).pipe(switchMap$1(async ([mapApiLinks, geoDataLinksWithGeometry]) => {
39873
- // looking for TMS links to process
39874
- let processedMapApiLinks = await Promise.all(mapApiLinks.map((link) => {
39875
- if (link.type === 'service' && link.accessServiceProtocol === 'tms') {
39876
- return this.dataService.getGeodataLinksFromTms(link);
39877
- }
39878
- return link;
39879
- }));
39880
- processedMapApiLinks = processedMapApiLinks.flat();
39881
- return [...processedMapApiLinks, ...geoDataLinksWithGeometry];
39882
- }), shareReplay(1));
40146
+ ]).pipe(map$1(([mapApiLinks, geoDataLinksWithGeometry]) => [
40147
+ ...mapApiLinks,
40148
+ ...geoDataLinksWithGeometry,
40149
+ ]), shareReplay(1));
39883
40150
  this.dropdownChoices$ = this.compatibleMapLinks$.pipe(map$1((links) => links.length
39884
40151
  ? links.map((link, index) => ({
39885
40152
  label: getLinkLabel(link),
@@ -39887,12 +40154,39 @@ class MapViewComponent {
39887
40154
  }))
39888
40155
  : [{ label: 'map.dropdown.placeholder', value: 0 }]));
39889
40156
  this.selectedLinkIndex$ = new BehaviorSubject(0);
39890
- this.loading = false;
39891
- this.error = null;
39892
- this.selectedLink$ = combineLatest([
40157
+ this.selectedStyleIndex$ = new BehaviorSubject(0);
40158
+ this.selectedSourceLink$ = combineLatest([
39893
40159
  this.compatibleMapLinks$,
39894
40160
  this.selectedLinkIndex$.pipe(distinctUntilChanged()),
39895
- ]).pipe(map$1(([links, index]) => links[index]));
40161
+ ]).pipe(map$1(([links, idx]) => links[idx]), shareReplay(1));
40162
+ this.styleLinks$ = this.selectedSourceLink$.pipe(switchMap$1((src) => {
40163
+ if (src &&
40164
+ src.type === 'service' &&
40165
+ src.accessServiceProtocol === 'tms') {
40166
+ return from(this.dataService.getGeodataLinksFromTms(src, false)).pipe(
40167
+ // We need to check for maplibre-style links because when a TMS service has no styles,
40168
+ // getGeodataLinksFromTms returns the original TMS link, which isn't a maplibre-style link
40169
+ map$1((links) => links?.filter((link) => link.type === 'service' &&
40170
+ link.accessServiceProtocol === 'maplibre-style') || []));
40171
+ }
40172
+ return of([]);
40173
+ }), tap$1(() => this.selectedStyleIndex$.next(0)), shareReplay(1));
40174
+ this.styleDropdownChoices$ = this.styleLinks$.pipe(map$1((links) => links.length
40175
+ ? links.map((link, index) => ({
40176
+ label: getLinkLabel(link),
40177
+ value: index,
40178
+ }))
40179
+ : [
40180
+ {
40181
+ label: '\u00A0\u00A0\u00A0\u00A0',
40182
+ value: 0,
40183
+ },
40184
+ ]));
40185
+ this.selectedLink$ = combineLatest([
40186
+ this.selectedSourceLink$,
40187
+ this.styleLinks$,
40188
+ this.selectedStyleIndex$.pipe(distinctUntilChanged()),
40189
+ ]).pipe(map$1(([src, styles, styleIdx]) => (styles.length ? styles[styleIdx] : src)), shareReplay(1));
39896
40190
  this.currentLayers$ = combineLatest([this.selectedLink$, this.excludeWfs$]).pipe(switchMap$1(([link, excludeWfs]) => {
39897
40191
  if (!link) {
39898
40192
  return of([]);
@@ -40010,9 +40304,6 @@ class MapViewComponent {
40010
40304
  }
40011
40305
  return throwError(() => 'protocol not supported');
40012
40306
  }
40013
- selectLinkToDisplay(link) {
40014
- this.selectedLinkIndex$.next(link);
40015
- }
40016
40307
  handleError(error) {
40017
40308
  if (error instanceof FetchError) {
40018
40309
  this.error = this.translateService.instant(`dataset.error.${error.type}`, {
@@ -40032,7 +40323,7 @@ class MapViewComponent {
40032
40323
  this.changeRef.detectChanges();
40033
40324
  }
40034
40325
  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 }); }
40035
- 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 }); }
40326
+ 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 }); }
40036
40327
  }
40037
40328
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MapViewComponent, decorators: [{
40038
40329
  type: Component,
@@ -40048,7 +40339,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
40048
40339
  ExternalViewerButtonComponent,
40049
40340
  ButtonComponent,
40050
40341
  MapLegendComponent,
40051
- ], 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" }]
40342
+ ], 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" }]
40052
40343
  }], ctorParameters: () => [{ type: MdViewFacade }, { type: MapUtilsService }, { type: DataService }, { type: i0.ChangeDetectorRef }, { type: i1$1.TranslateService }], propDecorators: { exceedsLimit: [{
40053
40344
  type: Input
40054
40345
  }], displaySource: [{
@@ -43177,6 +43468,7 @@ class MultilingualPanelComponent {
43177
43468
  this.formLanguage = lang;
43178
43469
  this.facade.updateRecordField('defaultLanguage', lang);
43179
43470
  this.facade.updateRecordField('otherLanguages', this.selectedLanguages.filter((lang) => lang !== this.formLanguage));
43471
+ this.closeActionMenu();
43180
43472
  }
43181
43473
  confirmDeleteAction(lang) {
43182
43474
  const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
@@ -43277,7 +43569,7 @@ class MultilingualPanelComponent {
43277
43569
  provideNgIconsConfig({
43278
43570
  size: '1.25em',
43279
43571
  }),
43280
- ], 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(item)\"\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", "canDelete", "page"], outputs: ["duplicate", "delete", "closeActionMenu", "rollback", "switch"] }] }); }
43572
+ ], 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"] }] }); }
43281
43573
  }
43282
43574
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MultilingualPanelComponent, decorators: [{
43283
43575
  type: Component,
@@ -43298,7 +43590,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
43298
43590
  provideNgIconsConfig({
43299
43591
  size: '1.25em',
43300
43592
  }),
43301
- ], 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(item)\"\n >\n </gn-ui-action-menu>\n </ng-template>\n </div>\n </gn-ui-button>\n </div>\n</div>\n" }]
43593
+ ], 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" }]
43302
43594
  }], 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: [{
43303
43595
  type: Input
43304
43596
  }], actionMenuButtons: [{
@@ -43707,7 +43999,7 @@ class DefaultRouterModule {
43707
43999
  };
43708
44000
  }
43709
44001
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DefaultRouterModule, deps: [{ token: RouterService }], target: i0.ɵɵFactoryTarget.NgModule }); }
43710
- 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] }); }
44002
+ 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] }); }
43711
44003
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DefaultRouterModule, providers: [
43712
44004
  RouterFacade,
43713
44005
  {
@@ -43750,5 +44042,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
43750
44042
  * Generated bundle index. Do not edit.
43751
44043
  */
43752
44044
 
43753
- export { ADD_RESULTS, ADD_SEARCH, AbstractAction, AbstractSearchField, ActionMenuComponent, AddLayerFromCatalogComponent, AddLayerRecordPreviewComponent, AddResults, AddSearch, AnchorLinkDirective, ApiCardComponent, ApplicationBannerComponent, AuthService, AutocompleteComponent, AvailableServicesField, AvatarComponent, AvatarServiceInterface, BASEMAP_LAYERS, BadgeComponent, BaseConverter, BaseFileReader, BaseReader, BlockListComponent, ButtonComponent, CLEAR_ERROR, CLEAR_RESULTS, CarouselComponent, CatalogTitleComponent, ChartComponent, ChartViewComponent, CheckToggleComponent, CheckboxComponent, ClearError, ClearResults, ColorScaleComponent, ConfirmationDialogComponent, ContentGhostComponent, CopyTextButtonComponent, DEFAULT_GN4_LOGIN_URL, DEFAULT_GN4_LOGOUT_URL, DEFAULT_GN4_SETTINGS_URL, DEFAULT_LANG, DEFAULT_PAGE_SIZE, DEFAULT_RESULTS_LAYOUT_CONFIG, DEFAULT_SEARCH_KEY, DO_NOT_USE_DEFAULT_BASEMAP, DataService, DataTableComponent, DataViewComponent, DataViewPermalinkComponent, DataViewShareComponent, DataViewWebComponentComponent, DatePickerComponent, DateRangeDropdownComponent, DateRangePickerComponent, DateRangeSearchField, DateService, DcatApConverter, DefaultRouterModule, DownloadItemComponent, DownloadsListComponent, DragAndDropFileInputComponent, DropdownMultiselectComponent, DropdownSelectorComponent, EDITOR_FEATURE_KEY, ES_QUERY_FIELDS_PRIORITY, ES_RESOURCES_VALUES, ES_SOURCE_SUMMARY, EXTERNAL_VIEWER_OPEN_NEW_TAB, EXTERNAL_VIEWER_URL_TEMPLATE, EditableLabelDirective, EditorFacade, EditorService, ElasticsearchService, EmbeddedTranslateLoader, ErrorComponent, ErrorType, ExpandablePanelButtonComponent, ExpandablePanelComponent, ExternalViewerButtonComponent, FIELDS_BRIEF, FIELDS_SUMMARY, FILTER_GEOMETRY, FILTER_SUMMARY_IGNORE_LIST, FORMATS, FacetBlockComponent, FacetBlockStubComponent, FacetItemComponent, FacetItemStubComponent, FacetListComponent, FacetsContainerComponent, FacetsModule, FavoriteStarComponent, FavoritesService, FeatureAuthModule, FeatureCatalogListComponent, FeatureCatalogModule, FeatureDetailComponent, FeatureEditorModule, FeatureMapModule, FeatureNotificationsModule, FeatureRecordModule, FeatureSearchModule, FetchError, FieldsService, FigureComponent, FigureContainerComponent, FileInputComponent, FileTranslateLoader, FilesDropDirective, FilterDropdownComponent, FormFieldArrayComponent, FormFieldComponent, FormFieldDateComponent, FormFieldFileComponent, FormFieldKeywordsComponent, FormFieldLicenseComponent, FormFieldObjectComponent, FormFieldRichComponent, FormFieldSimpleComponent, FormFieldSpatialExtentComponent, FormFieldTemporalExtentsComponent, FormFieldWrapperComponent, FullTextSearchField, FuzzySearchComponent, GEONETWORK_UI_TAG_NAME, GEONETWORK_UI_VERSION, GeoDataBadgeComponent, GeoTableViewComponent, GeocodingComponent, GeojsonReader, Gn4Converter, Gn4PlatformMapper, Gn4PlatformService, Gn4Repository, Gn4SettingsService, GpfApiDlComponent, GravatarService, HttpLoaderFactory, I18nInterceptor, ImageFallbackDirective, ImageInputComponent, ImageOverlayPreviewComponent, ImportRecordComponent, InlineFilterComponent, InteractiveTableColumnComponent, InteractiveTableComponent, InternalLinkCardComponent, IsSpatialSearchField, Iso191153Converter, Iso19139Converter, KindBadgeComponent, LANGUAGES_LIST, LANGUAGE_NAMES, LANGUAGE_STORAGE_KEY, LANG_2_TO_3_MAPPER, LANG_3_TO_2_MAPPER, LOGIN_URL, LOGOUT_URL, LONLAT_CRS_CODES, LangService, LanguageSwitcherComponent, LayersPanelComponent, LicenseSearchField, LinkCardComponent, LinkClassifierService, LinkUsage, LoadingMaskComponent, LogService, MAP_FEATURE_KEY, MAP_VIEW_CONSTRAINTS, METADATA_LANGUAGE, MY_FORMATS, MapContainerComponent, MapFacade, MapLegendComponent, MapStateContainerComponent, MapStyleService, MapUtilsService, MapViewComponent, MarkdownEditorComponent, MarkdownParserComponent, MaxLinesComponent, mdview_actions as MdViewActions, MdViewFacade, MetadataCatalogComponent, MetadataContactComponent, MetadataInfoComponent, MetadataLinkType, MetadataMapperContext, MetadataQualityComponent, MetadataQualityItemComponent, ModalDialogComponent, MultilingualPanelComponent, MultilingualSearchField, MyOrgService, NAMESPACES, NOT_APPLICABLE_CONSTRAINT, NOT_KNOWN_CONSTRAINT, NotificationComponent, NotificationsContainerComponent, NotificationsService, ORGANIZATIONS_STRATEGY, ORGANIZATION_PAGE_URL_TOKEN, ORGANIZATION_URL_TOKEN, OrganisationPreviewComponent, OrganisationsComponent, OrganisationsFilterComponent, OrganisationsResultComponent, OrganizationSearchField, OrganizationsFromGroupsService, OrganizationsFromMetadataService, OwnerSearchField, PAGINATE, PARSE_DELIMITER, PATCH_RESULTS_AGGREGATIONS, PROXY_PATH, Paginate, PaginationButtonsComponent, PaginationComponent, PaginationDotsComponent, PatchResultsAggregations, PopoverComponent, PopupAlertComponent, PossibleResourceTypes, PossibleResourceTypesDefinition, PreviousNextButtonsComponent, ProgressBarComponent, ProxyService, QUERY_FIELDS, RECORD_DATASET_URL_TOKEN, RECORD_REUSE_URL_TOKEN, RECORD_SERVICE_URL_TOKEN, REQUEST_MORE_ON_AGGREGATION, REQUEST_MORE_RESULTS, REQUEST_NEW_RESULTS, RESULTS_LAYOUT_CONFIG, ROUTER_CONFIG, ROUTER_ROUTE_DATASET, ROUTER_ROUTE_ORGANIZATION, ROUTER_ROUTE_REUSE, ROUTER_ROUTE_SEARCH, ROUTER_ROUTE_SERVICE, ROUTER_STATE_KEY, ROUTE_PARAMS, RecordApiFormComponent, RecordFormComponent, RecordKindField, RecordMetaComponent, RecordMetricComponent, RecordPreviewCardComponent, RecordPreviewComponent, RecordPreviewFeedComponent, RecordPreviewListComponent, RecordPreviewRowComponent, RecordPreviewTextComponent, RecordPreviewTitleComponent, RecordsMetricsComponent, RecordsService, RelatedRecordCardComponent, RequestMoreOnAggregation, RequestMoreResults, RequestNewResults, ResourceTypeLegacyField, ResultsHitsContainerComponent, ResultsHitsNumberComponent, ResultsHitsSearchKindComponent, ResultsLayoutComponent, ResultsLayoutConfigItem, ResultsListComponent, ResultsListContainerComponent, ResultsListItemComponent, ResultsTableComponent, ResultsTableContainerComponent, RouterEffects, RouterFacade, RouterService, SEARCH_FEATURE_KEY, SETTINGS_URL, SET_CONFIG_AGGREGATIONS, SET_CONFIG_FILTERS, SET_CONFIG_REQUEST_FIELDS, SET_ERROR, SET_FAVORITES_ONLY, SET_FILTERS, SET_INCLUDE_ON_AGGREGATION, SET_PAGE_SIZE, SET_RESULTS_AGGREGATIONS, SET_RESULTS_HITS, SET_RESULTS_LAYOUT, SET_SEARCH, SET_SORT_BY, SET_SPATIAL_FILTER_ENABLED, SUPPORTED_LANGUAGES, SearchEffects, SearchFacade, SearchFeatureCatalogComponent, SearchFiltersSummaryComponent, SearchFiltersSummaryItemComponent, SearchInputComponent, SearchRouterContainerDirective, SearchService, SearchStateContainerDirective, SelectionService, ServiceCapabilitiesComponent, SetConfigAggregations, SetConfigFilters, SetConfigRequestFields, SetError, SetFavoritesOnly, SetFilters, SetIncludeOnAggregation, SetPageSize, SetResultsAggregations, SetResultsHits, SetResultsLayout, SetSearch, SetSortBy, SetSpatialFilterEnabled, SimpleSearchField, SiteTitleComponent, SortByComponent, SortableListComponent, SourceLabelComponent, SourcesService, SpatialExtentComponent, SpinningLoaderComponent, StarToggleComponent, StickyHeaderComponent, SupportedTypes, SwitchToggleComponent, THUMBNAIL_PLACEHOLDER, TRANSLATE_DEFAULT_CONFIG, TRANSLATE_WITH_OVERRIDES_CONFIG, TableViewComponent, TextAreaComponent, TextInputComponent, ThemeService, ThumbnailComponent, TranslatedSearchField, TruncatedTextComponent, UPDATE_CONFIG_AGGREGATIONS, UPDATE_FILTERS, UPDATE_REQUEST_AGGREGATION_TERM, UiDatavizModule, UiElementsModule, FacetsModule$1 as UiFacetsModule, UiInputsModule, UiLayoutModule, UiSearchModule, UiWidgetsModule, UpdateConfigAggregations, UpdateFilters, UrlInputComponent, UserFeedbackItemComponent, UserPreviewComponent, UserSearchField, UtilI18nModule, UtilSharedModule, VECTOR_STYLE_DEFAULT, ViewportIntersectorComponent, WEB_COMPONENT_EMBEDDER_URL, WizardComponent, WizardFieldComponent, WizardFieldType, WizardService, WizardSummarizeComponent, XmlParseError, _reset, allChildrenElement, appConfigWithTranslationFixture, appendChildTree, appendChildren, assertValidXml, blockModelFixture, bytesToMegabytes, canEditRecord, checkFileFormat, clearSelectedFeatures, createChild, createDocument, createElement, createFuzzyFilter, createNestedChild, createNestedElement, currentPage, defaultMapStyleFixture, defaultMapStyleHlFixture, downgradeImage, downsizeImage, draftSaveSuccess, dragPanCondition, dropEmptyTranslations, editorReducer, emptyBlockModelFixture, findChildElement, findChildOrCreate, findChildrenElement, findConverterForDocument, findNestedChildOrCreate, findNestedElement, findNestedElements, findParent, firstChildElement, formatDate, formatUserInfo, getArrayItem, getAsArray, getAsUrl, getBadgeColor, getCustomTranslations, getError, getFavoritesOnly, getFileFormat, getFileFormatFromServiceOutput, getFirstValue, getFormatPriority, getGeometryFromGeoJSON, getGlobalConfig, getJsonDataItemsProxy, getLangFromBrowser, getLayers, getLinkLabel, getLinkPriority, getMapContext, getMapContextLayerFromConfig, getMapState, getMetadataQualityConfig, getMimeTypeForFormat, getNamespace, getOptionalMapConfig, getOptionalSearchConfig, getPageSize, getResourceType, getReuseType, getRootElement, getSearchConfigAggregations, getSearchFilters, getSearchResults, getSearchResultsAggregations, getSearchResultsHits, getSearchResultsLayout, getSearchResultsLoading, getSearchSortBy, getSearchState, getSearchStateSearch, getSelectedFeatures, getSpatialFilterEnabled, getTemporalRangeUnion, getThemeConfig, hasRecordChangedSinceDraft, hasRecordChangedSinceDraftSuccess, initSearch, initialEditorState, initialMapState, initialState, isConfigLoaded, isDateRange, isFormatInQueryParam, isPublished, itemModelFixture, kindToCodeListValue, loadAppConfig, malformedConfigFixture, mapConfigFixture, mapContact, mapKeywords, mapLogo, mapOrganization, mapReducer, markRecordAsChanged, matchesNoApplicableConstraint, matchesNoKnownConstraint, megabytesToBytes, mimeTypeToFormat, minimalAppConfigFixture, missingMandatoryConfigFixture, mouseWheelZoomCondition, noDuplicateFileName, okAppConfigFixture, openDataset, openRecord, parse, parseXmlString, placeholder, prioritizePageScroll, propagateToDocumentOnly, provideGn4, provideRepositoryUrl, readAttribute, readDataset, readDatasetHeaders, readText, reducer$2 as reducer, reducerSearch, removeAllChildren, removeChildren, removeChildrenByName, removeSearchParams, removeWhitespace, renameElements, saveRecord, saveRecordFailure, saveRecordSuccess, selectCanEditRecord, selectCurrentPage, selectEditorConfig, selectEditorState, selectFallback, selectFallbackFields, selectField, selectHasRecordChanged, selectIsPublished, selectRecord, selectRecordChangedSinceSave, selectRecordSaveError, selectRecordSaving, selectRecordSections, selectRecordSource, selectTranslatedField, selectTranslatedValue, setContext, setCurrentPage, setFieldVisibility, setSelectedFeatures, setTextContent, someHabTableItemFixture, sortByFromString, sortByToString, sortByToStrings, stripHtml, stripNamespace, tableItemsFixture, toDate, totalPages, undoRecordDraft, unrecognizedKeysConfigFixture, updateRecordField, wmsLayerFlatten, writeAttribute, wrongLanguageCodeConfigFixture, xmlToString };
44045
+ 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, 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 };
43754
44046
  //# sourceMappingURL=geonetwork-ui.mjs.map