geonetwork-ui 2.8.0-dev.6f6597946 → 2.8.0-dev.6f988469c

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 (221) hide show
  1. package/esm2022/index.mjs +2 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/common/distribution.mapper.mjs +5 -1
  3. package/esm2022/libs/api/metadata-converter/src/lib/dcat-ap/dcat-ap.converter.mjs +3 -3
  4. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +26 -1
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.mjs +7 -7
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +3 -2
  7. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +4 -3
  8. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/constant.mjs +1 -2
  9. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +10 -10
  10. package/esm2022/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.mjs +3 -2
  11. package/esm2022/libs/common/domain/src/index.mjs +3 -0
  12. package/esm2022/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.mjs +1 -1
  13. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +3 -1
  14. package/esm2022/libs/common/domain/src/lib/model/search/sort-by.model.mjs +6 -1
  15. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  16. package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +3 -1
  17. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +26 -8
  18. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +23 -3
  19. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +2 -2
  20. package/esm2022/libs/feature/record/src/index.mjs +2 -1
  21. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +13 -4
  22. package/esm2022/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.mjs +23 -8
  23. package/esm2022/libs/feature/record/src/lib/stac-view/stac-view.component.mjs +138 -0
  24. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +14 -1
  25. package/esm2022/libs/feature/router/src/lib/default/router.service.mjs +5 -1
  26. package/esm2022/libs/feature/router/src/lib/default/state/router.effects.mjs +9 -7
  27. package/esm2022/libs/feature/search/src/lib/constants.mjs +1 -2
  28. package/esm2022/libs/feature/search/src/lib/sort-by/sort-by.component.mjs +8 -12
  29. package/esm2022/libs/ui/elements/src/index.mjs +3 -1
  30. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +1 -1
  31. package/esm2022/libs/ui/elements/src/lib/external-link-card/external-link-card.component.mjs +11 -4
  32. package/esm2022/libs/ui/elements/src/lib/metadata-doi/metadata-doi.component.mjs +37 -0
  33. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +5 -9
  34. package/esm2022/libs/ui/elements/src/lib/stac-items-result-grid/stac-items-result-grid.component.mjs +18 -0
  35. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.mjs +5 -5
  36. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  37. package/esm2022/libs/ui/inputs/src/lib/date-picker/date-picker.component.mjs +21 -7
  38. package/esm2022/libs/ui/inputs/src/lib/date-range-inputs/date-range-inputs.component.mjs +35 -0
  39. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +2 -3
  40. package/esm2022/libs/ui/layout/src/lib/paginable.interface.mjs +1 -1
  41. package/esm2022/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +13 -5
  42. package/esm2022/libs/util/i18n/src/lib/date-locales.mjs +33 -0
  43. package/esm2022/libs/util/shared/src/index.mjs +2 -1
  44. package/esm2022/libs/util/shared/src/lib/humanize-date.directive.mjs +33 -0
  45. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +5 -1
  46. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +12 -1
  47. package/esm2022/libs/util/shared/src/lib/services/date.service.mjs +19 -2
  48. package/esm2022/libs/util/shared/src/lib/utils/sort-by.mjs +9 -6
  49. package/esm2022/translations/de.json +18 -3
  50. package/esm2022/translations/en.json +18 -4
  51. package/esm2022/translations/es.json +17 -2
  52. package/esm2022/translations/fr.json +18 -3
  53. package/esm2022/translations/it.json +19 -4
  54. package/esm2022/translations/nl.json +17 -2
  55. package/esm2022/translations/pt.json +17 -2
  56. package/esm2022/translations/sk.json +18 -3
  57. package/fesm2022/geonetwork-ui-date-locales-MYnkDJ5h.mjs +35 -0
  58. package/fesm2022/geonetwork-ui-date-locales-MYnkDJ5h.mjs.map +1 -0
  59. package/fesm2022/geonetwork-ui.mjs +635 -187
  60. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  61. package/index.d.ts +1 -0
  62. package/index.d.ts.map +1 -1
  63. package/index.ts +1 -0
  64. package/libs/api/metadata-converter/src/lib/common/distribution.mapper.d.ts.map +1 -1
  65. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  66. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -1
  67. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +5 -1
  68. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  69. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  70. package/libs/api/repository/src/lib/gn4/elasticsearch/constant.d.ts.map +1 -1
  71. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +7 -7
  72. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  73. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts.map +1 -1
  74. package/libs/common/domain/src/index.d.ts +3 -0
  75. package/libs/common/domain/src/index.d.ts.map +1 -0
  76. package/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.d.ts +1 -1
  77. package/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.d.ts.map +1 -1
  78. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +7 -2
  79. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  80. package/libs/common/domain/src/lib/model/search/sort-by.model.d.ts.map +1 -1
  81. package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -1
  82. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  83. package/libs/feature/dataviz/src/lib/chart-view/chart-view.component.d.ts.map +1 -1
  84. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +2 -1
  85. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  86. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +2 -0
  87. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  88. package/libs/feature/record/src/index.d.ts +1 -0
  89. package/libs/feature/record/src/index.d.ts.map +1 -1
  90. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +3 -2
  91. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
  92. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +3 -2
  93. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
  94. package/libs/feature/record/src/lib/stac-view/stac-view.component.d.ts +35 -0
  95. package/libs/feature/record/src/lib/stac-view/stac-view.component.d.ts.map +1 -0
  96. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +28 -24
  97. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  98. package/libs/feature/router/src/lib/default/router.service.d.ts +2 -0
  99. package/libs/feature/router/src/lib/default/router.service.d.ts.map +1 -1
  100. package/libs/feature/router/src/lib/default/state/router.effects.d.ts +3 -1
  101. package/libs/feature/router/src/lib/default/state/router.effects.d.ts.map +1 -1
  102. package/libs/feature/search/src/lib/constants.d.ts.map +1 -1
  103. package/libs/feature/search/src/lib/sort-by/sort-by.component.d.ts +4 -3
  104. package/libs/feature/search/src/lib/sort-by/sort-by.component.d.ts.map +1 -1
  105. package/libs/ui/elements/src/index.d.ts +2 -0
  106. package/libs/ui/elements/src/index.d.ts.map +1 -1
  107. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
  108. package/libs/ui/elements/src/lib/external-link-card/external-link-card.component.d.ts +3 -2
  109. package/libs/ui/elements/src/lib/external-link-card/external-link-card.component.d.ts.map +1 -1
  110. package/libs/ui/elements/src/lib/metadata-doi/metadata-doi.component.d.ts +8 -0
  111. package/libs/ui/elements/src/lib/metadata-doi/metadata-doi.component.d.ts.map +1 -0
  112. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +0 -2
  113. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  114. package/libs/ui/elements/src/lib/stac-items-result-grid/stac-items-result-grid.component.d.ts +8 -0
  115. package/libs/ui/elements/src/lib/stac-items-result-grid/stac-items-result-grid.component.d.ts.map +1 -0
  116. package/libs/ui/inputs/src/index.d.ts +1 -0
  117. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  118. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts +5 -0
  119. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts.map +1 -1
  120. package/libs/ui/inputs/src/lib/date-range-inputs/date-range-inputs.component.d.ts +12 -0
  121. package/libs/ui/inputs/src/lib/date-range-inputs/date-range-inputs.component.d.ts.map +1 -0
  122. package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
  123. package/libs/ui/layout/src/lib/paginable.interface.d.ts +3 -3
  124. package/libs/ui/layout/src/lib/paginable.interface.d.ts.map +1 -1
  125. package/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts +2 -1
  126. package/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts.map +1 -1
  127. package/libs/util/i18n/src/lib/date-locales.d.ts +5 -0
  128. package/libs/util/i18n/src/lib/date-locales.d.ts.map +1 -0
  129. package/libs/util/shared/src/index.d.ts +1 -0
  130. package/libs/util/shared/src/index.d.ts.map +1 -1
  131. package/libs/util/shared/src/lib/humanize-date.directive.d.ts +15 -0
  132. package/libs/util/shared/src/lib/humanize-date.directive.d.ts.map +1 -0
  133. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
  134. package/libs/util/shared/src/lib/links/link-utils.d.ts +6 -0
  135. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  136. package/libs/util/shared/src/lib/services/date.service.d.ts +4 -0
  137. package/libs/util/shared/src/lib/services/date.service.d.ts.map +1 -1
  138. package/libs/util/shared/src/lib/utils/sort-by.d.ts.map +1 -1
  139. package/package.json +1 -1
  140. package/src/libs/api/metadata-converter/src/lib/common/distribution.mapper.ts +2 -0
  141. package/src/libs/api/metadata-converter/src/lib/dcat-ap/dcat-ap.converter.ts +2 -2
  142. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +1 -1
  143. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.service+eaux-usees.ts +1 -1
  144. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +5 -2
  145. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +1 -1
  146. package/src/libs/api/metadata-converter/src/lib/fixtures/georhena.records.ts +1 -1
  147. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +2 -2
  148. package/src/libs/api/metadata-converter/src/lib/fixtures/wallonie.records.reuse.ts +1 -1
  149. package/src/libs/api/metadata-converter/src/lib/fixtures/wallonie.records.service+napitswallonia.ts +1 -1
  150. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +28 -0
  151. package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +13 -6
  152. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +6 -2
  153. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +4 -2
  154. package/src/libs/api/repository/src/lib/gn4/elasticsearch/constant.ts +0 -1
  155. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +37 -36
  156. package/src/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.ts +3 -2
  157. package/src/libs/common/domain/src/index.ts +2 -0
  158. package/src/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.ts +1 -1
  159. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +12 -1
  160. package/src/libs/common/domain/src/lib/model/search/sort-by.model.ts +5 -0
  161. package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -1
  162. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +5 -0
  163. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +19 -0
  164. package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.ts +1 -0
  165. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +30 -5
  166. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +3 -3
  167. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +30 -0
  168. package/src/libs/feature/editor/src/lib/fields.config.ts +1 -1
  169. package/src/libs/feature/record/src/index.ts +1 -0
  170. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +7 -1
  171. package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +23 -4
  172. package/src/libs/feature/record/src/lib/stac-view/stac-view.component.css +3 -0
  173. package/src/libs/feature/record/src/lib/stac-view/stac-view.component.html +68 -0
  174. package/src/libs/feature/record/src/lib/stac-view/stac-view.component.ts +190 -0
  175. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +30 -1
  176. package/src/libs/feature/router/src/lib/default/router.service.ts +8 -0
  177. package/src/libs/feature/router/src/lib/default/state/router.effects.ts +6 -7
  178. package/src/libs/feature/search/src/lib/constants.ts +0 -1
  179. package/src/libs/feature/search/src/lib/sort-by/sort-by.component.ts +8 -12
  180. package/src/libs/ui/elements/src/index.ts +2 -0
  181. package/src/libs/ui/elements/src/lib/external-link-card/external-link-card.component.html +43 -22
  182. package/src/libs/ui/elements/src/lib/external-link-card/external-link-card.component.ts +12 -3
  183. package/src/libs/ui/elements/src/lib/metadata-doi/metadata-doi.component.css +0 -0
  184. package/src/libs/ui/elements/src/lib/metadata-doi/metadata-doi.component.html +31 -0
  185. package/src/libs/ui/elements/src/lib/metadata-doi/metadata-doi.component.ts +30 -0
  186. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +67 -21
  187. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +2 -9
  188. package/src/libs/ui/elements/src/lib/stac-items-result-grid/stac-items-result-grid.component.css +0 -0
  189. package/src/libs/ui/elements/src/lib/stac-items-result-grid/stac-items-result-grid.component.html +13 -0
  190. package/src/libs/ui/elements/src/lib/stac-items-result-grid/stac-items-result-grid.component.ts +15 -0
  191. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.html +1 -1
  192. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.ts +2 -2
  193. package/src/libs/ui/inputs/src/index.ts +1 -0
  194. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.ts +17 -1
  195. package/src/libs/ui/inputs/src/lib/date-range-inputs/date-range-inputs.component.css +0 -0
  196. package/src/libs/ui/inputs/src/lib/date-range-inputs/date-range-inputs.component.html +15 -0
  197. package/src/libs/ui/inputs/src/lib/date-range-inputs/date-range-inputs.component.ts +41 -0
  198. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +4 -2
  199. package/src/libs/ui/layout/src/lib/paginable.interface.ts +3 -3
  200. package/src/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.html +12 -6
  201. package/src/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.ts +4 -1
  202. package/src/libs/util/i18n/src/lib/date-locales.ts +63 -0
  203. package/src/libs/util/shared/src/index.ts +1 -0
  204. package/src/libs/util/shared/src/lib/humanize-date.directive.ts +35 -0
  205. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +4 -0
  206. package/src/libs/util/shared/src/lib/links/link-utils.ts +11 -0
  207. package/src/libs/util/shared/src/lib/services/date.service.ts +27 -1
  208. package/src/libs/util/shared/src/lib/utils/sort-by.ts +8 -5
  209. package/translations/de.json +18 -3
  210. package/translations/en.json +18 -4
  211. package/translations/es.json +17 -2
  212. package/translations/fr.json +18 -3
  213. package/translations/it.json +19 -4
  214. package/translations/nl.json +17 -2
  215. package/translations/pt.json +17 -2
  216. package/translations/sk.json +18 -3
  217. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.mjs +0 -59
  218. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts +0 -11
  219. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts.map +0 -1
  220. package/src/libs/common/domain/src/lib/index.ts +0 -2
  221. package/src/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.ts +0 -54
@@ -3,7 +3,11 @@
3
3
  ghostClass="h-[178px]"
4
4
  [showContent]="fieldReady('abstract')"
5
5
  >
6
- <gn-ui-max-lines [maxLines]="6" *ngIf="metadata.abstract">
6
+ <gn-ui-max-lines
7
+ [maxLines]="6"
8
+ *ngIf="metadata.abstract"
9
+ data-test="metadata-info-abstract"
10
+ >
7
11
  <div class="mb-6">
8
12
  <gn-ui-markdown-parser
9
13
  [textContent]="metadata.abstract"
@@ -101,19 +105,31 @@
101
105
  <gn-ui-expandable-panel
102
106
  *ngIf="
103
107
  (metadata.kind === 'dataset' && metadata.lineage) ||
108
+ resourceContact ||
109
+ metadata.resourceCreated ||
110
+ metadata.resourcePublished ||
104
111
  metadata.resourceUpdated ||
105
- metadata.updateFrequency ||
106
- (metadata.kind === 'dataset' && metadata.status)
112
+ (metadata.kind === 'dataset' && metadata.updateFrequency) ||
113
+ metadata.otherLanguages?.length ||
114
+ (metadata.kind === 'dataset' && temporalExtent)
107
115
  "
108
116
  [title]="'record.metadata.details' | translate"
109
117
  data-test="details-panel"
110
118
  >
111
- <div *ngIf="metadata.lineage" class="text-gray-900 flex flex-col mt-4 gap-2">
119
+ <div
120
+ *ngIf="metadata.kind === 'dataset' && metadata.lineage"
121
+ class="text-gray-900 flex flex-col mt-4 gap-2"
122
+ data-test="details-panel-lineage"
123
+ >
112
124
  <p class="whitespace-pre-line break-words text-gray-900" gnUiLinkify>
113
125
  {{ metadata.lineage }}
114
126
  </p>
115
127
  </div>
116
- <div class="flex flex-row gap-6 mt-5 mb-8" *ngIf="resourceContact">
128
+ <div
129
+ class="flex flex-row gap-6 mt-5 mb-8 resource-contact"
130
+ *ngIf="resourceContact"
131
+ data-test="details-panel-resource-contact"
132
+ >
117
133
  <div
118
134
  *ngIf="resourceContact.organization?.logoUrl?.href"
119
135
  class="flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden"
@@ -165,19 +181,40 @@
165
181
  <div
166
182
  class="py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700"
167
183
  >
168
- <div *ngIf="metadata.resourceCreated">
184
+ <div
185
+ *ngIf="metadata.resourceCreated"
186
+ data-test="details-panel-resource-created"
187
+ >
169
188
  <p class="text-sm" translate>record.metadata.creation</p>
170
- <p class="text-primary font-medium mt-1">
171
- {{ formatDate(metadata.resourceCreated) }}
172
- </p>
189
+ <p
190
+ class="text-primary font-medium mt-1 resource-created"
191
+ [gnUiHumanizeDate]="metadata.resourceCreated"
192
+ ></p>
173
193
  </div>
174
- <div *ngIf="metadata.resourcePublished">
194
+ <div
195
+ *ngIf="metadata.resourcePublished"
196
+ data-test="details-panel-resource-published"
197
+ >
175
198
  <p class="text-sm" translate>record.metadata.publication</p>
176
- <p class="text-primary font-medium mt-1">
177
- {{ formatDate(metadata.resourcePublished) }}
178
- </p>
199
+ <p
200
+ class="text-primary font-medium mt-1 resource-published"
201
+ [gnUiHumanizeDate]="metadata.resourcePublished"
202
+ ></p>
203
+ </div>
204
+ <div
205
+ *ngIf="metadata.resourceUpdated"
206
+ data-test="details-panel-resource-updated"
207
+ >
208
+ <p class="text-sm" translate>record.metadata.update</p>
209
+ <p
210
+ class="text-primary font-medium mt-1 resource-updated"
211
+ [gnUiHumanizeDate]="metadata.resourceUpdated"
212
+ ></p>
179
213
  </div>
180
- <div *ngIf="updateFrequency">
214
+ <div
215
+ *ngIf="metadata.kind === 'dataset' && metadata.updateFrequency"
216
+ data-test="details-panel-update-frequency"
217
+ >
181
218
  <p class="text-sm" translate>record.metadata.updateFrequency</p>
182
219
  <p
183
220
  class="text-primary font-medium mt-1 updateFrequency"
@@ -187,11 +224,14 @@
187
224
  {{ updateFrequency }}
188
225
  </p>
189
226
  </div>
190
- <div *ngIf="metadata.otherLanguages?.length">
227
+ <div
228
+ *ngIf="metadata.otherLanguages?.length"
229
+ data-test="details-panel-other-languages"
230
+ >
191
231
  <p class="text-sm mb-1" translate>record.metadata.languages</p>
192
232
  <div class="flex flex-row gap-1 flex-wrap">
193
233
  <p
194
- class="text-primary font-medium"
234
+ class="text-primary font-medium other-languages"
195
235
  translate
196
236
  *ngFor="let language of metadata.otherLanguages"
197
237
  >
@@ -199,9 +239,14 @@
199
239
  </p>
200
240
  </div>
201
241
  </div>
202
- <div *ngIf="temporalExtent">
242
+ <div
243
+ *ngIf="metadata.kind === 'dataset' && temporalExtent"
244
+ data-test="details-panel-temporal-extent"
245
+ >
203
246
  <p class="text-sm" translate>record.metadata.temporalExtent</p>
204
- <div class="flex flex-row gap-1 mb-1 text-primary font-medium">
247
+ <div
248
+ class="flex flex-row gap-1 mb-1 text-primary font-medium temporal-extent"
249
+ >
205
250
  <p
206
251
  *ngIf="temporalExtent.start && temporalExtent.end"
207
252
  translate
@@ -252,9 +297,10 @@
252
297
  <div class="flex flex-col gap-4 mr-4 py-5 rounded text-gray-700">
253
298
  <div *ngIf="metadata.recordUpdated">
254
299
  <p class="text-sm" translate>record.metadata.updatedOn</p>
255
- <p class="text-primary font-medium">
256
- {{ metadata.recordUpdated && formatDateTime(metadata.recordUpdated) }}
257
- </p>
300
+ <p
301
+ class="text-primary font-medium"
302
+ [gnUiHumanizeDate]="metadata.recordUpdated"
303
+ ></p>
258
304
  </div>
259
305
  <div *ngIf="metadata.landingPage">
260
306
  <p class="text-sm" translate>record.metadata.sheet</p>
@@ -26,7 +26,7 @@ import { matOpenInNew } from '@ng-icons/material-icons/baseline'
26
26
  import { matMailOutline } from '@ng-icons/material-icons/outline'
27
27
  import { ThumbnailComponent } from '../thumbnail/thumbnail.component'
28
28
  import { GnUiLinkifyDirective } from './linkify.directive'
29
-
29
+ import { GnUiHumanizeDateDirective } from '../../../../../../libs/util/shared/src'
30
30
  import { CommonModule } from '@angular/common'
31
31
  import { SpatialExtentComponent } from '../../../../../../libs/ui/map/src'
32
32
 
@@ -49,6 +49,7 @@ import { SpatialExtentComponent } from '../../../../../../libs/ui/map/src'
49
49
  CopyTextButtonComponent,
50
50
  NgIcon,
51
51
  GnUiLinkifyDirective,
52
+ GnUiHumanizeDateDirective,
52
53
  SpatialExtentComponent,
53
54
  ],
54
55
  viewProviders: [
@@ -146,12 +147,4 @@ export class MetadataInfoComponent {
146
147
  onKeywordClick(keyword: Keyword) {
147
148
  this.keyword.emit(keyword)
148
149
  }
149
-
150
- formatDate(date: Date): string {
151
- return this.dateService.formatDate(date)
152
- }
153
-
154
- formatDateTime(date: Date): string {
155
- return this.dateService.formatDateTime(date)
156
- }
157
150
  }
@@ -0,0 +1,13 @@
1
+ <div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-[10px]">
2
+ <div *ngFor="let item of items">
3
+ <div
4
+ data-cy="stac-item-card"
5
+ class="h-[173px] flex flex-col justify-between gap-4 bg-white rounded-lg border border-gray-300 px-5 py-3 mx-auto"
6
+ >
7
+ <h2 class="text-xl text-black line-clamp-4 break-words">
8
+ {{ item.id }}
9
+ </h2>
10
+ <p class="truncate">{{ item.properties.datetime }}</p>
11
+ </div>
12
+ </div>
13
+ </div>
@@ -0,0 +1,15 @@
1
+ import { CommonModule } from '@angular/common'
2
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'
3
+ import { StacItem } from '@camptocamp/ogc-client'
4
+
5
+ @Component({
6
+ selector: 'gn-ui-stac-items-result-grid',
7
+ standalone: true,
8
+ imports: [CommonModule],
9
+ templateUrl: './stac-items-result-grid.component.html',
10
+ styleUrl: './stac-items-result-grid.component.css',
11
+ changeDetection: ChangeDetectionStrategy.OnPush,
12
+ })
13
+ export class StacItemsResultGridComponent {
14
+ @Input() items: StacItem[] = []
15
+ }
@@ -13,7 +13,7 @@
13
13
  </div>
14
14
  <div class="p-4 flex flex-col">
15
15
  <span>{{ userFeedbackParent.authorName }}</span>
16
- <span> {{ userFeedbackParent.date | timeSince }}</span>
16
+ <span [gnUiHumanizeDate]="userFeedbackParent.date"></span>
17
17
  </div>
18
18
  </div>
19
19
  <div data-cy="commentText" class="mt-4 whitespace-pre-line">
@@ -11,13 +11,13 @@ import {
11
11
  UserFeedbackViewModel,
12
12
  } from '../../../../../../libs/common/domain/src/lib/model/record'
13
13
  import { UserModel } from '../../../../../../libs/common/domain/src/lib/model/user'
14
- import { TimeSincePipe } from './time-since.pipe'
15
14
  import { CommonModule } from '@angular/common'
16
15
  import { ButtonComponent, TextAreaComponent } from '../../../../../../libs/ui/inputs/src'
17
16
  import { TranslatePipe } from '@ngx-translate/core'
18
17
  import { SpinningLoaderComponent } from '../../../../../../libs/ui/widgets/src'
19
18
  import { NgIcon, provideIcons } from '@ng-icons/core'
20
19
  import { matSendOutline } from '@ng-icons/material-icons/outline'
20
+ import { GnUiHumanizeDateDirective } from '../../../../../../libs/util/shared/src'
21
21
 
22
22
  @Component({
23
23
  selector: 'gn-ui-user-feedback-item',
@@ -27,11 +27,11 @@ import { matSendOutline } from '@ng-icons/material-icons/outline'
27
27
  standalone: true,
28
28
  imports: [
29
29
  CommonModule,
30
- TimeSincePipe,
31
30
  TextAreaComponent,
32
31
  TranslatePipe,
33
32
  ButtonComponent,
34
33
  SpinningLoaderComponent,
34
+ GnUiHumanizeDateDirective,
35
35
  NgIcon,
36
36
  ],
37
37
  viewProviders: [
@@ -24,3 +24,4 @@ export * from './lib/text-input/text-input.component'
24
24
  export * from './lib/url-input/url-input.component'
25
25
  export * from './lib/viewport-intersector/viewport-intersector.component'
26
26
  export * from './lib/search-feature-catalog/search-feature-catalog.component'
27
+ export * from './lib/date-range-inputs/date-range-inputs.component'
@@ -5,7 +5,11 @@ import {
5
5
  Input,
6
6
  Output,
7
7
  } from '@angular/core'
8
- import { MatNativeDateModule } from '@angular/material/core'
8
+ import {
9
+ DateAdapter,
10
+ MAT_DATE_LOCALE,
11
+ MatNativeDateModule,
12
+ } from '@angular/material/core'
9
13
  import { MatDatepickerModule } from '@angular/material/datepicker'
10
14
  import { ButtonComponent } from '../button/button.component'
11
15
  import {
@@ -14,6 +18,7 @@ import {
14
18
  provideNgIconsConfig,
15
19
  } from '@ng-icons/core'
16
20
  import { iconoirCalendar } from '@ng-icons/iconoir'
21
+ import { TranslateService } from '@ngx-translate/core'
17
22
 
18
23
  @Component({
19
24
  selector: 'gn-ui-date-picker',
@@ -32,9 +37,20 @@ import { iconoirCalendar } from '@ng-icons/iconoir'
32
37
  provideNgIconsConfig({
33
38
  size: '1.5rem',
34
39
  }),
40
+ {
41
+ provide: MAT_DATE_LOCALE,
42
+ useFactory: (locale: string) => locale,
43
+ },
35
44
  ],
36
45
  })
37
46
  export class DatePickerComponent {
38
47
  @Input() date: Date
39
48
  @Output() dateChange = new EventEmitter<Date>()
49
+
50
+ constructor(
51
+ private dateAdapter: DateAdapter<Date>,
52
+ private translate: TranslateService
53
+ ) {
54
+ this.dateAdapter.setLocale(this.translate.currentLang)
55
+ }
40
56
  }
@@ -0,0 +1,15 @@
1
+ <div class="m-8">
2
+ <p class="mb-4" translate>daterange.filter.period</p>
3
+ <p translate>daterange.filter.from</p>
4
+ <gn-ui-date-picker
5
+ id="start-date-picker"
6
+ [date]="temporalExtent?.start"
7
+ (dateChange)="onStartDateChange($event)"
8
+ ></gn-ui-date-picker>
9
+ <p class="mt-4" translate>daterange.filter.to</p>
10
+ <gn-ui-date-picker
11
+ id="end-date-picker"
12
+ [date]="temporalExtent?.end"
13
+ (dateChange)="onEndDateChange($event)"
14
+ ></gn-ui-date-picker>
15
+ </div>
@@ -0,0 +1,41 @@
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ EventEmitter,
5
+ Input,
6
+ Output,
7
+ } from '@angular/core'
8
+ import { DatePickerComponent } from '../date-picker/date-picker.component'
9
+ import { DatasetTemporalExtent } from '../../../../../../libs/common/domain/src/lib/model/record/metadata.model'
10
+ import { TranslateDirective } from '@ngx-translate/core'
11
+ import { CommonModule } from '@angular/common'
12
+
13
+ @Component({
14
+ selector: 'gn-ui-date-range-inputs',
15
+ standalone: true,
16
+ imports: [CommonModule, TranslateDirective, DatePickerComponent],
17
+ templateUrl: './date-range-inputs.component.html',
18
+ styleUrl: './date-range-inputs.component.css',
19
+ changeDetection: ChangeDetectionStrategy.OnPush,
20
+ })
21
+ export class DateRangeInputsComponent {
22
+ @Input() temporalExtent: DatasetTemporalExtent | null
23
+ @Output() temporalExtentChange =
24
+ new EventEmitter<DatasetTemporalExtent | null>()
25
+
26
+ onStartDateChange(date: Date) {
27
+ this.temporalExtent = {
28
+ ...this.temporalExtent,
29
+ start: date,
30
+ }
31
+ this.temporalExtentChange.emit(this.temporalExtent)
32
+ }
33
+
34
+ onEndDateChange(date: Date) {
35
+ this.temporalExtent = {
36
+ ...this.temporalExtent,
37
+ end: date,
38
+ }
39
+ this.temporalExtentChange.emit(this.temporalExtent)
40
+ }
41
+ }
@@ -90,8 +90,10 @@ export class DropdownSelectorComponent implements OnInit {
90
90
 
91
91
  get selectedChoice(): DropdownChoice {
92
92
  return (
93
- this.choices.find((choice) => choice.value === this.selected) ??
94
- this.choices[0]
93
+ this.choices.find(
94
+ (choice) =>
95
+ JSON.stringify(choice.value) === JSON.stringify(this.selected)
96
+ ) ?? this.choices[0]
95
97
  )
96
98
  }
97
99
 
@@ -6,9 +6,9 @@
6
6
  export interface Paginable {
7
7
  isFirstPage: boolean
8
8
  isLastPage: boolean
9
- pagesCount: number
10
- currentPage: number
11
- goToPage(index: number): void
9
+ pagesCount?: number
10
+ currentPage?: number
11
+ goToPage?(index: number): void
12
12
  goToNextPage(): void
13
13
  goToPrevPage(): void
14
14
  }
@@ -3,28 +3,34 @@
3
3
  data-test="previousButton"
4
4
  type="light"
5
5
  [extraClass]="
6
- 'w-10 h-8 px-2 py-1 rounded-lg ' +
6
+ 'w-auto min-w-10 h-8 px-2 py-1 rounded-lg ' +
7
7
  (!listComponent.isFirstPage
8
- ? 'border border-gray-300'
9
- : 'border border-gray-100')
8
+ ? 'border border-gray-300 text-main'
9
+ : 'border border-gray-100 text-gray-300')
10
10
  "
11
11
  [disabled]="listComponent.isFirstPage"
12
12
  (buttonClick)="listComponent.goToPrevPage()"
13
13
  >
14
14
  <ng-icon name="matArrowBackIos"></ng-icon>
15
+ <span *ngIf="displayLabels" class="ml-2" translate
16
+ >pagination.previousPage</span
17
+ >
15
18
  </gn-ui-button>
16
19
  <gn-ui-button
17
20
  data-test="nextButton"
18
21
  type="light"
19
22
  [extraClass]="
20
- 'w-10 h-8 px-2 py-1 rounded-lg ' +
23
+ 'w-auto min-w-10 h-8 px-2 py-1 rounded-lg ' +
21
24
  (!listComponent.isLastPage
22
- ? 'border border-gray-300'
23
- : 'border border-gray-100')
25
+ ? 'border border-gray-300 text-main'
26
+ : 'border border-gray-100 text-gray-300')
24
27
  "
25
28
  [disabled]="listComponent.isLastPage"
26
29
  (buttonClick)="listComponent.goToNextPage()"
27
30
  >
31
+ <span *ngIf="displayLabels" class="mr-2" translate
32
+ >pagination.nextPage</span
33
+ >
28
34
  <ng-icon name="matArrowForwardIos"></ng-icon>
29
35
  </gn-ui-button>
30
36
  </div>
@@ -10,13 +10,15 @@ import {
10
10
  } from '@ng-icons/material-icons/baseline'
11
11
  import { Paginable } from '../paginable.interface'
12
12
  import { ButtonComponent } from '../../../../../../libs/ui/inputs/src'
13
+ import { CommonModule } from '@angular/common'
14
+ import { TranslateDirective } from '@ngx-translate/core'
13
15
 
14
16
  @Component({
15
17
  selector: 'gn-ui-previous-next-buttons',
16
18
  templateUrl: './previous-next-buttons.component.html',
17
19
  styleUrls: ['./previous-next-buttons.component.css'],
18
20
  standalone: true,
19
- imports: [ButtonComponent, NgIconComponent],
21
+ imports: [CommonModule, ButtonComponent, NgIconComponent, TranslateDirective],
20
22
  providers: [
21
23
  provideIcons({ matArrowBackIos, matArrowForwardIos }),
22
24
  provideNgIconsConfig({
@@ -26,4 +28,5 @@ import { ButtonComponent } from '../../../../../../libs/ui/inputs/src'
26
28
  })
27
29
  export class PreviousNextButtonsComponent {
28
30
  @Input() listComponent: Paginable
31
+ @Input() displayLabels = false
29
32
  }
@@ -0,0 +1,63 @@
1
+ import { LanguageCode2 } from './language-codes'
2
+ import {
3
+ ar,
4
+ az,
5
+ ca,
6
+ cs,
7
+ cy,
8
+ da,
9
+ de,
10
+ enUS,
11
+ es,
12
+ fi,
13
+ fr,
14
+ hy,
15
+ is,
16
+ it,
17
+ ka,
18
+ ko,
19
+ Locale,
20
+ nl,
21
+ nn,
22
+ pl,
23
+ pt,
24
+ ru,
25
+ sk,
26
+ sv,
27
+ tr,
28
+ uk,
29
+ zhCN,
30
+ } from 'date-fns/locale'
31
+
32
+ // all 2-char language codes should be listed here
33
+ const locales: Record<LanguageCode2, Locale> = {
34
+ en: enUS,
35
+ nl: nl,
36
+ fr: fr,
37
+ de: de,
38
+ ko: ko,
39
+ es: es,
40
+ cs: cs,
41
+ ca: ca,
42
+ fi: fi,
43
+ is: is,
44
+ it: it,
45
+ pt: pt,
46
+ ru: ru,
47
+ zh: zhCN,
48
+ sk: sk,
49
+ ar: ar,
50
+ da: da,
51
+ no: nn,
52
+ pl: pl,
53
+ sv: sv,
54
+ tr: tr,
55
+ hy: hy,
56
+ az: az,
57
+ ka: ka,
58
+ uk: uk,
59
+ cy: cy,
60
+ rm: enUS, // locale is unavailable
61
+ }
62
+
63
+ export default locales
@@ -4,3 +4,4 @@ export * from './lib/links'
4
4
  export * from './lib/image-fallback.directive'
5
5
  export * from './lib/gn-ui-version'
6
6
  export * from './lib/record'
7
+ export * from './lib/humanize-date.directive'
@@ -0,0 +1,35 @@
1
+ import { Renderer2, Directive, ElementRef, Input, OnInit } from '@angular/core'
2
+ import { DateService } from './services/date.service'
3
+
4
+ @Directive({
5
+ selector: '[gnUiHumanizeDate]',
6
+ standalone: true,
7
+ })
8
+ export class GnUiHumanizeDateDirective implements OnInit {
9
+ @Input() gnUiHumanizeDate: Date | string
10
+
11
+ constructor(
12
+ private dateService: DateService,
13
+ private el: ElementRef,
14
+ private renderer: Renderer2
15
+ ) {}
16
+
17
+ async ngOnInit() {
18
+ await this.updateElement()
19
+ }
20
+
21
+ private async updateElement(): Promise<void> {
22
+ const dateValue = this.gnUiHumanizeDate
23
+
24
+ const fullDateTime = this.dateService.formatDateTime(dateValue)
25
+ const relativeDate =
26
+ await this.dateService.formatRelativeDateTime(dateValue)
27
+
28
+ this.renderer.setAttribute(this.el.nativeElement, 'title', fullDateTime)
29
+ this.renderer.setProperty(
30
+ this.el.nativeElement,
31
+ 'textContent',
32
+ relativeDate
33
+ )
34
+ }
35
+ }
@@ -39,6 +39,10 @@ export class LinkClassifierService {
39
39
  return [LinkUsage.API, LinkUsage.DOWNLOAD, LinkUsage.GEODATA]
40
40
  case 'GPFDL':
41
41
  return [LinkUsage.API]
42
+ case 'postgis':
43
+ return [LinkUsage.UNKNOWN]
44
+ case 'stac':
45
+ return [LinkUsage.API]
42
46
  default:
43
47
  return [LinkUsage.UNKNOWN]
44
48
  }
@@ -150,6 +150,12 @@ export const FORMATS = {
150
150
  color: '#5A9E6F',
151
151
  mimeTypes: ['image/webp'],
152
152
  },
153
+ postgis: {
154
+ extensions: ['postgis'],
155
+ priority: 18,
156
+ color: '#336791',
157
+ mimeTypes: [],
158
+ },
153
159
  } as const
154
160
 
155
161
  export type FileFormat = keyof typeof FORMATS
@@ -195,6 +201,11 @@ export function getFileFormatFromServiceOutput(
195
201
  export function getFileFormat(
196
202
  link: DatasetOnlineResource | ServiceOnlineResource
197
203
  ): FileFormat {
204
+ if ('accessServiceProtocol' in link) {
205
+ if (link.accessServiceProtocol in FORMATS) {
206
+ return link.accessServiceProtocol as FileFormat
207
+ }
208
+ }
198
209
  if ('mimeType' in link) {
199
210
  const mimeTypeFormat = mimeTypeToFormat(link.mimeType)
200
211
  if (mimeTypeFormat !== null) {
@@ -1,10 +1,18 @@
1
1
  import { Injectable } from '@angular/core'
2
2
  import { TranslateService } from '@ngx-translate/core'
3
+ import { type Locale } from 'date-fns/locale'
4
+ import { formatDistance } from 'date-fns/formatDistance'
5
+
6
+ const DEFAULT_LANGUAGE = 'en'
3
7
 
4
8
  @Injectable({
5
9
  providedIn: 'root',
6
10
  })
7
11
  export class DateService {
12
+ dateLocales = import('../../../../../../libs/util/i18n/src/lib/date-locales').then(
13
+ (obj) => obj.default
14
+ )
15
+
8
16
  constructor(private translateService: TranslateService) {}
9
17
 
10
18
  private getDateObject(date: Date | string): Date {
@@ -22,11 +30,17 @@ export class DateService {
22
30
  locale: string
23
31
  dateObj: Date
24
32
  } {
25
- const locale = this.translateService.currentLang || 'en-US'
33
+ const locale = this.translateService.currentLang || DEFAULT_LANGUAGE
26
34
  const dateObj = this.getDateObject(date)
27
35
  return { locale, dateObj }
28
36
  }
29
37
 
38
+ private async getDateLocale(): Promise<Locale> {
39
+ const lang = this.translateService.currentLang || DEFAULT_LANGUAGE
40
+ const locales = await this.dateLocales
41
+ return locales[lang]
42
+ }
43
+
30
44
  formatDate(
31
45
  date: Date | string,
32
46
  options?: Intl.DateTimeFormatOptions
@@ -42,4 +56,16 @@ export class DateService {
42
56
  const { locale, dateObj } = this.getLocaleAndDate(date)
43
57
  return dateObj.toLocaleString(locale, options)
44
58
  }
59
+
60
+ async formatRelativeDateTime(date: Date | string): Promise<string> {
61
+ const dateObj = this.getDateObject(date)
62
+
63
+ const now = new Date()
64
+ const locale = await this.getDateLocale()
65
+
66
+ return formatDistance(dateObj, now, {
67
+ addSuffix: true,
68
+ locale: locale,
69
+ })
70
+ }
45
71
  }
@@ -6,12 +6,15 @@ export function sortByToStrings(sortBy: SortByField): string[] {
6
6
  }
7
7
 
8
8
  export function sortByToString(sortBy: SortByField): string {
9
- return sortByToStrings(sortBy)[0]
9
+ return sortByToStrings(sortBy).join(',')
10
10
  }
11
11
 
12
12
  export function sortByFromString(sortByString: string): SortByField {
13
- return [
14
- sortByString.startsWith('-') ? 'desc' : 'asc',
15
- sortByString.startsWith('-') ? sortByString.substring(1) : sortByString,
16
- ]
13
+ const fields = sortByString
14
+ .split(',')
15
+ .map((field) => [
16
+ field.startsWith('-') ? 'desc' : 'asc',
17
+ field.startsWith('-') ? field.substring(1) : field,
18
+ ]) as SortByField
19
+ return fields.length > 1 ? fields : (fields[0] as SortByField)
17
20
  }