geonetwork-ui 2.6.0-dev.9df114cd4 → 2.6.0-dev.d216c4dea

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 (186) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/base.converter.mjs +1 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +3 -3
  3. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +3 -3
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +4 -4
  5. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +2 -10
  6. package/esm2022/libs/api/repository/src/lib/gn4/gn4.provider.mjs +7 -1
  7. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  8. package/esm2022/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.mjs +2 -3
  9. package/esm2022/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.mjs +1 -1
  10. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +5 -5
  11. package/esm2022/libs/feature/record/src/index.mjs +1 -2
  12. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +5 -9
  13. package/esm2022/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.mjs +7 -11
  14. package/esm2022/libs/feature/record/src/lib/record-meta/record-meta.component.mjs +1 -1
  15. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +8 -5
  16. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +4 -6
  17. package/esm2022/libs/feature/router/src/lib/default/constants.mjs +3 -1
  18. package/esm2022/libs/feature/router/src/lib/default/router.config.mjs +1 -1
  19. package/esm2022/libs/feature/router/src/lib/default/router.service.mjs +10 -2
  20. package/esm2022/libs/feature/router/src/lib/default/state/router.facade.mjs +9 -3
  21. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +4 -4
  22. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +2 -15
  23. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -2
  24. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +26 -10
  25. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +3 -3
  26. package/esm2022/libs/ui/elements/src/index.mjs +2 -1
  27. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +3 -3
  28. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  29. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +8 -5
  30. package/esm2022/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.mjs +161 -0
  31. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +10 -4
  32. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +15 -3
  33. package/esm2022/libs/ui/map/src/index.mjs +2 -1
  34. package/esm2022/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.mjs +79 -0
  35. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +5 -4
  36. package/esm2022/libs/util/app-config/src/lib/app-config.mjs +2 -1
  37. package/esm2022/libs/util/app-config/src/lib/fixtures.mjs +2 -1
  38. package/esm2022/libs/util/shared/src/index.mjs +2 -1
  39. package/esm2022/libs/util/shared/src/lib/gn-ui-version.mjs +6 -0
  40. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -1
  41. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +13 -6
  42. package/esm2022/translations/de.json +24 -3
  43. package/esm2022/translations/en.json +26 -5
  44. package/esm2022/translations/es.json +24 -3
  45. package/esm2022/translations/fr.json +24 -3
  46. package/esm2022/translations/it.json +24 -3
  47. package/esm2022/translations/nl.json +24 -3
  48. package/esm2022/translations/pt.json +24 -3
  49. package/fesm2022/geonetwork-ui.mjs +882 -451
  50. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  51. package/libs/api/metadata-converter/src/lib/base.converter.d.ts.map +1 -1
  52. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  53. package/libs/api/repository/src/lib/gn4/gn4.provider.d.ts.map +1 -1
  54. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +2 -2
  55. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  56. package/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.d.ts.map +1 -1
  57. package/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.d.ts +6 -6
  58. package/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.d.ts.map +1 -1
  59. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts.map +1 -1
  60. package/libs/feature/record/src/index.d.ts +0 -1
  61. package/libs/feature/record/src/index.d.ts.map +1 -1
  62. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts +9 -1
  63. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts.map +1 -1
  64. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +2 -3
  65. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
  66. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +1 -2
  67. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
  68. package/libs/feature/record/src/lib/record-meta/record-meta.component.d.ts +2 -2
  69. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +3 -1
  70. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  71. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +7 -7
  72. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  73. package/libs/feature/router/src/lib/default/constants.d.ts +2 -0
  74. package/libs/feature/router/src/lib/default/constants.d.ts.map +1 -1
  75. package/libs/feature/router/src/lib/default/router.config.d.ts +2 -0
  76. package/libs/feature/router/src/lib/default/router.config.d.ts.map +1 -1
  77. package/libs/feature/router/src/lib/default/router.service.d.ts.map +1 -1
  78. package/libs/feature/router/src/lib/default/state/router.facade.d.ts +5 -0
  79. package/libs/feature/router/src/lib/default/state/router.facade.d.ts.map +1 -1
  80. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  81. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  82. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -1
  83. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -1
  84. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts +5 -3
  85. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts.map +1 -1
  86. package/libs/ui/elements/src/index.d.ts +1 -0
  87. package/libs/ui/elements/src/index.d.ts.map +1 -1
  88. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +2 -2
  89. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  90. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts +30 -0
  91. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts.map +1 -0
  92. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +2 -1
  93. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  94. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +2 -0
  95. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -1
  96. package/libs/ui/map/src/index.d.ts +1 -0
  97. package/libs/ui/map/src/index.d.ts.map +1 -1
  98. package/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.d.ts +15 -0
  99. package/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.d.ts.map +1 -0
  100. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  101. package/libs/util/app-config/src/lib/app-config.d.ts.map +1 -1
  102. package/libs/util/app-config/src/lib/fixtures.d.ts.map +1 -1
  103. package/libs/util/shared/src/index.d.ts +1 -0
  104. package/libs/util/shared/src/index.d.ts.map +1 -1
  105. package/libs/util/shared/src/lib/gn-ui-version.d.ts +3 -0
  106. package/libs/util/shared/src/lib/gn-ui-version.d.ts.map +1 -0
  107. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts +3 -3
  108. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
  109. package/libs/util/shared/src/lib/links/link-utils.d.ts +14 -7
  110. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  111. package/package.json +1 -1
  112. package/src/libs/api/metadata-converter/src/lib/base.converter.ts +1 -4
  113. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.service+eaux-usees.ts +2 -2
  114. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +2 -2
  115. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +2 -2
  116. package/src/libs/api/metadata-converter/src/lib/fixtures/wallonie.records.service+napitswallonia.ts +2 -2
  117. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +2 -2
  118. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +2 -2
  119. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +3 -3
  120. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +1 -9
  121. package/src/libs/api/repository/src/lib/gn4/gn4.provider.ts +6 -0
  122. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +2 -2
  123. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +26 -26
  124. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +2 -2
  125. package/src/libs/common/fixtures/src/lib/record-link.fixtures.ts +5 -5
  126. package/src/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.ts +1 -2
  127. package/src/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.ts +2 -2
  128. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.html +2 -2
  129. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.ts +2 -2
  130. package/src/libs/feature/record/src/index.ts +0 -1
  131. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +2 -3
  132. package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +4 -5
  133. package/src/libs/feature/record/src/lib/record-meta/record-meta.component.ts +2 -2
  134. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +5 -3
  135. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +4 -7
  136. package/src/libs/feature/router/src/lib/default/constants.ts +2 -0
  137. package/src/libs/feature/router/src/lib/default/router.config.ts +2 -0
  138. package/src/libs/feature/router/src/lib/default/router.service.ts +10 -0
  139. package/src/libs/feature/router/src/lib/default/state/router.facade.ts +10 -1
  140. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +2 -2
  141. package/src/libs/feature/search/src/lib/feature-search.module.ts +0 -8
  142. package/src/libs/feature/search/src/lib/record-url.token.ts +10 -1
  143. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.html +1 -0
  144. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +24 -5
  145. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -1
  146. package/src/libs/ui/elements/src/index.ts +1 -0
  147. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +2 -2
  148. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +1 -1
  149. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.css +9 -0
  150. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +13 -4
  151. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +12 -4
  152. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.html +96 -0
  153. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.ts +183 -0
  154. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +3 -0
  155. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +3 -7
  156. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +13 -0
  157. package/src/libs/ui/map/src/index.ts +1 -0
  158. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.css +0 -0
  159. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.html +4 -0
  160. package/src/libs/{feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.ts → ui/map/src/lib/components/spatial-extent/spatial-extent.component.ts} +7 -8
  161. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +7 -4
  162. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +2 -1
  163. package/src/libs/util/app-config/src/lib/app-config.ts +1 -0
  164. package/src/libs/util/app-config/src/lib/fixtures.ts +1 -0
  165. package/src/libs/util/shared/src/index.ts +1 -0
  166. package/src/libs/util/shared/src/lib/gn-ui-version.ts +8 -0
  167. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +12 -3
  168. package/src/libs/util/shared/src/lib/links/link-utils.ts +30 -12
  169. package/tailwind.base.css +3 -3
  170. package/translations/de.json +24 -3
  171. package/translations/en.json +26 -5
  172. package/translations/es.json +24 -3
  173. package/translations/fr.json +24 -3
  174. package/translations/it.json +24 -3
  175. package/translations/nl.json +24 -3
  176. package/translations/pt.json +24 -3
  177. package/translations/sk.json +24 -3
  178. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.mjs +0 -79
  179. package/esm2022/libs/feature/record/src/lib/gn-ui-version.token.mjs +0 -3
  180. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.d.ts +0 -15
  181. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.d.ts.map +0 -1
  182. package/libs/feature/record/src/lib/gn-ui-version.token.d.ts +0 -3
  183. package/libs/feature/record/src/lib/gn-ui-version.token.d.ts.map +0 -1
  184. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.html +0 -1
  185. package/src/libs/feature/record/src/lib/gn-ui-version.token.ts +0 -3
  186. /package/src/libs/{feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.css → ui/elements/src/lib/service-capabilities/service-capabilities.component.css} +0 -0
@@ -0,0 +1,183 @@
1
+ import { ChangeDetectorRef, Component, Input, OnInit } from '@angular/core'
2
+ import { CommonModule } from '@angular/common'
3
+ import { TranslateModule, TranslateService } from '@ngx-translate/core'
4
+ import { getLayers } from '../../../../../../libs/util/shared/src'
5
+ import { ButtonComponent, TextInputComponent } from '../../../../../../libs/ui/inputs/src'
6
+ import { NgIcon, provideIcons } from '@ng-icons/core'
7
+ import { iconoirSearch } from '@ng-icons/iconoir'
8
+ import { marker } from '@biesbjerg/ngx-translate-extract-marker'
9
+ import { matInfoOutline } from '@ng-icons/material-icons/outline'
10
+ import {
11
+ PopoverComponent,
12
+ SpinningLoaderComponent,
13
+ } from '../../../../../../libs/ui/widgets/src'
14
+ import {
15
+ WfsFeatureTypeFull,
16
+ WmsLayerFull,
17
+ WmtsLayer,
18
+ } from '@camptocamp/ogc-client'
19
+
20
+ marker(`service.metadata.search`)
21
+ marker(`service.metadata.capabilities.title`)
22
+ marker(`service.metadata.capabilities.abstract`)
23
+ marker(`service.metadata.capabilities.name`)
24
+ marker(`service.metadata.capabilities.defaultCrs`)
25
+ marker(`service.metadata.capabilities.availableCrs`)
26
+ marker(`service.metadata.capabilities.otherCrs`)
27
+ marker(`service.metadata.capabilities.objectCount`)
28
+ marker(`service.metadata.capabilities.geometryName`)
29
+ marker(`service.metadata.capabilities.geometryType`)
30
+ marker(`service.metadata.capabilities.keywords`)
31
+ marker(`service.metadata.capabilities.outputFormats`)
32
+ marker(`service.metadata.capabilities.resourceLinks`)
33
+ marker(`service.metadata.capabilities.attribution`)
34
+
35
+ @Component({
36
+ selector: 'gn-ui-service-capabilities',
37
+ standalone: true,
38
+ imports: [
39
+ CommonModule,
40
+ TranslateModule,
41
+ ButtonComponent,
42
+ TextInputComponent,
43
+ NgIcon,
44
+ PopoverComponent,
45
+ SpinningLoaderComponent,
46
+ ],
47
+ viewProviders: [
48
+ provideIcons({
49
+ iconoirSearch,
50
+ matInfoOutline,
51
+ }),
52
+ ],
53
+ templateUrl: './service-capabilities.component.html',
54
+ styleUrl: './service-capabilities.component.css',
55
+ })
56
+ export class ServiceCapabilitiesComponent implements OnInit {
57
+ @Input() apiLinks = []
58
+ availableLayers = []
59
+ filteredLayers = []
60
+ selectedLayer = null
61
+ layerInformation = []
62
+ searchQuery = ''
63
+ loading = false
64
+ searchActive
65
+
66
+ capabilitiesKeys = [
67
+ 'title',
68
+ 'abstract',
69
+ 'name',
70
+ 'defaultCrs',
71
+ 'availableCrs',
72
+ 'otherCrs',
73
+ 'objectCount',
74
+ 'geometryName',
75
+ 'geometryType',
76
+ 'keywords',
77
+ 'outputFormats',
78
+ 'resourceLinks',
79
+ 'attribution',
80
+ ]
81
+
82
+ constructor(
83
+ private cdr: ChangeDetectorRef,
84
+ private translateService: TranslateService
85
+ ) {}
86
+
87
+ ngOnInit() {
88
+ this.loadLayers()
89
+ }
90
+
91
+ onSearchChange(event: Event) {
92
+ const input = event.target as HTMLInputElement
93
+ this.searchQuery = input.value
94
+ if (!input.value) {
95
+ this.searchActive = false
96
+ this.filteredLayers = this.availableLayers
97
+ }
98
+ }
99
+
100
+ onSearchEnter(event: KeyboardEvent) {
101
+ if (event.key === 'Enter') {
102
+ this.searchActive = true
103
+ this.searchLayers()
104
+ }
105
+ }
106
+
107
+ async loadLayers() {
108
+ if (
109
+ this.apiLinks.length > 0 &&
110
+ this.apiLinks[0].accessServiceProtocol !== 'ogcFeatures'
111
+ ) {
112
+ this.loading = true
113
+ this.availableLayers = await getLayers(
114
+ this.apiLinks[0].url.href,
115
+ this.apiLinks[0].accessServiceProtocol
116
+ )
117
+ this.loading = false
118
+ this.cdr.detectChanges()
119
+ this.filteredLayers = this.availableLayers
120
+ } else {
121
+ this.availableLayers = []
122
+ }
123
+ }
124
+
125
+ selectLayer(layer: WfsFeatureTypeFull | WmsLayerFull | WmtsLayer) {
126
+ if (layer === this.selectedLayer) {
127
+ this.selectedLayer = null
128
+ this.layerInformation = []
129
+ return
130
+ }
131
+
132
+ this.selectedLayer = layer
133
+ const filteredInfo = []
134
+ Object.keys(layer).map((key) => {
135
+ if (this.capabilitiesKeys.includes(key)) {
136
+ const displayName = this.translateService.instant(
137
+ `service.metadata.capabilities.${key}`
138
+ )
139
+ if (key in layer && layer[key]?.length) {
140
+ filteredInfo.push({ displayName, value: layer[key] })
141
+ }
142
+ }
143
+ })
144
+
145
+ this.layerInformation = filteredInfo
146
+ }
147
+
148
+ isList(value: string | string[]) {
149
+ return Array.isArray(value)
150
+ }
151
+
152
+ getExtraInputClass() {
153
+ if (this.searchActive) {
154
+ return 'h-14 border rounded-lg border-primary text-primary focus:border-primary hover:border-primary'
155
+ }
156
+ return 'h-14 border rounded-lg'
157
+ }
158
+
159
+ searchLayers() {
160
+ this.searchActive = true
161
+ this.filteredLayers = this.availableLayers.filter((layer) => {
162
+ const query = this.searchQuery.toLowerCase()
163
+ if (layer.title) {
164
+ return (
165
+ layer.title.toLowerCase().includes(query) ||
166
+ layer.abstract?.toLowerCase().includes(query)
167
+ )
168
+ } else {
169
+ return layer.name.toLowerCase().includes(query)
170
+ }
171
+ })
172
+ if (!this.filteredLayers.includes(this.selectedLayer)) {
173
+ this.selectedLayer = null
174
+ this.layerInformation = []
175
+ }
176
+ }
177
+
178
+ getExtraClass(layerItem) {
179
+ return layerItem.title === this.selectedLayer?.title
180
+ ? `h-8 rounded-lg bg-primary-darker text-white hover:text-primary-darker hover:bg-white`
181
+ : `h-8 rounded-lg`
182
+ }
183
+ }
@@ -21,6 +21,7 @@ import { TimeSincePipe } from './user-feedback-item/time-since.pipe'
21
21
  import { UserPreviewComponent } from './user-preview/user-preview.component'
22
22
  import { ApplicationBannerComponent } from './application-banner/application-banner.component'
23
23
  import { InternalLinkCardComponent } from './internal-link-card/internal-link-card.component'
24
+ import { ServiceCapabilitiesComponent } from './service-capabilities/service-capabilities.component'
24
25
 
25
26
  @NgModule({
26
27
  imports: [
@@ -44,6 +45,7 @@ import { InternalLinkCardComponent } from './internal-link-card/internal-link-ca
44
45
  ImageInputComponent,
45
46
  ApplicationBannerComponent,
46
47
  InternalLinkCardComponent,
48
+ ServiceCapabilitiesComponent,
47
49
  ],
48
50
  providers: [
49
51
  provideNgIconsConfig({
@@ -59,6 +61,7 @@ import { InternalLinkCardComponent } from './internal-link-card/internal-link-ca
59
61
  ImageInputComponent,
60
62
  ApplicationBannerComponent,
61
63
  InternalLinkCardComponent,
64
+ ServiceCapabilitiesComponent,
62
65
  ],
63
66
  })
64
67
  export class UiElementsModule {}
@@ -31,11 +31,7 @@
31
31
  *ngFor="let item of items"
32
32
  (click)="handleRowClick(item)"
33
33
  data-cy="table-row"
34
- [title]="
35
- !item.extras?.edit && !isDraftPage
36
- ? ('editor.record.lock.reason' | translate)
37
- : ''
38
- "
34
+ [title]="getItemTitle(item) | translate"
39
35
  >
40
36
  <div
41
37
  class="relative h-0"
@@ -52,9 +48,9 @@
52
48
  class="table-row-cell px-3 py-1.5 flex items-center bg-white transition-colors duration-75 truncate border-b border-gray-200"
53
49
  [ngClass]="{
54
50
  'text-purple-light cursor-default':
55
- !item.extras?.edit && !isDraftPage,
51
+ (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset',
56
52
  'group-hover:text-main group-hover:bg-gray-50':
57
- item.extras?.edit || isDraftPage,
53
+ (item.extras?.edit || isDraftPage) && item.kind === 'dataset',
58
54
  }"
59
55
  >
60
56
  <ng-container
@@ -12,7 +12,11 @@ import { CommonModule } from '@angular/common'
12
12
  import { NgIconComponent, provideIcons } from '@ng-icons/core'
13
13
  import { iconoirNavArrowDown, iconoirNavArrowUp } from '@ng-icons/iconoir'
14
14
  import { TranslateModule } from '@ngx-translate/core'
15
+ import { marker } from '@biesbjerg/ngx-translate-extract-marker'
16
+ import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
15
17
 
18
+ marker('editor.record.lock.reason')
19
+ marker('editor.record.lock.format')
16
20
  @Component({
17
21
  selector: 'gn-ui-interactive-table',
18
22
  templateUrl: './interactive-table.component.html',
@@ -44,6 +48,15 @@ export class InteractiveTableComponent {
44
48
  }
45
49
  }
46
50
 
51
+ getItemTitle(item: CatalogRecord) {
52
+ if (!item.extras?.edit && !this.isDraftPage && item.kind === 'dataset') {
53
+ return 'editor.record.lock.reason'
54
+ } else if (item.kind !== 'dataset') {
55
+ return 'editor.record.lock.format'
56
+ }
57
+ return ''
58
+ }
59
+
47
60
  handleRowClick(item: unknown) {
48
61
  this.itemClick.emit(item)
49
62
  }
@@ -3,3 +3,4 @@ export * from './lib/components/map-container/map-settings.token'
3
3
  export * from './lib/components/feature-detail/feature-detail.component'
4
4
  export * from './lib/components/map-legend/map-legend.component'
5
5
  export * from './lib/map-utils'
6
+ export * from './lib/components/spatial-extent/spatial-extent.component'
@@ -0,0 +1,4 @@
1
+ <gn-ui-map-container
2
+ class="h-full w-full"
3
+ [context]="mapContext$ | async"
4
+ ></gn-ui-map-container>
@@ -1,27 +1,26 @@
1
- import { ChangeDetectionStrategy, Component, Input } from '@angular/core'
1
+ import { Component, Input } from '@angular/core'
2
2
  import { CommonModule } from '@angular/common'
3
3
  import { Geometry } from 'geojson'
4
4
  import GeoJSON, { GeoJSONFeatureCollection } from 'ol/format/GeoJSON'
5
- import { DatasetSpatialExtent } from '../../../../../../../../../libs/common/domain/src/lib/model/record'
6
5
  import { Polygon } from 'ol/geom'
7
6
  import {
8
7
  createViewFromLayer,
9
8
  MapContext,
10
9
  MapContextLayer,
11
10
  } from '@geospatial-sdk/core'
12
- import { MapContainerComponent } from '../../../../../../../../../libs/ui/map/src'
11
+ import { MapContainerComponent } from '../map-container/map-container.component'
13
12
  import { BehaviorSubject, Observable } from 'rxjs'
14
13
  import { switchMap } from 'rxjs/operators'
14
+ import { DatasetSpatialExtent } from '../../../../../../../libs/common/domain/src/lib/model/record'
15
15
 
16
16
  @Component({
17
- selector: 'gn-ui-form-field-map-container',
17
+ selector: 'gn-ui-spatial-extent',
18
18
  standalone: true,
19
19
  imports: [CommonModule, MapContainerComponent],
20
- templateUrl: './form-field-map-container.component.html',
21
- styleUrls: ['./form-field-map-container.component.css'],
22
- changeDetection: ChangeDetectionStrategy.OnPush,
20
+ templateUrl: './spatial-extent.component.html',
21
+ styleUrl: './spatial-extent.component.css',
23
22
  })
24
- export class FormFieldMapContainerComponent {
23
+ export class SpatialExtentComponent {
25
24
  @Input() set spatialExtents(value: DatasetSpatialExtent[]) {
26
25
  this.spatialExtents$.next(value)
27
26
  }
@@ -9,10 +9,10 @@
9
9
  <ng-icon
10
10
  name="iconoirLock"
11
11
  class="text-purple"
12
- *ngIf="!item.extras?.edit && !isDraftPage"
12
+ *ngIf="(!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset'"
13
13
  ></ng-icon>
14
14
  <gn-ui-checkbox
15
- *ngIf="item.extras?.edit || isDraftPage"
15
+ *ngIf="(item.extras?.edit || isDraftPage) && item.kind === 'dataset'"
16
16
  [checked]="isChecked(item)"
17
17
  (changed)="handleRecordSelectedChange($event, item)"
18
18
  class="-m-2"
@@ -149,11 +149,14 @@
149
149
  (buttonClick)="openActionMenu(item, template)"
150
150
  type="light"
151
151
  data-test="record-menu-button"
152
- [disabled]="!item.extras?.edit && !isDraftPage"
152
+ [disabled]="
153
+ (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset'
154
+ "
153
155
  >
154
156
  <ng-icon
155
157
  [ngClass]="{
156
- 'text-purple-light': !item.extras?.edit && !isDraftPage,
158
+ 'text-purple-light':
159
+ (!item.extras?.edit && !isDraftPage) || item.kind !== 'dataset',
157
160
  }"
158
161
  name="matMoreVert"
159
162
  ></ng-icon>
@@ -174,8 +174,9 @@ export class ResultsTableComponent {
174
174
  }
175
175
 
176
176
  handleRecordClick(item: CatalogRecord) {
177
- if (item?.extras?.edit || this.isDraftPage)
177
+ if ((item?.extras?.edit || this.isDraftPage) && item.kind === 'dataset') {
178
178
  this.recordClick.emit(item as CatalogRecord)
179
+ }
179
180
  }
180
181
 
181
182
  handleDuplicate(item: unknown) {
@@ -99,6 +99,7 @@ export function loadAppConfig() {
99
99
  'metadata_language',
100
100
  'login_url',
101
101
  'logout_url',
102
+ 'settings_url',
102
103
  'web_component_embedder_url',
103
104
  'languages',
104
105
  'contact_email',
@@ -7,6 +7,7 @@ proxy_path = "/proxy/?url="
7
7
  metadata_language = "fre"
8
8
  login_url = "/cas/login?service="
9
9
  logout_url = "/geonetwork/signout"
10
+ settings_url = "/geonetwork/settings"
10
11
  web_component_embedder_url = "/datahub/wc-embedder.html"
11
12
 
12
13
  [map]
@@ -3,3 +3,4 @@ export * from './lib/services'
3
3
  export * from './lib/utils'
4
4
  export * from './lib/links'
5
5
  export * from './lib/image-fallback.directive'
6
+ export * from './lib/gn-ui-version'
@@ -0,0 +1,8 @@
1
+ import packageJson from '../../../../../package.json'
2
+
3
+ export const GEONETWORK_UI_VERSION = packageJson.version
4
+
5
+ export const GEONETWORK_UI_TAG_NAME =
6
+ GEONETWORK_UI_VERSION.split('-')[1] === 'dev'
7
+ ? 'main'
8
+ : `v${packageJson.version}`
@@ -1,5 +1,8 @@
1
1
  import { Injectable } from '@angular/core'
2
- import { DatasetOnlineResource } from '../../../../../../libs/common/domain/src/lib/model/record'
2
+ import {
3
+ DatasetOnlineResource,
4
+ ServiceOnlineResource,
5
+ } from '../../../../../../libs/common/domain/src/lib/model/record'
3
6
  import { getFileFormat } from './link-utils'
4
7
 
5
8
  export enum LinkUsage {
@@ -16,8 +19,11 @@ export enum LinkUsage {
16
19
  providedIn: 'root',
17
20
  })
18
21
  export class LinkClassifierService {
19
- getUsagesForLink(link: DatasetOnlineResource): LinkUsage[] {
22
+ getUsagesForLink(
23
+ link: DatasetOnlineResource | ServiceOnlineResource
24
+ ): LinkUsage[] {
20
25
  switch (link.type) {
26
+ case 'endpoint':
21
27
  case 'service': {
22
28
  switch (link.accessServiceProtocol) {
23
29
  case 'esriRest':
@@ -54,7 +60,10 @@ export class LinkClassifierService {
54
60
  }
55
61
  }
56
62
 
57
- hasUsage(link: DatasetOnlineResource, usage: LinkUsage) {
63
+ hasUsage(
64
+ link: DatasetOnlineResource | ServiceOnlineResource,
65
+ usage: LinkUsage
66
+ ) {
58
67
  return this.getUsagesForLink(link).indexOf(usage) > -1
59
68
  }
60
69
  }
@@ -1,6 +1,7 @@
1
1
  import { marker } from '@biesbjerg/ngx-translate-extract-marker'
2
2
  import {
3
3
  DatasetOnlineResource,
4
+ ServiceOnlineResource,
4
5
  ServiceProtocol,
5
6
  } from '../../../../../../libs/common/domain/src/lib/model/record'
6
7
  import {
@@ -140,7 +141,9 @@ export function getFormatPriority(linkFormat: FileFormat): number {
140
141
  return 0
141
142
  }
142
143
 
143
- export function getLinkPriority(link: DatasetOnlineResource): number {
144
+ export function getLinkPriority(
145
+ link: DatasetOnlineResource | ServiceOnlineResource
146
+ ): number {
144
147
  return getFormatPriority(getFileFormat(link))
145
148
  }
146
149
 
@@ -164,7 +167,9 @@ export function getFileFormatFromServiceOutput(
164
167
  return null
165
168
  }
166
169
 
167
- export function getFileFormat(link: DatasetOnlineResource): FileFormat {
170
+ export function getFileFormat(
171
+ link: DatasetOnlineResource | ServiceOnlineResource
172
+ ): FileFormat {
168
173
  if ('mimeType' in link) {
169
174
  const mimeTypeFormat = mimeTypeToFormat(link.mimeType)
170
175
  if (mimeTypeFormat !== null) {
@@ -181,7 +186,7 @@ export function getFileFormat(link: DatasetOnlineResource): FileFormat {
181
186
  }
182
187
 
183
188
  export function isFormatInQueryParam(
184
- link: DatasetOnlineResource,
189
+ link: DatasetOnlineResource | ServiceOnlineResource,
185
190
  alias: string
186
191
  ): boolean {
187
192
  const queryParams = link.url.searchParams
@@ -203,7 +208,7 @@ export function mimeTypeToFormat(mimeType: string): FileFormat {
203
208
  }
204
209
 
205
210
  export function checkFileFormat(
206
- link: DatasetOnlineResource,
211
+ link: DatasetOnlineResource | ServiceOnlineResource,
207
212
  format: FileFormat
208
213
  ): boolean {
209
214
  return (
@@ -225,7 +230,9 @@ export function getBadgeColor(linkFormat: FileFormat): string {
225
230
  return 'var(--color-gray-700)' // Default color ?
226
231
  }
227
232
 
228
- export function getLinkLabel(link: DatasetOnlineResource): string {
233
+ export function getLinkLabel(
234
+ link: DatasetOnlineResource | ServiceOnlineResource
235
+ ): string {
229
236
  let format = ''
230
237
  switch (link.type) {
231
238
  case 'service':
@@ -249,7 +256,7 @@ export function getLinkLabel(link: DatasetOnlineResource): string {
249
256
  default:
250
257
  format = getFileFormat(link)
251
258
  }
252
- const label = link.description || link.name
259
+ const label = link.description || ('name' in link ? link.name : '')
253
260
  return format ? `${label} (${format})` : label
254
261
  }
255
262
 
@@ -261,14 +268,25 @@ export async function getLayers(url: string, serviceProtocol: ServiceProtocol) {
261
268
  }
262
269
  case 'wfs': {
263
270
  const endpointWfs = await new WfsEndpoint(url).isReady()
264
- return endpointWfs.getFeatureTypes()
271
+ const featureTypes = await endpointWfs.getFeatureTypes()
272
+ const layers = await Promise.all(
273
+ featureTypes.map(async (collection) => {
274
+ return await endpointWfs.getFeatureTypeFull(collection.name)
275
+ })
276
+ )
277
+ return layers
265
278
  }
266
279
  case 'wms': {
267
280
  const endpointWms = await new WmsEndpoint(url).isReady()
268
- return endpointWms
269
- .getLayers()
270
- .flatMap(wmsLayerFlatten)
271
- .filter((l) => l.name)
281
+ const layers = (
282
+ await endpointWms
283
+ .getLayers()
284
+ .flatMap(wmsLayerFlatten)
285
+ .filter((l) => l.name)
286
+ ).map((collection) => {
287
+ return endpointWms.getLayerByName(collection.name)
288
+ })
289
+ return layers
272
290
  }
273
291
  case 'wmts': {
274
292
  const endpointWmts = await new WmtsEndpoint(url).isReady()
@@ -279,7 +297,7 @@ export async function getLayers(url: string, serviceProtocol: ServiceProtocol) {
279
297
  }
280
298
  }
281
299
 
282
- function wmsLayerFlatten(layerFull) {
300
+ export function wmsLayerFlatten(layerFull) {
283
301
  const layer = {
284
302
  title: layerFull.title,
285
303
  name: layerFull.name,
package/tailwind.base.css CHANGED
@@ -94,8 +94,8 @@
94
94
 
95
95
  .gn-ui-btn-default {
96
96
  @apply gn-ui-btn text-white
97
- bg-gray-700 hover:bg-gray-800 active:bg-gray-900
98
- border-gray-700 focus:ring-4 focus:ring-gray-200;
97
+ bg-gray-700 hover:bg-gray-800 hover:!text-white active:bg-gray-900
98
+ border-gray-700 focus:ring-4 focus:ring-gray-200 focus:text-gray-900;
99
99
  }
100
100
 
101
101
  .gn-ui-btn-primary {
@@ -230,7 +230,7 @@
230
230
 
231
231
  /* Section title */
232
232
  .gn-ui-section-title {
233
- @apply text-title font-medium pt-9 text-[28px] container-lg px-4 lg:mx-auto;
233
+ @apply text-title font-medium pt-9 text-[28px];
234
234
  }
235
235
  }
236
236
 
@@ -233,6 +233,7 @@
233
233
  "editor.record.loadError.body": "Der Datensatz konnte nicht geladen werden:",
234
234
  "editor.record.loadError.closeMessage": "Verstanden",
235
235
  "editor.record.loadError.title": "Fehler beim Laden des Datensatzes",
236
+ "editor.record.lock.format": "",
236
237
  "editor.record.lock.reason": "",
237
238
  "editor.record.onlineResource.protocol.other": "",
238
239
  "editor.record.onlineResourceError.body": "",
@@ -292,7 +293,6 @@
292
293
  "input.image.dropFileLabel": "",
293
294
  "input.image.selectFileLabel": "",
294
295
  "input.image.uploadErrorLabel": "",
295
- "input.image.uploadErrorRetry": "",
296
296
  "input.image.uploadProgressCancel": "",
297
297
  "input.image.uploadProgressLabel": "",
298
298
  "language.ca": "Katalanisch",
@@ -359,6 +359,7 @@
359
359
  "record.card.metadata.contact": "",
360
360
  "record.externalViewer.open": "In externem Kartenviewer öffnen",
361
361
  "record.feature.limit": "Die Vorschau wurde aufgrund zu vieler Elemente deaktiviert",
362
+ "record.kind.data": "",
362
363
  "record.kind.dataset": "",
363
364
  "record.kind.reuse": "",
364
365
  "record.kind.service": "",
@@ -432,13 +433,12 @@
432
433
  "record.metadata.quality.updateFrequency.failed": "Aktualisierungsfrequenz nicht angegeben",
433
434
  "record.metadata.quality.updateFrequency.success": "Aktualisierungsfrequenz angegeben",
434
435
  "record.metadata.related": "Ähnliche Datensätze",
435
- "record.metadata.related.contents": "Verwandte Inhalte",
436
+ "record.metadata.related.contents": "",
436
437
  "record.metadata.ressources.and.links": "Ressourcen und Links",
437
438
  "record.metadata.sheet": "Weitere Informationen verfügbar unter:",
438
439
  "record.metadata.status": "Status",
439
440
  "record.metadata.status.notPublished": "",
440
441
  "record.metadata.status.published": "",
441
- "record.metadata.technical": "Technische Informationen",
442
442
  "record.metadata.temporalExtent": "Zeitlicher Umfang",
443
443
  "record.metadata.temporalExtent.fromDateToDate": "Von {start} bis {end}",
444
444
  "record.metadata.temporalExtent.sinceDate": "Seit {start}",
@@ -475,6 +475,7 @@
475
475
  "results.sortBy.popularity": "Beliebtheit",
476
476
  "results.sortBy.qualityScore": "Qualitätsbewertung",
477
477
  "results.sortBy.relevancy": "Relevanz",
478
+ "reuse.metadata.access": "",
478
479
  "search.autocomplete.error": "Vorschläge konnten nicht abgerufen werden:",
479
480
  "search.error.couldNotReachApi": "Die API konnte nicht erreicht werden",
480
481
  "search.error.organizationHasNoDataset": "",
@@ -524,6 +525,26 @@
524
525
  "search.filters.useSpatialFilter": "Zuerst Datensätze im Interessenbereich anzeigen",
525
526
  "search.filters.useSpatialFilterHelp": "Wenn diese Option aktiviert ist, werden Datensätze im Bereich des Katalogs zuerst angezeigt. Datensätze außerhalb dieses Bereichs werden nicht angezeigt.",
526
527
  "search.filters.user": "Editor",
528
+ "service.metadata.capabilities": "",
529
+ "service.metadata.capabilities.abstract": "",
530
+ "service.metadata.capabilities.attribution": "",
531
+ "service.metadata.capabilities.availableCrs": "",
532
+ "service.metadata.capabilities.defaultCrs": "",
533
+ "service.metadata.capabilities.geometryName": "",
534
+ "service.metadata.capabilities.geometryType": "",
535
+ "service.metadata.capabilities.keywords": "",
536
+ "service.metadata.capabilities.name": "",
537
+ "service.metadata.capabilities.objectCount": "",
538
+ "service.metadata.capabilities.otherCrs": "",
539
+ "service.metadata.capabilities.outputFormats": "",
540
+ "service.metadata.capabilities.resourceLinks": "",
541
+ "service.metadata.capabilities.title": "",
542
+ "service.metadata.filter": "",
543
+ "service.metadata.filter.noLayers": "",
544
+ "service.metadata.other": "",
545
+ "service.metadata.question": "",
546
+ "service.metadata.search": "",
547
+ "service.metadata.spatialExtent": "",
527
548
  "share.tab.permalink": "Teilen",
528
549
  "share.tab.webComponent": "Integrieren",
529
550
  "table.loading.data": "Daten werden geladen...",