geonetwork-ui 2.3.0-dev.61774f7d → 2.3.0-dev.6b7e19cb

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 (152) hide show
  1. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +35 -2
  2. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.mjs +64 -0
  3. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.mjs +15 -0
  4. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +20 -6
  5. package/esm2022/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.mjs +1 -1
  6. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +16 -1
  7. package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +73 -20
  8. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +1 -1
  9. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +1 -1
  10. package/esm2022/libs/feature/map/src/lib/map-context/map-context.model.mjs +1 -1
  11. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +29 -8
  12. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +3 -2
  13. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +1 -1
  14. package/esm2022/libs/feature/search/src/index.mjs +2 -1
  15. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +1 -1
  16. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -2
  17. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +2 -2
  18. package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +16 -3
  19. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +77 -15
  20. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +1 -6
  21. package/esm2022/libs/ui/inputs/src/index.mjs +16 -15
  22. package/esm2022/libs/ui/inputs/src/lib/date-picker/date-picker.component.mjs +22 -0
  23. package/esm2022/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.mjs +7 -5
  24. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +17 -8
  25. package/esm2022/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +29 -0
  26. package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +5 -3
  27. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +11 -9
  28. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  29. package/esm2022/libs/ui/layout/src/lib/block-list/block-list.component.mjs +76 -0
  30. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +42 -18
  31. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +3 -8
  32. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -2
  33. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +22 -1
  34. package/esm2022/translations/de.json +20 -14
  35. package/esm2022/translations/en.json +20 -14
  36. package/esm2022/translations/es.json +20 -14
  37. package/esm2022/translations/fr.json +20 -14
  38. package/esm2022/translations/it.json +20 -14
  39. package/esm2022/translations/nl.json +20 -14
  40. package/esm2022/translations/pt.json +20 -14
  41. package/fesm2022/geonetwork-ui.mjs +1336 -864
  42. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  43. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +3 -1
  44. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  45. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts +39 -0
  46. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts.map +1 -0
  47. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts +8 -0
  48. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts.map +1 -0
  49. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +3 -0
  50. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  51. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  52. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts +10 -5
  53. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts.map +1 -1
  54. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts +1 -0
  55. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts.map +1 -1
  56. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  57. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  58. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  59. package/libs/feature/search/src/index.d.ts +1 -0
  60. package/libs/feature/search/src/index.d.ts.map +1 -1
  61. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts +3 -3
  62. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  63. package/libs/ui/elements/src/lib/api-card/api-card.component.d.ts.map +1 -1
  64. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  65. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +3 -1
  66. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
  67. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +12 -3
  68. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  69. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +29 -30
  70. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  71. package/libs/ui/inputs/src/index.d.ts +15 -14
  72. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  73. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts +9 -0
  74. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts.map +1 -0
  75. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts +1 -1
  76. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts.map +1 -1
  77. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts +1 -1
  78. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
  79. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts +12 -0
  80. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts.map +1 -0
  81. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts +2 -1
  82. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts.map +1 -1
  83. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +35 -35
  84. package/libs/ui/layout/src/index.d.ts +1 -0
  85. package/libs/ui/layout/src/index.d.ts.map +1 -1
  86. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts +25 -0
  87. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts.map +1 -0
  88. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts +13 -6
  89. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts.map +1 -1
  90. package/libs/ui/layout/src/lib/ui-layout.module.d.ts +4 -5
  91. package/libs/ui/layout/src/lib/ui-layout.module.d.ts.map +1 -1
  92. package/libs/util/shared/src/lib/links/link-utils.d.ts +18 -0
  93. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  94. package/package.json +1 -1
  95. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +8 -0
  96. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +2 -2
  97. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +51 -1
  98. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.css +0 -0
  99. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.html +8 -0
  100. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.ts +64 -0
  101. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.css +0 -0
  102. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.html +4 -0
  103. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.ts +15 -0
  104. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +33 -33
  105. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +16 -0
  106. package/src/libs/feature/editor/src/lib/fields.config.ts +15 -0
  107. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.css +7 -0
  108. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.html +32 -18
  109. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.ts +72 -17
  110. package/src/libs/feature/map/src/lib/map-context/map-context.model.ts +1 -0
  111. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +26 -8
  112. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +2 -1
  113. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +0 -1
  114. package/src/libs/feature/search/src/index.ts +1 -0
  115. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +2 -2
  116. package/src/libs/ui/elements/src/lib/api-card/api-card.component.ts +2 -1
  117. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +1 -1
  118. package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +38 -20
  119. package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +12 -0
  120. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +26 -10
  121. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +87 -8
  122. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +0 -2
  123. package/src/libs/ui/inputs/src/index.ts +15 -14
  124. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.css +3 -0
  125. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.html +11 -0
  126. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.ts +16 -0
  127. package/src/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.ts +8 -1
  128. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +13 -0
  129. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.css +6 -0
  130. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.html +26 -0
  131. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.ts +32 -0
  132. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +1 -0
  133. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +1 -0
  134. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +2 -2
  135. package/src/libs/ui/layout/src/index.ts +1 -0
  136. package/src/libs/ui/layout/src/lib/block-list/block-list.component.css +23 -0
  137. package/src/libs/ui/layout/src/lib/block-list/block-list.component.html +20 -0
  138. package/src/libs/ui/layout/src/lib/block-list/block-list.component.ts +84 -0
  139. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +8 -4
  140. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +4 -4
  141. package/src/libs/ui/layout/src/lib/carousel/carousel.component.ts +45 -15
  142. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +0 -2
  143. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +1 -1
  144. package/src/libs/util/shared/src/lib/links/link-utils.ts +21 -0
  145. package/translations/de.json +20 -14
  146. package/translations/en.json +20 -14
  147. package/translations/es.json +20 -14
  148. package/translations/fr.json +20 -14
  149. package/translations/it.json +20 -14
  150. package/translations/nl.json +20 -14
  151. package/translations/pt.json +20 -14
  152. package/translations/sk.json +20 -14
@@ -0,0 +1,16 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core'
2
+ import { MatNativeDateModule } from '@angular/material/core'
3
+ import { MatDatepickerModule } from '@angular/material/datepicker'
4
+ import { MatIconModule } from '@angular/material/icon'
5
+
6
+ @Component({
7
+ selector: 'gn-ui-date-picker',
8
+ templateUrl: './date-picker.component.html',
9
+ styleUrls: ['./date-picker.component.css'],
10
+ standalone: true,
11
+ imports: [MatIconModule, MatNativeDateModule, MatDatepickerModule],
12
+ })
13
+ export class DatePickerComponent {
14
+ @Input() date: Date
15
+ @Output() dateChange = new EventEmitter<Date>()
16
+ }
@@ -1,10 +1,17 @@
1
1
  import { Component } from '@angular/core'
2
- import { MatDatepickerInputEvent } from '@angular/material/datepicker'
2
+ import { MatNativeDateModule } from '@angular/material/core'
3
+ import {
4
+ MatDatepickerInputEvent,
5
+ MatDatepickerModule,
6
+ } from '@angular/material/datepicker'
7
+ import { MatIconModule } from '@angular/material/icon'
3
8
 
4
9
  @Component({
5
10
  selector: 'gn-ui-date-range-picker',
6
11
  templateUrl: './date-range-picker.component.html',
7
12
  styleUrls: ['./date-range-picker.component.css'],
13
+ standalone: true,
14
+ imports: [MatIconModule, MatNativeDateModule, MatDatepickerModule],
8
15
  })
9
16
  export class DateRangePickerComponent {
10
17
  startDate: Date
@@ -2,6 +2,7 @@ import {
2
2
  CdkConnectedOverlay,
3
3
  CdkOverlayOrigin,
4
4
  ConnectedPosition,
5
+ OverlayModule,
5
6
  } from '@angular/cdk/overlay'
6
7
  import {
7
8
  ChangeDetectionStrategy,
@@ -17,6 +18,10 @@ import {
17
18
  } from '@angular/core'
18
19
  import { firstValueFrom } from 'rxjs'
19
20
  import { DropdownChoice } from './dropdown-selector.model'
21
+ import { CommonModule } from '@angular/common'
22
+ import { TranslateModule } from '@ngx-translate/core'
23
+ import { MatIconModule } from '@angular/material/icon'
24
+ import { ButtonComponent } from '../button/button.component'
20
25
 
21
26
  const DEFAULT_ROW_NUMBERS = 6
22
27
 
@@ -25,6 +30,14 @@ const DEFAULT_ROW_NUMBERS = 6
25
30
  templateUrl: './dropdown-selector.component.html',
26
31
  styleUrls: ['./dropdown-selector.component.css'],
27
32
  changeDetection: ChangeDetectionStrategy.OnPush,
33
+ standalone: true,
34
+ imports: [
35
+ CommonModule,
36
+ ButtonComponent,
37
+ OverlayModule,
38
+ MatIconModule,
39
+ TranslateModule,
40
+ ],
28
41
  })
29
42
  export class DropdownSelectorComponent implements OnInit {
30
43
  @Input() title: string
@@ -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
@@ -36,7 +36,6 @@ import { ImageInputComponent } from './image-input/image-input.component'
36
36
 
37
37
  @NgModule({
38
38
  declarations: [
39
- DropdownSelectorComponent,
40
39
  AutocompleteComponent,
41
40
  TextInputComponent,
42
41
  DragAndDropFileInputComponent,
@@ -49,7 +48,6 @@ import { ImageInputComponent } from './image-input/image-input.component'
49
48
  CopyTextButtonComponent,
50
49
  CheckboxComponent,
51
50
  SearchInputComponent,
52
- DateRangePickerComponent,
53
51
  ],
54
52
  imports: [
55
53
  CommonModule,
@@ -73,6 +71,8 @@ import { ImageInputComponent } from './image-input/image-input.component'
73
71
  TextAreaComponent,
74
72
  ButtonComponent,
75
73
  ImageInputComponent,
74
+ DropdownSelectorComponent,
75
+ DateRangePickerComponent,
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
@@ -145,6 +145,17 @@
145
145
  "downloads.format.unknown": "unbekannt",
146
146
  "downloads.wfs.featuretype.not.found": "Der Layer wurde nicht gefunden",
147
147
  "dropFile": "Datei ablegen",
148
+ "editor.record.form.license": "Lizenz",
149
+ "editor.record.form.license.cc-by": "",
150
+ "editor.record.form.license.cc-by-sa": "",
151
+ "editor.record.form.license.cc-zero": "",
152
+ "editor.record.form.license.etalab": "",
153
+ "editor.record.form.license.etalab-v2": "",
154
+ "editor.record.form.license.odbl": "",
155
+ "editor.record.form.license.odc-by": "",
156
+ "editor.record.form.license.pddl": "",
157
+ "editor.record.form.license.unknown": "Unbekannt oder nicht vorhanden",
158
+ "editor.record.form.resourceUpdated": "",
148
159
  "editor.record.loadError.body": "",
149
160
  "editor.record.loadError.closeMessage": "",
150
161
  "editor.record.loadError.title": "",
@@ -215,6 +226,7 @@
215
226
  "multiselect.filter.placeholder": "Suche",
216
227
  "nav.back": "Zurück",
217
228
  "next": "weiter",
229
+ "ogc.unreachable.unknown": "Der Dienst konnte nicht erreicht werden",
218
230
  "organisation.filter.placeholder": "Ergebnisse filtern",
219
231
  "organisation.sort.sortBy": "Sortieren nach:",
220
232
  "organisations.hits.found": "{hits, plural, =0{Keine Organisation gefunden} other{{hits} von {total} Organisationen angezeigt}}",
@@ -279,14 +291,6 @@
279
291
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
280
292
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
281
293
  "record.metadata.related": "Ähnliche Datensätze",
282
- "record.metadata.userFeedbacks": "",
283
- "record.metadata.userFeedbacks.anonymousUser": "",
284
- "record.metadata.userFeedbacks.sortSelector.label": "",
285
- "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
286
- "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
287
- "record.metadata.userFeedbacks.newComment.placeholder": "",
288
- "record.metadata.userFeedbacks.newAnswer.placeholder": "",
289
- "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
290
294
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
291
295
  "record.metadata.status": "Status",
292
296
  "record.metadata.technical": "Technische Informationen",
@@ -301,6 +305,14 @@
301
305
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
302
306
  "record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
303
307
  "record.metadata.usage": "Nutzung und Einschränkungen",
308
+ "record.metadata.userFeedbacks": "",
309
+ "record.metadata.userFeedbacks.anonymousUser": "",
310
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "",
311
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "",
312
+ "record.metadata.userFeedbacks.newComment.placeholder": "",
313
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "",
314
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "",
315
+ "record.metadata.userFeedbacks.sortSelector.label": "",
304
316
  "record.more.details": "Weitere Details",
305
317
  "record.tab.chart": "Diagramm",
306
318
  "record.tab.data": "Tabelle",
@@ -360,12 +372,6 @@
360
372
  "table.loading.data": "Daten werden geladen...",
361
373
  "table.object.count": "Objekte in diesem Datensatz",
362
374
  "table.select.data": "Datenquelle",
363
- "timeSincePipe.lessThanAMinute": "",
364
- "timeSincePipe.minutesAgo": "",
365
- "timeSincePipe.hoursAgo": "",
366
- "timeSincePipe.daysAgo": "",
367
- "timeSincePipe.monthsAgo": "",
368
- "timeSincePipe.yearsAgo": "",
369
375
  "tooltip.html.copy": "HTML kopieren",
370
376
  "tooltip.id.copy": "Eindeutige Kennung kopieren",
371
377
  "tooltip.url.copy": "URL kopieren",
@@ -145,6 +145,17 @@
145
145
  "downloads.format.unknown": "unknown",
146
146
  "downloads.wfs.featuretype.not.found": "The layer was not found",
147
147
  "dropFile": "drop file",
148
+ "editor.record.form.license": "License",
149
+ "editor.record.form.license.cc-by": "Creative Commons CC-BY",
150
+ "editor.record.form.license.cc-by-sa": "Creative Commons CC-BY-SA",
151
+ "editor.record.form.license.cc-zero": "Creative Commons CC-0",
152
+ "editor.record.form.license.etalab": "Open Licence (Etalab)",
153
+ "editor.record.form.license.etalab-v2": "Open Licence v2.0 (Etalab)",
154
+ "editor.record.form.license.odbl": "Open Data Commons ODbL",
155
+ "editor.record.form.license.odc-by": "Open Data Commons ODC-By",
156
+ "editor.record.form.license.pddl": "Open Data Commons PDDL",
157
+ "editor.record.form.license.unknown": "Unknown or absent",
158
+ "editor.record.form.resourceUpdated": "Last update date",
148
159
  "editor.record.loadError.body": "The record could not be loaded:",
149
160
  "editor.record.loadError.closeMessage": "Understood",
150
161
  "editor.record.loadError.title": "Error loading record",
@@ -215,6 +226,7 @@
215
226
  "multiselect.filter.placeholder": "Search",
216
227
  "nav.back": "Back",
217
228
  "next": "next",
229
+ "ogc.unreachable.unknown": "The service could not be reached",
218
230
  "organisation.filter.placeholder": "Filter results",
219
231
  "organisation.sort.sortBy": "Sort by:",
220
232
  "organisations.hits.found": "{hits, plural, =0{No organizations found} other{{hits} out of {total} organizations shown}}",
@@ -279,14 +291,6 @@
279
291
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
280
292
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
281
293
  "record.metadata.related": "Related records",
282
- "record.metadata.userFeedbacks": "Questions / Answers",
283
- "record.metadata.userFeedbacks.anonymousUser": "In order to leave a comment, please log in.",
284
- "record.metadata.userFeedbacks.sortSelector.label": "Sort by ...",
285
- "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Newest comments first",
286
- "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Oldest comments first",
287
- "record.metadata.userFeedbacks.newComment.placeholder": "Write your comment here...",
288
- "record.metadata.userFeedbacks.newAnswer.placeholder": "Answer...",
289
- "record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publish",
290
294
  "record.metadata.sheet": "Original metadata",
291
295
  "record.metadata.status": "Status",
292
296
  "record.metadata.technical": "Technical information",
@@ -301,6 +305,14 @@
301
305
  "record.metadata.updateFrequency": "Data Update Frequency",
302
306
  "record.metadata.updatedOn": "Last Data Information Update",
303
307
  "record.metadata.usage": "License and Conditions",
308
+ "record.metadata.userFeedbacks": "Questions / Answers",
309
+ "record.metadata.userFeedbacks.anonymousUser": "In order to leave a comment, please log in.",
310
+ "record.metadata.userFeedbacks.newAnswer.buttonTitle": "Publish",
311
+ "record.metadata.userFeedbacks.newAnswer.placeholder": "Answer...",
312
+ "record.metadata.userFeedbacks.newComment.placeholder": "Write your comment here...",
313
+ "record.metadata.userFeedbacks.sortSelector.choices.newestFirst": "Newest comments first",
314
+ "record.metadata.userFeedbacks.sortSelector.choices.oldestFirst": "Oldest comments first",
315
+ "record.metadata.userFeedbacks.sortSelector.label": "Sort by ...",
304
316
  "record.more.details": "Read more",
305
317
  "record.tab.chart": "Chart",
306
318
  "record.tab.data": "Table",
@@ -360,12 +372,6 @@
360
372
  "table.loading.data": "Loading data...",
361
373
  "table.object.count": "objects in this dataset",
362
374
  "table.select.data": "Data source",
363
- "timeSincePipe.lessThanAMinute": "Less than a minute ago",
364
- "timeSincePipe.minutesAgo": "{value} minute{s} ago",
365
- "timeSincePipe.hoursAgo": "{value} hour{s} ago",
366
- "timeSincePipe.daysAgo": "{value} day{s} ago",
367
- "timeSincePipe.monthsAgo": "{value} month{s} ago",
368
- "timeSincePipe.yearsAgo": "{value} year{s} ago",
369
375
  "tooltip.html.copy": "Copy HTML",
370
376
  "tooltip.id.copy": "Copy unique identifier",
371
377
  "tooltip.url.copy": "Copy URL",