geonetwork-ui 2.3.0-dev.e07c5606 → 2.3.0-dev.e43863db

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 (227) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.mjs +2 -2
  2. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +9 -7
  3. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +23 -8
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +15 -4
  5. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +9 -7
  6. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  7. package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +1 -1
  8. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +47 -2
  9. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-license/form-field-license.component.mjs +1 -1
  10. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.mjs +15 -0
  11. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.mjs +104 -0
  12. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +14 -4
  13. package/esm2022/libs/feature/editor/src/lib/components/wizard-field/wizard-field.component.mjs +1 -1
  14. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +15 -1
  15. package/esm2022/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.mjs +73 -20
  16. package/esm2022/libs/feature/map/src/lib/add-layer-from-wfs/add-layer-from-wfs.component.mjs +1 -1
  17. package/esm2022/libs/feature/map/src/lib/add-layer-from-wms/add-layer-from-wms.component.mjs +1 -1
  18. package/esm2022/libs/feature/map/src/lib/map-context/map-context.model.mjs +1 -1
  19. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +58 -17
  20. package/esm2022/libs/feature/map/src/lib/utils/map-utils.service.mjs +7 -3
  21. package/esm2022/libs/feature/record/src/lib/data-view/data-view.component.mjs +1 -1
  22. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +17 -9
  23. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +34 -5
  24. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +1 -3
  25. package/esm2022/libs/feature/search/src/index.mjs +2 -1
  26. package/esm2022/libs/feature/search/src/lib/results-layout/results-layout.component.mjs +1 -1
  27. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +4 -4
  28. package/esm2022/libs/feature/search/src/lib/sort-by/sort-by.component.mjs +1 -1
  29. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +1 -1
  30. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +1 -1
  31. package/esm2022/libs/ui/catalog/src/lib/organisations-filter/organisations-filter.component.mjs +1 -1
  32. package/esm2022/libs/ui/elements/src/index.mjs +2 -2
  33. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -2
  34. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +2 -2
  35. package/esm2022/libs/ui/elements/src/lib/error/error.component.mjs +30 -0
  36. package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +16 -3
  37. package/esm2022/libs/ui/elements/src/lib/record-api-form/record-api-form.component.mjs +98 -36
  38. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +6 -11
  39. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.mjs +3 -5
  40. package/esm2022/libs/ui/inputs/src/index.mjs +16 -15
  41. package/esm2022/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.mjs +4 -3
  42. package/esm2022/libs/ui/inputs/src/lib/date-picker/date-picker.component.mjs +22 -0
  43. package/esm2022/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.mjs +7 -5
  44. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +5 -3
  45. package/esm2022/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +29 -0
  46. package/esm2022/libs/ui/inputs/src/lib/text-input/text-input.component.mjs +5 -3
  47. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +10 -8
  48. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  49. package/esm2022/libs/ui/layout/src/lib/block-list/block-list.component.mjs +76 -0
  50. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +42 -18
  51. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +3 -8
  52. package/esm2022/libs/util/app-config/src/lib/app-config.mjs +3 -1
  53. package/esm2022/libs/util/app-config/src/lib/fixtures.mjs +2 -1
  54. package/esm2022/libs/util/app-config/src/lib/model.mjs +1 -1
  55. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -2
  56. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +22 -1
  57. package/esm2022/translations/de.json +13 -14
  58. package/esm2022/translations/en.json +13 -14
  59. package/esm2022/translations/es.json +13 -14
  60. package/esm2022/translations/fr.json +13 -14
  61. package/esm2022/translations/it.json +13 -14
  62. package/esm2022/translations/nl.json +13 -14
  63. package/esm2022/translations/pt.json +13 -14
  64. package/fesm2022/geonetwork-ui.mjs +1742 -1190
  65. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  66. package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts +2 -2
  67. package/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.d.ts.map +1 -1
  68. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts +1 -1
  69. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -1
  70. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +4 -1
  71. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  72. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +2 -1
  73. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  74. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  75. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +3 -3
  76. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  77. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +4 -1
  78. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  79. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts +8 -0
  80. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.d.ts.map +1 -0
  81. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.d.ts +21 -0
  82. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.d.ts.map +1 -0
  83. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +2 -0
  84. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  85. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -1
  86. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts +10 -5
  87. package/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.d.ts.map +1 -1
  88. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts +7 -0
  89. package/libs/feature/map/src/lib/map-context/map-context.model.d.ts.map +1 -1
  90. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +1 -1
  91. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  92. package/libs/feature/map/src/lib/utils/map-utils.service.d.ts.map +1 -1
  93. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts +2 -2
  94. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  95. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +5 -2
  96. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  97. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  98. package/libs/feature/search/src/index.d.ts +1 -0
  99. package/libs/feature/search/src/index.d.ts.map +1 -1
  100. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts +3 -3
  101. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  102. package/libs/ui/elements/src/index.d.ts +1 -1
  103. package/libs/ui/elements/src/index.d.ts.map +1 -1
  104. package/libs/ui/elements/src/lib/api-card/api-card.component.d.ts.map +1 -1
  105. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  106. package/libs/ui/elements/src/lib/error/error.component.d.ts +16 -0
  107. package/libs/ui/elements/src/lib/error/error.component.d.ts.map +1 -0
  108. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +3 -1
  109. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
  110. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts +24 -4
  111. package/libs/ui/elements/src/lib/record-api-form/record-api-form.component.d.ts.map +1 -1
  112. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +29 -30
  113. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  114. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts +1 -2
  115. package/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.d.ts.map +1 -1
  116. package/libs/ui/inputs/src/index.d.ts +15 -14
  117. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  118. package/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.d.ts +1 -1
  119. package/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.d.ts.map +1 -1
  120. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts +9 -0
  121. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts.map +1 -0
  122. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts +1 -1
  123. package/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.d.ts.map +1 -1
  124. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts +2 -1
  125. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
  126. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts +12 -0
  127. package/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts.map +1 -0
  128. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts +2 -1
  129. package/libs/ui/inputs/src/lib/text-input/text-input.component.d.ts.map +1 -1
  130. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +27 -27
  131. package/libs/ui/layout/src/index.d.ts +1 -0
  132. package/libs/ui/layout/src/index.d.ts.map +1 -1
  133. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts +25 -0
  134. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts.map +1 -0
  135. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts +13 -6
  136. package/libs/ui/layout/src/lib/carousel/carousel.component.d.ts.map +1 -1
  137. package/libs/ui/layout/src/lib/ui-layout.module.d.ts +4 -5
  138. package/libs/ui/layout/src/lib/ui-layout.module.d.ts.map +1 -1
  139. package/libs/util/app-config/src/lib/app-config.d.ts.map +1 -1
  140. package/libs/util/app-config/src/lib/fixtures.d.ts.map +1 -1
  141. package/libs/util/app-config/src/lib/model.d.ts +1 -0
  142. package/libs/util/app-config/src/lib/model.d.ts.map +1 -1
  143. package/libs/util/shared/src/lib/links/link-utils.d.ts +18 -0
  144. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  145. package/package.json +2 -2
  146. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +9 -1
  147. package/src/libs/api/metadata-converter/src/lib/iso19115-3/iso19115-3.converter.ts +3 -3
  148. package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +35 -31
  149. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +68 -16
  150. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +72 -17
  151. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +16 -10
  152. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +3 -3
  153. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +8 -0
  154. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +10 -2
  155. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +65 -1
  156. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.css +0 -0
  157. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.html +4 -0
  158. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-resource-updated/form-field-resource-updated.component.ts +15 -0
  159. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.css +0 -0
  160. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.html +14 -0
  161. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-update-frequency/form-field-update-frequency.component.ts +143 -0
  162. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +10 -0
  163. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +11 -1
  164. package/src/libs/feature/editor/src/lib/fields.config.ts +14 -0
  165. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.css +7 -0
  166. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.html +32 -18
  167. package/src/libs/feature/map/src/lib/add-layer-from-ogc-api/add-layer-from-ogc-api.component.ts +72 -17
  168. package/src/libs/feature/map/src/lib/map-context/map-context.model.ts +7 -0
  169. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +57 -17
  170. package/src/libs/feature/map/src/lib/utils/map-utils.service.ts +6 -2
  171. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +17 -9
  172. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +40 -4
  173. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +0 -2
  174. package/src/libs/feature/search/src/index.ts +1 -0
  175. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.html +4 -4
  176. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +2 -2
  177. package/src/libs/ui/elements/src/index.ts +1 -1
  178. package/src/libs/ui/elements/src/lib/api-card/api-card.component.ts +2 -1
  179. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +1 -1
  180. package/src/libs/ui/elements/src/lib/{search-results-error/search-results-error.component.html → error/error.component.html} +18 -3
  181. package/src/libs/ui/elements/src/lib/{search-results-error/search-results-error.component.ts → error/error.component.ts} +5 -4
  182. package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +38 -20
  183. package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +12 -0
  184. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.html +26 -10
  185. package/src/libs/ui/elements/src/lib/record-api-form/record-api-form.component.ts +125 -30
  186. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +3 -6
  187. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.html +1 -1
  188. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.ts +0 -1
  189. package/src/libs/ui/inputs/src/index.ts +15 -14
  190. package/src/libs/ui/inputs/src/lib/check-toggle/check-toggle.component.ts +3 -0
  191. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.css +3 -0
  192. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.html +11 -0
  193. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.ts +16 -0
  194. package/src/libs/ui/inputs/src/lib/date-range-picker/date-range-picker.component.ts +8 -1
  195. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.html +1 -0
  196. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +1 -0
  197. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.css +6 -0
  198. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.html +26 -0
  199. package/src/libs/ui/inputs/src/lib/previous-next-buttons/previous-next-buttons.component.ts +32 -0
  200. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.html +1 -0
  201. package/src/libs/ui/inputs/src/lib/text-input/text-input.component.ts +1 -0
  202. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +2 -2
  203. package/src/libs/ui/layout/src/index.ts +1 -0
  204. package/src/libs/ui/layout/src/lib/block-list/block-list.component.css +23 -0
  205. package/src/libs/ui/layout/src/lib/block-list/block-list.component.html +20 -0
  206. package/src/libs/ui/layout/src/lib/block-list/block-list.component.ts +84 -0
  207. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +8 -4
  208. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +4 -4
  209. package/src/libs/ui/layout/src/lib/carousel/carousel.component.ts +45 -15
  210. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +0 -2
  211. package/src/libs/util/app-config/src/lib/app-config.ts +2 -0
  212. package/src/libs/util/app-config/src/lib/fixtures.ts +1 -0
  213. package/src/libs/util/app-config/src/lib/model.ts +1 -0
  214. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +1 -1
  215. package/src/libs/util/shared/src/lib/links/link-utils.ts +21 -0
  216. package/translations/de.json +13 -14
  217. package/translations/en.json +13 -14
  218. package/translations/es.json +13 -14
  219. package/translations/fr.json +13 -14
  220. package/translations/it.json +13 -14
  221. package/translations/nl.json +13 -14
  222. package/translations/pt.json +13 -14
  223. package/translations/sk.json +13 -14
  224. package/esm2022/libs/ui/elements/src/lib/search-results-error/search-results-error.component.mjs +0 -29
  225. package/libs/ui/elements/src/lib/search-results-error/search-results-error.component.d.ts +0 -15
  226. package/libs/ui/elements/src/lib/search-results-error/search-results-error.component.d.ts.map +0 -1
  227. /package/src/libs/ui/elements/src/lib/{search-results-error/search-results-error.component.css → error/error.component.css} +0 -0
@@ -0,0 +1,143 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ Input,
5
+ OnInit,
6
+ } from '@angular/core'
7
+ import { FormControl } from '@angular/forms'
8
+ import { marker } from '@biesbjerg/ngx-translate-extract-marker'
9
+ import {
10
+ CheckToggleComponent,
11
+ DropdownSelectorComponent,
12
+ } from '../../../../../../../../../libs/ui/inputs/src'
13
+ import { TranslateModule, TranslateService } from '@ngx-translate/core'
14
+
15
+ @Component({
16
+ selector: 'gn-ui-form-field-update-frequency',
17
+ templateUrl: './form-field-update-frequency.component.html',
18
+ styleUrls: ['./form-field-update-frequency.component.css'],
19
+ changeDetection: ChangeDetectionStrategy.OnPush,
20
+ standalone: true,
21
+ imports: [CheckToggleComponent, DropdownSelectorComponent, TranslateModule],
22
+ })
23
+ export class FormFieldUpdateFrequencyComponent implements OnInit {
24
+ @Input() control: FormControl
25
+
26
+ get planned() {
27
+ return this.control.value !== 'notPlanned'
28
+ }
29
+
30
+ constructor(private translateService: TranslateService) {}
31
+
32
+ ngOnInit() {
33
+ const updatedTimes = this.control.value?.updatedTimes
34
+ const per = this.control.value?.per
35
+ if (updatedTimes && updatedTimes !== 1 && updatedTimes !== 2) {
36
+ this.choices = [
37
+ {
38
+ value: `${per}.${updatedTimes}`,
39
+ label: this.translateService.instant(
40
+ `domain.record.updateFrequency.${per}`,
41
+ {
42
+ count: updatedTimes,
43
+ }
44
+ ),
45
+ },
46
+ ...this.choices,
47
+ ]
48
+ }
49
+ }
50
+
51
+ onPlannedToggled() {
52
+ if (this.planned) {
53
+ this.control.setValue('notPlanned')
54
+ } else {
55
+ this.control.setValue({ updatedTimes: 1, per: 'day' })
56
+ }
57
+ }
58
+
59
+ get selectedFrequency() {
60
+ const { updatedTimes, per } = this.control.value
61
+ return `${per}.${updatedTimes}`
62
+ }
63
+
64
+ onSelectFrequencyValue(value: unknown) {
65
+ const split = (value as string).split('.')
66
+ this.control.setValue({ updatedTimes: Number(split[1]), per: split[0] })
67
+ }
68
+
69
+ choices = [
70
+ {
71
+ value: 'day.1',
72
+ label: this.translateService.instant(
73
+ 'domain.record.updateFrequency.day',
74
+ {
75
+ count: 1,
76
+ }
77
+ ),
78
+ },
79
+ {
80
+ value: 'day.2',
81
+ label: this.translateService.instant(
82
+ 'domain.record.updateFrequency.day',
83
+ {
84
+ count: 2,
85
+ }
86
+ ),
87
+ },
88
+ {
89
+ value: 'week.1',
90
+ label: this.translateService.instant(
91
+ 'domain.record.updateFrequency.week',
92
+ {
93
+ count: 1,
94
+ }
95
+ ),
96
+ },
97
+ {
98
+ value: 'week.2',
99
+ label: this.translateService.instant(
100
+ 'domain.record.updateFrequency.week',
101
+ {
102
+ count: 2,
103
+ }
104
+ ),
105
+ },
106
+ {
107
+ value: 'month.1',
108
+ label: this.translateService.instant(
109
+ 'domain.record.updateFrequency.month',
110
+ {
111
+ count: 1,
112
+ }
113
+ ),
114
+ },
115
+ {
116
+ value: 'month.2',
117
+ label: this.translateService.instant(
118
+ 'domain.record.updateFrequency.month',
119
+ {
120
+ count: 2,
121
+ }
122
+ ),
123
+ },
124
+ {
125
+ value: 'year.1',
126
+ label: this.translateService.instant(
127
+ 'domain.record.updateFrequency.year',
128
+ {
129
+ count: 1,
130
+ }
131
+ ),
132
+ },
133
+ {
134
+ value: 'year.2',
135
+ label: this.translateService.instant(
136
+ 'domain.record.updateFrequency.year',
137
+ {
138
+ count: 2,
139
+ }
140
+ ),
141
+ },
142
+ ]
143
+ }
@@ -51,6 +51,16 @@
51
51
  [label]="config.labelKey | translate"
52
52
  ></gn-ui-form-field-license>
53
53
  </ng-container>
54
+ <ng-container *ngIf="isResourceUpdated">
55
+ <gn-ui-form-field-resource-updated
56
+ [control]="formControl"
57
+ ></gn-ui-form-field-resource-updated>
58
+ </ng-container>
59
+ <ng-container *ngIf="isUpdateFrequency">
60
+ <gn-ui-form-field-update-frequency
61
+ [control]="formControl"
62
+ ></gn-ui-form-field-update-frequency>
63
+ </ng-container>
54
64
  <ng-container *ngIf="isSimpleField">
55
65
  <gn-ui-form-field-simple
56
66
  [type]="simpleType"
@@ -18,11 +18,13 @@ import { FormFieldArrayComponent } from './form-field-array/form-field-array.com
18
18
  import { FormFieldFileComponent } from './form-field-file/form-field-file.component'
19
19
  import { FormFieldLicenseComponent } from './form-field-license/form-field-license.component'
20
20
  import { FormFieldObjectComponent } from './form-field-object/form-field-object.component'
21
+ import { FormFieldResourceUpdatedComponent } from './form-field-resource-updated/form-field-resource-updated.component'
21
22
  import { FormFieldRichComponent } from './form-field-rich/form-field-rich.component'
22
23
  import { FormFieldSimpleComponent } from './form-field-simple/form-field-simple.component'
23
24
  import { FormFieldSpatialExtentComponent } from './form-field-spatial-extent/form-field-spatial-extent.component'
24
25
  import { FormFieldTemporalExtentComponent } from './form-field-temporal-extent/form-field-temporal-extent.component'
25
26
  import { FormFieldConfig } from './form-field.model'
27
+ import { FormFieldUpdateFrequencyComponent } from './form-field-update-frequency/form-field-update-frequency.component'
26
28
 
27
29
  @Component({
28
30
  selector: 'gn-ui-form-field',
@@ -37,6 +39,9 @@ import { FormFieldConfig } from './form-field.model'
37
39
  MatIconModule,
38
40
  MatTooltipModule,
39
41
  FormFieldWrapperComponent,
42
+ FormFieldLicenseComponent,
43
+ FormFieldResourceUpdatedComponent,
44
+ FormFieldUpdateFrequencyComponent,
40
45
  FormFieldSimpleComponent,
41
46
  FormFieldRichComponent,
42
47
  FormFieldObjectComponent,
@@ -44,7 +49,6 @@ import { FormFieldConfig } from './form-field.model'
44
49
  FormFieldTemporalExtentComponent,
45
50
  FormFieldFileComponent,
46
51
  FormFieldArrayComponent,
47
- FormFieldLicenseComponent,
48
52
  TranslateModule,
49
53
  ],
50
54
  })
@@ -125,6 +129,12 @@ export class FormFieldComponent {
125
129
  get isLicenses() {
126
130
  return this.model === 'licenses'
127
131
  }
132
+ get isResourceUpdated() {
133
+ return this.model === 'resourceUpdated'
134
+ }
135
+ get isUpdateFrequency() {
136
+ return this.model === 'updateFrequency'
137
+ }
128
138
 
129
139
  get withoutWrapper() {
130
140
  return this.model === 'title' || this.model === 'abstract'
@@ -40,4 +40,18 @@ export const DEFAULT_FIELDS: EditorFieldsConfig = [
40
40
  type: 'list',
41
41
  },
42
42
  },
43
+ {
44
+ model: 'resourceUpdated',
45
+ formFieldConfig: {
46
+ labelKey: marker('editor.record.form.resourceUpdated'),
47
+ type: 'date',
48
+ },
49
+ },
50
+ {
51
+ model: 'updateFrequency',
52
+ formFieldConfig: {
53
+ labelKey: marker('editor.record.form.updateFrequency'),
54
+ type: 'text',
55
+ },
56
+ },
43
57
  ]
@@ -0,0 +1,7 @@
1
+ .dropdown-content {
2
+ display: none;
3
+ }
4
+
5
+ .relative:hover .dropdown-content {
6
+ display: block;
7
+ }
@@ -4,8 +4,7 @@
4
4
  (valueChange)="urlChange.next($event)"
5
5
  [hint]="'map.ogc.urlInput.hint' | translate"
6
6
  class="w-96"
7
- >
8
- </gn-ui-text-input>
7
+ ></gn-ui-text-input>
9
8
  </div>
10
9
 
11
10
  <div *ngIf="errorMessage" class="text-red-500 mt-2">
@@ -16,21 +15,36 @@
16
15
  <p class="loading-message" translate>map.loading.service</p>
17
16
  </div>
18
17
 
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
18
+ <ng-container *ngFor="let layer of layers">
19
+ <div
20
+ *ngIf="shouldDisplayLayer(layer)"
21
+ class="flex items-center justify-between my-2 layer-item-tree"
22
+ >
23
+ <div class="flex flex-col items-start w-full">
24
+ <p
25
+ class="max-w-xs overflow-hidden overflow-ellipsis whitespace-nowrap"
26
+ [title]="layer.name"
33
27
  >
28
+ {{ layer.name }}
29
+ </p>
30
+ <div class="flex justify-between items-center w-full">
31
+ <gn-ui-dropdown-selector
32
+ [title]="'Add Layer As' | translate"
33
+ [choices]="getLayerChoices(layer)"
34
+ (selectValue)="onLayerTypeSelect(layer.name, $event)"
35
+ [selected]="selectedLayerTypes[layer.name]"
36
+ extraBtnClass="w-6 h-5 !text-sm !px-2 !py-1"
37
+ ></gn-ui-dropdown-selector>
38
+ <gn-ui-button
39
+ class="layer-add-btn"
40
+ type="primary"
41
+ (buttonClick)="addLayer(layer.name, selectedLayerTypes[layer.name])"
42
+ extraClass="text-sm !px-2 !py-1"
43
+ translate
44
+ >
45
+ <span translate>map.layer.add</span>
46
+ </gn-ui-button>
47
+ </div>
34
48
  </div>
35
- </ng-container>
36
- </div>
49
+ </div>
50
+ </ng-container>
@@ -14,7 +14,7 @@ import {
14
14
  MapContextLayerTypeEnum,
15
15
  } from '../map-context/map-context.model'
16
16
  import { TranslateModule } from '@ngx-translate/core'
17
- import { UiInputsModule } from '../../../../../../libs/ui/inputs/src'
17
+ import { DropdownChoice, UiInputsModule } from '../../../../../../libs/ui/inputs/src'
18
18
  import { CommonModule } from '@angular/common'
19
19
  import { MapLayer } from '../+state/map.models'
20
20
 
@@ -30,18 +30,16 @@ export class AddLayerFromOgcApiComponent implements OnInit {
30
30
  @Output() layerAdded = new EventEmitter<MapLayer>()
31
31
 
32
32
  urlChange = new Subject<string>()
33
- layerUrl = ''
34
33
  loading = false
35
- layers: string[] = []
36
- ogcEndpoint: OgcApiEndpoint = null
34
+ layers: any[] = []
37
35
  errorMessage: string | null = null
36
+ selectedLayerTypes: { [key: string]: DropdownChoice['value'] } = {}
38
37
 
39
38
  constructor(private changeDetectorRef: ChangeDetectorRef) {}
40
39
 
41
40
  ngOnInit() {
42
41
  this.urlChange.pipe(debounceTime(700)).subscribe(() => {
43
42
  this.loadLayers()
44
- this.changeDetectorRef.detectChanges() // manually trigger change detection
45
43
  })
46
44
  }
47
45
 
@@ -49,14 +47,13 @@ export class AddLayerFromOgcApiComponent implements OnInit {
49
47
  this.errorMessage = null
50
48
  try {
51
49
  this.loading = true
52
- if (this.ogcUrl.trim() === '') {
50
+ if (!this.ogcUrl.trim()) {
53
51
  this.layers = []
54
52
  return
55
53
  }
56
- this.ogcEndpoint = await new OgcApiEndpoint(this.ogcUrl)
57
-
58
- // Currently only supports feature collections
59
- this.layers = await this.ogcEndpoint.featureCollections
54
+ const ogcEndpoint = await new OgcApiEndpoint(this.ogcUrl)
55
+ this.layers = await ogcEndpoint.allCollections
56
+ this.setDefaultLayerTypes()
60
57
  } catch (error) {
61
58
  const err = error as Error
62
59
  this.layers = []
@@ -67,14 +64,72 @@ export class AddLayerFromOgcApiComponent implements OnInit {
67
64
  }
68
65
  }
69
66
 
70
- async addLayer(layer: string) {
71
- this.layerUrl = await this.ogcEndpoint.getCollectionItemsUrl(layer)
67
+ setDefaultLayerTypes() {
68
+ this.layers.forEach((layer) => {
69
+ const choices = this.getLayerChoices(layer)
70
+ if (choices.length > 0) {
71
+ this.selectedLayerTypes[layer.name] = choices[0].value
72
+ }
73
+ })
74
+ }
72
75
 
73
- const layerToAdd: MapContextLayerModel = {
74
- name: layer,
75
- url: this.layerUrl,
76
- type: MapContextLayerTypeEnum.OGCAPI,
76
+ getLayerChoices(layer: any) {
77
+ const choices = []
78
+ if (layer.hasRecords) {
79
+ choices.push({ label: 'Records', value: 'record' })
80
+ }
81
+ if (layer.hasFeatures) {
82
+ choices.push({ label: 'Features', value: 'features' })
83
+ }
84
+ if (layer.hasVectorTiles) {
85
+ choices.push({ label: 'Vector Tiles', value: 'vectorTiles' })
86
+ }
87
+ if (layer.hasMapTiles) {
88
+ choices.push({ label: 'Map Tiles', value: 'mapTiles' })
89
+ }
90
+ return choices
91
+ }
92
+
93
+ shouldDisplayLayer(layer: any) {
94
+ return (
95
+ layer.hasRecords ||
96
+ layer.hasFeatures ||
97
+ layer.hasVectorTiles ||
98
+ layer.hasMapTiles
99
+ )
100
+ }
101
+
102
+ onLayerTypeSelect(layerName: string, selectedType: any) {
103
+ this.selectedLayerTypes[layerName] = selectedType
104
+ ? selectedType
105
+ : this.getLayerChoices(layerName)[0]?.value
106
+ }
107
+
108
+ async addLayer(layer: string, layerType: any) {
109
+ try {
110
+ const ogcEndpoint = await new OgcApiEndpoint(this.ogcUrl)
111
+ let layerUrl: string
112
+
113
+ if (layerType === 'vectorTiles') {
114
+ layerUrl = await ogcEndpoint.getVectorTilesetUrl(layer)
115
+ } else if (layerType === 'mapTiles') {
116
+ layerUrl = await ogcEndpoint.getMapTilesetUrl(layer)
117
+ } else {
118
+ layerUrl = await ogcEndpoint.getCollectionItemsUrl(layer, {
119
+ outputFormat: 'json',
120
+ })
121
+ }
122
+
123
+ const layerToAdd: MapContextLayerModel = {
124
+ name: layer,
125
+ url: layerUrl,
126
+ type: MapContextLayerTypeEnum.OGCAPI,
127
+ layerType: layerType,
128
+ }
129
+ this.layerAdded.emit({ ...layerToAdd, title: layer })
130
+ } catch (error) {
131
+ const err = error as Error
132
+ console.error('Error adding layer:', err.message)
77
133
  }
78
- this.layerAdded.emit({ ...layerToAdd, title: layer })
79
134
  }
80
135
  }
@@ -20,29 +20,35 @@ export interface MapContextLayerWmsModel {
20
20
  type: 'wms'
21
21
  url: string
22
22
  name: string
23
+ attributions?: string
23
24
  }
24
25
 
25
26
  export interface MapContextLayerWmtsModel {
26
27
  type: 'wmts'
27
28
  url: string
28
29
  name: string
30
+ attributions?: string
29
31
  }
30
32
 
31
33
  interface MapContextLayerWfsModel {
32
34
  type: 'wfs'
33
35
  url: string
34
36
  name: string
37
+ attributions?: string
35
38
  }
36
39
 
37
40
  export interface MapContextLayerOgcapiModel {
38
41
  type: 'ogcapi'
39
42
  url: string
40
43
  name: string
44
+ layerType: 'feature' | 'vectorTiles' | 'mapTiles' | 'record'
45
+ attributions?: string
41
46
  }
42
47
 
43
48
  interface LayerXyzModel {
44
49
  type: 'xyz'
45
50
  name?: string
51
+ attributions?: string
46
52
  }
47
53
  interface LayerXyzModelWithUrl extends LayerXyzModel {
48
54
  url: string
@@ -58,6 +64,7 @@ export type MapContextLayerXyzModel =
58
64
 
59
65
  interface LayerGeojson {
60
66
  type: 'geojson'
67
+ attributions?: string
61
68
  }
62
69
  interface LayerGeojsonWithUrl extends LayerGeojson {
63
70
  url: string
@@ -25,6 +25,12 @@ import WMTS from 'ol/source/WMTS'
25
25
  import { Geometry } from 'ol/geom'
26
26
  import Feature from 'ol/Feature'
27
27
  import { WfsEndpoint, WmtsEndpoint } from '@camptocamp/ogc-client'
28
+ import OGCVectorTile from 'ol/source/OGCVectorTile.js'
29
+ import { MVT } from 'ol/format'
30
+ import VectorTileLayer from 'ol/layer/VectorTile'
31
+ import OGCMapTile from 'ol/source/OGCMapTile.js'
32
+ import ImageLayer from 'ol/layer/Image'
33
+ import ImageWMS from 'ol/source/ImageWMS'
28
34
 
29
35
  export const DEFAULT_BASELAYER_CONTEXT: MapContextLayerXyzModel = {
30
36
  type: MapContextLayerTypeEnum.XYZ,
@@ -33,6 +39,7 @@ export const DEFAULT_BASELAYER_CONTEXT: MapContextLayerXyzModel = {
33
39
  `https://b.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png`,
34
40
  `https://c.basemaps.cartocdn.com/rastertiles/voyager/{z}/{x}/{y}.png`,
35
41
  ],
42
+ attributions: `<span>© <a href="http://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors, © <a href="https://carto.com/">Carto</a></span>`,
36
43
  }
37
44
 
38
45
  export const DEFAULT_VIEW: MapContextViewModel = {
@@ -69,38 +76,69 @@ export class MapContextService {
69
76
  }
70
77
  map.setView(this.createView(mapContext.view, map))
71
78
  map.getLayers().clear()
72
- mapContext.layers.forEach((layer) => map.addLayer(this.createLayer(layer)))
79
+ mapContext.layers.forEach((layer) =>
80
+ map.addLayer(this.createLayer(layer, mapConfig))
81
+ )
73
82
  return map
74
83
  }
75
84
 
76
- createLayer(layerModel: MapContextLayerModel): Layer {
85
+ createLayer(layerModel: MapContextLayerModel, mapConfig?: MapConfig): Layer {
77
86
  const { type } = layerModel
78
87
  const style = this.styleService.styles.default
79
88
  switch (type) {
80
89
  case MapContextLayerTypeEnum.OGCAPI:
81
- return new VectorLayer({
82
- source: new VectorSource({
83
- format: new GeoJSON(),
84
- url: layerModel.url,
85
- }),
86
- style,
87
- })
88
-
90
+ if (layerModel.layerType === 'vectorTiles') {
91
+ return new VectorTileLayer({
92
+ source: new OGCVectorTile({
93
+ url: layerModel.url,
94
+ format: new MVT(),
95
+ attributions: layerModel.attributions,
96
+ }),
97
+ })
98
+ } else if (layerModel.layerType === 'mapTiles') {
99
+ return new TileLayer({
100
+ source: new OGCMapTile({
101
+ url: layerModel.url,
102
+ attributions: layerModel.attributions,
103
+ }),
104
+ })
105
+ } else {
106
+ return new VectorLayer({
107
+ source: new VectorSource({
108
+ format: new GeoJSON(),
109
+ url: layerModel.url,
110
+ attributions: layerModel.attributions,
111
+ }),
112
+ style,
113
+ })
114
+ }
89
115
  case MapContextLayerTypeEnum.XYZ:
90
116
  return new TileLayer({
91
117
  source: new XYZ({
92
118
  url: 'url' in layerModel ? layerModel.url : undefined,
93
119
  urls: 'urls' in layerModel ? layerModel.urls : undefined,
120
+ attributions: layerModel.attributions,
94
121
  }),
95
122
  })
96
123
  case MapContextLayerTypeEnum.WMS:
97
- return new TileLayer({
98
- source: new TileWMS({
99
- url: layerModel.url,
100
- params: { LAYERS: layerModel.name },
101
- gutter: 20,
102
- }),
103
- })
124
+ if (mapConfig?.DO_NOT_TILE_WMS) {
125
+ return new ImageLayer({
126
+ source: new ImageWMS({
127
+ url: layerModel.url,
128
+ params: { LAYERS: layerModel.name },
129
+ attributions: layerModel.attributions,
130
+ }),
131
+ })
132
+ } else {
133
+ return new TileLayer({
134
+ source: new TileWMS({
135
+ url: layerModel.url,
136
+ params: { LAYERS: layerModel.name, TILED: true },
137
+ attributions: layerModel.attributions,
138
+ }),
139
+ })
140
+ }
141
+
104
142
  case MapContextLayerTypeEnum.WMTS: {
105
143
  // TODO: isolate this in utils service
106
144
  const olLayer = new TileLayer({})
@@ -123,6 +161,7 @@ export class MapContextService {
123
161
  tileGrid,
124
162
  projection: matrixSet.crs,
125
163
  dimensions,
164
+ attributions: layerModel.attributions,
126
165
  })
127
166
  )
128
167
  })
@@ -148,6 +187,7 @@ export class MapContextService {
148
187
  })
149
188
  },
150
189
  strategy: bboxStrategy,
190
+ attributions: layerModel.attributions,
151
191
  })
152
192
  )
153
193
  })
@@ -33,6 +33,7 @@ import { WmsEndpoint, WmtsEndpoint } from '@camptocamp/ogc-client'
33
33
  import { LONLAT_CRS_CODES } from '../constant/projections'
34
34
  import { fromEPSGCode, register } from 'ol/proj/proj4'
35
35
  import proj4 from 'proj4/dist/proj4'
36
+ import { defaults as defaultControls } from 'ol/control/defaults'
36
37
 
37
38
  const FEATURE_PROJECTION = 'EPSG:3857'
38
39
  const DATA_PROJECTION = 'EPSG:4326'
@@ -47,7 +48,10 @@ export class MapUtilsService {
47
48
 
48
49
  createEmptyMap(): Map {
49
50
  return new Map({
50
- controls: [],
51
+ controls: defaultControls({
52
+ attribution: true,
53
+ attributionOptions: { collapsible: false },
54
+ }),
51
55
  pixelRatio: 1,
52
56
  })
53
57
  }
@@ -213,7 +217,7 @@ export class MapUtilsService {
213
217
  }
214
218
 
215
219
  getRecordExtent(record: Partial<CatalogRecord>): Extent {
216
- if (!('spatialExtents' in record)) {
220
+ if (!('spatialExtents' in record) || record.spatialExtents.length === 0) {
217
221
  return null
218
222
  }
219
223
  // transform an array of geojson geometries into a bbox