geonetwork-ui 2.2.0-dev.3678ce55 → 2.2.0-dev.3ee8e2c9

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 (223) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +2 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +36 -2
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +2 -1
  4. package/esm2022/libs/api/repository/src/index.mjs +2 -1
  5. package/esm2022/libs/api/repository/src/lib/gn4/index.mjs +3 -1
  6. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  7. package/esm2022/libs/feature/auth/src/lib/feature-auth.module.mjs +2 -2
  8. package/esm2022/libs/feature/catalog/src/lib/feature-catalog.module.mjs +2 -2
  9. package/esm2022/libs/feature/catalog/src/lib/organisations/organisations.component.mjs +4 -15
  10. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +5 -4
  11. package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +5 -3
  12. package/esm2022/libs/feature/map/src/index.mjs +2 -1
  13. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.mjs +1 -1
  14. package/esm2022/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.mjs +106 -0
  15. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +64 -0
  16. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +63 -0
  17. package/esm2022/libs/feature/map/src/lib/constant/index.mjs +2 -1
  18. package/esm2022/libs/feature/map/src/lib/constant/projections.mjs +2 -0
  19. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +17 -3
  20. package/esm2022/libs/feature/map/src/lib/geocoding/geocoding.component.mjs +76 -0
  21. package/esm2022/libs/feature/map/src/lib/layers-panel/layers-panel.component.mjs +6 -3
  22. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +3 -1
  23. package/esm2022/libs/feature/map/src/lib/utils/index.mjs +1 -3
  24. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +60 -29
  25. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +29 -20
  26. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +9 -6
  27. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +2 -2
  28. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +1 -1
  29. package/esm2022/libs/feature/search/src/lib/state/effects.mjs +3 -3
  30. package/esm2022/libs/feature/search/src/lib/utils/service/fields.mjs +2 -2
  31. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +4 -4
  32. package/esm2022/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.mjs +1 -1
  33. package/esm2022/libs/ui/elements/src/index.mjs +4 -1
  34. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +3 -3
  35. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +27 -0
  36. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +17 -0
  37. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +10 -3
  38. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +12 -6
  39. package/esm2022/libs/ui/elements/src/lib/related-record-card/related-record-card.component.mjs +3 -3
  40. package/esm2022/libs/ui/elements/src/lib/thumbnail/thumbnail.component.mjs +7 -3
  41. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +15 -3
  42. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +2 -2
  43. package/esm2022/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.mjs +6 -3
  44. package/esm2022/libs/ui/inputs/src/lib/editable-label/editable-label.directive.mjs +45 -0
  45. package/esm2022/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.mjs +3 -3
  46. package/esm2022/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.mjs +2 -2
  47. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +8 -3
  48. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +2 -2
  49. package/esm2022/libs/ui/search/src/lib/record-preview-card/record-preview-card.component.mjs +1 -1
  50. package/esm2022/libs/ui/search/src/lib/record-preview-feed/record-preview-feed.component.mjs +1 -1
  51. package/esm2022/libs/ui/search/src/lib/record-preview-list/record-preview-list.component.mjs +1 -1
  52. package/esm2022/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.mjs +1 -1
  53. package/esm2022/libs/ui/search/src/lib/record-preview-title/record-preview-title.component.mjs +1 -1
  54. package/esm2022/libs/ui/search/src/lib/record-table/record-table.component.mjs +3 -3
  55. package/esm2022/libs/util/i18n/src/index.mjs +2 -1
  56. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +29 -13
  57. package/esm2022/libs/util/shared/src/lib/utils/fuzzy-filter.mjs +27 -0
  58. package/esm2022/libs/util/shared/src/lib/utils/index.mjs +2 -1
  59. package/esm2022/translations/de.json +102 -87
  60. package/esm2022/translations/en.json +35 -20
  61. package/esm2022/translations/es.json +15 -0
  62. package/esm2022/translations/fr.json +19 -4
  63. package/esm2022/translations/it.json +27 -12
  64. package/esm2022/translations/nl.json +15 -0
  65. package/esm2022/translations/pt.json +15 -0
  66. package/fesm2022/geonetwork-ui.mjs +856 -298
  67. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  68. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts +1 -0
  69. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  70. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  71. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -1
  72. package/libs/api/repository/src/index.d.ts +1 -0
  73. package/libs/api/repository/src/index.d.ts.map +1 -1
  74. package/libs/api/repository/src/lib/gn4/index.d.ts +2 -0
  75. package/libs/api/repository/src/lib/gn4/index.d.ts.map +1 -1
  76. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +10 -5
  77. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  78. package/libs/feature/catalog/src/lib/organisations/organisations.component.d.ts +0 -1
  79. package/libs/feature/catalog/src/lib/organisations/organisations.component.d.ts.map +1 -1
  80. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +15 -2
  81. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  82. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +1 -1
  83. package/libs/feature/map/src/index.d.ts +1 -0
  84. package/libs/feature/map/src/index.d.ts.map +1 -1
  85. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts +22 -0
  86. package/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.d.ts.map +1 -0
  87. package/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.d.ts +22 -0
  88. package/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.d.ts.map +1 -0
  89. package/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.d.ts +22 -0
  90. package/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.d.ts.map +1 -0
  91. package/libs/feature/map/src/lib/constant/index.d.ts +1 -0
  92. package/libs/feature/map/src/lib/constant/index.d.ts.map +1 -1
  93. package/libs/feature/map/src/lib/constant/projections.d.ts.map +1 -0
  94. package/libs/feature/map/src/lib/feature-map.module.d.ts +16 -12
  95. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  96. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts +20 -0
  97. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts.map +1 -0
  98. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +1 -0
  99. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  100. package/libs/feature/map/src/lib/utils/index.d.ts +0 -2
  101. package/libs/feature/map/src/lib/utils/index.d.ts.map +1 -1
  102. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +13 -11
  103. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  104. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +1 -3
  105. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  106. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts +3 -2
  107. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  108. package/libs/feature/search/src/lib/state/effects.d.ts +1 -1
  109. package/libs/feature/search/src/lib/state/effects.d.ts.map +1 -1
  110. package/libs/feature/search/src/lib/utils/service/fields.d.ts +1 -1
  111. package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
  112. package/libs/ui/elements/src/index.d.ts +3 -0
  113. package/libs/ui/elements/src/index.d.ts.map +1 -1
  114. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  115. package/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.d.ts +10 -0
  116. package/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.d.ts.map +1 -0
  117. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts +8 -0
  118. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts.map +1 -0
  119. package/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.d.ts +1 -0
  120. package/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.d.ts.map +1 -1
  121. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +1 -0
  122. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  123. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts +3 -2
  124. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts.map +1 -1
  125. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +13 -11
  126. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  127. package/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.d.ts.map +1 -1
  128. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts +13 -0
  129. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts.map +1 -0
  130. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +18 -17
  131. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  132. package/libs/util/i18n/src/index.d.ts +1 -0
  133. package/libs/util/i18n/src/index.d.ts.map +1 -1
  134. package/libs/util/shared/src/lib/links/link-utils.d.ts +19 -7
  135. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  136. package/libs/util/shared/src/lib/utils/fuzzy-filter.d.ts +9 -0
  137. package/libs/util/shared/src/lib/utils/fuzzy-filter.d.ts.map +1 -0
  138. package/libs/util/shared/src/lib/utils/index.d.ts +1 -0
  139. package/libs/util/shared/src/lib/utils/index.d.ts.map +1 -1
  140. package/package.json +4 -1
  141. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +3 -0
  142. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +43 -0
  143. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +1 -0
  144. package/src/libs/api/repository/src/index.ts +1 -0
  145. package/src/libs/api/repository/src/lib/gn4/index.ts +2 -0
  146. package/src/libs/common/domain/src/lib/index.ts +2 -0
  147. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +12 -7
  148. package/src/libs/feature/auth/src/lib/feature-auth.module.ts +1 -1
  149. package/src/libs/feature/catalog/src/lib/feature-catalog.module.ts +1 -1
  150. package/src/libs/feature/catalog/src/lib/organisations/organisations.component.ts +3 -17
  151. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +8 -5
  152. package/src/libs/feature/editor/src/lib/record-form/record-form.component.ts +2 -1
  153. package/src/libs/feature/map/src/index.ts +1 -0
  154. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.css +0 -0
  155. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.html +21 -0
  156. package/src/libs/feature/map/src/lib/add-layer-from-file/add-layer-from-file.component.ts +107 -0
  157. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.css +0 -0
  158. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.html +37 -0
  159. package/src/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.ts +64 -0
  160. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.css +0 -0
  161. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.html +55 -0
  162. package/src/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.ts +63 -0
  163. package/src/libs/feature/map/src/lib/constant/index.ts +1 -0
  164. package/src/libs/feature/map/src/lib/feature-map.module.ts +9 -0
  165. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.css +0 -0
  166. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.html +39 -0
  167. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.ts +83 -0
  168. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.html +9 -3
  169. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +6 -0
  170. package/src/libs/feature/map/src/lib/utils/index.ts +0 -2
  171. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +85 -50
  172. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +18 -3
  173. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +12 -4
  174. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +2 -4
  175. package/src/libs/feature/search/src/lib/feature-search.module.ts +1 -1
  176. package/src/libs/feature/search/src/lib/state/effects.ts +1 -1
  177. package/src/libs/feature/search/src/lib/utils/service/fields.ts +1 -1
  178. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -0
  179. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.ts +1 -1
  180. package/src/libs/ui/elements/src/index.ts +3 -0
  181. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +4 -1
  182. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.css +0 -0
  183. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +29 -0
  184. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.ts +15 -0
  185. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +264 -0
  186. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.html +1 -0
  187. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.ts +16 -0
  188. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +93 -27
  189. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.ts +7 -0
  190. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.css +4 -0
  191. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +59 -32
  192. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +5 -0
  193. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.html +1 -1
  194. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.ts +4 -0
  195. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +7 -0
  196. package/src/libs/ui/inputs/src/lib/button/button.component.css +1 -1
  197. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.ts +7 -4
  198. package/src/libs/ui/inputs/src/lib/editable-label/editable-label.directive.ts +47 -0
  199. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +8 -3
  200. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.css +1 -0
  201. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +3 -0
  202. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +1 -1
  203. package/src/libs/ui/search/src/lib/record-table/record-table.component.html +2 -2
  204. package/src/libs/util/i18n/src/index.ts +1 -0
  205. package/src/libs/util/shared/src/lib/links/link-utils.ts +34 -11
  206. package/src/libs/util/shared/src/lib/utils/fuzzy-filter.ts +32 -0
  207. package/src/libs/util/shared/src/lib/utils/index.ts +1 -0
  208. package/translations/de.json +102 -87
  209. package/translations/en.json +35 -20
  210. package/translations/es.json +15 -0
  211. package/translations/fr.json +19 -4
  212. package/translations/it.json +27 -12
  213. package/translations/nl.json +15 -0
  214. package/translations/pt.json +15 -0
  215. package/translations/sk.json +15 -0
  216. package/esm2022/libs/feature/map/src/lib/utils/map-utils-wms.service.mjs +0 -55
  217. package/esm2022/libs/feature/map/src/lib/utils/projections.mjs +0 -2
  218. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts +0 -17
  219. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts.map +0 -1
  220. package/libs/feature/map/src/lib/utils/projections.d.ts.map +0 -1
  221. package/src/libs/feature/map/src/lib/utils/map-utils-wms.service.ts +0 -58
  222. /package/libs/feature/map/src/lib/{utils → constant}/projections.d.ts +0 -0
  223. /package/src/libs/feature/map/src/lib/{utils → constant}/projections.ts +0 -0
@@ -2,18 +2,18 @@ import { HttpClient } from '@angular/common/http'
2
2
  import { Injectable } from '@angular/core'
3
3
  import type { FeatureCollection } from 'geojson'
4
4
  import { extend, Extent, isEmpty } from 'ol/extent'
5
- import OlFeature, { FeatureLike } from 'ol/Feature'
5
+ import Feature from 'ol/Feature'
6
6
  import GeoJSON from 'ol/format/GeoJSON'
7
7
  import { Geometry } from 'ol/geom'
8
8
  import Layer from 'ol/layer/Layer'
9
9
  import Map from 'ol/Map'
10
- import { fromLonLat } from 'ol/proj'
10
+ import { transformExtent } from 'ol/proj'
11
11
  import Source from 'ol/source/Source'
12
12
  import ImageWMS from 'ol/source/ImageWMS'
13
13
  import TileWMS from 'ol/source/TileWMS'
14
14
  import VectorSource from 'ol/source/Vector'
15
- import { Options, optionsFromCapabilities } from 'ol/source/WMTS'
16
- import { DragPan, MouseWheelZoom, defaults, Interaction } from 'ol/interaction'
15
+ import { optionsFromCapabilities } from 'ol/source/WMTS'
16
+ import { defaults, DragPan, Interaction, MouseWheelZoom } from 'ol/interaction'
17
17
  import {
18
18
  mouseOnly,
19
19
  noModifierKeys,
@@ -21,45 +21,53 @@ import {
21
21
  primaryAction,
22
22
  } from 'ol/events/condition'
23
23
  import WMTSCapabilities from 'ol/format/WMTSCapabilities'
24
- import { from, Observable, of } from 'rxjs'
24
+ import { from, Observable } from 'rxjs'
25
25
  import { map } from 'rxjs/operators'
26
26
  import {
27
27
  MapContextLayerModel,
28
28
  MapContextLayerTypeEnum,
29
+ MapContextLayerWmsModel,
29
30
  MapContextLayerWmtsModel,
30
31
  } from '../map-context/map-context.model'
31
- import { MapUtilsWMSService } from './map-utils-wms.service'
32
32
  import Collection from 'ol/Collection'
33
33
  import MapBrowserEvent from 'ol/MapBrowserEvent'
34
- import { DatasetDistribution } from '../../../../../../libs/common/domain/src/lib/model/record'
34
+ import {
35
+ CatalogRecord,
36
+ DatasetDistribution,
37
+ } from '../../../../../../libs/common/domain/src/lib/model/record'
38
+ import { ProxyService } from '../../../../../../libs/util/shared/src'
39
+ import { WmsEndpoint } from '@camptocamp/ogc-client'
40
+ import { LONLAT_CRS_CODES } from '../constant/projections'
41
+ import { fromEPSGCode, register } from 'ol/proj/proj4'
42
+ import proj4 from 'proj4/dist/proj4'
35
43
 
36
44
  const FEATURE_PROJECTION = 'EPSG:3857'
37
45
  const DATA_PROJECTION = 'EPSG:4326'
38
46
 
47
+ const GEOJSON = new GeoJSON()
48
+
39
49
  @Injectable({
40
50
  providedIn: 'root',
41
51
  })
42
52
  export class MapUtilsService {
43
- constructor(private http: HttpClient, private wmsUtils: MapUtilsWMSService) {}
53
+ constructor(private http: HttpClient, private proxy: ProxyService) {}
44
54
 
45
55
  createEmptyMap(): Map {
46
- const map = new Map({
56
+ return new Map({
47
57
  controls: [],
48
58
  pixelRatio: 1,
49
59
  })
50
- return map
51
60
  }
52
61
 
53
62
  readFeatureCollection = (
54
63
  featureCollection: FeatureCollection,
55
64
  featureProjection = FEATURE_PROJECTION,
56
65
  dataProjection = DATA_PROJECTION
57
- ): FeatureLike[] => {
58
- const olFeatures = new GeoJSON().readFeatures(featureCollection, {
66
+ ): Feature<Geometry>[] => {
67
+ return GEOJSON.readFeatures(featureCollection, {
59
68
  featureProjection,
60
69
  dataProjection,
61
- })
62
- return olFeatures
70
+ }) as Feature<Geometry>[]
63
71
  }
64
72
 
65
73
  isWMSLayer(layer: Layer<Source>): boolean {
@@ -78,20 +86,14 @@ export class MapUtilsService {
78
86
  ...source.getParams(),
79
87
  INFO_FORMAT: 'application/json',
80
88
  }
81
- const url = source.getFeatureInfoUrl(
82
- coordinate,
83
- resolution,
84
- projection,
85
- params
86
- )
87
- return url
89
+ return source.getFeatureInfoUrl(coordinate, resolution, projection, params)
88
90
  }
89
91
 
90
- getVectorFeaturesFromClick(olMap, event): OlFeature<Geometry>[] {
92
+ getVectorFeaturesFromClick(olMap, event): Feature<Geometry>[] {
91
93
  const features = []
92
94
  const hit = olMap.forEachFeatureAtPixel(
93
95
  event.pixel,
94
- (feature: OlFeature<Geometry>) => {
96
+ (feature: Feature<Geometry>) => {
95
97
  return feature
96
98
  },
97
99
  { layerFilter: (layer) => layer.getSource() instanceof VectorSource }
@@ -103,9 +105,9 @@ export class MapUtilsService {
103
105
  }
104
106
 
105
107
  getGFIFeaturesObservablesFromClick(
106
- olMap,
107
- event
108
- ): Observable<OlFeature<Geometry>[]>[] {
108
+ olMap: Map,
109
+ event: MapBrowserEvent<PointerEvent>
110
+ ): Observable<Feature<Geometry>[]>[] {
109
111
  const wmsLayers = olMap.getLayers().getArray().filter(this.isWMSLayer)
110
112
 
111
113
  if (wmsLayers.length > 0) {
@@ -128,8 +130,8 @@ export class MapUtilsService {
128
130
  /**
129
131
  * Will emit `null` if no extent could be computed
130
132
  */
131
- getLayerExtent(layer: MapContextLayerModel): Observable<Extent | null> {
132
- let geographicExtent: Observable<Extent>
133
+ async getLayerExtent(layer: MapContextLayerModel): Promise<Extent | null> {
134
+ let latLonExtent: Extent
133
135
  if (
134
136
  layer &&
135
137
  layer.type === 'geojson' &&
@@ -138,37 +140,55 @@ export class MapUtilsService {
138
140
  layer.data.features[0] &&
139
141
  layer.data.features[0].geometry
140
142
  ) {
141
- geographicExtent = of(layer.data).pipe(
142
- map((layerData) =>
143
- new GeoJSON()
144
- .readFeatures(layerData)
145
- .map((feature) => feature.getGeometry())
146
- .filter((geom) => !!geom)
147
- .reduce(
148
- (prev, curr) =>
149
- prev ? extend(prev, curr.getExtent()) : curr.getExtent(),
150
- null as Extent
151
- )
143
+ latLonExtent = new GeoJSON()
144
+ .readFeatures(layer.data)
145
+ .map((feature) => feature.getGeometry())
146
+ .filter((geom) => !!geom)
147
+ .reduce(
148
+ (prev, curr) =>
149
+ prev ? extend(prev, curr.getExtent()) : curr.getExtent(),
150
+ null as Extent
152
151
  )
153
- )
154
152
  } else if (layer && layer.type === 'wms') {
155
- geographicExtent = this.wmsUtils.getLayerLonLatBBox(layer)
153
+ latLonExtent = await this.getWmsLayerExtent(layer)
156
154
  } else if (layer && layer.type === 'wmts') {
157
155
  if (layer.extent) {
158
- geographicExtent = of(layer.extent)
156
+ latLonExtent = layer.extent
159
157
  } else {
160
- return of(layer.options.tileGrid.getExtent())
158
+ return layer.options.tileGrid.getExtent()
161
159
  }
162
160
  } else {
163
- return of(null)
161
+ return null
162
+ }
163
+ if (!latLonExtent || isEmpty(latLonExtent)) {
164
+ return null
164
165
  }
165
- return geographicExtent.pipe(
166
- map((extent) => [
167
- ...fromLonLat([extent[0], extent[1]], 'EPSG:3857'),
168
- ...fromLonLat([extent[2], extent[3]], 'EPSG:3857'),
169
- ]),
170
- map((extent) => (isEmpty(extent) ? null : extent))
166
+ return transformExtent(latLonExtent, 'EPSG:4326', 'EPSG:3857')
167
+ }
168
+
169
+ async getWmsLayerExtent(
170
+ layer: MapContextLayerWmsModel
171
+ ): Promise<Extent | null> {
172
+ const endpoint = await new WmsEndpoint(
173
+ this.proxy.getProxiedUrl(layer.url)
174
+ ).isReady()
175
+ const { boundingBoxes } = endpoint.getLayerByName(layer.name)
176
+ if (!Object.keys(boundingBoxes).length) {
177
+ return null
178
+ }
179
+ const lonLatCRS = Object.keys(boundingBoxes)?.find((crs) =>
180
+ LONLAT_CRS_CODES.includes(crs)
171
181
  )
182
+ if (lonLatCRS) {
183
+ return boundingBoxes[lonLatCRS].map(parseFloat)
184
+ } else {
185
+ const availableEPSGCode = Object.keys(boundingBoxes)[0]
186
+ register(proj4)
187
+ const proj = await fromEPSGCode(availableEPSGCode)
188
+ const bboxWithFiniteNumbers =
189
+ boundingBoxes[availableEPSGCode].map(parseFloat)
190
+ return transformExtent(bboxWithFiniteNumbers, proj, 'EPSG:4326')
191
+ }
172
192
  }
173
193
 
174
194
  getWmtsLayerFromCapabilities(
@@ -235,6 +255,21 @@ ${e.stack || e.message || e}`)
235
255
  .getArray()
236
256
  )
237
257
  }
258
+
259
+ getRecordExtent(record: Partial<CatalogRecord>): Extent {
260
+ if (!('spatialExtents' in record)) {
261
+ return null
262
+ }
263
+ // transform an array of geojson geometries into a bbox
264
+ const totalExtent = record.spatialExtents.reduce(
265
+ (prev, curr) => {
266
+ const geom = GEOJSON.readGeometry(curr.geometry)
267
+ return extend(prev, geom.getExtent())
268
+ },
269
+ [Infinity, Infinity, -Infinity, -Infinity]
270
+ )
271
+ return transformExtent(totalExtent, 'EPSG:4326', 'EPSG:3857')
272
+ }
238
273
  }
239
274
 
240
275
  export function dragPanCondition(
@@ -22,10 +22,14 @@ import { StyleLike } from 'ol/style/Style'
22
22
  import {
23
23
  BehaviorSubject,
24
24
  combineLatest,
25
+ from,
26
+ lastValueFrom,
25
27
  Observable,
26
28
  of,
29
+ startWith,
27
30
  Subscription,
28
31
  throwError,
32
+ withLatestFrom,
29
33
  } from 'rxjs'
30
34
  import {
31
35
  catchError,
@@ -99,7 +103,7 @@ export class MapViewComponent implements OnInit, OnDestroy {
99
103
 
100
104
  mapContext$ = this.currentLayers$.pipe(
101
105
  switchMap((layers) =>
102
- this.mapUtils.getLayerExtent(layers[0]).pipe(
106
+ from(this.mapUtils.getLayerExtent(layers[0])).pipe(
103
107
  catchError((error) => {
104
108
  console.warn(error) // FIXME: report this to the user somehow
105
109
  return of(undefined)
@@ -115,7 +119,19 @@ export class MapViewComponent implements OnInit, OnDestroy {
115
119
  ),
116
120
  tap(() => this.resetSelection())
117
121
  )
118
- )
122
+ ),
123
+ withLatestFrom(this.mdViewFacade.metadata$),
124
+ map(([context, metadata]) => {
125
+ if (context.view.extent) return context
126
+ const extent = this.mapUtils.getRecordExtent(metadata)
127
+ return {
128
+ ...context,
129
+ view: {
130
+ ...context.view,
131
+ extent,
132
+ },
133
+ }
134
+ })
119
135
  )
120
136
 
121
137
  constructor(
@@ -123,7 +139,6 @@ export class MapViewComponent implements OnInit, OnDestroy {
123
139
  private mapManager: MapManagerService,
124
140
  private mapUtils: MapUtilsService,
125
141
  private dataService: DataService,
126
- private proxy: ProxyService,
127
142
  private featureInfo: FeatureInfoService,
128
143
  private changeRef: ChangeDetectorRef,
129
144
  private styleService: MapStyleService
@@ -1,10 +1,18 @@
1
- <div>
2
- <span class="align-text-top mr-1.5 favorite-count" *ngIf="hasFavoriteCount">{{
3
- favoriteCount
4
- }}</span>
1
+ <div class="flex flex-row content-center">
2
+ <span
3
+ class="align-text-top mr-1.5 mt-1.5 favorite-count"
4
+ *ngIf="hasFavoriteCount && displayCount"
5
+ >{{ favoriteCount }}</span
6
+ >
5
7
  <gn-ui-star-toggle
6
8
  [toggled]="isFavorite$ | async"
7
9
  (newValue)="toggleFavorite($event)"
8
10
  [disabled]="loading || (isAnonymous$ | async)"
11
+ class="mt-1"
9
12
  ></gn-ui-star-toggle>
13
+ <span
14
+ class="align-text-top ml-1.5 favorite-count mt-1.5"
15
+ *ngIf="!displayCount"
16
+ translate="datahub.record.addToFavorites"
17
+ ></span>
10
18
  </div>
@@ -14,10 +14,7 @@ import { TranslateService } from '@ngx-translate/core'
14
14
  import { StarToggleComponent } from '../../../../../../../libs/ui/inputs/src'
15
15
  import { Observable, Subscription } from 'rxjs'
16
16
  import { CatalogRecord } from '../../../../../../../libs/common/domain/src/lib/model/record'
17
- import {
18
- AuthService,
19
- FavoritesService,
20
- } from '../../../../../../../libs/api/repository/src/lib/gn4'
17
+ import { AuthService, FavoritesService } from '../../../../../../../libs/api/repository/src'
21
18
  import { PlatformServiceInterface } from '../../../../../../../libs/common/domain/src/lib/platform.service.interface'
22
19
 
23
20
  @Component({
@@ -27,6 +24,7 @@ import { PlatformServiceInterface } from '../../../../../../../libs/common/domai
27
24
  changeDetection: ChangeDetectionStrategy.OnPush,
28
25
  })
29
26
  export class FavoriteStarComponent implements AfterViewInit, OnDestroy {
27
+ @Input() displayCount? = true
30
28
  @Input() set record(value) {
31
29
  this.record_ = value
32
30
  this.favoriteCount =
@@ -23,7 +23,7 @@ import { FilterDropdownComponent } from './filter-dropdown/filter-dropdown.compo
23
23
  import { Geometry } from 'geojson'
24
24
  import { UiWidgetsModule } from '../../../../../libs/ui/widgets/src'
25
25
  import { RecordsRepositoryInterface } from '../../../../../libs/common/domain/src/lib/repository/records-repository.interface'
26
- import { Gn4Repository } from '../../../../../libs/api/repository/src/lib/gn4'
26
+ import { Gn4Repository } from '../../../../../libs/api/repository/src'
27
27
 
28
28
  // this geometry will be used to filter & boost results accordingly
29
29
  export const FILTER_GEOMETRY = new InjectionToken<Promise<Geometry>>(
@@ -43,7 +43,7 @@ import { switchMapWithSearchId } from '../utils/operators/search.operator'
43
43
  import { Geometry } from 'geojson'
44
44
  import { FILTER_GEOMETRY } from '../feature-search.module'
45
45
  import { RecordsRepositoryInterface } from '../../../../../../libs/common/domain/src/lib/repository/records-repository.interface'
46
- import { FavoritesService } from '../../../../../../libs/api/repository/src/lib/gn4'
46
+ import { FavoritesService } from '../../../../../../libs/api/repository/src'
47
47
  import { PlatformServiceInterface } from '../../../../../../libs/common/domain/src/lib/platform.service.interface'
48
48
  import { valid as validGeoJson } from 'geojson-validation'
49
49
 
@@ -13,7 +13,7 @@ import {
13
13
  FieldFilters,
14
14
  TermBucket,
15
15
  } from '../../../../../../../libs/common/domain/src/lib/model/search'
16
- import { ElasticsearchService } from '../../../../../../../libs/api/repository/src/lib/gn4'
16
+ import { ElasticsearchService } from '../../../../../../../libs/api/repository/src'
17
17
  import { LangService } from '../../../../../../../libs/util/i18n/src'
18
18
 
19
19
  export type FieldValue = string | number
@@ -5,5 +5,6 @@
5
5
  [selected]="currentLang"
6
6
  ariaName="languages"
7
7
  [showTitle]="false"
8
+ [extraBtnClass]="'flex justify-items-center text-white !pl-2 !py-1'"
8
9
  >
9
10
  </gn-ui-dropdown-selector>
@@ -34,7 +34,7 @@ export class LanguageSwitcherComponent implements OnInit {
34
34
  ngOnInit(): void {
35
35
  const languages = this.languagePlaceholder || DEFAULT_LANGUAGES
36
36
  this.languageList = languages.map((language) => ({
37
- label: `language.${language}`,
37
+ label: `${language}`.toUpperCase(),
38
38
  value: language,
39
39
  }))
40
40
  }
@@ -18,4 +18,7 @@ export * from './lib/pagination/pagination.component'
18
18
  export * from './lib/related-record-card/related-record-card.component'
19
19
  export * from './lib/search-results-error/search-results-error.component'
20
20
  export * from './lib/user-preview/user-preview.component'
21
+ export * from './lib/max-lines/max-lines.component'
21
22
  export * from './lib/record-api-form/record-api-form.component'
23
+ export * from './lib/markdown-parser/markdown-parser.component'
24
+ export * from './lib/image-overlay-preview/image-overlay-preview.component'
@@ -8,7 +8,10 @@
8
8
  >
9
9
  record.metadata.download
10
10
  </p>
11
- <div class="flex flex-wrap justify-start sm:justify-end sm:pb-4">
11
+ <div
12
+ class="flex flex-wrap justify-start sm:justify-end sm:pb-4"
13
+ data-cy="download-format-filters"
14
+ >
12
15
  <gn-ui-button
13
16
  class="m-1 format-filter"
14
17
  [extraClass]="
@@ -0,0 +1,29 @@
1
+ <gn-ui-content-ghost
2
+ [showContent]="imageUrl !== undefined"
3
+ ghostClass="h-36 mb-3"
4
+ >
5
+ <div
6
+ *ngIf="imageUrl"
7
+ data-cy="record-thumbnail"
8
+ class="flex-shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 h-36 group-hover:shadow-xl group-hover:border-0 mb-3"
9
+ >
10
+ <gn-ui-thumbnail
11
+ class="relative h-full w-full"
12
+ [thumbnailUrl]="imageUrl"
13
+ fit="cover"
14
+ (placeholderShown)="isPlaceholderShown.emit($event)"
15
+ ></gn-ui-thumbnail>
16
+ <div class="relative">
17
+ <gn-ui-button
18
+ class="absolute bottom-0 right-0 z-10 mr-2 mb-2"
19
+ [type]="'outline'"
20
+ [extraClass]="'!py-2 !px-0'"
21
+ (buttonClick)="openLightbox(imageUrl)"
22
+ >
23
+ <mat-icon class="material-symbols-outlined font-extralight"
24
+ >zoom_out_map</mat-icon
25
+ >
26
+ </gn-ui-button>
27
+ </div>
28
+ </div>
29
+ </gn-ui-content-ghost>
@@ -0,0 +1,15 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core'
2
+ import * as basicLightbox from 'basiclightbox'
3
+
4
+ @Component({
5
+ selector: 'gn-ui-image-overlay-preview',
6
+ templateUrl: './image-overlay-preview.component.html',
7
+ styleUrls: ['./image-overlay-preview.component.css'],
8
+ })
9
+ export class ImageOverlayPreviewComponent {
10
+ @Input() imageUrl: string
11
+ @Output() isPlaceholderShown = new EventEmitter<boolean>()
12
+ openLightbox(src: string) {
13
+ basicLightbox.create(`<img src="${src}"/>`).show()
14
+ }
15
+ }