geonetwork-ui 2.2.0 → 2.3.0-dev.179fba83

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 (218) hide show
  1. package/esm2022/libs/api/metadata-converter/src/index.mjs +5 -5
  2. package/esm2022/libs/api/metadata-converter/src/lib/base.converter.mjs +14 -0
  3. package/esm2022/libs/api/metadata-converter/src/lib/find-converter.mjs +15 -0
  4. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +3 -3
  5. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.converter.mjs +52 -0
  6. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +7 -3
  7. package/esm2022/libs/api/metadata-converter/src/lib/gn4/index.mjs +4 -0
  8. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/index.mjs +2 -0
  9. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.mjs +123 -0
  10. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.mjs +116 -0
  11. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.mjs +138 -0
  12. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/index.mjs +2 -0
  13. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +242 -0
  14. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +58 -62
  15. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.mjs +18 -0
  16. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.mjs +14 -0
  17. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/role.mapper.mjs +48 -0
  18. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.mjs +18 -0
  19. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/utils/update-frequency.mapper.mjs +64 -0
  20. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +75 -58
  21. package/esm2022/libs/api/metadata-converter/src/lib/xml-utils.mjs +76 -14
  22. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +4 -4
  23. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  24. package/esm2022/libs/data-access/gn4/src/openapi/api/records.api.service.mjs +35 -7
  25. package/esm2022/libs/data-access/gn4/src/openapi/model/models.mjs +1 -2
  26. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +2 -2
  27. package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +8 -8
  28. package/esm2022/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.mjs +6 -2
  29. package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +72 -0
  30. package/esm2022/libs/feature/map/src/lib/feature-map.module.mjs +7 -3
  31. package/esm2022/libs/feature/map/src/lib/layers-panel/layers-panel.component.mjs +12 -7
  32. package/esm2022/libs/feature/map/src/lib/map-context/map-context.model.mjs +2 -1
  33. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +52 -25
  34. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +12 -49
  35. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +6 -2
  36. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +3 -3
  37. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +3 -3
  38. package/esm2022/libs/ui/elements/src/lib/thumbnail/thumbnail.component.mjs +4 -3
  39. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +6 -5
  40. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +2 -1
  41. package/esm2022/libs/ui/inputs/src/lib/files-drop/files-drop.directive.mjs +59 -0
  42. package/esm2022/libs/ui/inputs/src/lib/image-input/image-input.component.mjs +183 -0
  43. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +10 -4
  44. package/esm2022/libs/util/shared/src/lib/utils/bytes-convert.mjs +4 -0
  45. package/esm2022/libs/util/shared/src/lib/utils/image-resize.mjs +60 -0
  46. package/esm2022/libs/util/shared/src/lib/utils/index.mjs +8 -6
  47. package/esm2022/translations/de.json +12 -0
  48. package/esm2022/translations/en.json +12 -0
  49. package/esm2022/translations/es.json +12 -0
  50. package/esm2022/translations/fr.json +12 -0
  51. package/esm2022/translations/it.json +12 -0
  52. package/esm2022/translations/nl.json +12 -0
  53. package/esm2022/translations/pt.json +12 -0
  54. package/fesm2022/geonetwork-ui.mjs +3910 -2866
  55. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  56. package/libs/api/metadata-converter/src/index.d.ts +4 -4
  57. package/libs/api/metadata-converter/src/index.d.ts.map +1 -1
  58. package/libs/api/metadata-converter/src/lib/{metadata-base.mapper.d.ts → base.converter.d.ts} +3 -3
  59. package/libs/api/metadata-converter/src/lib/base.converter.d.ts.map +1 -0
  60. package/libs/api/metadata-converter/src/lib/find-converter.d.ts +3 -0
  61. package/libs/api/metadata-converter/src/lib/find-converter.d.ts.map +1 -0
  62. package/libs/api/metadata-converter/src/lib/gn4/{gn4.metadata.mapper.d.ts → gn4.converter.d.ts} +5 -5
  63. package/libs/api/metadata-converter/src/lib/gn4/gn4.converter.d.ts.map +1 -0
  64. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  65. package/libs/api/metadata-converter/src/lib/gn4/index.d.ts +4 -0
  66. package/libs/api/metadata-converter/src/lib/gn4/index.d.ts.map +1 -0
  67. package/libs/api/metadata-converter/src/lib/iso19115-3/index.d.ts +2 -0
  68. package/libs/api/metadata-converter/src/lib/iso19115-3/index.d.ts.map +1 -0
  69. package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts +9 -0
  70. package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts.map +1 -0
  71. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +20 -0
  72. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +1 -0
  73. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts +21 -0
  74. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +1 -0
  75. package/libs/api/metadata-converter/src/lib/iso19139/index.d.ts +2 -0
  76. package/libs/api/metadata-converter/src/lib/iso19139/index.d.ts.map +1 -0
  77. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts +11 -0
  78. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -0
  79. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +34 -6
  80. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  81. package/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.d.ts +8 -0
  82. package/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.d.ts.map +1 -0
  83. package/libs/api/metadata-converter/src/lib/iso19139/utils/keyword.mapper.d.ts.map +1 -0
  84. package/libs/api/metadata-converter/src/lib/iso19139/utils/role.mapper.d.ts.map +1 -0
  85. package/libs/api/metadata-converter/src/lib/iso19139/utils/status.mapper.d.ts.map +1 -0
  86. package/libs/api/metadata-converter/src/lib/iso19139/utils/update-frequency.mapper.d.ts.map +1 -0
  87. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +39 -3
  88. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  89. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts +14 -1
  90. package/libs/api/metadata-converter/src/lib/xml-utils.d.ts.map +1 -1
  91. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +2 -2
  92. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  93. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +6 -4
  94. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  95. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts +9 -5
  96. package/libs/data-access/gn4/src/openapi/api/records.api.service.d.ts.map +1 -1
  97. package/libs/data-access/gn4/src/openapi/model/models.d.ts +0 -1
  98. package/libs/data-access/gn4/src/openapi/model/models.d.ts.map +1 -1
  99. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  100. package/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.d.ts.map +1 -1
  101. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts +23 -0
  102. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts.map +1 -0
  103. package/libs/feature/map/src/lib/feature-map.module.d.ts +2 -1
  104. package/libs/feature/map/src/lib/feature-map.module.d.ts.map +1 -1
  105. package/libs/feature/map/src/lib/layers-panel/layers-panel.component.d.ts +2 -0
  106. package/libs/feature/map/src/lib/layers-panel/layers-panel.component.d.ts.map +1 -1
  107. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts +10 -5
  108. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts.map +1 -1
  109. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  110. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts +2 -3
  111. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  112. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  113. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts +1 -1
  114. package/libs/ui/elements/src/lib/thumbnail/thumbnail.component.d.ts.map +1 -1
  115. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +20 -20
  116. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  117. package/libs/ui/inputs/src/lib/files-drop/files-drop.directive.d.ts +14 -0
  118. package/libs/ui/inputs/src/lib/files-drop/files-drop.directive.d.ts.map +1 -0
  119. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts +44 -0
  120. package/libs/ui/inputs/src/lib/image-input/image-input.component.d.ts.map +1 -0
  121. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +2 -1
  122. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  123. package/libs/util/shared/src/lib/utils/bytes-convert.d.ts +2 -0
  124. package/libs/util/shared/src/lib/utils/bytes-convert.d.ts.map +1 -0
  125. package/libs/util/shared/src/lib/utils/image-resize.d.ts +3 -0
  126. package/libs/util/shared/src/lib/utils/image-resize.d.ts.map +1 -0
  127. package/libs/util/shared/src/lib/utils/index.d.ts +7 -5
  128. package/libs/util/shared/src/lib/utils/index.d.ts.map +1 -1
  129. package/package.json +2 -2
  130. package/src/libs/api/metadata-converter/src/index.ts +4 -4
  131. package/src/libs/api/metadata-converter/src/lib/{metadata-base.mapper.ts → base.converter.ts} +2 -2
  132. package/src/libs/api/metadata-converter/src/lib/find-converter.ts +16 -0
  133. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +32 -5
  134. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +11 -4
  135. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +33 -7
  136. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +580 -0
  137. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +2 -2
  138. package/src/libs/api/metadata-converter/src/lib/gn4/{gn4.metadata.mapper.ts → gn4.converter.ts} +2 -2
  139. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +8 -2
  140. package/src/libs/api/metadata-converter/src/lib/gn4/index.ts +3 -0
  141. package/src/libs/api/metadata-converter/src/lib/iso19115-3/index.ts +1 -0
  142. package/src/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.ts +176 -0
  143. package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +329 -0
  144. package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +513 -0
  145. package/src/libs/api/metadata-converter/src/lib/iso19139/index.ts +1 -0
  146. package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +327 -0
  147. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +121 -82
  148. package/src/libs/api/metadata-converter/src/lib/iso19139/utils/individual-name.ts +20 -0
  149. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +175 -95
  150. package/src/libs/api/metadata-converter/src/lib/xml-utils.ts +84 -16
  151. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +2 -2
  152. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +9 -4
  153. package/src/libs/data-access/gn4/src/openapi/api/records.api.service.ts +43 -12
  154. package/src/libs/data-access/gn4/src/openapi/model/models.ts +0 -1
  155. package/src/libs/data-access/gn4/src/spec.yaml +1 -1
  156. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +1 -1
  157. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.css +0 -0
  158. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.html +8 -0
  159. package/src/libs/feature/editor/src/lib/components/overview-upload/overview-upload.component.ts +70 -0
  160. package/src/libs/feature/editor/src/lib/services/editor.service.ts +27 -16
  161. package/src/libs/feature/map/src/lib/add-layer-from-catalog/add-layer-record-preview/add-layer-record-preview.component.ts +5 -1
  162. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.css +0 -0
  163. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.html +36 -0
  164. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.ts +80 -0
  165. package/src/libs/feature/map/src/lib/feature-map.module.ts +2 -0
  166. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.html +8 -0
  167. package/src/libs/feature/map/src/lib/layers-panel/layers-panel.component.ts +5 -0
  168. package/src/libs/feature/map/src/lib/map-context/map-context.model.ts +10 -3
  169. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +60 -32
  170. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +17 -61
  171. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +5 -1
  172. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.ts +5 -3
  173. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +1 -1
  174. package/src/libs/ui/inputs/src/lib/button/button.component.ts +1 -1
  175. package/src/libs/ui/inputs/src/lib/files-drop/files-drop.directive.ts +45 -0
  176. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.css +0 -0
  177. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.html +146 -0
  178. package/src/libs/ui/inputs/src/lib/image-input/image-input.component.ts +193 -0
  179. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +3 -0
  180. package/src/libs/util/shared/src/lib/utils/bytes-convert.ts +3 -0
  181. package/src/libs/util/shared/src/lib/utils/image-resize.ts +72 -0
  182. package/src/libs/util/shared/src/lib/utils/index.ts +7 -5
  183. package/translations/de.json +12 -0
  184. package/translations/en.json +12 -0
  185. package/translations/es.json +12 -0
  186. package/translations/fr.json +12 -0
  187. package/translations/it.json +12 -0
  188. package/translations/nl.json +12 -0
  189. package/translations/pt.json +12 -0
  190. package/translations/sk.json +12 -0
  191. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +0 -52
  192. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.mjs +0 -14
  193. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/role.mapper.mjs +0 -48
  194. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/status.mapper.mjs +0 -18
  195. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/update-frequency.mapper.mjs +0 -64
  196. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +0 -130
  197. package/esm2022/libs/api/metadata-converter/src/lib/metadata-base.mapper.mjs +0 -14
  198. package/esm2022/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.mjs +0 -13
  199. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +0 -1
  200. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts.map +0 -1
  201. package/libs/api/metadata-converter/src/lib/iso19139/codelists/role.mapper.d.ts.map +0 -1
  202. package/libs/api/metadata-converter/src/lib/iso19139/codelists/status.mapper.d.ts.map +0 -1
  203. package/libs/api/metadata-converter/src/lib/iso19139/codelists/update-frequency.mapper.d.ts.map +0 -1
  204. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts +0 -4
  205. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +0 -1
  206. package/libs/api/metadata-converter/src/lib/metadata-base.mapper.d.ts.map +0 -1
  207. package/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.d.ts +0 -18
  208. package/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.d.ts.map +0 -1
  209. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +0 -196
  210. package/src/libs/data-access/gn4/src/openapi/model/inlineObject3.api.model.ts +0 -18
  211. /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/keyword.mapper.d.ts +0 -0
  212. /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/role.mapper.d.ts +0 -0
  213. /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/status.mapper.d.ts +0 -0
  214. /package/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/update-frequency.mapper.d.ts +0 -0
  215. /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/keyword.mapper.ts +0 -0
  216. /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/role.mapper.ts +0 -0
  217. /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/status.mapper.ts +0 -0
  218. /package/src/libs/api/metadata-converter/src/lib/iso19139/{codelists → utils}/update-frequency.mapper.ts +0 -0
@@ -14,7 +14,7 @@ import {
14
14
  } from '../../../../../../libs/common/domain/src/lib/model/search'
15
15
  import { map } from 'rxjs/operators'
16
16
  import {
17
- Gn4MetadataMapper,
17
+ Gn4Converter,
18
18
  Gn4SearchResults,
19
19
  } from '../../../../../../libs/api/metadata-converter/src'
20
20
  import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
@@ -24,7 +24,7 @@ export class Gn4Repository implements RecordsRepositoryInterface {
24
24
  constructor(
25
25
  private gn4SearchApi: SearchApiService,
26
26
  private gn4SearchHelper: ElasticsearchService,
27
- private gn4Mapper: Gn4MetadataMapper
27
+ private gn4Mapper: Gn4Converter
28
28
  ) {}
29
29
 
30
30
  search({
@@ -83,8 +83,8 @@ export interface BaseRecord {
83
83
  title: string
84
84
  abstract: string
85
85
  recordCreated?: Date
86
- recordUpdated: Date
87
86
  recordPublished?: Date
87
+ recordUpdated: Date
88
88
  languages: Array<LanguageCode>
89
89
  kind: RecordKind
90
90
  topics: Array<string> // TODO: handle codelists
@@ -98,6 +98,12 @@ export interface BaseRecord {
98
98
  landingPage?: URL
99
99
  updateFrequency?: UpdateFrequency
100
100
 
101
+ // information related to the resource (dataset, service)
102
+ contactsForResource: Array<Individual>
103
+ resourceCreated?: Date
104
+ resourcePublished?: Date
105
+ resourceUpdated?: Date
106
+
101
107
  // to add: canonical url
102
108
  // to add: source catalog (??)
103
109
  // to add: is open data ?
@@ -173,10 +179,7 @@ export interface DatasetTemporalExtent {
173
179
 
174
180
  export interface DatasetRecord extends BaseRecord {
175
181
  kind: 'dataset'
176
- contactsForResource: Array<Individual>
177
182
  status: RecordStatus
178
- datasetCreated?: Date
179
- datasetUpdated?: Date
180
183
  lineage: string // Explanation of the origin of this record (e.g: how, why)"
181
184
  distributions: Array<DatasetDistribution>
182
185
  spatialExtents: Array<DatasetSpatialExtent>
@@ -203,3 +206,5 @@ export interface ServiceRecord extends BaseRecord {
203
206
  }
204
207
 
205
208
  export type CatalogRecord = ServiceRecord | DatasetRecord
209
+
210
+ export type CatalogRecordKeys = keyof ServiceRecord | keyof DatasetRecord
@@ -30,7 +30,6 @@ import {
30
30
  import { ExtentDtoApiModel } from '../model/models'
31
31
  import { FeatureResponseApiModel } from '../model/models'
32
32
  import { IProcessingReportApiModel } from '../model/models'
33
- import { InlineObject3ApiModel } from '../model/models'
34
33
  import { MetadataBatchApproveParameterApiModel } from '../model/models'
35
34
  import { MetadataBatchSubmitParameterApiModel } from '../model/models'
36
35
  import { MetadataCategoryApiModel } from '../model/models'
@@ -75,6 +74,20 @@ export class RecordsApiService {
75
74
  this.encoder = this.configuration.encoder || new CustomHttpParameterCodec()
76
75
  }
77
76
 
77
+ /**
78
+ * @param consumes string[] mime-types
79
+ * @return true: consumes contains 'multipart/form-data', false: otherwise
80
+ */
81
+ private canConsumeForm(consumes: string[]): boolean {
82
+ const form = 'multipart/form-data'
83
+ for (const consume of consumes) {
84
+ if (form === consume) {
85
+ return true
86
+ }
87
+ }
88
+ return false
89
+ }
90
+
78
91
  private addToHttpParams(
79
92
  httpParams: HttpParams,
80
93
  value: any,
@@ -8290,44 +8303,44 @@ export class RecordsApiService {
8290
8303
  /**
8291
8304
  * Create a new resource for a given metadata
8292
8305
  * @param metadataUuid The metadata UUID
8306
+ * @param file The file to upload
8293
8307
  * @param visibility The sharing policy
8294
8308
  * @param approved Use approved version or not
8295
- * @param inlineObject3ApiModel
8296
8309
  * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
8297
8310
  * @param reportProgress flag to report request and response progress.
8298
8311
  */
8299
8312
  public putResource(
8300
8313
  metadataUuid: string,
8314
+ file: Blob,
8301
8315
  visibility?: 'public' | 'private',
8302
8316
  approved?: boolean,
8303
- inlineObject3ApiModel?: InlineObject3ApiModel,
8304
8317
  observe?: 'body',
8305
8318
  reportProgress?: boolean,
8306
8319
  options?: { httpHeaderAccept?: 'application/json' }
8307
8320
  ): Observable<MetadataResourceApiModel>
8308
8321
  public putResource(
8309
8322
  metadataUuid: string,
8323
+ file: Blob,
8310
8324
  visibility?: 'public' | 'private',
8311
8325
  approved?: boolean,
8312
- inlineObject3ApiModel?: InlineObject3ApiModel,
8313
8326
  observe?: 'response',
8314
8327
  reportProgress?: boolean,
8315
8328
  options?: { httpHeaderAccept?: 'application/json' }
8316
8329
  ): Observable<HttpResponse<MetadataResourceApiModel>>
8317
8330
  public putResource(
8318
8331
  metadataUuid: string,
8332
+ file: Blob,
8319
8333
  visibility?: 'public' | 'private',
8320
8334
  approved?: boolean,
8321
- inlineObject3ApiModel?: InlineObject3ApiModel,
8322
8335
  observe?: 'events',
8323
8336
  reportProgress?: boolean,
8324
8337
  options?: { httpHeaderAccept?: 'application/json' }
8325
8338
  ): Observable<HttpEvent<MetadataResourceApiModel>>
8326
8339
  public putResource(
8327
8340
  metadataUuid: string,
8341
+ file: Blob,
8328
8342
  visibility?: 'public' | 'private',
8329
8343
  approved?: boolean,
8330
- inlineObject3ApiModel?: InlineObject3ApiModel,
8331
8344
  observe: any = 'body',
8332
8345
  reportProgress: boolean = false,
8333
8346
  options?: { httpHeaderAccept?: 'application/json' }
@@ -8337,6 +8350,11 @@ export class RecordsApiService {
8337
8350
  'Required parameter metadataUuid was null or undefined when calling putResource.'
8338
8351
  )
8339
8352
  }
8353
+ if (file === null || file === undefined) {
8354
+ throw new Error(
8355
+ 'Required parameter file was null or undefined when calling putResource.'
8356
+ )
8357
+ }
8340
8358
 
8341
8359
  let queryParameters = new HttpParams({ encoder: this.encoder })
8342
8360
  if (visibility !== undefined && visibility !== null) {
@@ -8369,11 +8387,24 @@ export class RecordsApiService {
8369
8387
  }
8370
8388
 
8371
8389
  // to determine the Content-Type header
8372
- const consumes: string[] = ['application/json']
8373
- const httpContentTypeSelected: string | undefined =
8374
- this.configuration.selectHeaderContentType(consumes)
8375
- if (httpContentTypeSelected !== undefined) {
8376
- headers = headers.set('Content-Type', httpContentTypeSelected)
8390
+ const consumes: string[] = ['multipart/form-data']
8391
+
8392
+ const canConsumeForm = this.canConsumeForm(consumes)
8393
+
8394
+ let formParams: { append(param: string, value: any): any }
8395
+ let useForm = false
8396
+ let convertFormParamsToString = false
8397
+ // use FormData to transmit files using content-type "multipart/form-data"
8398
+ // see https://stackoverflow.com/questions/4007969/application-x-www-form-urlencoded-or-multipart-form-data
8399
+ useForm = canConsumeForm
8400
+ if (useForm) {
8401
+ formParams = new FormData()
8402
+ } else {
8403
+ formParams = new HttpParams({ encoder: this.encoder })
8404
+ }
8405
+
8406
+ if (file !== undefined) {
8407
+ formParams = (formParams.append('file', <any>file) as any) || formParams
8377
8408
  }
8378
8409
 
8379
8410
  let responseType_: 'text' | 'json' = 'json'
@@ -8388,7 +8419,7 @@ export class RecordsApiService {
8388
8419
  `${this.configuration.basePath}/records/${encodeURIComponent(
8389
8420
  String(metadataUuid)
8390
8421
  )}/attachments`,
8391
- inlineObject3ApiModel,
8422
+ convertFormParamsToString ? formParams.toString() : formParams,
8392
8423
  {
8393
8424
  params: queryParameters,
8394
8425
  responseType: <any>responseType_,
@@ -33,7 +33,6 @@ export * from './iProcessingReport.api.model'
33
33
  export * from './iSODate.api.model'
34
34
  export * from './infoReport.api.model'
35
35
  export * from './inlineObject1.api.model'
36
- export * from './inlineObject3.api.model'
37
36
  export * from './inlineObject4.api.model'
38
37
  export * from './isoLanguage.api.model'
39
38
  export * from './jSONObject.api.model'
@@ -7390,7 +7390,7 @@ paths:
7390
7390
  example: true
7391
7391
  requestBody:
7392
7392
  content:
7393
- application/json:
7393
+ multipart/form-data:
7394
7394
  schema:
7395
7395
  required:
7396
7396
  - file
@@ -94,7 +94,7 @@ export class DataService {
94
94
  ),
95
95
  geojson: endpoint.supportsJson(featureType.name)
96
96
  ? endpoint.getFeatureUrl(featureType.name, {
97
- outputFormat: 'application/json',
97
+ asJson: true,
98
98
  outputCrs: 'EPSG:4326',
99
99
  })
100
100
  : null,
@@ -0,0 +1,8 @@
1
+ <gn-ui-image-input
2
+ [maxSizeMB]="5"
3
+ [previewUrl]="resourceUrl"
4
+ [altText]="resourceFileName"
5
+ (fileChange)="handleFileChange($event)"
6
+ (urlChange)="handleUrlChange($event)"
7
+ (delete)="handleDelete()"
8
+ ></gn-ui-image-input>
@@ -0,0 +1,70 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ ChangeDetectorRef,
4
+ Component,
5
+ Input,
6
+ OnInit,
7
+ } from '@angular/core'
8
+ import { CommonModule } from '@angular/common'
9
+ import { RecordsApiService } from '../../../../../../../libs/data-access/gn4/src'
10
+ import { UiInputsModule } from '../../../../../../../libs/ui/inputs/src'
11
+
12
+ @Component({
13
+ selector: 'gn-ui-overview-upload',
14
+ standalone: true,
15
+ imports: [CommonModule, UiInputsModule],
16
+ templateUrl: './overview-upload.component.html',
17
+ styleUrls: ['./overview-upload.component.css'],
18
+ changeDetection: ChangeDetectionStrategy.OnPush,
19
+ })
20
+ export class OverviewUploadComponent implements OnInit {
21
+ @Input() metadataUuid: string
22
+
23
+ resourceFileName: string
24
+ resourceUrl: string
25
+
26
+ constructor(
27
+ private recordsApiService: RecordsApiService,
28
+ private cd: ChangeDetectorRef
29
+ ) {}
30
+
31
+ ngOnInit(): void {
32
+ this.recordsApiService
33
+ .getAllResources(this.metadataUuid)
34
+ .subscribe((resources) => {
35
+ this.resourceFileName = resources[0]?.filename
36
+ this.resourceUrl = resources[0]?.url
37
+ this.cd.markForCheck()
38
+ })
39
+ }
40
+
41
+ handleFileChange(file: File) {
42
+ this.recordsApiService
43
+ .putResource(this.metadataUuid, file, 'public')
44
+ .subscribe((resource) => {
45
+ this.resourceFileName = resource.filename
46
+ this.resourceUrl = resource.url
47
+ this.cd.markForCheck()
48
+ })
49
+ }
50
+
51
+ handleUrlChange(url: string) {
52
+ this.recordsApiService
53
+ .putResourceFromURL(this.metadataUuid, url, 'public')
54
+ .subscribe((resource) => {
55
+ this.resourceFileName = resource.filename
56
+ this.resourceUrl = resource.url
57
+ this.cd.markForCheck()
58
+ })
59
+ }
60
+
61
+ handleDelete() {
62
+ this.recordsApiService
63
+ .delResource(this.metadataUuid, this.resourceFileName)
64
+ .subscribe(() => {
65
+ this.resourceFileName = null
66
+ this.resourceUrl = null
67
+ this.cd.markForCheck()
68
+ })
69
+ }
70
+ }
@@ -1,8 +1,11 @@
1
1
  import { Inject, Injectable, Optional } from '@angular/core'
2
- import { toModel, toXml } from '../../../../../../libs/api/metadata-converter/src'
2
+ import {
3
+ findConverterForDocument,
4
+ Iso19139Converter,
5
+ } from '../../../../../../libs/api/metadata-converter/src'
3
6
  import { Configuration } from '../../../../../../libs/data-access/gn4/src'
4
- import { Observable } from 'rxjs'
5
- import { map } from 'rxjs/operators'
7
+ import { from, Observable } from 'rxjs'
8
+ import { map, switchMap } from 'rxjs/operators'
6
9
  import { HttpClient } from '@angular/common/http'
7
10
  import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
8
11
  import { EditorFieldsConfig } from '../models/fields.model'
@@ -30,7 +33,11 @@ export class EditorService {
30
33
  Accept: 'application/xml',
31
34
  },
32
35
  })
33
- .pipe(map((response) => toModel(response.toString())))
36
+ .pipe(
37
+ switchMap((response) =>
38
+ findConverterForDocument(response).readRecord(response.toString())
39
+ )
40
+ )
34
41
  }
35
42
 
36
43
  // returns the record as it was when saved
@@ -52,17 +59,21 @@ export class EditorService {
52
59
  }
53
60
 
54
61
  // TODO: use the catalog repository instead
55
- return this.http
56
- .put(
57
- `${this.apiUrl}/records?metadataType=METADATA&uuidProcessing=OVERWRITE&transformWith=_none_&publishToAll=on`,
58
- toXml(savedRecord),
59
- {
60
- headers: {
61
- 'Content-Type': 'application/xml',
62
- },
63
- withCredentials: true,
64
- }
65
- )
66
- .pipe(map(() => savedRecord))
62
+ // TODO: use converter based on the format of the record before change
63
+ return from(new Iso19139Converter().writeRecord(savedRecord)).pipe(
64
+ switchMap((recordXml) =>
65
+ this.http.put(
66
+ `${this.apiUrl}/records?metadataType=METADATA&uuidProcessing=OVERWRITE&transformWith=_none_&publishToAll=on`,
67
+ recordXml,
68
+ {
69
+ headers: {
70
+ 'Content-Type': 'application/xml',
71
+ },
72
+ withCredentials: true,
73
+ }
74
+ )
75
+ ),
76
+ map(() => savedRecord)
77
+ )
67
78
  }
68
79
  }
@@ -59,7 +59,11 @@ export class AddLayerRecordPreviewComponent extends RecordPreviewComponent {
59
59
  name: link.name,
60
60
  })
61
61
  } else if (link.accessServiceProtocol === 'wmts') {
62
- return this.mapUtils.getWmtsLayerFromCapabilities(link)
62
+ return of({
63
+ url: link.url.toString(),
64
+ type: MapContextLayerTypeEnum.WMTS,
65
+ name: link.name,
66
+ })
63
67
  }
64
68
  return throwError(() => 'protocol not supported')
65
69
  }
@@ -0,0 +1,36 @@
1
+ <div class="flex items-center mb-5">
2
+ <gn-ui-text-input
3
+ [(value)]="ogcUrl"
4
+ (valueChange)="urlChange.next($event)"
5
+ [hint]="'map.ogc.urlInput.hint' | translate"
6
+ class="w-96"
7
+ >
8
+ </gn-ui-text-input>
9
+ </div>
10
+
11
+ <div *ngIf="errorMessage" class="text-red-500 mt-2">
12
+ {{ errorMessage }}
13
+ </div>
14
+
15
+ <div *ngIf="loading">
16
+ <p class="loading-message" translate>map.loading.service</p>
17
+ </div>
18
+
19
+ <div *ngIf="!loading && layers.length > 0">
20
+ <h2 class="font-bold" translate>map.layers.available</h2>
21
+ <ng-container *ngFor="let layer of layers">
22
+ <div class="flex items-center justify-between my-2 layer-item-tree">
23
+ <p class="max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap">
24
+ {{ layer }}
25
+ </p>
26
+ <gn-ui-button
27
+ class="layer-add-btn"
28
+ type="primary"
29
+ (buttonClick)="addLayer(layer)"
30
+ extraClass="text-sm !px-2 !py-1"
31
+ translate
32
+ ><span translate> map.layer.add </span></gn-ui-button
33
+ >
34
+ </div>
35
+ </ng-container>
36
+ </div>
@@ -0,0 +1,80 @@
1
+ import {
2
+ Component,
3
+ OnInit,
4
+ Output,
5
+ EventEmitter,
6
+ ChangeDetectionStrategy,
7
+ Input,
8
+ ChangeDetectorRef,
9
+ } from '@angular/core'
10
+ import { OgcApiEndpoint } from '@camptocamp/ogc-client'
11
+ import { Subject, debounceTime } from 'rxjs'
12
+ import {
13
+ MapContextLayerModel,
14
+ MapContextLayerTypeEnum,
15
+ } from '../map-context/map-context.model'
16
+ import { TranslateModule } from '@ngx-translate/core'
17
+ import { UiInputsModule } from '../../../../../../libs/ui/inputs/src'
18
+ import { CommonModule } from '@angular/common'
19
+ import { MapLayer } from '../+state/map.models'
20
+
21
+ @Component({
22
+ selector: 'gn-ui-add-layer-from-ogc-api',
23
+ templateUrl: './add-layer-from-ogc-api.component.html',
24
+ styleUrls: ['./add-layer-from-ogc-api.component.css'],
25
+ standalone: true,
26
+ imports: [CommonModule, TranslateModule, UiInputsModule],
27
+ })
28
+ export class AddLayerFromOgcApiComponent implements OnInit {
29
+ @Input() ogcUrl: string
30
+ @Output() layerAdded = new EventEmitter<MapLayer>()
31
+
32
+ urlChange = new Subject<string>()
33
+ layerUrl = ''
34
+ loading = false
35
+ layers: string[] = []
36
+ ogcEndpoint: OgcApiEndpoint = null
37
+ errorMessage: string | null = null
38
+
39
+ constructor(private changeDetectorRef: ChangeDetectorRef) {}
40
+
41
+ ngOnInit() {
42
+ this.urlChange.pipe(debounceTime(700)).subscribe(() => {
43
+ this.loadLayers()
44
+ this.changeDetectorRef.detectChanges() // manually trigger change detection
45
+ })
46
+ }
47
+
48
+ async loadLayers() {
49
+ this.errorMessage = null
50
+ try {
51
+ this.loading = true
52
+ if (this.ogcUrl.trim() === '') {
53
+ this.layers = []
54
+ return
55
+ }
56
+ this.ogcEndpoint = await new OgcApiEndpoint(this.ogcUrl)
57
+
58
+ // Currently only supports feature collections
59
+ this.layers = await this.ogcEndpoint.featureCollections
60
+ } catch (error) {
61
+ const err = error as Error
62
+ this.layers = []
63
+ this.errorMessage = 'Error loading layers: ' + err.message
64
+ } finally {
65
+ this.loading = false
66
+ this.changeDetectorRef.markForCheck()
67
+ }
68
+ }
69
+
70
+ async addLayer(layer: string) {
71
+ this.layerUrl = await this.ogcEndpoint.getCollectionItemsUrl(layer)
72
+
73
+ const layerToAdd: MapContextLayerModel = {
74
+ name: layer,
75
+ url: this.layerUrl,
76
+ type: MapContextLayerTypeEnum.OGCAPI,
77
+ }
78
+ this.layerAdded.emit({ ...layerToAdd, title: layer })
79
+ }
80
+ }
@@ -25,6 +25,7 @@ import { AddLayerFromFileComponent } from './add-layer-from-file/add-layer-from-
25
25
  import { AddLayerFromWfsComponent } from './add-layer-from-wfs/add-layer-from-wfs.component'
26
26
  import { GeocodingComponent } from './geocoding/geocoding.component'
27
27
  import { GEOCODING_PROVIDER, GeocodingProvider } from './geocoding.service'
28
+ import { AddLayerFromOgcApiComponent } from './add-layer-from-ogc-api/add-layer-from-ogc-api.component'
28
29
 
29
30
  @NgModule({
30
31
  declarations: [
@@ -59,6 +60,7 @@ import { GEOCODING_PROVIDER, GeocodingProvider } from './geocoding.service'
59
60
  EffectsModule.forFeature([MapEffects]),
60
61
  UiElementsModule,
61
62
  UiInputsModule,
63
+ AddLayerFromOgcApiComponent,
62
64
  ],
63
65
  providers: [
64
66
  {
@@ -40,6 +40,14 @@
40
40
  <gn-ui-add-layer-from-wfs></gn-ui-add-layer-from-wfs>
41
41
  </div>
42
42
  </mat-tab>
43
+ <mat-tab [label]="'map.add.layer.ogc.api' | translate" bodyClass="h-full">
44
+ <div class="p-3">
45
+ <gn-ui-add-layer-from-ogc-api
46
+ [ogcUrl]="ogcUrl"
47
+ (layerAdded)="addLayer($event)"
48
+ ></gn-ui-add-layer-from-ogc-api>
49
+ </div>
50
+ </mat-tab>
43
51
  <mat-tab [label]="'map.add.layer.file' | translate" bodyClass="h-full">
44
52
  <div class="p-3">
45
53
  <gn-ui-add-layer-from-file></gn-ui-add-layer-from-file>
@@ -9,9 +9,14 @@ import { MapFacade } from '../+state/map.facade'
9
9
  })
10
10
  export class LayersPanelComponent {
11
11
  layers$ = this.mapFacade.layers$
12
+ ogcUrl = ''
12
13
  constructor(private mapFacade: MapFacade) {}
13
14
 
14
15
  deleteLayer(index: number) {
15
16
  this.mapFacade.removeLayer(index)
16
17
  }
18
+
19
+ addLayer(layer) {
20
+ this.mapFacade.addLayer(layer)
21
+ }
17
22
  }
@@ -1,7 +1,6 @@
1
1
  import type { FeatureCollection } from 'geojson'
2
2
  import { Coordinate } from 'ol/coordinate'
3
3
  import type { Extent } from 'ol/extent'
4
- import { Options } from 'ol/source/WMTS'
5
4
 
6
5
  export enum MapContextLayerTypeEnum {
7
6
  XYZ = 'xyz',
@@ -9,6 +8,7 @@ export enum MapContextLayerTypeEnum {
9
8
  WMTS = 'wmts',
10
9
  WFS = 'wfs',
11
10
  GEOJSON = 'geojson',
11
+ OGCAPI = 'ogcapi',
12
12
  }
13
13
 
14
14
  export interface MapContextModel {
@@ -24,8 +24,8 @@ export interface MapContextLayerWmsModel {
24
24
 
25
25
  export interface MapContextLayerWmtsModel {
26
26
  type: 'wmts'
27
- options: Options
28
- extent?: Extent
27
+ url: string
28
+ name: string
29
29
  }
30
30
 
31
31
  interface MapContextLayerWfsModel {
@@ -34,6 +34,12 @@ interface MapContextLayerWfsModel {
34
34
  name: string
35
35
  }
36
36
 
37
+ export interface MapContextLayerOgcapiModel {
38
+ type: 'ogcapi'
39
+ url: string
40
+ name: string
41
+ }
42
+
37
43
  interface LayerXyzModel {
38
44
  type: 'xyz'
39
45
  name?: string
@@ -71,6 +77,7 @@ export type MapContextLayerModel =
71
77
  | MapContextLayerWfsModel
72
78
  | MapContextLayerXyzModel
73
79
  | MapContextLayerGeojsonModel
80
+ | MapContextLayerOgcapiModel
74
81
 
75
82
  export interface MapContextViewModel {
76
83
  center?: Coordinate // expressed in long/lat (EPSG:4326)