geonetwork-ui 2.3.0-dev.f54cc11e → 2.3.0-dev.ff2a9db7

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 (160) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +2 -2
  2. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +2 -2
  3. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +9 -7
  4. package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +1 -1
  5. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +35 -2
  6. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.mjs +1 -1
  7. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.mjs +104 -0
  8. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +8 -3
  9. package/esm2022/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.mjs +1 -1
  10. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +8 -1
  11. package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +73 -20
  12. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +1 -1
  13. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +1 -1
  14. package/esm2022/libs/feature/map/src/lib/map-context/map-context.model.mjs +1 -1
  15. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +29 -8
  16. package/esm2022/libs/feature/record/src/lib/data-view/data-view.component.mjs +1 -1
  17. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +4 -3
  18. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +1 -1
  19. package/esm2022/libs/feature/search/src/index.mjs +2 -1
  20. package/esm2022/libs/feature/search/src/lib/results-layout/results-layout.component.mjs +1 -1
  21. package/esm2022/libs/feature/search/src/lib/sort-by/sort-by.component.mjs +1 -1
  22. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +1 -1
  23. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +1 -1
  24. package/esm2022/libs/ui/catalog/src/lib/organisations-filter/organisations-filter.component.mjs +1 -1
  25. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -2
  26. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +2 -2
  27. package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +16 -3
  28. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +99 -36
  29. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +1 -6
  30. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.mjs +3 -5
  31. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  32. package/esm2022/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.mjs +4 -3
  33. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +5 -3
  34. package/esm2022/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +29 -0
  35. package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +5 -3
  36. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +6 -5
  37. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  38. package/esm2022/libs/ui/layout/src/lib/block-list/block-list.component.mjs +76 -0
  39. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +42 -18
  40. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +3 -8
  41. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -2
  42. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +22 -1
  43. package/esm2022/translations/de.json +11 -14
  44. package/esm2022/translations/en.json +11 -14
  45. package/esm2022/translations/es.json +11 -14
  46. package/esm2022/translations/fr.json +11 -14
  47. package/esm2022/translations/it.json +11 -14
  48. package/esm2022/translations/nl.json +11 -14
  49. package/esm2022/translations/pt.json +11 -14
  50. package/fesm2022/geonetwork-ui.mjs +642 -239
  51. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  52. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  53. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  54. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +3 -1
  55. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  56. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.d.ts +21 -0
  57. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.d.ts.map +1 -0
  58. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +1 -0
  59. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  60. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  61. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts +10 -5
  62. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts.map +1 -1
  63. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts +1 -0
  64. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts.map +1 -1
  65. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  66. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  67. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  68. package/libs/feature/search/src/index.d.ts +1 -0
  69. package/libs/feature/search/src/index.d.ts.map +1 -1
  70. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts +3 -3
  71. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  72. package/libs/ui/elements/src/lib/api-card/api-card.component.d.ts.map +1 -1
  73. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  74. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +3 -1
  75. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
  76. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +24 -4
  77. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  78. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +29 -30
  79. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  80. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts +1 -2
  81. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts.map +1 -1
  82. package/libs/ui/inputs/src/index.d.ts +1 -0
  83. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  84. package/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.d.ts +1 -1
  85. package/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.d.ts.map +1 -1
  86. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts +2 -1
  87. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
  88. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts +12 -0
  89. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts.map +1 -0
  90. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts +2 -1
  91. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts.map +1 -1
  92. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +27 -27
  93. package/libs/ui/layout/src/index.d.ts +1 -0
  94. package/libs/ui/layout/src/index.d.ts.map +1 -1
  95. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts +25 -0
  96. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts.map +1 -0
  97. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts +13 -6
  98. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts.map +1 -1
  99. package/libs/ui/layout/src/lib/ui-layout.module.d.ts +4 -5
  100. package/libs/ui/layout/src/lib/ui-layout.module.d.ts.map +1 -1
  101. package/libs/util/shared/src/lib/links/link-utils.d.ts +18 -0
  102. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  103. package/package.json +2 -2
  104. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +1 -1
  105. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +1 -4
  106. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +16 -10
  107. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +8 -0
  108. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +51 -1
  109. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.css +0 -0
  110. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.html +14 -0
  111. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.ts +143 -0
  112. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +5 -0
  113. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +5 -0
  114. package/src/libs/feature/editor/src/lib/fields.config.ts +7 -0
  115. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.css +7 -0
  116. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.html +32 -18
  117. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.ts +72 -17
  118. package/src/libs/feature/map/src/lib/map-context/map-context.model.ts +1 -0
  119. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +26 -8
  120. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +2 -1
  121. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +0 -1
  122. package/src/libs/feature/search/src/index.ts +1 -0
  123. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +2 -2
  124. package/src/libs/ui/elements/src/lib/api-card/api-card.component.ts +2 -1
  125. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +1 -1
  126. package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +38 -20
  127. package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +12 -0
  128. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +26 -10
  129. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +126 -30
  130. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +0 -2
  131. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.html +1 -1
  132. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.ts +0 -1
  133. package/src/libs/ui/inputs/src/index.ts +1 -0
  134. package/src/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.ts +3 -0
  135. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.html +1 -0
  136. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +1 -0
  137. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.css +6 -0
  138. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.html +26 -0
  139. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.ts +32 -0
  140. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +1 -0
  141. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +1 -0
  142. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +1 -1
  143. package/src/libs/ui/layout/src/index.ts +1 -0
  144. package/src/libs/ui/layout/src/lib/block-list/block-list.component.css +23 -0
  145. package/src/libs/ui/layout/src/lib/block-list/block-list.component.html +20 -0
  146. package/src/libs/ui/layout/src/lib/block-list/block-list.component.ts +84 -0
  147. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +8 -4
  148. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +4 -4
  149. package/src/libs/ui/layout/src/lib/carousel/carousel.component.ts +45 -15
  150. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +0 -2
  151. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +1 -1
  152. package/src/libs/util/shared/src/lib/links/link-utils.ts +21 -0
  153. package/translations/de.json +11 -14
  154. package/translations/en.json +11 -14
  155. package/translations/es.json +11 -14
  156. package/translations/fr.json +11 -14
  157. package/translations/it.json +11 -14
  158. package/translations/nl.json +11 -14
  159. package/translations/pt.json +11 -14
  160. package/translations/sk.json +11 -14
@@ -30,7 +30,7 @@
30
30
  ></gn-ui-user-feedback-item>
31
31
  </div>
32
32
 
33
- <div *ngIf="isActiveUserEditor" class="mt-2 flex flex-col">
33
+ <div *ngIf="activeUser" class="mt-2 flex flex-col">
34
34
  <hr class="-mx-4 my-4" />
35
35
  <div
36
36
  id="new-comment-buttons"
@@ -21,7 +21,6 @@ import { UserModel } from '../../../../../../libs/common/domain/src/lib/model/us
21
21
  export class UserFeedbackItemComponent implements OnInit {
22
22
  @Input() userFeedbackParent: UserFeedbackViewModel
23
23
  @Input() userFeedBacksAnswers: UserFeedbackViewModel[]
24
- @Input() isActiveUserEditor: boolean
25
24
  @Input() activeUser: UserModel
26
25
  @Input() isLastComment: boolean
27
26
  @Input() isAddUserFeedbackLoading: boolean
@@ -19,3 +19,4 @@ export * from './lib/text-area/text-area.component'
19
19
  export * from './lib/text-input/text-input.component'
20
20
  export * from './lib/ui-inputs.module'
21
21
  export * from './lib/viewport-intersector/viewport-intersector.component'
22
+ export * from './lib/previous-next-buttons/previous-next-buttons.component'
@@ -5,12 +5,15 @@ import {
5
5
  Input,
6
6
  Output,
7
7
  } from '@angular/core'
8
+ import { FormsModule } from '@angular/forms'
8
9
 
9
10
  @Component({
10
11
  selector: 'gn-ui-check-toggle',
11
12
  templateUrl: './check-toggle.component.html',
12
13
  styleUrls: ['./check-toggle.component.css'],
13
14
  changeDetection: ChangeDetectionStrategy.OnPush,
15
+ standalone: true,
16
+ imports: [FormsModule],
14
17
  })
15
18
  export class CheckToggleComponent {
16
19
  @Input() title: string
@@ -18,6 +18,7 @@
18
18
  cdkOverlayOrigin
19
19
  #overlayOrigin="cdkOverlayOrigin"
20
20
  (keydown)="handleTriggerKeydown($event)"
21
+ [disabled]="disabled"
21
22
  >
22
23
  <div class="grow font-medium truncate py-1 mr-2 text-left">
23
24
  {{ getChoiceLabel() | translate }}
@@ -48,6 +48,7 @@ export class DropdownSelectorComponent implements OnInit {
48
48
  @Input() maxRows: number
49
49
  @Input() extraBtnClass = ''
50
50
  @Input() minWidth = ''
51
+ @Input() disabled: boolean
51
52
  @Output() selectValue = new EventEmitter<DropdownChoice['value']>()
52
53
  @ViewChild('overlayOrigin') overlayOrigin: CdkOverlayOrigin
53
54
  @ViewChild(CdkConnectedOverlay) overlay: CdkConnectedOverlay
@@ -0,0 +1,6 @@
1
+ :host {
2
+ --gn-ui-button-rounded: 100%;
3
+ --gn-ui-button-width: 8px;
4
+ --gn-ui-button-height: 8px;
5
+ --gn-ui-button-padding: 12px;
6
+ }
@@ -0,0 +1,26 @@
1
+ <div class="flex flex-row gap-x-4 items-center">
2
+ <gn-ui-button
3
+ data-test="previousButton"
4
+ [type]="isFirst ? 'default' : 'outline'"
5
+ [disabled]="isFirst"
6
+ (buttonClick)="previousButtonClicked()"
7
+ >
8
+ <mat-icon
9
+ class="material-symbols-outlined text-[14px] text-center pt-[5px]"
10
+ >
11
+ arrow_back
12
+ </mat-icon>
13
+ </gn-ui-button>
14
+ <gn-ui-button
15
+ data-test="nextButton"
16
+ [type]="isLast ? 'default' : 'outline'"
17
+ [disabled]="isLast"
18
+ (buttonClick)="nextButtonClicked()"
19
+ >
20
+ <mat-icon
21
+ class="material-symbols-outlined text-[14px] text-center pt-[5px]"
22
+ >
23
+ arrow_forward
24
+ </mat-icon>
25
+ </gn-ui-button>
26
+ </div>
@@ -0,0 +1,32 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ EventEmitter,
5
+ Input,
6
+ Output,
7
+ } from '@angular/core'
8
+ import { ButtonComponent } from '../button/button.component'
9
+ import { MatIconModule } from '@angular/material/icon'
10
+
11
+ @Component({
12
+ selector: 'gn-ui-previous-next-buttons',
13
+ templateUrl: './previous-next-buttons.component.html',
14
+ styleUrls: ['./previous-next-buttons.component.css'],
15
+ changeDetection: ChangeDetectionStrategy.OnPush,
16
+ standalone: true,
17
+ imports: [ButtonComponent, MatIconModule],
18
+ })
19
+ export class PreviousNextButtonsComponent {
20
+ @Input() isFirst: boolean
21
+ @Input() isLast: boolean
22
+
23
+ @Output() directionButtonClicked: EventEmitter<string> = new EventEmitter()
24
+
25
+ previousButtonClicked() {
26
+ this.directionButtonClicked.next('previous')
27
+ }
28
+
29
+ nextButtonClicked() {
30
+ this.directionButtonClicked.next('next')
31
+ }
32
+ }
@@ -8,4 +8,5 @@
8
8
  [placeholder]="hint"
9
9
  [attr.aria-label]="hint"
10
10
  [attr.required]="required || null"
11
+ [disabled]="disabled"
11
12
  />
@@ -29,6 +29,7 @@ export class TextInputComponent implements AfterViewInit {
29
29
  @Input() extraClass = ''
30
30
  @Input() hint: string
31
31
  @Input() required = false
32
+ @Input() disabled: boolean
32
33
  rawChange = new Subject<string>()
33
34
  @Output() valueChange = this.rawChange.pipe(distinctUntilChanged())
34
35
  @ViewChild('input') input
@@ -44,7 +44,6 @@ import { ImageInputComponent } from './image-input/image-input.component'
44
44
  StarToggleComponent,
45
45
  DropdownMultiselectComponent,
46
46
  ViewportIntersectorComponent,
47
- CheckToggleComponent,
48
47
  CopyTextButtonComponent,
49
48
  CheckboxComponent,
50
49
  SearchInputComponent,
@@ -73,6 +72,7 @@ import { ImageInputComponent } from './image-input/image-input.component'
73
72
  ImageInputComponent,
74
73
  DropdownSelectorComponent,
75
74
  DateRangePickerComponent,
75
+ CheckToggleComponent,
76
76
  ],
77
77
  exports: [
78
78
  DropdownSelectorComponent,
@@ -6,4 +6,5 @@ export * from './lib/form-field-wrapper/form-field-wrapper.component'
6
6
  export * from './lib/interactive-table/interactive-table-column/interactive-table-column.component'
7
7
  export * from './lib/interactive-table/interactive-table.component'
8
8
  export * from './lib/sticky-header/sticky-header.component'
9
+ export * from './lib/block-list/block-list.component'
9
10
  export * from './lib/ui-layout.module'
@@ -0,0 +1,23 @@
1
+ :host .block-list-container ::ng-deep > * {
2
+ flex-shrink: 0;
3
+ }
4
+
5
+ :host {
6
+ position: relative;
7
+ }
8
+
9
+ .list-page-dot {
10
+ width: 6px;
11
+ height: 6px;
12
+ border-radius: 6px;
13
+ position: relative;
14
+ }
15
+
16
+ .list-page-dot:after {
17
+ content: '';
18
+ position: absolute;
19
+ left: -7px;
20
+ top: -7px;
21
+ width: 20px;
22
+ height: 20px;
23
+ }
@@ -0,0 +1,20 @@
1
+ <div
2
+ class="block-list-container flex flex-col"
3
+ #blockContainer
4
+ [ngClass]="containerClass"
5
+ [ngStyle]="{ minHeight: minHeight + 'px' }"
6
+ >
7
+ <ng-content></ng-content>
8
+ </div>
9
+ <div
10
+ *ngIf="pagesCount > 1"
11
+ class="absolute flex flex-row justify-center gap-[14px] p-1"
12
+ [ngClass]="paginationContainerClass"
13
+ >
14
+ <button
15
+ *ngFor="let page of pages"
16
+ class="list-page-dot"
17
+ (click)="goToPage(page)"
18
+ [ngClass]="currentPage === page ? 'bg-primary' : 'bg-gray-400'"
19
+ ></button>
20
+ </div>
@@ -0,0 +1,84 @@
1
+ import {
2
+ AfterViewInit,
3
+ ChangeDetectionStrategy,
4
+ ChangeDetectorRef,
5
+ Component,
6
+ ContentChildren,
7
+ ElementRef,
8
+ Input,
9
+ QueryList,
10
+ ViewChild,
11
+ } from '@angular/core'
12
+ import { CommonModule } from '@angular/common'
13
+
14
+ @Component({
15
+ selector: 'gn-ui-block-list',
16
+ templateUrl: './block-list.component.html',
17
+ styleUrls: ['./block-list.component.css'],
18
+ changeDetection: ChangeDetectionStrategy.OnPush,
19
+ standalone: true,
20
+ imports: [CommonModule],
21
+ })
22
+ export class BlockListComponent implements AfterViewInit {
23
+ @Input() pageSize = 5
24
+ @Input() containerClass = ''
25
+ @Input() paginationContainerClass = 'w-full bottom-0 top-auto'
26
+ @ContentChildren('block', { read: ElementRef }) blocks: QueryList<
27
+ ElementRef<HTMLElement>
28
+ >
29
+ @ViewChild('blockContainer') blockContainer: ElementRef<HTMLElement>
30
+
31
+ protected minHeight = 0
32
+
33
+ protected currentPage = 0
34
+ protected get pages() {
35
+ return new Array(this.pagesCount).fill(0).map((_, i) => i)
36
+ }
37
+
38
+ get isFirstPage() {
39
+ return this.currentPage === 0
40
+ }
41
+ get isLastPage() {
42
+ return this.currentPage === this.pagesCount - 1
43
+ }
44
+ get pagesCount() {
45
+ return this.blocks ? Math.ceil(this.blocks.length / this.pageSize) : 1
46
+ }
47
+
48
+ constructor(private changeDetector: ChangeDetectorRef) {}
49
+
50
+ ngAfterViewInit() {
51
+ this.blocks.changes.subscribe(this.refreshBlocksVisibility)
52
+ this.refreshBlocksVisibility()
53
+
54
+ // we store the first height as the min-height of the list container
55
+ this.minHeight = this.blockContainer.nativeElement.clientHeight
56
+ this.changeDetector.detectChanges()
57
+ }
58
+
59
+ protected refreshBlocksVisibility = () => {
60
+ this.blocks.forEach((block, index) => {
61
+ block.nativeElement.style.display =
62
+ index >= this.currentPage * this.pageSize &&
63
+ index < (this.currentPage + 1) * this.pageSize
64
+ ? null
65
+ : 'none'
66
+ })
67
+ }
68
+
69
+ public goToPage(index: number) {
70
+ this.currentPage = Math.max(Math.min(index, this.pagesCount - 1), 0)
71
+ this.changeDetector.detectChanges()
72
+ this.refreshBlocksVisibility()
73
+ }
74
+
75
+ public previousPage() {
76
+ if (this.isFirstPage) return
77
+ this.goToPage(this.currentPage - 1)
78
+ }
79
+
80
+ public nextPage() {
81
+ if (this.isLastPage) return
82
+ this.goToPage(this.currentPage + 1)
83
+ }
84
+ }
@@ -1,20 +1,24 @@
1
1
  :host .carousel-container ::ng-deep > * {
2
2
  flex-shrink: 0;
3
3
  }
4
+
4
5
  :host {
5
6
  position: relative;
7
+ display: block;
6
8
  }
9
+
7
10
  .carousel-step-dot {
8
11
  width: 6px;
9
12
  height: 6px;
10
13
  border-radius: 6px;
11
14
  position: relative;
12
15
  }
16
+
13
17
  .carousel-step-dot:after {
14
18
  content: '';
15
19
  position: absolute;
16
- left: -4px;
17
- top: -4px;
18
- width: 14px;
19
- height: 14px;
20
+ left: -7px;
21
+ top: -7px;
22
+ width: 20px;
23
+ height: 20px;
20
24
  }
@@ -1,17 +1,17 @@
1
- <div #carouselOverflowContainer class="overflow-hidden h-full w-full">
2
- <div class="carousel-container flex flex-row" [ngClass]="containerClass">
1
+ <div #carouselOverflowContainer class="w-full">
2
+ <div class="carousel-container flex" [ngClass]="containerClass">
3
3
  <ng-content></ng-content>
4
4
  </div>
5
5
  </div>
6
6
  <div
7
7
  *ngIf="steps.length > 1"
8
- class="absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1"
8
+ class="absolute flex flex-row justify-center gap-[14px] p-1"
9
9
  [ngClass]="stepsContainerClass"
10
10
  >
11
11
  <button
12
12
  *ngFor="let step of steps; let i = index"
13
13
  class="carousel-step-dot"
14
14
  (click)="scrollToStep(i)"
15
- [ngClass]="selectedStep === i ? 'bg-secondary' : 'bg-gray-400'"
15
+ [ngClass]="currentStep === i ? 'bg-primary' : 'bg-gray-400'"
16
16
  ></button>
17
17
  </div>
@@ -4,25 +4,49 @@ import {
4
4
  ChangeDetectorRef,
5
5
  Component,
6
6
  ElementRef,
7
+ EventEmitter,
7
8
  Input,
9
+ Output,
8
10
  ViewChild,
9
11
  } from '@angular/core'
10
12
  import EmblaCarousel, { EmblaCarouselType } from 'embla-carousel'
13
+ import { CommonModule } from '@angular/common'
11
14
 
12
15
  @Component({
13
16
  selector: 'gn-ui-carousel',
14
17
  templateUrl: './carousel.component.html',
15
18
  styleUrls: ['./carousel.component.css'],
16
19
  changeDetection: ChangeDetectionStrategy.OnPush,
20
+ standalone: true,
21
+ imports: [CommonModule],
17
22
  })
18
23
  export class CarouselComponent implements AfterViewInit {
24
+ @ViewChild('carouselOverflowContainer') carouselOverflowContainer: ElementRef
25
+
19
26
  @Input() containerClass = ''
20
- @Input() stepsContainerClass = ''
21
- @ViewChild('carouselOverflowContainer')
22
- carouselOverflowContainer: ElementRef
23
- steps: number[] = []
24
- selectedStep = -1
25
- emblaApi: EmblaCarouselType
27
+ @Input() stepsContainerClass = 'w-full bottom-0 top-auto'
28
+ @Output() currentStepChange = new EventEmitter<number>()
29
+
30
+ protected steps: number[] = []
31
+ protected emblaApi: EmblaCarouselType
32
+ protected currentStep = 0
33
+
34
+ protected refreshSteps = () => {
35
+ this.steps = this.emblaApi.scrollSnapList()
36
+ this.currentStep = this.emblaApi.selectedScrollSnap()
37
+ this.currentStepChange.emit(this.currentStep)
38
+ this.changeDetector.detectChanges()
39
+ }
40
+
41
+ get isFirstStep() {
42
+ return this.currentStep === 0
43
+ }
44
+ get isLastStep() {
45
+ return this.currentStep === this.steps.length - 1
46
+ }
47
+ get stepsCount() {
48
+ return this.steps.length
49
+ }
26
50
 
27
51
  constructor(private changeDetector: ChangeDetectorRef) {}
28
52
 
@@ -33,18 +57,24 @@ export class CarouselComponent implements AfterViewInit {
33
57
  duration: 15,
34
58
  }
35
59
  )
36
- const refreshSteps = () => {
37
- this.steps = this.emblaApi.scrollSnapList()
38
- this.selectedStep = this.emblaApi.selectedScrollSnap()
39
- this.changeDetector.detectChanges()
40
- }
60
+
41
61
  this.emblaApi
42
- .on('init', refreshSteps)
43
- .on('reInit', refreshSteps)
44
- .on('select', refreshSteps)
62
+ .on('init', this.refreshSteps)
63
+ .on('reInit', this.refreshSteps)
64
+ .on('select', this.refreshSteps)
45
65
  }
46
66
 
47
- scrollToStep(stepIndex: number) {
67
+ public scrollToStep(stepIndex: number) {
48
68
  this.emblaApi.scrollTo(stepIndex)
49
69
  }
70
+
71
+ public slideToPrevious() {
72
+ if (this.isFirstStep) return
73
+ this.emblaApi.scrollPrev()
74
+ }
75
+
76
+ public slideToNext() {
77
+ if (this.isLastStep) return
78
+ this.emblaApi.scrollNext()
79
+ }
50
80
  }
@@ -15,14 +15,12 @@ import { CarouselComponent } from './carousel/carousel.component'
15
15
  StickyHeaderComponent,
16
16
  AnchorLinkDirective,
17
17
  ExpandablePanelButtonComponent,
18
- CarouselComponent,
19
18
  ],
20
19
  exports: [
21
20
  ExpandablePanelComponent,
22
21
  StickyHeaderComponent,
23
22
  AnchorLinkDirective,
24
23
  ExpandablePanelButtonComponent,
25
- CarouselComponent,
26
24
  ],
27
25
  })
28
26
  export class UiLayoutModule {}
@@ -26,7 +26,7 @@ export class LinkClassifierService {
26
26
  case 'wmts':
27
27
  return [LinkUsage.API, LinkUsage.MAP_API]
28
28
  case 'ogcFeatures':
29
- return [LinkUsage.API]
29
+ return [LinkUsage.API, LinkUsage.DOWNLOAD, LinkUsage.GEODATA]
30
30
  default:
31
31
  return [LinkUsage.UNKNOWN]
32
32
  }
@@ -94,6 +94,27 @@ export const FORMATS = {
94
94
  color: '#de630b',
95
95
  mimeTypes: ['application/x-dxf', 'image/x-dxf'],
96
96
  },
97
+ html: {
98
+ extensions: ['html', 'htm'],
99
+ priority: 12,
100
+ color: '#f2bb3a',
101
+ mimeTypes: ['text/html'],
102
+ },
103
+ fgb: {
104
+ extensions: ['fgb', 'flatgeobuf'],
105
+ priority: 13,
106
+ color: '#f2bb3a',
107
+ mimeTypes: ['application/flatgeobuf'],
108
+ },
109
+ jsonfg: {
110
+ extensions: ['jsonfg', 'jsonfgc'],
111
+ priority: 14,
112
+ color: '#f2bb3a',
113
+ mimeTypes: [
114
+ 'application/vnd.ogc.fg+json',
115
+ 'application/vnd.ogc.fg+json;compatibility=geojson',
116
+ ],
117
+ },
97
118
  } as const
98
119
 
99
120
  export type FileFormat = keyof typeof FORMATS
@@ -156,6 +156,8 @@
156
156
  "editor.record.form.license.pddl": "",
157
157
  "editor.record.form.license.unknown": "Unbekannt oder nicht vorhanden",
158
158
  "editor.record.form.resourceUpdated": "",
159
+ "editor.record.form.updateFrequency": "",
160
+ "editor.record.form.updateFrequency.planned": "",
159
161
  "editor.record.loadError.body": "",
160
162
  "editor.record.loadError.closeMessage": "",
161
163
  "editor.record.loadError.title": "",
@@ -226,6 +228,7 @@
226
228
  "multiselect.filter.placeholder": "Suche",
227
229
  "nav.back": "Zurück",
228
230
  "next": "weiter",
231
+ "ogc.unreachable.unknown": "Der Dienst konnte nicht erreicht werden",
229
232
  "organisation.filter.placeholder": "Ergebnisse filtern",
230
233
  "organisation.sort.sortBy": "Sortieren nach:",
231
234
  "organisations.hits.found": "{hits, plural, =0{Keine Organisation gefunden} other{{hits} von {total} Organisationen angezeigt}}",
@@ -290,14 +293,6 @@
290
293
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
291
294
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
292
295
  "record.metadata.related": "Ähnliche Datensätze",
293
- "record.metadata.userFeedbacks": "",
294
- "record.metadata.userFeedbacks.anonymousUser": "",
295
- "record.metadata.userFeedbacks.sortSelector.label": "",
296
- "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
297
- "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
298
- "record.metadata.userFeedbacks.newComment.placeholder": "",
299
- "record.metadata.userFeedbacks.newAnswer.placeholder": "",
300
- "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
301
296
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
302
297
  "record.metadata.status": "Status",
303
298
  "record.metadata.technical": "Technische Informationen",
@@ -312,6 +307,14 @@
312
307
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
313
308
  "record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
314
309
  "record.metadata.usage": "Nutzung und Einschränkungen",
310
+ "record.metadata.userFeedbacks": "",
311
+ "record.metadata.userFeedbacks.anonymousUser": "",
312
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
313
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
314
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
315
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
316
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
317
+ "record.metadata.userFeedbacks.sortSelector.label": "",
315
318
  "record.more.details": "Weitere Details",
316
319
  "record.tab.chart": "Diagramm",
317
320
  "record.tab.data": "Tabelle",
@@ -371,12 +374,6 @@
371
374
  "table.loading.data": "Daten werden geladen...",
372
375
  "table.object.count": "Objekte in diesem Datensatz",
373
376
  "table.select.data": "Datenquelle",
374
- "timeSincePipe.lessThanAMinute": "",
375
- "timeSincePipe.minutesAgo": "",
376
- "timeSincePipe.hoursAgo": "",
377
- "timeSincePipe.daysAgo": "",
378
- "timeSincePipe.monthsAgo": "",
379
- "timeSincePipe.yearsAgo": "",
380
377
  "tooltip.html.copy": "HTML kopieren",
381
378
  "tooltip.id.copy": "Eindeutige Kennung kopieren",
382
379
  "tooltip.url.copy": "URL kopieren",
@@ -156,6 +156,8 @@
156
156
  "editor.record.form.license.pddl": "Open Data Commons PDDL",
157
157
  "editor.record.form.license.unknown": "Unknown or absent",
158
158
  "editor.record.form.resourceUpdated": "Last update date",
159
+ "editor.record.form.updateFrequency": "Update frequency",
160
+ "editor.record.form.updateFrequency.planned": "The data should be updated regularly.",
159
161
  "editor.record.loadError.body": "The record could not be loaded:",
160
162
  "editor.record.loadError.closeMessage": "Understood",
161
163
  "editor.record.loadError.title": "Error loading record",
@@ -226,6 +228,7 @@
226
228
  "multiselect.filter.placeholder": "Search",
227
229
  "nav.back": "Back",
228
230
  "next": "next",
231
+ "ogc.unreachable.unknown": "The service could not be reached",
229
232
  "organisation.filter.placeholder": "Filter results",
230
233
  "organisation.sort.sortBy": "Sort by:",
231
234
  "organisations.hits.found": "{hits, plural, =0{No organizations found} other{{hits} out of {total} organizations shown}}",
@@ -290,14 +293,6 @@
290
293
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
291
294
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
292
295
  "record.metadata.related": "Related records",
293
- "record.metadata.userFeedbacks": "Questions / Answers",
294
- "record.metadata.userFeedbacks.anonymousUser": "In order to leave a comment, please log in.",
295
- "record.metadata.userFeedbacks.sortSelector.label": "Sort by ...",
296
- "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Newest comments first",
297
- "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Oldest comments first",
298
- "record.metadata.userFeedbacks.newComment.placeholder": "Write your comment here...",
299
- "record.metadata.userFeedbacks.newAnswer.placeholder": "Answer...",
300
- "record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publish",
301
296
  "record.metadata.sheet": "Original metadata",
302
297
  "record.metadata.status": "Status",
303
298
  "record.metadata.technical": "Technical information",
@@ -312,6 +307,14 @@
312
307
  "record.metadata.updateFrequency": "Data Update Frequency",
313
308
  "record.metadata.updatedOn": "Last Data Information Update",
314
309
  "record.metadata.usage": "License and Conditions",
310
+ "record.metadata.userFeedbacks": "Questions / Answers",
311
+ "record.metadata.userFeedbacks.anonymousUser": "In order to leave a comment, please log in.",
312
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publish",
313
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "Answer...",
314
+ "record.metadata.userFeedbacks.newComment.placeholder": "Write your comment here...",
315
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Newest comments first",
316
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Oldest comments first",
317
+ "record.metadata.userFeedbacks.sortSelector.label": "Sort by ...",
315
318
  "record.more.details": "Read more",
316
319
  "record.tab.chart": "Chart",
317
320
  "record.tab.data": "Table",
@@ -371,12 +374,6 @@
371
374
  "table.loading.data": "Loading data...",
372
375
  "table.object.count": "objects in this dataset",
373
376
  "table.select.data": "Data source",
374
- "timeSincePipe.lessThanAMinute": "Less than a minute ago",
375
- "timeSincePipe.minutesAgo": "{value} minute{s} ago",
376
- "timeSincePipe.hoursAgo": "{value} hour{s} ago",
377
- "timeSincePipe.daysAgo": "{value} day{s} ago",
378
- "timeSincePipe.monthsAgo": "{value} month{s} ago",
379
- "timeSincePipe.yearsAgo": "{value} year{s} ago",
380
377
  "tooltip.html.copy": "Copy HTML",
381
378
  "tooltip.id.copy": "Copy unique identifier",
382
379
  "tooltip.url.copy": "Copy URL",