geonetwork-ui 2.3.0-dev.3efe236f → 2.3.0-dev.431347d3

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 (188) 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 +64 -0
  7. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.mjs +15 -0
  8. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.mjs +104 -0
  9. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +25 -6
  10. package/esm2022/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.mjs +1 -1
  11. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +23 -1
  12. package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +73 -20
  13. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +1 -1
  14. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +1 -1
  15. package/esm2022/libs/feature/map/src/lib/map-context/map-context.model.mjs +1 -1
  16. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +37 -8
  17. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +6 -2
  18. package/esm2022/libs/feature/record/src/lib/data-view/data-view.component.mjs +1 -1
  19. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +4 -3
  20. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +1 -1
  21. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +1 -3
  22. package/esm2022/libs/feature/search/src/index.mjs +2 -1
  23. package/esm2022/libs/feature/search/src/lib/results-layout/results-layout.component.mjs +1 -1
  24. package/esm2022/libs/feature/search/src/lib/sort-by/sort-by.component.mjs +1 -1
  25. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +1 -1
  26. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +1 -1
  27. package/esm2022/libs/ui/catalog/src/lib/organisations-filter/organisations-filter.component.mjs +1 -1
  28. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -2
  29. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +2 -2
  30. package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +16 -3
  31. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +98 -36
  32. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +1 -6
  33. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.mjs +3 -5
  34. package/esm2022/libs/ui/inputs/src/index.mjs +16 -15
  35. package/esm2022/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.mjs +4 -3
  36. package/esm2022/libs/ui/inputs/src/lib/date-picker/date-picker.component.mjs +22 -0
  37. package/esm2022/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.mjs +7 -5
  38. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +19 -8
  39. package/esm2022/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +29 -0
  40. package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +5 -3
  41. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +14 -11
  42. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  43. package/esm2022/libs/ui/layout/src/lib/block-list/block-list.component.mjs +76 -0
  44. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +42 -18
  45. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +3 -8
  46. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -2
  47. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +22 -1
  48. package/esm2022/translations/de.json +22 -14
  49. package/esm2022/translations/en.json +22 -14
  50. package/esm2022/translations/es.json +22 -14
  51. package/esm2022/translations/fr.json +22 -14
  52. package/esm2022/translations/it.json +22 -14
  53. package/esm2022/translations/nl.json +22 -14
  54. package/esm2022/translations/pt.json +22 -14
  55. package/fesm2022/geonetwork-ui.mjs +1520 -912
  56. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  57. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  58. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  59. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +3 -1
  60. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  61. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts +39 -0
  62. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.d.ts.map +1 -0
  63. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts +8 -0
  64. 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
  65. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.d.ts +21 -0
  66. 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
  67. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +4 -0
  68. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  69. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  70. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts +10 -5
  71. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts.map +1 -1
  72. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts +7 -0
  73. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts.map +1 -1
  74. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  75. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  76. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  77. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  78. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  79. package/libs/feature/search/src/index.d.ts +1 -0
  80. package/libs/feature/search/src/index.d.ts.map +1 -1
  81. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts +3 -3
  82. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  83. package/libs/ui/elements/src/lib/api-card/api-card.component.d.ts.map +1 -1
  84. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  85. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +3 -1
  86. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
  87. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +24 -4
  88. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  89. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +29 -30
  90. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  91. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts +1 -2
  92. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts.map +1 -1
  93. package/libs/ui/inputs/src/index.d.ts +15 -14
  94. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  95. package/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.d.ts +1 -1
  96. package/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.d.ts.map +1 -1
  97. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts +9 -0
  98. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts.map +1 -0
  99. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts +1 -1
  100. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts.map +1 -1
  101. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts +2 -1
  102. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
  103. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts +12 -0
  104. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts.map +1 -0
  105. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts +2 -1
  106. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts.map +1 -1
  107. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +35 -35
  108. package/libs/ui/layout/src/index.d.ts +1 -0
  109. package/libs/ui/layout/src/index.d.ts.map +1 -1
  110. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts +25 -0
  111. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts.map +1 -0
  112. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts +13 -6
  113. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts.map +1 -1
  114. package/libs/ui/layout/src/lib/ui-layout.module.d.ts +4 -5
  115. package/libs/ui/layout/src/lib/ui-layout.module.d.ts.map +1 -1
  116. package/libs/util/shared/src/lib/links/link-utils.d.ts +18 -0
  117. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  118. package/package.json +2 -2
  119. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +1 -1
  120. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +1 -4
  121. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +16 -10
  122. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +8 -0
  123. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +2 -2
  124. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +51 -1
  125. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.css +0 -0
  126. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.html +8 -0
  127. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.ts +64 -0
  128. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.css +0 -0
  129. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.html +4 -0
  130. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.ts +15 -0
  131. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.css +0 -0
  132. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.html +14 -0
  133. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.ts +143 -0
  134. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +38 -33
  135. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +21 -0
  136. package/src/libs/feature/editor/src/lib/fields.config.ts +22 -0
  137. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.css +7 -0
  138. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.html +32 -18
  139. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.ts +72 -17
  140. package/src/libs/feature/map/src/lib/map-context/map-context.model.ts +7 -0
  141. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +34 -8
  142. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +5 -1
  143. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +2 -1
  144. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +0 -1
  145. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +0 -2
  146. package/src/libs/feature/search/src/index.ts +1 -0
  147. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +2 -2
  148. package/src/libs/ui/elements/src/lib/api-card/api-card.component.ts +2 -1
  149. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +1 -1
  150. package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +38 -20
  151. package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +12 -0
  152. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +26 -10
  153. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +125 -30
  154. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +0 -2
  155. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.html +1 -1
  156. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.ts +0 -1
  157. package/src/libs/ui/inputs/src/index.ts +15 -14
  158. package/src/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.ts +3 -0
  159. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.css +3 -0
  160. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.html +11 -0
  161. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.ts +16 -0
  162. package/src/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.ts +8 -1
  163. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.html +1 -0
  164. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +14 -0
  165. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.css +6 -0
  166. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.html +26 -0
  167. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.ts +32 -0
  168. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +1 -0
  169. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +1 -0
  170. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +3 -3
  171. package/src/libs/ui/layout/src/index.ts +1 -0
  172. package/src/libs/ui/layout/src/lib/block-list/block-list.component.css +23 -0
  173. package/src/libs/ui/layout/src/lib/block-list/block-list.component.html +20 -0
  174. package/src/libs/ui/layout/src/lib/block-list/block-list.component.ts +84 -0
  175. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +8 -4
  176. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +4 -4
  177. package/src/libs/ui/layout/src/lib/carousel/carousel.component.ts +45 -15
  178. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +0 -2
  179. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +1 -1
  180. package/src/libs/util/shared/src/lib/links/link-utils.ts +21 -0
  181. package/translations/de.json +22 -14
  182. package/translations/en.json +22 -14
  183. package/translations/es.json +22 -14
  184. package/translations/fr.json +22 -14
  185. package/translations/it.json +22 -14
  186. package/translations/nl.json +22 -14
  187. package/translations/pt.json +22 -14
  188. package/translations/sk.json +22 -14
@@ -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
@@ -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 }}
@@ -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
@@ -35,6 +48,7 @@ export class DropdownSelectorComponent implements OnInit {
35
48
  @Input() maxRows: number
36
49
  @Input() extraBtnClass = ''
37
50
  @Input() minWidth = ''
51
+ @Input() disabled: boolean
38
52
  @Output() selectValue = new EventEmitter<DropdownChoice['value']>()
39
53
  @ViewChild('overlayOrigin') overlayOrigin: CdkOverlayOrigin
40
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
@@ -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,
@@ -45,11 +44,9 @@ import { ImageInputComponent } from './image-input/image-input.component'
45
44
  StarToggleComponent,
46
45
  DropdownMultiselectComponent,
47
46
  ViewportIntersectorComponent,
48
- CheckToggleComponent,
49
47
  CopyTextButtonComponent,
50
48
  CheckboxComponent,
51
49
  SearchInputComponent,
52
- DateRangePickerComponent,
53
50
  ],
54
51
  imports: [
55
52
  CommonModule,
@@ -73,6 +70,9 @@ import { ImageInputComponent } from './image-input/image-input.component'
73
70
  TextAreaComponent,
74
71
  ButtonComponent,
75
72
  ImageInputComponent,
73
+ DropdownSelectorComponent,
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
@@ -145,6 +145,19 @@
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": "",
159
+ "editor.record.form.updateFrequency": "",
160
+ "editor.record.form.updateFrequency.planned": "",
148
161
  "editor.record.loadError.body": "",
149
162
  "editor.record.loadError.closeMessage": "",
150
163
  "editor.record.loadError.title": "",
@@ -215,6 +228,7 @@
215
228
  "multiselect.filter.placeholder": "Suche",
216
229
  "nav.back": "Zurück",
217
230
  "next": "weiter",
231
+ "ogc.unreachable.unknown": "Der Dienst konnte nicht erreicht werden",
218
232
  "organisation.filter.placeholder": "Ergebnisse filtern",
219
233
  "organisation.sort.sortBy": "Sortieren nach:",
220
234
  "organisations.hits.found": "{hits, plural, =0{Keine Organisation gefunden} other{{hits} von {total} Organisationen angezeigt}}",
@@ -279,14 +293,6 @@
279
293
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
280
294
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
281
295
  "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
296
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
291
297
  "record.metadata.status": "Status",
292
298
  "record.metadata.technical": "Technische Informationen",
@@ -301,6 +307,14 @@
301
307
  "record.metadata.updateFrequency": "Aktualisierungsfrequenz der Daten",
302
308
  "record.metadata.updatedOn": "Letzte Aktualisierung der Dateninformationen",
303
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": "",
304
318
  "record.more.details": "Weitere Details",
305
319
  "record.tab.chart": "Diagramm",
306
320
  "record.tab.data": "Tabelle",
@@ -360,12 +374,6 @@
360
374
  "table.loading.data": "Daten werden geladen...",
361
375
  "table.object.count": "Objekte in diesem Datensatz",
362
376
  "table.select.data": "Datenquelle",
363
- "timeSincePipe.lessThanAMinute": "",
364
- "timeSincePipe.minutesAgo": "",
365
- "timeSincePipe.hoursAgo": "",
366
- "timeSincePipe.daysAgo": "",
367
- "timeSincePipe.monthsAgo": "",
368
- "timeSincePipe.yearsAgo": "",
369
377
  "tooltip.html.copy": "HTML kopieren",
370
378
  "tooltip.id.copy": "Eindeutige Kennung kopieren",
371
379
  "tooltip.url.copy": "URL kopieren",
@@ -145,6 +145,19 @@
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",
159
+ "editor.record.form.updateFrequency": "Update frequency",
160
+ "editor.record.form.updateFrequency.planned": "The data should be updated regularly.",
148
161
  "editor.record.loadError.body": "The record could not be loaded:",
149
162
  "editor.record.loadError.closeMessage": "Understood",
150
163
  "editor.record.loadError.title": "Error loading record",
@@ -215,6 +228,7 @@
215
228
  "multiselect.filter.placeholder": "Search",
216
229
  "nav.back": "Back",
217
230
  "next": "next",
231
+ "ogc.unreachable.unknown": "The service could not be reached",
218
232
  "organisation.filter.placeholder": "Filter results",
219
233
  "organisation.sort.sortBy": "Sort by:",
220
234
  "organisations.hits.found": "{hits, plural, =0{No organizations found} other{{hits} out of {total} organizations shown}}",
@@ -279,14 +293,6 @@
279
293
  "record.metadata.quality.updateFrequency.failed": "Update frequency is not specified",
280
294
  "record.metadata.quality.updateFrequency.success": "Update frequency is specified",
281
295
  "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
296
  "record.metadata.sheet": "Original metadata",
291
297
  "record.metadata.status": "Status",
292
298
  "record.metadata.technical": "Technical information",
@@ -301,6 +307,14 @@
301
307
  "record.metadata.updateFrequency": "Data Update Frequency",
302
308
  "record.metadata.updatedOn": "Last Data Information Update",
303
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 ...",
304
318
  "record.more.details": "Read more",
305
319
  "record.tab.chart": "Chart",
306
320
  "record.tab.data": "Table",
@@ -360,12 +374,6 @@
360
374
  "table.loading.data": "Loading data...",
361
375
  "table.object.count": "objects in this dataset",
362
376
  "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
377
  "tooltip.html.copy": "Copy HTML",
370
378
  "tooltip.id.copy": "Copy unique identifier",
371
379
  "tooltip.url.copy": "Copy URL",