geonetwork-ui 2.2.0-dev.cbcafed5 → 2.2.0-dev.da2c1f8f

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 (222) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +27 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +64 -61
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.mjs +7 -4
  4. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.mjs +14 -0
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/converter.mjs +25 -17
  7. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +55 -23
  8. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +52 -32
  9. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +2 -2
  10. package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.mjs +10 -3
  11. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +14 -5
  12. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +33 -8
  13. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  14. package/esm2022/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.mjs +1 -1
  15. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  16. package/esm2022/libs/feature/editor/src/index.mjs +6 -1
  17. package/esm2022/libs/feature/editor/src/lib/+state/editor.actions.mjs +8 -0
  18. package/esm2022/libs/feature/editor/src/lib/+state/editor.effects.mjs +26 -0
  19. package/esm2022/libs/feature/editor/src/lib/+state/editor.facade.mjs +30 -0
  20. package/esm2022/libs/feature/editor/src/lib/+state/editor.models.mjs +2 -0
  21. package/esm2022/libs/feature/editor/src/lib/+state/editor.reducer.mjs +42 -0
  22. package/esm2022/libs/feature/editor/src/lib/+state/editor.selectors.mjs +13 -0
  23. package/esm2022/libs/feature/editor/src/lib/expressions.mjs +13 -0
  24. package/esm2022/libs/feature/editor/src/lib/feature-editor.module.mjs +16 -4
  25. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +34 -0
  26. package/esm2022/libs/feature/editor/src/lib/models/fields.model.mjs +2 -0
  27. package/esm2022/libs/feature/editor/src/lib/record-form/record-form.component.mjs +15 -11
  28. package/esm2022/libs/feature/editor/src/lib/services/editor.service.mjs +22 -44
  29. package/esm2022/libs/feature/map/src/lib/map-context/map-context.service.mjs +9 -1
  30. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +13 -13
  31. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +3 -3
  32. package/esm2022/libs/feature/search/src/lib/utils/service/fields.mjs +41 -26
  33. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +11 -9
  34. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +3 -3
  35. package/esm2022/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.mjs +3 -3
  36. package/esm2022/libs/ui/elements/src/lib/max-lines/max-lines.component.mjs +5 -3
  37. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  38. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +47 -22
  39. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +3 -4
  40. package/esm2022/libs/ui/elements/src/lib/thumbnail/thumbnail.component.mjs +3 -3
  41. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +4 -4
  42. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +9 -9
  43. package/esm2022/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.mjs +3 -3
  44. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +3 -3
  45. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field.component.mjs +4 -2
  46. package/esm2022/libs/ui/inputs/src/lib/form-field/form-field.model.mjs +1 -1
  47. package/esm2022/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.mjs +3 -3
  48. package/esm2022/libs/ui/inputs/src/lib/text-area/text-area.component.mjs +3 -3
  49. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +6 -6
  50. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +3 -3
  51. package/esm2022/libs/ui/widgets/src/lib/badge/badge.component.mjs +3 -3
  52. package/esm2022/libs/util/i18n/src/lib/i18n.constants.mjs +18 -1
  53. package/esm2022/libs/util/shared/src/lib/utils/index.mjs +2 -1
  54. package/esm2022/libs/util/shared/src/lib/utils/temporal-extent-union.mjs +32 -0
  55. package/esm2022/translations/de.json +37 -27
  56. package/esm2022/translations/en.json +32 -22
  57. package/esm2022/translations/es.json +27 -17
  58. package/esm2022/translations/fr.json +50 -40
  59. package/esm2022/translations/it.json +44 -34
  60. package/esm2022/translations/nl.json +28 -18
  61. package/esm2022/translations/pt.json +27 -17
  62. package/fesm2022/geonetwork-ui.mjs +972 -527
  63. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  64. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts +2 -0
  65. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  66. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts +0 -1
  67. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  68. package/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.d.ts.map +1 -1
  69. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +4 -5
  70. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  71. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts +3 -0
  72. package/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.d.ts.map +1 -0
  73. package/libs/api/metadata-converter/src/lib/iso19139/converter.d.ts.map +1 -1
  74. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts +7 -6
  75. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  76. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts +4 -3
  77. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  78. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  79. package/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.d.ts.map +1 -1
  80. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts +1 -1
  81. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.d.ts.map +1 -1
  82. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +9 -2
  83. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  84. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +21 -12
  85. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  86. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts +1 -0
  87. package/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.d.ts.map +1 -1
  88. package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -1
  89. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  90. package/libs/feature/editor/src/index.d.ts +5 -0
  91. package/libs/feature/editor/src/index.d.ts.map +1 -1
  92. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts +23 -0
  93. package/libs/feature/editor/src/lib/+state/editor.actions.d.ts.map +1 -0
  94. package/libs/feature/editor/src/lib/+state/editor.effects.d.ts +15 -0
  95. package/libs/feature/editor/src/lib/+state/editor.effects.d.ts.map +1 -0
  96. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts +19 -0
  97. package/libs/feature/editor/src/lib/+state/editor.facade.d.ts.map +1 -0
  98. package/libs/feature/editor/src/lib/+state/editor.models.d.ts +2 -0
  99. package/libs/feature/editor/src/lib/+state/editor.models.d.ts.map +1 -0
  100. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts +18 -0
  101. package/libs/feature/editor/src/lib/+state/editor.reducer.d.ts.map +1 -0
  102. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts +15 -0
  103. package/libs/feature/editor/src/lib/+state/editor.selectors.d.ts.map +1 -0
  104. package/libs/feature/editor/src/lib/expressions.d.ts +4 -0
  105. package/libs/feature/editor/src/lib/expressions.d.ts.map +1 -0
  106. package/libs/feature/editor/src/lib/feature-editor.module.d.ts +3 -1
  107. package/libs/feature/editor/src/lib/feature-editor.module.d.ts.map +1 -1
  108. package/libs/feature/editor/src/lib/fields.config.d.ts +3 -0
  109. package/libs/feature/editor/src/lib/fields.config.d.ts.map +1 -0
  110. package/libs/feature/editor/src/lib/models/fields.model.d.ts +15 -0
  111. package/libs/feature/editor/src/lib/models/fields.model.d.ts.map +1 -0
  112. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts +10 -5
  113. package/libs/feature/editor/src/lib/record-form/record-form.component.d.ts.map +1 -1
  114. package/libs/feature/editor/src/lib/services/editor.service.d.ts +3 -13
  115. package/libs/feature/editor/src/lib/services/editor.service.d.ts.map +1 -1
  116. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts +1 -0
  117. package/libs/feature/map/src/lib/map-context/map-context.service.d.ts.map +1 -1
  118. package/libs/feature/search/src/lib/utils/service/fields.d.ts +21 -8
  119. package/libs/feature/search/src/lib/utils/service/fields.d.ts.map +1 -1
  120. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  121. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts +1 -1
  122. package/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.d.ts.map +1 -1
  123. package/libs/ui/elements/src/lib/max-lines/max-lines.component.d.ts.map +1 -1
  124. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +16 -6
  125. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  126. package/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.d.ts.map +1 -1
  127. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +13 -13
  128. package/libs/ui/inputs/src/lib/button/button.component.d.ts +1 -1
  129. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  130. package/libs/ui/inputs/src/lib/form-field/form-field.component.d.ts.map +1 -1
  131. package/libs/ui/inputs/src/lib/form-field/form-field.model.d.ts +0 -1
  132. package/libs/ui/inputs/src/lib/form-field/form-field.model.d.ts.map +1 -1
  133. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts +1 -1
  134. package/libs/ui/inputs/src/lib/text-area/text-area.component.d.ts.map +1 -1
  135. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts +40 -40
  136. package/libs/ui/layout/src/lib/interactive-table/interactive-table-column/interactive-table-column.component.d.ts +1 -1
  137. package/libs/util/i18n/src/lib/i18n.constants.d.ts +17 -0
  138. package/libs/util/i18n/src/lib/i18n.constants.d.ts.map +1 -1
  139. package/libs/util/shared/src/lib/utils/index.d.ts +1 -0
  140. package/libs/util/shared/src/lib/utils/index.d.ts.map +1 -1
  141. package/libs/util/shared/src/lib/utils/temporal-extent-union.d.ts +5 -0
  142. package/libs/util/shared/src/lib/utils/temporal-extent-union.d.ts.map +1 -0
  143. package/package.json +1 -1
  144. package/src/libs/api/metadata-converter/src/lib/fixtures/generic.records.ts +63 -8
  145. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.ts +57 -9
  146. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +229 -24
  147. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +29 -0
  148. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +99 -76
  149. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.metadata.mapper.ts +6 -3
  150. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +4 -5
  151. package/src/libs/api/metadata-converter/src/lib/iso19139/codelists/keyword.mapper.ts +16 -0
  152. package/src/libs/api/metadata-converter/src/lib/iso19139/converter.ts +30 -21
  153. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +120 -63
  154. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +177 -97
  155. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +1 -1
  156. package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts +22 -2
  157. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +15 -4
  158. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +47 -8
  159. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +25 -14
  160. package/src/libs/common/domain/src/lib/model/thesaurus/thesaurus.model.ts +1 -0
  161. package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -4
  162. package/src/libs/common/fixtures/src/lib/elasticsearch/full-response.ts +1 -1
  163. package/src/libs/common/fixtures/src/lib/gn4/groups.fixtures.ts +1 -1
  164. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +52 -10
  165. package/src/libs/feature/editor/src/index.ts +5 -0
  166. package/src/libs/feature/editor/src/lib/+state/editor.actions.ts +24 -0
  167. package/src/libs/feature/editor/src/lib/+state/editor.effects.ts +49 -0
  168. package/src/libs/feature/editor/src/lib/+state/editor.facade.ts +30 -0
  169. package/src/libs/feature/editor/src/lib/+state/editor.models.ts +1 -0
  170. package/src/libs/feature/editor/src/lib/+state/editor.reducer.ts +68 -0
  171. package/src/libs/feature/editor/src/lib/+state/editor.selectors.ts +39 -0
  172. package/src/libs/feature/editor/src/lib/expressions.ts +16 -0
  173. package/src/libs/feature/editor/src/lib/feature-editor.module.ts +11 -0
  174. package/src/libs/feature/editor/src/lib/fields.config.ts +35 -0
  175. package/src/libs/feature/editor/src/lib/models/fields.model.ts +29 -0
  176. package/src/libs/feature/editor/src/lib/record-form/record-form.component.html +9 -7
  177. package/src/libs/feature/editor/src/lib/record-form/record-form.component.ts +11 -5
  178. package/src/libs/feature/editor/src/lib/services/editor.service.ts +34 -73
  179. package/src/libs/feature/map/src/lib/map-context/map-context.service.ts +10 -0
  180. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +12 -12
  181. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.html +3 -4
  182. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +21 -16
  183. package/src/libs/feature/search/src/lib/utils/service/fields.ts +43 -34
  184. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -1
  185. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.css +5 -0
  186. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.html +39 -0
  187. package/src/libs/ui/elements/src/lib/markdown-editor/markdown-editor.component.ts +58 -0
  188. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.css +2 -2
  189. package/src/libs/ui/elements/src/lib/markdown-parser/markdown-parser.component.ts +1 -0
  190. package/src/libs/ui/elements/src/lib/max-lines/max-lines.component.html +5 -1
  191. package/src/libs/ui/elements/src/lib/max-lines/max-lines.component.ts +1 -0
  192. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +1 -1
  193. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +169 -52
  194. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +51 -15
  195. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.ts +2 -3
  196. package/src/libs/ui/elements/src/lib/thumbnail/thumbnail.component.html +2 -2
  197. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +1 -1
  198. package/src/libs/ui/inputs/src/lib/button/button.component.css +0 -5
  199. package/src/libs/ui/inputs/src/lib/button/button.component.html +0 -1
  200. package/src/libs/ui/inputs/src/lib/button/button.component.ts +7 -6
  201. package/src/libs/ui/inputs/src/lib/dropdown-multiselect/dropdown-multiselect.component.html +1 -1
  202. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.html +3 -1
  203. package/src/libs/ui/inputs/src/lib/form-field/form-field.component.ts +3 -1
  204. package/src/libs/ui/inputs/src/lib/form-field/form-field.model.ts +0 -1
  205. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.css +3 -0
  206. package/src/libs/ui/inputs/src/lib/navigation-button/navigation-button.component.html +1 -1
  207. package/src/libs/ui/inputs/src/lib/text-area/text-area.component.ts +1 -0
  208. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +2 -2
  209. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +1 -0
  210. package/src/libs/ui/widgets/src/lib/badge/badge.component.html +3 -1
  211. package/src/libs/util/i18n/src/lib/i18n.constants.ts +18 -0
  212. package/src/libs/util/shared/src/lib/utils/index.ts +1 -0
  213. package/src/libs/util/shared/src/lib/utils/temporal-extent-union.ts +32 -0
  214. package/tailwind.base.css +44 -15
  215. package/translations/de.json +37 -27
  216. package/translations/en.json +32 -22
  217. package/translations/es.json +27 -17
  218. package/translations/fr.json +50 -40
  219. package/translations/it.json +44 -34
  220. package/translations/nl.json +28 -18
  221. package/translations/pt.json +27 -17
  222. package/translations/sk.json +118 -108
@@ -74,12 +74,12 @@
74
74
  margin-top: 0;
75
75
  margin-bottom: 10px;
76
76
  color: var(--color-primary) !important;
77
- text-decoration: none !important;
78
- @apply font-bold;
77
+ text-decoration: none;
79
78
  }
80
79
 
81
80
  :host ::ng-deep .markdown-body p > a:hover {
82
81
  color: var(--color-primary-darker) !important;
82
+ @apply underline;
83
83
  }
84
84
 
85
85
  /** Blockquotes **/
@@ -6,6 +6,7 @@ import { marked } from 'marked'
6
6
  templateUrl: './markdown-parser.component.html',
7
7
  styleUrls: ['./markdown-parser.component.css'],
8
8
  changeDetection: ChangeDetectionStrategy.OnPush,
9
+ standalone: true,
9
10
  })
10
11
  export class MarkdownParserComponent {
11
12
  @Input() textContent: string
@@ -1,10 +1,14 @@
1
1
  <div
2
2
  #container
3
- class="max-lines overflow-hidden transition-[max-height] duration-300"
3
+ class="max-lines overflow-hidden transition-[max-height] duration-300 relative"
4
4
  [ngClass]="isExpanded ? 'ease-in' : 'ease-out'"
5
5
  [style.maxHeight]="maxHeight"
6
6
  >
7
7
  <ng-content></ng-content>
8
+ <div
9
+ *ngIf="showToggleButton && !isExpanded"
10
+ class="absolute inset-x-0 bottom-0 bg-gradient-to-b from-transparent to-white h-3"
11
+ ></div>
8
12
  </div>
9
13
  <div
10
14
  *ngIf="showToggleButton"
@@ -78,6 +78,7 @@ export class MaxLinesComponent implements AfterViewInit, OnDestroy {
78
78
  }
79
79
 
80
80
  ngOnDestroy(): void {
81
+ if (!this.observer) return
81
82
  this.observer.unobserve(this.container.nativeElement.children[0])
82
83
  }
83
84
  }
@@ -1,5 +1,5 @@
1
1
  <div class="py-5 px-5 rounded bg-gray-100 text-black mb-6">
2
- <div class="grid gap-3">
2
+ <div class="grid gap-3 overflow-hidden">
3
3
  <div>
4
4
  <p class="text-sm font-medium" translate>record.metadata.contact</p>
5
5
  </div>
@@ -7,33 +7,144 @@
7
7
  ></gn-ui-markdown-parser>
8
8
  </div>
9
9
  </gn-ui-max-lines>
10
+ <div *ngIf="metadata.keywords?.length">
11
+ <p class="mt-6 mb-3 font-medium text-primary text-sm" translate>
12
+ record.metadata.keywords
13
+ </p>
14
+ <div class="sm:pb-4 flex flex-wrap gap-2">
15
+ <gn-ui-badge
16
+ class="inline-block lowercase"
17
+ (click)="onKeywordClick(keyword)"
18
+ [clickable]="true"
19
+ *ngFor="let keyword of metadata.keywords"
20
+ >{{ keyword.label }}</gn-ui-badge
21
+ >
22
+ </div>
23
+ </div>
10
24
  </gn-ui-content-ghost>
11
25
  </div>
12
26
 
27
+ <gn-ui-expandable-panel [title]="'record.metadata.usage' | translate">
28
+ <div class="flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900">
29
+ <ng-container *ngFor="let license of licenses">
30
+ <div *ngIf="license.url; else noUrl" class="text-primary">
31
+ <a
32
+ [href]="license.url"
33
+ target="_blank"
34
+ class="cursor-pointer hover:underline transition-all"
35
+ >
36
+ {{ license.text }}
37
+ <mat-icon
38
+ class="material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0"
39
+ >open_in_new</mat-icon
40
+ >
41
+ </a>
42
+ </div>
43
+ <ng-template #noUrl>
44
+ <div class="text-primary" gnUiLinkify>
45
+ {{ license.text }}
46
+ </div>
47
+ </ng-template>
48
+ </ng-container>
49
+ <ng-container *ngIf="legalConstraints.length">
50
+ <gn-ui-markdown-parser
51
+ *ngFor="let constraint of legalConstraints"
52
+ [textContent]="constraint"
53
+ >
54
+ </gn-ui-markdown-parser>
55
+ </ng-container>
56
+ <ng-container *ngIf="otherConstraints.length">
57
+ <div gnUiLinkify *ngFor="let constraint of otherConstraints">
58
+ <h5 translate class="font-medium text-black text-sm mb-[2px] mt-[16px]">
59
+ record.metadata.otherConstraints
60
+ </h5>
61
+ <gn-ui-markdown-parser [textContent]="constraint">
62
+ </gn-ui-markdown-parser>
63
+ </div>
64
+ </ng-container>
65
+
66
+ <span class="noUsage" *ngIf="!hasUsage">
67
+ {{ 'record.metadata.noUsage' | translate }}
68
+ </span>
69
+ </div>
70
+ </gn-ui-expandable-panel>
13
71
  <gn-ui-expandable-panel
14
- class="metadata-origin"
15
72
  *ngIf="
16
73
  metadata.lineage ||
17
74
  metadata.recordUpdated ||
18
75
  metadata.updateFrequency ||
19
76
  metadata.status
20
77
  "
21
- [title]="'record.metadata.origin' | translate"
78
+ [title]="'record.metadata.details' | translate"
22
79
  >
23
- <p
24
- *ngIf="metadata.lineage"
25
- class="mb-5 pt-4 whitespace-pre-line break-words"
26
- gnUiLinkify
27
- >
28
- {{ metadata.lineage }}
29
- </p>
80
+ <div *ngIf="metadata.lineage" class="text-gray-900 flex flex-col mt-4 gap-2">
81
+ <p class="whitespace-pre-line break-words text-gray-900" gnUiLinkify>
82
+ {{ metadata.lineage }}
83
+ </p>
84
+ </div>
85
+ <div class="flex flex-row gap-6 mt-5 mb-8" *ngIf="resourceContact">
86
+ <div
87
+ *ngIf="resourceContact.organization?.logoUrl?.href"
88
+ class="flex items-center justify-center border-solid border border-gray-300 rounded-md bg-white h-32 overflow-hidden"
89
+ >
90
+ <gn-ui-thumbnail
91
+ class="relative h-full w-full"
92
+ [thumbnailUrl]="resourceContact.organization.logoUrl.href"
93
+ fit="contain"
94
+ ></gn-ui-thumbnail>
95
+ </div>
96
+ <div class="flex flex-col gap-1">
97
+ <p class="text-sm font-medium" translate>record.metadata.producer</p>
98
+ <div
99
+ class="text-primary font-title text-21 mr-2 cursor-pointer hover:underline"
100
+ data-cy="organization-name"
101
+ >
102
+ {{ resourceContact.organization?.name }}
103
+ </div>
104
+ <div *ngIf="resourceContact.organization?.website">
105
+ <a
106
+ [href]="resourceContact.organization.website"
107
+ target="_blank"
108
+ class="contact-website text-primary text-sm cursor-pointer hover:underline transition-all"
109
+ >{{ resourceContact.organization.website }}
110
+ <mat-icon
111
+ class="material-symbols-outlined !w-[12px] !h-[12px] !text-[12px] opacity-75 shrink-0"
112
+ >open_in_new</mat-icon
113
+ >
114
+ </a>
115
+ </div>
116
+ <div class="mt-4" *ngIf="resourceContact.email">
117
+ <div class="flex">
118
+ <mat-icon
119
+ class="material-symbols-outlined !w-5 !h-5 !text-[20px] opacity-75 shrink-0"
120
+ >
121
+ mail_outline</mat-icon
122
+ >
123
+ <a
124
+ *ngIf="resourceContact.email"
125
+ [href]="'mailto:' + resourceContact.email"
126
+ class="text-sm hover:underline ml-2"
127
+ target="_blank"
128
+ data-cy="contact-email"
129
+ >{{ resourceContact?.email }}</a
130
+ >
131
+ </div>
132
+ </div>
133
+ </div>
134
+ </div>
30
135
  <div
31
- class="py-4 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-[10px] gap-x-[20px] text-gray-700 info-grid"
136
+ class="py-6 px-6 rounded bg-gray-100 grid grid-cols-2 gap-y-6 gap-x-[20px] text-gray-700"
32
137
  >
33
- <div *ngIf="metadata.recordUpdated">
34
- <p class="text-sm" translate>record.metadata.updatedOn</p>
138
+ <div *ngIf="metadata.recordCreated">
139
+ <p class="text-sm" translate>record.metadata.creation</p>
35
140
  <p class="text-primary font-medium mt-1">
36
- {{ metadata.recordUpdated && metadata.recordUpdated.toLocaleString() }}
141
+ {{ metadata.recordCreated.toLocaleDateString() }}
142
+ </p>
143
+ </div>
144
+ <div *ngIf="metadata.recordPublished">
145
+ <p class="text-sm" translate>record.metadata.publication</p>
146
+ <p class="text-primary font-medium mt-1">
147
+ {{ metadata.recordPublished.toLocaleDateString() }}
37
148
  </p>
38
149
  </div>
39
150
  <div *ngIf="updateFrequency">
@@ -46,34 +157,52 @@
46
157
  {{ updateFrequency }}
47
158
  </p>
48
159
  </div>
49
- <div *ngIf="metadata.status">
50
- <p class="text-sm" translate>record.metadata.updateStatus</p>
51
- <p class="text-primary font-medium mt-1" translate>
52
- domain.record.status.{{ metadata.status }}
53
- </p>
160
+ <div *ngIf="metadata.languages">
161
+ <p class="text-sm mb-1" translate>record.metadata.languages</p>
162
+ <div class="flex flex-row gap-1 flex-wrap">
163
+ <p
164
+ class="text-primary font-medium"
165
+ translate
166
+ *ngFor="let language of metadata.languages"
167
+ >
168
+ language.{{ language }}
169
+ </p>
170
+ </div>
171
+ </div>
172
+ <div *ngIf="temporalExtent">
173
+ <p class="text-sm" translate>record.metadata.temporalExtent</p>
174
+ <div class="flex flex-row gap-1 mb-1 text-primary font-medium">
175
+ <p
176
+ *ngIf="temporalExtent.start && temporalExtent.end"
177
+ translate
178
+ [translateParams]="{
179
+ start: temporalExtent.start,
180
+ end: temporalExtent.end
181
+ }"
182
+ >
183
+ record.metadata.temporalExtent.fromDateToDate
184
+ </p>
185
+ <p
186
+ *ngIf="temporalExtent.start && !temporalExtent.end"
187
+ translate
188
+ [translateParams]="{ start: temporalExtent.start }"
189
+ >
190
+ record.metadata.temporalExtent.sinceDate
191
+ </p>
192
+ <p
193
+ *ngIf="!temporalExtent.start && temporalExtent.end"
194
+ translate
195
+ [translateParams]="{ end: temporalExtent.end }"
196
+ >
197
+ record.metadata.temporalExtent.untilDate
198
+ </p>
199
+ </div>
54
200
  </div>
55
- </div>
56
- </gn-ui-expandable-panel>
57
- <gn-ui-expandable-panel [title]="'record.metadata.usage' | translate">
58
- <div class="py-4 px-6 rounded bg-gray-100 text-gray-700 flex flex-wrap gap-2">
59
- <gn-ui-badge *ngIf="metadata.extras?.isOpenData">
60
- <span translate>record.metadata.isOpenData</span>
61
- </gn-ui-badge>
62
- <span
63
- class="text-primary font-medium"
64
- *ngFor="let usage of usages"
65
- gnUiLinkify
66
- >
67
- {{ usage }}
68
- </span>
69
- <span class="text-primary font-medium noUsage" *ngIf="!hasUsage">
70
- {{ 'record.metadata.noUsage' | translate }}
71
- </span>
72
201
  </div>
73
202
  </gn-ui-expandable-panel>
74
203
  <gn-ui-expandable-panel
75
204
  *ngIf="metadata.landingPage"
76
- [title]="'record.metadata.details' | translate"
205
+ [title]="'record.metadata.technical' | translate"
77
206
  >
78
207
  <div class="flex flex-col gap-4 mr-4 py-5 rounded text-gray-700">
79
208
  <div *ngIf="metadata.recordUpdated">
@@ -109,25 +238,13 @@
109
238
  </p>
110
239
  </div>
111
240
  </div>
112
- <div *ngIf="metadata.themes?.length">
113
- <p class="text-sm mb-1" translate>record.metadata.themes</p>
114
- <div class="sm:pb-4 sm:pr-16">
115
- <gn-ui-badge
116
- class="inline-block mr-2 lowercase"
117
- *ngFor="let theme of metadata.themes"
118
- >{{ theme }}</gn-ui-badge
119
- >
120
- </div>
121
- </div>
122
- <div *ngIf="metadata.keywords?.length">
123
- <p class="text-sm mb-1" translate>record.metadata.keywords</p>
241
+ <div *ngIf="metadata.topics?.length">
242
+ <p class="text-sm mb-1" translate>record.metadata.topics</p>
124
243
  <div class="sm:pb-4 sm:pr-16">
125
244
  <gn-ui-badge
126
245
  class="inline-block mr-2 mb-2 lowercase"
127
- (click)="onKeywordClick(keyword)"
128
- [clickable]="true"
129
- *ngFor="let keyword of metadata.keywords"
130
- >{{ keyword }}</gn-ui-badge
246
+ *ngFor="let topic of metadata.topics"
247
+ >{{ topic }}</gn-ui-badge
131
248
  >
132
249
  </div>
133
250
  </div>
@@ -5,7 +5,11 @@ import {
5
5
  Input,
6
6
  Output,
7
7
  } from '@angular/core'
8
- import { DatasetRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
8
+ import {
9
+ DatasetRecord,
10
+ Keyword,
11
+ } from '../../../../../../libs/common/domain/src/lib/model/record'
12
+ import { getTemporalRangeUnion } from '../../../../../../libs/util/shared/src'
9
13
 
10
14
  @Component({
11
15
  selector: 'gn-ui-metadata-info',
@@ -16,24 +20,48 @@ import { DatasetRecord } from '../../../../../../libs/common/domain/src/lib/mode
16
20
  export class MetadataInfoComponent {
17
21
  @Input() metadata: Partial<DatasetRecord>
18
22
  @Input() incomplete: boolean
19
- @Output() keyword = new EventEmitter<string>()
23
+ @Output() keyword = new EventEmitter<Keyword>()
20
24
  updatedTimes: number
21
25
 
22
26
  get hasUsage() {
23
27
  return (
24
28
  this.metadata.extras?.isOpenData === true ||
25
- this.metadata.useLimitations?.length ||
26
- this.metadata.accessConstraints?.length
29
+ (this.metadata.legalConstraints?.length > 0 &&
30
+ this.legalConstraints.length > 0) ||
31
+ (this.metadata.otherConstraints?.length > 0 &&
32
+ this.otherConstraints.length > 0) ||
33
+ (this.metadata.licenses?.length > 0 && this.licenses.length > 0)
27
34
  )
28
35
  }
29
36
 
30
- get usages(): string[] {
37
+ get legalConstraints() {
31
38
  let array = []
32
- if (this.metadata.useLimitations?.length) {
33
- array = array.concat(this.metadata.useLimitations)
39
+ if (this.metadata.legalConstraints?.length) {
40
+ array = array.concat(
41
+ this.metadata.legalConstraints.filter((c) => c.text).map((c) => c.text)
42
+ )
34
43
  }
35
- if (this.metadata.accessConstraints?.length) {
36
- array = array.concat(this.metadata.accessConstraints.map((c) => c.text))
44
+ return array
45
+ }
46
+
47
+ get otherConstraints() {
48
+ let array = []
49
+ if (this.metadata.otherConstraints?.length) {
50
+ array = array.concat(
51
+ this.metadata.otherConstraints.filter((c) => c.text).map((c) => c.text)
52
+ )
53
+ }
54
+ return array
55
+ }
56
+
57
+ get licenses(): { text: string; url: string }[] {
58
+ let array = []
59
+ if (this.metadata.licenses?.length) {
60
+ array = array.concat(
61
+ this.metadata.licenses
62
+ .filter((c) => c.text)
63
+ .map((c) => ({ text: c.text, url: c.url }))
64
+ )
37
65
  }
38
66
  return array
39
67
  }
@@ -49,16 +77,24 @@ export class MetadataInfoComponent {
49
77
  }
50
78
  }
51
79
 
80
+ get temporalExtent(): { start: string; end: string } {
81
+ const temporalExtents = this.metadata.temporalExtents
82
+ return getTemporalRangeUnion(temporalExtents)
83
+ }
84
+
85
+ get shownOrganization() {
86
+ return this.metadata.ownerOrganization
87
+ }
88
+
89
+ get resourceContact() {
90
+ return this.metadata.contactsForResource?.[0]
91
+ }
92
+
52
93
  fieldReady(propName: string) {
53
94
  return !this.incomplete || propName in this.metadata
54
95
  }
55
96
 
56
- onKeywordClick(keyword: string) {
97
+ onKeywordClick(keyword: Keyword) {
57
98
  this.keyword.emit(keyword)
58
99
  }
59
-
60
- copyText() {
61
- navigator.clipboard.writeText(this.metadata.uniqueIdentifier)
62
- ;(event.target as HTMLElement).blur()
63
- }
64
100
  }
@@ -32,8 +32,7 @@ export class MetadataQualityComponent implements OnChanges {
32
32
 
33
33
  get calculatedQualityScore(): number {
34
34
  return Math.round(
35
- (this.items.filter(({ value }) => value === true).length * 100) /
36
- this.items.length
35
+ (this.items.filter(({ value }) => value).length * 100) / this.items.length
37
36
  )
38
37
  }
39
38
 
@@ -56,7 +55,7 @@ export class MetadataQualityComponent implements OnChanges {
56
55
  this.items = []
57
56
  this.add('title', !!this.metadata?.title)
58
57
  this.add('description', !!this.metadata?.abstract)
59
- this.add('topic', this.metadata?.themes?.length > 0)
58
+ this.add('topic', this.metadata?.topics?.length > 0)
60
59
  this.add('keywords', this.metadata?.keywords?.length > 0)
61
60
  this.add('legalConstraints', this.metadata?.legalConstraints?.length > 0)
62
61
  this.add('organisation', !!contact?.organization)
@@ -1,13 +1,13 @@
1
1
  <div
2
2
  #containerElement
3
- class="h-full w-full relative shrink-0 overflow-hidden flex items-center"
3
+ class="h-full w-full relative shrink-0 overflow-hidden flex items-center justify-center"
4
4
  [ngClass]="isPlaceholder ? 'bg-gray-100' : 'bg-white'"
5
5
  [attr.data-cy-is-placeholder]="isPlaceholder.toString()"
6
6
  >
7
7
  <img
8
8
  #imageElement
9
9
  class="relative w-full object-center"
10
- [ngClass]="imgFit === 'contain' ? 'h-4/5' : 'h-full'"
10
+ [ngClass]="imgFit === 'contain' ? 'h-4/5 w-4/5' : 'h-full'"
11
11
  [ngStyle]="{ objectFit: imgFit }"
12
12
  alt="thumbnail"
13
13
  loading="lazy"
@@ -45,6 +45,7 @@ import { ImageOverlayPreviewComponent } from './image-overlay-preview/image-over
45
45
  UiInputsModule,
46
46
  FormsModule,
47
47
  NgOptimizedImage,
48
+ MarkdownParserComponent,
48
49
  ],
49
50
  declarations: [
50
51
  MetadataInfoComponent,
@@ -67,7 +68,6 @@ import { ImageOverlayPreviewComponent } from './image-overlay-preview/image-over
67
68
  PaginationButtonsComponent,
68
69
  MaxLinesComponent,
69
70
  RecordApiFormComponent,
70
- MarkdownParserComponent,
71
71
  ImageOverlayPreviewComponent,
72
72
  ],
73
73
  exports: [
@@ -1,5 +0,0 @@
1
- /* makes sure icons will not make the buttons grow vertically */
2
- :host ::ng-deep mat-icon.mat-icon {
3
- margin-top: -0.325em;
4
- margin-bottom: -0.325em;
5
- }
@@ -1,6 +1,5 @@
1
1
  <button
2
2
  type="button"
3
- class="flex flex-row items-center text-[1em] leading-none p-[1em] rounded-[0.25em] transition-all duration-100 focus:outline-none disabled:opacity-50 disabled:pointer-events-none"
4
3
  [class]="classList"
5
4
  [disabled]="disabled"
6
5
  (click)="handleClick($event)"
@@ -12,29 +12,30 @@ import { propagateToDocumentOnly } from '../../../../../../libs/util/shared/src'
12
12
  templateUrl: './button.component.html',
13
13
  styleUrls: ['./button.component.css'],
14
14
  changeDetection: ChangeDetectionStrategy.OnPush,
15
+ standalone: true,
15
16
  })
16
17
  export class ButtonComponent {
17
18
  private btnClass: string
18
19
 
19
- // btn-classes are explicited to allow tailwind recognize them and add it in css.
20
20
  @Input() set type(
21
21
  value: 'primary' | 'secondary' | 'default' | 'outline' | 'light'
22
22
  ) {
23
+ // btn-classes are written in full to be picked up by tailwind
23
24
  switch (value) {
24
25
  case 'primary':
25
- this.btnClass = 'btn-primary'
26
+ this.btnClass = 'gn-ui-btn-primary'
26
27
  break
27
28
  case 'secondary':
28
- this.btnClass = 'btn-secondary'
29
+ this.btnClass = 'gn-ui-btn-secondary'
29
30
  break
30
31
  case 'outline':
31
- this.btnClass = 'btn-outline'
32
+ this.btnClass = 'gn-ui-btn-outline'
32
33
  break
33
34
  case 'light':
34
- this.btnClass = 'btn-light'
35
+ this.btnClass = 'gn-ui-btn-light'
35
36
  break
36
37
  default:
37
- this.btnClass = 'btn-default'
38
+ this.btnClass = 'gn-ui-btn-default'
38
39
  break
39
40
  }
40
41
  }
@@ -1,6 +1,6 @@
1
1
  <gn-ui-button
2
2
  type="outline"
3
- extraClass="w-full !p-[8px] !pl-[16px]"
3
+ extraClass="bg-background w-full !p-[8px] !pl-[16px]"
4
4
  [title]="title"
5
5
  [attr.aria-owns]="id"
6
6
  (buttonClick)="openOverlay()"
@@ -9,7 +9,9 @@
9
9
  <gn-ui-button
10
10
  type="outline"
11
11
  class="grow min-w-0"
12
- extraClass="!p-[8px] !pl-[16px] flex flex-row w-full {{ extraBtnClass }}"
12
+ extraClass="bg-background !p-[8px] !pl-[16px] flex flex-row w-full {{
13
+ extraBtnClass
14
+ }}"
13
15
  [title]="title"
14
16
  [attr.aria-owns]="id"
15
17
  (buttonClick)="openOverlay()"
@@ -17,7 +17,9 @@ import { Observable } from 'rxjs'
17
17
  export class FormFieldComponent {
18
18
  @Input() config: FormFieldConfig
19
19
  @Input() set value(v: unknown) {
20
- this.formControl.setValue(v)
20
+ this.formControl.setValue(v, {
21
+ emitEvent: false,
22
+ })
21
23
  }
22
24
  @Output() valueChange: Observable<unknown>
23
25
 
@@ -13,7 +13,6 @@ type BaseFormFieldType =
13
13
  type AllFormFieldType = BaseFormFieldType | 'object' | 'array'
14
14
 
15
15
  interface FormFieldConfigBase {
16
- model?: string
17
16
  type: AllFormFieldType
18
17
  labelKey: string
19
18
  hintKey?: string
@@ -0,0 +1,3 @@
1
+ button {
2
+ color: var(--navigation-button-color, --color-background);
3
+ }
@@ -1,5 +1,5 @@
1
1
  <button
2
- class="group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 text-white rounded content-center"
2
+ class="group flex items-center justify-center gap-1 backdrop-blur p-1 bg-primary-opacity-30 rounded content-center"
3
3
  >
4
4
  <mat-icon class="material-symbols-outlined align-middle w-[18px]">{{
5
5
  icon
@@ -12,6 +12,7 @@ import { distinctUntilChanged } from 'rxjs/operators'
12
12
  selector: 'gn-ui-text-area',
13
13
  templateUrl: './text-area.component.html',
14
14
  styleUrls: ['./text-area.component.css'],
15
+ standalone: true,
15
16
  })
16
17
  export class TextAreaComponent implements AfterViewInit {
17
18
  @Input() value = ''
@@ -47,10 +47,8 @@ import { EditableLabelDirective } from './editable-label/editable-label.directiv
47
47
  declarations: [
48
48
  DropdownSelectorComponent,
49
49
  AutocompleteComponent,
50
- ButtonComponent,
51
50
  TextInputComponent,
52
51
  DragAndDropFileInputComponent,
53
- TextAreaComponent,
54
52
  ChipsInputComponent,
55
53
  NavigationButtonComponent,
56
54
  StarToggleComponent,
@@ -89,6 +87,8 @@ import { EditableLabelDirective } from './editable-label/editable-label.directiv
89
87
  MatDatepickerModule,
90
88
  MatNativeDateModule,
91
89
  EditableLabelDirective,
90
+ TextAreaComponent,
91
+ ButtonComponent,
92
92
  ],
93
93
  exports: [
94
94
  DropdownSelectorComponent,
@@ -4,6 +4,7 @@
4
4
  </div>
5
5
  </div>
6
6
  <div
7
+ *ngIf="steps.length > 1"
7
8
  class="absolute right-0 top-0 flex flex-row justify-center gap-[10px] p-1"
8
9
  [ngClass]="stepsContainerClass"
9
10
  >
@@ -1,7 +1,9 @@
1
1
  <div
2
2
  class="inline-block bg-black opacity-70 py-1.5 px-3 rounded font-medium text-gray-50 text-sm leading-none"
3
3
  [ngClass]="
4
- clickable ? 'hover:bg-gray-800 cursor-pointer transition-colors' : ''
4
+ clickable
5
+ ? 'hover:bg-primary cursor-pointer transition-colors duration-100'
6
+ : ''
5
7
  "
6
8
  >
7
9
  <ng-content></ng-content>
@@ -40,6 +40,24 @@ export const LANG_3_TO_2_MAPPER = {
40
40
  slo: 'sk',
41
41
  }
42
42
 
43
+ export const LANGUAGE_NAMES = {
44
+ en: 'English',
45
+ nl: 'Nederlands',
46
+ fr: 'Français',
47
+ de: 'Deutsch',
48
+ ko: '한국어',
49
+ es: 'Español',
50
+ cs: 'Čeština',
51
+ ca: 'Català',
52
+ fi: 'Suomi',
53
+ is: 'Íslenska',
54
+ it: 'Italiano',
55
+ pt: 'Português',
56
+ ru: 'Русский',
57
+ zh: '中文',
58
+ sk: 'Slovenčina',
59
+ }
60
+
43
61
  // Caution: changing this can break language selection from third parties!
44
62
  export const LANGUAGE_STORAGE_KEY = 'geonetwork-ui-language'
45
63
 
@@ -6,3 +6,4 @@ export * from './sort-by'
6
6
  export * from './url'
7
7
  export * from './event'
8
8
  export * from './fuzzy-filter'
9
+ export * from './temporal-extent-union'