geonetwork-ui 2.2.0-dev.e0d0f7a1 → 2.2.0-dev.eaf94daa

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 (249) 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/repository/src/lib/gn4/index.mjs +3 -1
  4. package/esm2022/libs/api/repository/src/lib/gn4/selection/selection.service.mjs +13 -26
  5. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  6. package/esm2022/libs/common/domain/src/lib/model/search/aggregation.model.mjs +1 -1
  7. package/esm2022/libs/common/domain/src/lib/model/search/field.model.mjs +2 -0
  8. package/esm2022/libs/common/domain/src/lib/model/search/filter.model.mjs +1 -1
  9. package/esm2022/libs/common/domain/src/lib/model/search/index.mjs +2 -1
  10. package/esm2022/libs/common/domain/src/lib/model/search/search.model.mjs +1 -1
  11. package/esm2022/libs/feature/catalog/src/lib/my-org/my-org.service.mjs +4 -10
  12. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +5 -4
  13. package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +5 -3
  14. package/esm2022/libs/feature/map/src/index.mjs +2 -1
  15. package/esm2022/libs/feature/map/src/lib/constant/index.mjs +2 -1
  16. package/esm2022/libs/feature/map/src/lib/constant/projections.mjs +2 -0
  17. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +17 -3
  18. package/esm2022/libs/feature/map/src/lib/geocoding/geocoding.component.mjs +93 -0
  19. package/esm2022/libs/feature/map/src/lib/geocoding.service.mjs +40 -0
  20. package/esm2022/libs/feature/map/src/lib/utils/index.mjs +1 -3
  21. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +60 -29
  22. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +29 -20
  23. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +2 -2
  24. package/esm2022/libs/feature/search/src/index.mjs +4 -1
  25. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +1 -1
  26. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +2 -6
  27. package/esm2022/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.mjs +1 -1
  28. package/esm2022/libs/feature/search/src/lib/filter-geometry.token.mjs +4 -0
  29. package/esm2022/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.mjs +7 -3
  30. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -0
  31. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +2 -2
  32. package/esm2022/libs/feature/search/src/lib/results-table/results-table.component.mjs +128 -0
  33. package/esm2022/libs/feature/search/src/lib/state/effects.mjs +6 -4
  34. package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +3 -2
  35. package/esm2022/libs/ui/elements/src/index.mjs +2 -1
  36. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +3 -3
  37. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +3 -3
  38. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +2 -2
  39. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  40. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +3 -1
  41. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  42. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +3 -3
  43. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +2 -2
  44. package/esm2022/libs/ui/inputs/src/lib/checkbox/checkbox.component.mjs +3 -3
  45. package/esm2022/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.mjs +3 -3
  46. package/esm2022/libs/ui/inputs/src/lib/editable-label/editable-label.directive.mjs +46 -0
  47. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +8 -3
  48. package/esm2022/libs/ui/layout/src/index.mjs +3 -1
  49. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +2 -2
  50. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.mjs +36 -0
  51. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +37 -0
  52. package/esm2022/libs/ui/search/src/index.mjs +1 -2
  53. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +9 -10
  54. package/esm2022/libs/util/i18n/src/index.mjs +1 -2
  55. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +29 -13
  56. package/esm2022/translations/de.json +5 -3
  57. package/esm2022/translations/en.json +6 -4
  58. package/esm2022/translations/es.json +5 -3
  59. package/esm2022/translations/fr.json +6 -4
  60. package/esm2022/translations/it.json +5 -3
  61. package/esm2022/translations/nl.json +5 -3
  62. package/esm2022/translations/pt.json +5 -3
  63. package/fesm2022/geonetwork-ui.mjs +586 -454
  64. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  65. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts +1 -0
  66. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  67. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  68. package/libs/api/repository/src/lib/gn4/index.d.ts +2 -0
  69. package/libs/api/repository/src/lib/gn4/index.d.ts.map +1 -1
  70. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts +4 -5
  71. package/libs/api/repository/src/lib/gn4/selection/selection.service.d.ts.map +1 -1
  72. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +10 -5
  73. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  74. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts +1 -1
  75. package/libs/common/domain/src/lib/model/search/aggregation.model.d.ts.map +1 -1
  76. package/libs/common/domain/src/lib/model/search/field.model.d.ts +2 -0
  77. package/libs/common/domain/src/lib/model/search/field.model.d.ts.map +1 -0
  78. package/libs/common/domain/src/lib/model/search/filter.model.d.ts +1 -1
  79. package/libs/common/domain/src/lib/model/search/filter.model.d.ts.map +1 -1
  80. package/libs/common/domain/src/lib/model/search/index.d.ts +1 -0
  81. package/libs/common/domain/src/lib/model/search/index.d.ts.map +1 -1
  82. package/libs/common/domain/src/lib/model/search/search.model.d.ts +2 -3
  83. package/libs/common/domain/src/lib/model/search/search.model.d.ts.map +1 -1
  84. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts +0 -1
  85. package/libs/feature/catalog/src/lib/my-org/my-org.service.d.ts.map +1 -1
  86. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +15 -2
  87. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  88. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +1 -1
  89. package/libs/feature/map/src/index.d.ts +1 -0
  90. package/libs/feature/map/src/index.d.ts.map +1 -1
  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 +13 -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 +25 -0
  97. package/libs/feature/map/src/lib/geocoding/geocoding.component.d.ts.map +1 -0
  98. package/libs/feature/map/src/lib/geocoding.service.d.ts +18 -0
  99. package/libs/feature/map/src/lib/geocoding.service.d.ts.map +1 -0
  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/index.d.ts +3 -0
  107. package/libs/feature/search/src/index.d.ts.map +1 -1
  108. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts +3 -3
  109. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  110. package/libs/feature/search/src/lib/feature-search.module.d.ts +0 -4
  111. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  112. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts +3 -2
  113. package/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.d.ts.map +1 -1
  114. package/libs/feature/search/src/lib/filter-geometry.token.d.ts +4 -0
  115. package/libs/feature/search/src/lib/filter-geometry.token.d.ts.map +1 -0
  116. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts +1 -1
  117. package/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.d.ts.map +1 -1
  118. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -0
  119. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -0
  120. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts +33 -0
  121. package/libs/feature/search/src/lib/results-table/results-table.component.d.ts.map +1 -0
  122. package/libs/feature/search/src/lib/state/effects.d.ts.map +1 -1
  123. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -1
  124. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  125. package/libs/ui/dataviz/src/lib/chart/chart.component.d.ts +1 -1
  126. package/libs/ui/elements/src/index.d.ts +1 -0
  127. package/libs/ui/elements/src/index.d.ts.map +1 -1
  128. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  129. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +1 -1
  130. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  131. package/libs/ui/inputs/src/index.d.ts +1 -0
  132. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  133. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts +13 -0
  134. package/libs/ui/inputs/src/lib/editable-label/editable-label.directive.d.ts.map +1 -0
  135. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +2 -1
  136. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  137. package/libs/ui/layout/src/index.d.ts +2 -0
  138. package/libs/ui/layout/src/index.d.ts.map +1 -1
  139. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +14 -0
  140. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts.map +1 -0
  141. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +15 -0
  142. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -0
  143. package/libs/ui/search/src/index.d.ts +0 -1
  144. package/libs/ui/search/src/index.d.ts.map +1 -1
  145. package/libs/ui/search/src/lib/ui-search.module.d.ts +15 -15
  146. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  147. package/libs/util/i18n/src/index.d.ts +0 -1
  148. package/libs/util/i18n/src/index.d.ts.map +1 -1
  149. package/libs/util/shared/src/lib/links/link-utils.d.ts +19 -7
  150. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  151. package/package.json +4 -1
  152. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +3 -0
  153. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +43 -0
  154. package/src/libs/api/repository/src/lib/gn4/index.ts +2 -0
  155. package/src/libs/api/repository/src/lib/gn4/selection/selection.service.ts +14 -38
  156. package/src/libs/common/domain/src/lib/index.ts +2 -0
  157. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +12 -7
  158. package/src/libs/common/domain/src/lib/model/search/aggregation.model.ts +1 -1
  159. package/src/libs/common/domain/src/lib/model/search/field.model.ts +1 -0
  160. package/src/libs/common/domain/src/lib/model/search/filter.model.ts +1 -1
  161. package/src/libs/common/domain/src/lib/model/search/index.ts +1 -0
  162. package/src/libs/common/domain/src/lib/model/search/search.model.ts +2 -2
  163. package/src/libs/common/domain/src/lib/model/user/index.ts +1 -0
  164. package/src/libs/feature/catalog/src/lib/my-org/my-org.service.ts +4 -16
  165. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +8 -5
  166. package/src/libs/feature/editor/src/lib/record-form/record-form.component.ts +2 -1
  167. package/src/libs/feature/map/src/index.ts +1 -0
  168. package/src/libs/feature/map/src/lib/constant/index.ts +1 -0
  169. package/src/libs/feature/map/src/lib/feature-map.module.ts +8 -0
  170. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.css +0 -0
  171. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.html +39 -0
  172. package/src/libs/feature/map/src/lib/geocoding/geocoding.component.ts +99 -0
  173. package/src/libs/feature/map/src/lib/geocoding.service.ts +59 -0
  174. package/src/libs/feature/map/src/lib/utils/index.ts +0 -2
  175. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +85 -50
  176. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +18 -3
  177. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +1 -1
  178. package/src/libs/feature/search/src/index.ts +3 -0
  179. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +1 -1
  180. package/src/libs/feature/search/src/lib/feature-search.module.ts +1 -10
  181. package/src/libs/feature/search/src/lib/filter-dropdown/filter-dropdown.component.ts +4 -4
  182. package/src/libs/feature/search/src/lib/filter-geometry.token.ts +7 -0
  183. package/src/libs/feature/search/src/lib/fuzzy-search/fuzzy-search.component.ts +9 -3
  184. package/src/libs/feature/search/src/lib/record-url.token.ts +4 -0
  185. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +1 -1
  186. package/src/libs/feature/search/src/lib/results-table/results-table.component.css +0 -0
  187. package/src/libs/feature/search/src/lib/results-table/results-table.component.html +112 -0
  188. package/src/libs/feature/search/src/lib/results-table/results-table.component.ts +164 -0
  189. package/src/libs/feature/search/src/lib/state/effects.ts +5 -4
  190. package/src/libs/feature/search/src/lib/state/search.facade.ts +2 -1
  191. package/src/libs/ui/elements/src/index.ts +1 -0
  192. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +4 -1
  193. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +3 -2
  194. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +52 -52
  195. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +1 -1
  196. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +1 -0
  197. package/src/libs/ui/inputs/src/index.ts +1 -0
  198. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
  199. package/src/libs/ui/inputs/src/lib/button/button.component.css +1 -1
  200. package/src/libs/ui/inputs/src/lib/checkbox/checkbox.component.html +0 -1
  201. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +1 -1
  202. package/src/libs/ui/inputs/src/lib/editable-label/editable-label.directive.ts +48 -0
  203. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +3 -0
  204. package/src/libs/ui/layout/src/index.ts +2 -0
  205. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +1 -1
  206. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.css +0 -0
  207. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.html +1 -0
  208. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.ts +33 -0
  209. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.css +15 -0
  210. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +54 -0
  211. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +42 -0
  212. package/src/libs/ui/search/src/index.ts +0 -1
  213. package/src/libs/ui/search/src/lib/ui-search.module.ts +2 -3
  214. package/src/libs/util/i18n/src/index.ts +0 -1
  215. package/src/libs/util/shared/src/lib/links/link-utils.ts +34 -11
  216. package/translations/de.json +5 -3
  217. package/translations/en.json +6 -4
  218. package/translations/es.json +5 -3
  219. package/translations/fr.json +6 -4
  220. package/translations/it.json +5 -3
  221. package/translations/nl.json +5 -3
  222. package/translations/pt.json +5 -3
  223. package/translations/sk.json +5 -3
  224. package/esm2022/libs/feature/map/src/lib/utils/map-utils-wms.service.mjs +0 -55
  225. package/esm2022/libs/feature/map/src/lib/utils/projections.mjs +0 -2
  226. package/esm2022/libs/ui/search/src/lib/record-table/record-table.component.mjs +0 -145
  227. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.loader.mjs +0 -24
  228. package/esm2022/libs/util/i18n/src/lib/testing/test.translate.module.mjs +0 -109
  229. package/esm2022/libs/util/i18n/src/lib/testing/translations.model.mjs +0 -6
  230. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts +0 -17
  231. package/libs/feature/map/src/lib/utils/map-utils-wms.service.d.ts.map +0 -1
  232. package/libs/feature/map/src/lib/utils/projections.d.ts.map +0 -1
  233. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts +0 -31
  234. package/libs/ui/search/src/lib/record-table/record-table.component.d.ts.map +0 -1
  235. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts +0 -17
  236. package/libs/util/i18n/src/lib/testing/test.translate.loader.d.ts.map +0 -1
  237. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts +0 -131
  238. package/libs/util/i18n/src/lib/testing/test.translate.module.d.ts.map +0 -1
  239. package/libs/util/i18n/src/lib/testing/translations.model.d.ts +0 -21
  240. package/libs/util/i18n/src/lib/testing/translations.model.d.ts.map +0 -1
  241. package/src/libs/feature/map/src/lib/utils/map-utils-wms.service.ts +0 -58
  242. package/src/libs/ui/search/src/lib/record-table/record-table.component.css +0 -7
  243. package/src/libs/ui/search/src/lib/record-table/record-table.component.html +0 -215
  244. package/src/libs/ui/search/src/lib/record-table/record-table.component.ts +0 -149
  245. package/src/libs/util/i18n/src/lib/testing/test.translate.loader.ts +0 -26
  246. package/src/libs/util/i18n/src/lib/testing/test.translate.module.ts +0 -235
  247. package/src/libs/util/i18n/src/lib/testing/translations.model.ts +0 -28
  248. /package/libs/feature/map/src/lib/{utils → constant}/projections.d.ts +0 -0
  249. /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
@@ -50,7 +50,7 @@ const mdViewReducer = createReducer(
50
50
  chartConfig,
51
51
  })),
52
52
  on(MdViewActions.close, (state) => {
53
- // eslint-disable-next-line
53
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
54
54
  const { metadata, related, ...stateWithoutMd } = state
55
55
  return stateWithoutMd
56
56
  })
@@ -1,4 +1,6 @@
1
1
  export * from './lib/feature-search.module'
2
+ export * from './lib/filter-geometry.token'
3
+ export * from './lib/record-url.token'
2
4
  export * from './lib/state/actions'
3
5
  export * from './lib/state/selectors'
4
6
  export * from './lib/state/search.facade'
@@ -18,3 +20,4 @@ export * from './lib/results-hits-number/results-hits.container.component'
18
20
  export * from './lib/results-layout/results-layout.component'
19
21
  export * from './lib/sort-by/sort-by.component'
20
22
  export * from './lib/state/container/search-state.container.directive'
23
+ export * from './lib/results-table/results-table.component'
@@ -39,7 +39,7 @@ export class FavoriteStarComponent implements AfterViewInit, OnDestroy {
39
39
  map((favorites) => favorites.indexOf(this.record.uniqueIdentifier) > -1)
40
40
  )
41
41
  isAnonymous$ = this.platformService.isAnonymous()
42
- record_: CatalogRecord
42
+ record_: Partial<CatalogRecord>
43
43
  favoriteCount: number | null
44
44
  loading = false
45
45
  loginUrl = this.authService.loginUrl
@@ -15,24 +15,15 @@ import { initialState, reducer, SEARCH_FEATURE_KEY } from './state/reducer'
15
15
  import { ResultsHitsContainerComponent } from './results-hits-number/results-hits.container.component'
16
16
  import { SearchStateContainerDirective } from './state/container/search-state.container.directive'
17
17
  import { UiInputsModule } from '../../../../../libs/ui/inputs/src'
18
- import { InjectionToken, NgModule } from '@angular/core'
18
+ import { NgModule } from '@angular/core'
19
19
  import { UiElementsModule } from '../../../../../libs/ui/elements/src'
20
20
  import { FavoriteStarComponent } from './favorites/favorite-star/favorite-star.component'
21
21
  import { MatIconModule } from '@angular/material/icon'
22
22
  import { FilterDropdownComponent } from './filter-dropdown/filter-dropdown.component'
23
- import { Geometry } from 'geojson'
24
23
  import { UiWidgetsModule } from '../../../../../libs/ui/widgets/src'
25
24
  import { RecordsRepositoryInterface } from '../../../../../libs/common/domain/src/lib/repository/records-repository.interface'
26
25
  import { Gn4Repository } from '../../../../../libs/api/repository/src'
27
26
 
28
- // this geometry will be used to filter & boost results accordingly
29
- export const FILTER_GEOMETRY = new InjectionToken<Promise<Geometry>>(
30
- 'filter-geometry'
31
- )
32
-
33
- // expects the replacement key ${uuid}
34
- export const RECORD_URL_TOKEN = new InjectionToken<string>('record-url-token')
35
-
36
27
  @NgModule({
37
28
  declarations: [
38
29
  SortByComponent,
@@ -10,7 +10,7 @@ import { catchError, filter, map, startWith } from 'rxjs/operators'
10
10
  import { SearchFacade } from '../state/search.facade'
11
11
  import { SearchService } from '../utils/service/search.service'
12
12
  import { FieldsService } from '../utils/service/fields.service'
13
- import { FieldAvailableValue } from '../utils/service/fields'
13
+ import { FieldAvailableValue, FieldValue } from '../utils/service/fields'
14
14
 
15
15
  @Component({
16
16
  selector: 'gn-ui-filter-dropdown',
@@ -31,11 +31,11 @@ export class FilterDropdownComponent implements OnInit {
31
31
  filter((selected) => !!selected),
32
32
  startWith([]),
33
33
  catchError(() => of([]))
34
- )
34
+ ) as Observable<FieldValue[]>
35
35
 
36
- onSelectedValues(values: (string | number)[]) {
36
+ onSelectedValues(values: unknown[]) {
37
37
  this.fieldsService
38
- .buildFiltersFromFieldValues({ [this.fieldName]: values })
38
+ .buildFiltersFromFieldValues({ [this.fieldName]: values as FieldValue[] })
39
39
  .subscribe((filters) => this.searchService.updateFilters(filters))
40
40
  }
41
41
 
@@ -0,0 +1,7 @@
1
+ // this geometry will be used to filter & boost results accordingly
2
+ import { InjectionToken } from '@angular/core'
3
+ import { Geometry } from 'geojson'
4
+
5
+ export const FILTER_GEOMETRY = new InjectionToken<Promise<Geometry>>(
6
+ 'filter-geometry'
7
+ )
@@ -11,12 +11,13 @@ import {
11
11
  AutocompleteComponent,
12
12
  AutocompleteItem,
13
13
  } from '../../../../../../libs/ui/inputs/src'
14
- import { Observable } from 'rxjs'
14
+ import { Observable, firstValueFrom } from 'rxjs'
15
15
  import { map } from 'rxjs/operators'
16
16
  import { SearchFacade } from '../state/search.facade'
17
17
  import { SearchService } from '../utils/service/search.service'
18
18
  import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
19
19
  import { RecordsRepositoryInterface } from '../../../../../../libs/common/domain/src/lib/repository/records-repository.interface'
20
+ import { SearchFilters } from '../../../../../../libs/api/metadata-converter/src'
20
21
 
21
22
  @Component({
22
23
  selector: 'gn-ui-fuzzy-search',
@@ -75,7 +76,12 @@ export class FuzzySearchComponent implements OnInit {
75
76
  }
76
77
  }
77
78
 
78
- handleInputCleared() {
79
- this.searchService.updateFilters({ any: '' })
79
+ async handleInputCleared() {
80
+ const currentSearchFilters: SearchFilters = await firstValueFrom(
81
+ this.searchFacade.searchFilters$
82
+ )
83
+ if (currentSearchFilters.any) {
84
+ this.searchService.updateFilters({ any: '' })
85
+ }
80
86
  }
81
87
  }
@@ -0,0 +1,4 @@
1
+ import { InjectionToken } from '@angular/core'
2
+
3
+ // expects the replacement key ${uuid}
4
+ export const RECORD_URL_TOKEN = new InjectionToken<string>('record-url-token')
@@ -17,7 +17,7 @@ import {
17
17
  ResultsLayoutConfigItem,
18
18
  ResultsLayoutConfigModel,
19
19
  } from '../../../../../../libs/ui/search/src'
20
- import { RECORD_URL_TOKEN } from '../feature-search.module'
20
+ import { RECORD_URL_TOKEN } from '../record-url.token'
21
21
  import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
22
22
 
23
23
  export type ResultsListShowMoreStrategy = 'auto' | 'button' | 'none'
@@ -0,0 +1,112 @@
1
+ <gn-ui-interactive-table
2
+ [items]="records$ | async"
3
+ (itemClick)="handleRecordClick($event)"
4
+ >
5
+ <!-- SELECTED COLUMN -->
6
+ <gn-ui-interactive-table-column>
7
+ <ng-template #header>
8
+ <gn-ui-checkbox
9
+ [checked]="isAllSelected() | async"
10
+ [indeterminate]="isSomeSelected() | async"
11
+ (changed)="toggleSelectAll()"
12
+ type="default"
13
+ class="-m-2 mr-3"
14
+ >
15
+ </gn-ui-checkbox>
16
+ </ng-template>
17
+ <ng-template #cell let-item>
18
+ <gn-ui-checkbox
19
+ [checked]="isChecked(item) | async"
20
+ (changed)="handleRecordSelectedChange($event, item)"
21
+ class="-m-2"
22
+ type="default"
23
+ ></gn-ui-checkbox>
24
+ </ng-template>
25
+ </gn-ui-interactive-table-column>
26
+
27
+ <!-- TITLE COLUMN -->
28
+ <gn-ui-interactive-table-column
29
+ [sortable]="true"
30
+ [activeSort]="isSortedBy('resourceTitleObject.default.keyword') | async"
31
+ (sortChange)="setSortBy('resourceTitleObject.default.keyword', $event)"
32
+ >
33
+ <ng-template #header>
34
+ <span translate>record.metadata.title</span>
35
+ </ng-template>
36
+ <ng-template #cell let-item>
37
+ {{ item.title }}
38
+ </ng-template>
39
+ </gn-ui-interactive-table-column>
40
+
41
+ <!-- FORMATS COLUMN -->
42
+ <gn-ui-interactive-table-column>
43
+ <ng-template #header>
44
+ <span translate>record.metadata.formats</span>
45
+ </ng-template>
46
+ <ng-template #cell let-item>
47
+ <div
48
+ class="flex justify-start items-center gap-2"
49
+ *ngIf="getRecordFormats(item) as formats"
50
+ [title]="formats.join(', ')"
51
+ >
52
+ <span
53
+ class="badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0"
54
+ [style.background-color]="getBadgeColor(formats[0])"
55
+ *ngIf="formats[0]"
56
+ >
57
+ {{ formats[0] }}
58
+ </span>
59
+ <span
60
+ class="badge-btn min-w-[45px] text-sm text-white px-2 flex-shrink-0"
61
+ [style.background-color]="getBadgeColor(formats[1])"
62
+ *ngIf="formats[1]"
63
+ >
64
+ {{ formats[1] }}
65
+ </span>
66
+ <div class="flex-shrink-0" *ngIf="formats.slice(2).length > 0">
67
+ <span>+{{ formats.slice(2).length }}</span>
68
+ </div>
69
+ </div>
70
+ <div *ngIf="!getRecordFormats(item)"></div>
71
+ </ng-template>
72
+ </gn-ui-interactive-table-column>
73
+
74
+ <!-- OWNER COLUMN -->
75
+ <gn-ui-interactive-table-column
76
+ [sortable]="true"
77
+ [activeSort]="isSortedBy('recordOwner') | async"
78
+ (sortChange)="setSortBy('recordOwner', $event)"
79
+ >
80
+ <ng-template #header>
81
+ <span translate>record.metadata.author</span>
82
+ </ng-template>
83
+ <ng-template #cell let-item>
84
+ <mat-icon class="material-symbols-outlined">person</mat-icon>
85
+ <span>{{ formatUserInfo(item.extras?.ownerInfo) }}</span>
86
+ </ng-template>
87
+ </gn-ui-interactive-table-column>
88
+
89
+ <!-- STATUS COLUMN -->
90
+ <gn-ui-interactive-table-column>
91
+ <ng-template #header>
92
+ <span translate>record.metadata.status</span>
93
+ </ng-template>
94
+ <ng-template #cell let-item>
95
+ {{ item.status }}
96
+ </ng-template>
97
+ </gn-ui-interactive-table-column>
98
+
99
+ <!-- UPDATE DATE COLUMN -->
100
+ <gn-ui-interactive-table-column
101
+ [sortable]="true"
102
+ [activeSort]="isSortedBy('changeDate') | async"
103
+ (sortChange)="setSortBy('changeDate', $event)"
104
+ >
105
+ <ng-template #header>
106
+ <span translate>record.metadata.updatedOn</span>
107
+ </ng-template>
108
+ <ng-template #cell let-item>
109
+ {{ dateToString(item.recordUpdated) }}
110
+ </ng-template>
111
+ </gn-ui-interactive-table-column>
112
+ </gn-ui-interactive-table>