geonetwork-ui 2.8.0-dev.6ea037ab6 → 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 (183) hide show
  1. package/esm2022/index.mjs +2 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/common/distribution.mapper.mjs +3 -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 +25 -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/common/domain/src/index.mjs +3 -0
  10. package/esm2022/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.mjs +1 -1
  11. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +2 -1
  12. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  13. package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +3 -1
  14. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +26 -8
  15. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.mjs +23 -3
  16. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +2 -2
  17. package/esm2022/libs/feature/record/src/index.mjs +2 -1
  18. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +13 -4
  19. package/esm2022/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.mjs +23 -8
  20. package/esm2022/libs/feature/record/src/lib/stac-view/stac-view.component.mjs +138 -0
  21. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +14 -1
  22. package/esm2022/libs/feature/search/src/lib/constants.mjs +1 -2
  23. package/esm2022/libs/ui/elements/src/index.mjs +3 -1
  24. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +1 -1
  25. package/esm2022/libs/ui/elements/src/lib/metadata-doi/metadata-doi.component.mjs +37 -0
  26. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +5 -9
  27. package/esm2022/libs/ui/elements/src/lib/stac-items-result-grid/stac-items-result-grid.component.mjs +18 -0
  28. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.mjs +5 -5
  29. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  30. package/esm2022/libs/ui/inputs/src/lib/date-picker/date-picker.component.mjs +21 -7
  31. package/esm2022/libs/ui/inputs/src/lib/date-range-inputs/date-range-inputs.component.mjs +35 -0
  32. package/esm2022/libs/ui/layout/src/lib/paginable.interface.mjs +1 -1
  33. package/esm2022/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +13 -5
  34. package/esm2022/libs/util/i18n/src/lib/date-locales.mjs +33 -0
  35. package/esm2022/libs/util/shared/src/index.mjs +2 -1
  36. package/esm2022/libs/util/shared/src/lib/humanize-date.directive.mjs +33 -0
  37. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +3 -1
  38. package/esm2022/libs/util/shared/src/lib/services/date.service.mjs +19 -2
  39. package/esm2022/translations/de.json +15 -4
  40. package/esm2022/translations/en.json +15 -4
  41. package/esm2022/translations/es.json +11 -0
  42. package/esm2022/translations/fr.json +15 -4
  43. package/esm2022/translations/it.json +16 -5
  44. package/esm2022/translations/nl.json +11 -0
  45. package/esm2022/translations/pt.json +11 -0
  46. package/esm2022/translations/sk.json +12 -1
  47. package/fesm2022/geonetwork-ui-date-locales-MYnkDJ5h.mjs +35 -0
  48. package/fesm2022/geonetwork-ui-date-locales-MYnkDJ5h.mjs.map +1 -0
  49. package/fesm2022/geonetwork-ui.mjs +538 -151
  50. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  51. package/index.d.ts +1 -0
  52. package/index.d.ts.map +1 -1
  53. package/index.ts +1 -0
  54. package/libs/api/metadata-converter/src/lib/common/distribution.mapper.d.ts.map +1 -1
  55. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  56. package/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.d.ts.map +1 -1
  57. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +5 -1
  58. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  59. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  60. package/libs/api/repository/src/lib/gn4/elasticsearch/constant.d.ts.map +1 -1
  61. package/libs/common/domain/src/index.d.ts +3 -0
  62. package/libs/common/domain/src/index.d.ts.map +1 -0
  63. package/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.d.ts +1 -1
  64. package/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.d.ts.map +1 -1
  65. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +7 -2
  66. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  67. package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -1
  68. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  69. package/libs/feature/dataviz/src/lib/chart-view/chart-view.component.d.ts.map +1 -1
  70. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +2 -1
  71. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  72. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts +2 -0
  73. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.d.ts.map +1 -1
  74. package/libs/feature/record/src/index.d.ts +1 -0
  75. package/libs/feature/record/src/index.d.ts.map +1 -1
  76. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +3 -2
  77. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
  78. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +3 -2
  79. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
  80. package/libs/feature/record/src/lib/stac-view/stac-view.component.d.ts +35 -0
  81. package/libs/feature/record/src/lib/stac-view/stac-view.component.d.ts.map +1 -0
  82. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +28 -24
  83. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  84. package/libs/feature/search/src/lib/constants.d.ts.map +1 -1
  85. package/libs/ui/elements/src/index.d.ts +2 -0
  86. package/libs/ui/elements/src/index.d.ts.map +1 -1
  87. package/libs/ui/elements/src/lib/metadata-doi/metadata-doi.component.d.ts +8 -0
  88. package/libs/ui/elements/src/lib/metadata-doi/metadata-doi.component.d.ts.map +1 -0
  89. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +0 -2
  90. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  91. package/libs/ui/elements/src/lib/stac-items-result-grid/stac-items-result-grid.component.d.ts +8 -0
  92. package/libs/ui/elements/src/lib/stac-items-result-grid/stac-items-result-grid.component.d.ts.map +1 -0
  93. package/libs/ui/inputs/src/index.d.ts +1 -0
  94. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  95. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts +5 -0
  96. package/libs/ui/inputs/src/lib/date-picker/date-picker.component.d.ts.map +1 -1
  97. package/libs/ui/inputs/src/lib/date-range-inputs/date-range-inputs.component.d.ts +12 -0
  98. package/libs/ui/inputs/src/lib/date-range-inputs/date-range-inputs.component.d.ts.map +1 -0
  99. package/libs/ui/layout/src/lib/paginable.interface.d.ts +3 -3
  100. package/libs/ui/layout/src/lib/paginable.interface.d.ts.map +1 -1
  101. package/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts +2 -1
  102. package/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.d.ts.map +1 -1
  103. package/libs/util/i18n/src/lib/date-locales.d.ts +5 -0
  104. package/libs/util/i18n/src/lib/date-locales.d.ts.map +1 -0
  105. package/libs/util/shared/src/index.d.ts +1 -0
  106. package/libs/util/shared/src/index.d.ts.map +1 -1
  107. package/libs/util/shared/src/lib/humanize-date.directive.d.ts +15 -0
  108. package/libs/util/shared/src/lib/humanize-date.directive.d.ts.map +1 -0
  109. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
  110. package/libs/util/shared/src/lib/services/date.service.d.ts +4 -0
  111. package/libs/util/shared/src/lib/services/date.service.d.ts.map +1 -1
  112. package/package.json +1 -1
  113. package/src/libs/api/metadata-converter/src/lib/common/distribution.mapper.ts +1 -0
  114. package/src/libs/api/metadata-converter/src/lib/dcat-ap/dcat-ap.converter.ts +2 -2
  115. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +1 -1
  116. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.service+eaux-usees.ts +1 -1
  117. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +5 -2
  118. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +1 -1
  119. package/src/libs/api/metadata-converter/src/lib/fixtures/georhena.records.ts +1 -1
  120. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +2 -2
  121. package/src/libs/api/metadata-converter/src/lib/fixtures/wallonie.records.reuse.ts +1 -1
  122. package/src/libs/api/metadata-converter/src/lib/fixtures/wallonie.records.service+napitswallonia.ts +1 -1
  123. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +27 -0
  124. package/src/libs/api/metadata-converter/src/lib/iso19139/iso19139.converter.ts +13 -6
  125. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +6 -2
  126. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +4 -2
  127. package/src/libs/api/repository/src/lib/gn4/elasticsearch/constant.ts +0 -1
  128. package/src/libs/common/domain/src/index.ts +2 -0
  129. package/src/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.ts +1 -1
  130. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +10 -1
  131. package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -1
  132. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +5 -0
  133. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +10 -0
  134. package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.ts +1 -0
  135. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +30 -5
  136. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.html +3 -3
  137. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field.component.ts +30 -0
  138. package/src/libs/feature/editor/src/lib/fields.config.ts +1 -1
  139. package/src/libs/feature/record/src/index.ts +1 -0
  140. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +7 -1
  141. package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +23 -4
  142. package/src/libs/feature/record/src/lib/stac-view/stac-view.component.css +3 -0
  143. package/src/libs/feature/record/src/lib/stac-view/stac-view.component.html +68 -0
  144. package/src/libs/feature/record/src/lib/stac-view/stac-view.component.ts +190 -0
  145. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +30 -1
  146. package/src/libs/feature/search/src/lib/constants.ts +0 -1
  147. package/src/libs/ui/elements/src/index.ts +2 -0
  148. package/src/libs/ui/elements/src/lib/metadata-doi/metadata-doi.component.css +0 -0
  149. package/src/libs/ui/elements/src/lib/metadata-doi/metadata-doi.component.html +31 -0
  150. package/src/libs/ui/elements/src/lib/metadata-doi/metadata-doi.component.ts +30 -0
  151. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +67 -21
  152. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +2 -9
  153. package/src/libs/ui/elements/src/lib/stac-items-result-grid/stac-items-result-grid.component.css +0 -0
  154. package/src/libs/ui/elements/src/lib/stac-items-result-grid/stac-items-result-grid.component.html +13 -0
  155. package/src/libs/ui/elements/src/lib/stac-items-result-grid/stac-items-result-grid.component.ts +15 -0
  156. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.html +1 -1
  157. package/src/libs/ui/elements/src/lib/user-feedback-item/user-feedback-item.component.ts +2 -2
  158. package/src/libs/ui/inputs/src/index.ts +1 -0
  159. package/src/libs/ui/inputs/src/lib/date-picker/date-picker.component.ts +17 -1
  160. package/src/libs/ui/inputs/src/lib/date-range-inputs/date-range-inputs.component.css +0 -0
  161. package/src/libs/ui/inputs/src/lib/date-range-inputs/date-range-inputs.component.html +15 -0
  162. package/src/libs/ui/inputs/src/lib/date-range-inputs/date-range-inputs.component.ts +41 -0
  163. package/src/libs/ui/layout/src/lib/paginable.interface.ts +3 -3
  164. package/src/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.html +12 -6
  165. package/src/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.ts +4 -1
  166. package/src/libs/util/i18n/src/lib/date-locales.ts +63 -0
  167. package/src/libs/util/shared/src/index.ts +1 -0
  168. package/src/libs/util/shared/src/lib/humanize-date.directive.ts +35 -0
  169. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +2 -0
  170. package/src/libs/util/shared/src/lib/services/date.service.ts +27 -1
  171. package/translations/de.json +15 -4
  172. package/translations/en.json +15 -4
  173. package/translations/es.json +11 -0
  174. package/translations/fr.json +15 -4
  175. package/translations/it.json +16 -5
  176. package/translations/nl.json +11 -0
  177. package/translations/pt.json +11 -0
  178. package/translations/sk.json +12 -1
  179. package/esm2022/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.mjs +0 -59
  180. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts +0 -11
  181. package/libs/ui/elements/src/lib/user-feedback-item/time-since.pipe.d.ts.map +0 -1
  182. package/src/libs/common/domain/src/lib/index.ts +0 -2
  183. 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
+ }
@@ -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
+ }
@@ -41,6 +41,8 @@ export class LinkClassifierService {
41
41
  return [LinkUsage.API]
42
42
  case 'postgis':
43
43
  return [LinkUsage.UNKNOWN]
44
+ case 'stac':
45
+ return [LinkUsage.API]
44
46
  default:
45
47
  return [LinkUsage.UNKNOWN]
46
48
  }
@@ -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
  }