geonetwork-ui 2.6.0-dev.c4b99cdef → 2.6.0-dev.ceb4be4c1

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 (212) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/common/distribution.mapper.mjs +3 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +37 -4
  3. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +2 -2
  5. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/constant.mjs +2 -1
  6. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +3 -3
  7. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +29 -5
  8. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  9. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  10. package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +45 -9
  11. package/esm2022/libs/feature/dataviz/src/lib/geo-table-view/geo-table-view.component.mjs +2 -2
  12. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +32 -2
  13. package/esm2022/libs/feature/dataviz/src/lib/table-view/table-view.component.mjs +25 -6
  14. package/esm2022/libs/feature/record/src/index.mjs +2 -3
  15. package/esm2022/libs/feature/record/src/lib/data-view/data-view.component.mjs +3 -3
  16. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +33 -7
  17. package/esm2022/libs/feature/record/src/lib/state/mdview.actions.mjs +3 -1
  18. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +7 -1
  19. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +13 -13
  20. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +7 -1
  21. package/esm2022/libs/feature/record/src/lib/state/mdview.selectors.mjs +3 -1
  22. package/esm2022/libs/feature/search/src/lib/constants.mjs +2 -1
  23. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +6 -2
  24. package/esm2022/libs/ui/dataviz/src/lib/chart/chart.component.mjs +5 -3
  25. package/esm2022/libs/ui/dataviz/src/lib/data-table/data-table.component.mjs +11 -6
  26. package/esm2022/libs/ui/elements/src/index.mjs +3 -1
  27. package/esm2022/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.mjs +55 -0
  28. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +27 -53
  29. package/esm2022/libs/ui/elements/src/lib/kind-badge/kind-badge.component.mjs +22 -5
  30. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  31. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +3 -3
  32. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +3 -3
  33. package/esm2022/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.mjs +51 -0
  34. package/esm2022/libs/ui/elements/src/lib/related-record-card/related-record-card.component.mjs +17 -7
  35. package/esm2022/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.mjs +12 -4
  36. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +10 -4
  37. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  38. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +3 -3
  39. package/esm2022/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.mjs +68 -0
  40. package/esm2022/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.mjs +3 -3
  41. package/esm2022/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.mjs +34 -13
  42. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +3 -3
  43. package/esm2022/libs/ui/layout/src/lib/truncated-text/truncated-text.component.mjs +65 -14
  44. package/esm2022/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.mjs +29 -4
  45. package/esm2022/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.mjs +4 -8
  46. package/esm2022/libs/ui/search/src/lib/results-hits-search-kind/results-hits-search-kind.component.mjs +3 -3
  47. package/esm2022/libs/ui/search/src/lib/results-list/results-layout.config.mjs +2 -2
  48. package/esm2022/libs/ui/search/src/lib/results-list/results-list.component.mjs +3 -3
  49. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +27 -14
  50. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +4 -1
  51. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +4 -1
  52. package/esm2022/translations/de.json +7 -2
  53. package/esm2022/translations/en.json +8 -5
  54. package/esm2022/translations/es.json +7 -2
  55. package/esm2022/translations/fr.json +7 -4
  56. package/esm2022/translations/it.json +39 -34
  57. package/esm2022/translations/nl.json +7 -2
  58. package/esm2022/translations/pt.json +7 -2
  59. package/fesm2022/geonetwork-ui.mjs +1106 -600
  60. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  61. package/libs/api/metadata-converter/src/lib/common/distribution.mapper.d.ts.map +1 -1
  62. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  63. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +0 -1
  64. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  65. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  66. package/libs/api/repository/src/lib/gn4/elasticsearch/constant.d.ts.map +1 -1
  67. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts +1 -1
  68. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  69. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +3 -0
  70. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  71. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +4 -1
  72. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  73. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +2 -0
  74. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  75. package/libs/feature/dataviz/src/lib/chart-view/chart-view.component.d.ts +12 -8
  76. package/libs/feature/dataviz/src/lib/chart-view/chart-view.component.d.ts.map +1 -1
  77. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +1 -0
  78. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  79. package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts +5 -2
  80. package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts.map +1 -1
  81. package/libs/feature/record/src/index.d.ts +1 -2
  82. package/libs/feature/record/src/index.d.ts.map +1 -1
  83. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  84. package/libs/feature/record/src/lib/state/mdview.actions.d.ts +10 -0
  85. package/libs/feature/record/src/lib/state/mdview.actions.d.ts.map +1 -1
  86. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +6 -0
  87. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  88. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +28 -21
  89. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  90. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts +2 -0
  91. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  92. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts +2 -0
  93. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts.map +1 -1
  94. package/libs/feature/search/src/lib/constants.d.ts.map +1 -1
  95. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts +1 -1
  96. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts.map +1 -1
  97. package/libs/ui/dataviz/src/lib/chart/chart.component.d.ts +2 -1
  98. package/libs/ui/dataviz/src/lib/chart/chart.component.d.ts.map +1 -1
  99. package/libs/ui/dataviz/src/lib/data-table/data-table.component.d.ts +6 -1
  100. package/libs/ui/dataviz/src/lib/data-table/data-table.component.d.ts.map +1 -1
  101. package/libs/ui/elements/src/index.d.ts +2 -0
  102. package/libs/ui/elements/src/index.d.ts.map +1 -1
  103. package/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.d.ts +15 -0
  104. package/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.d.ts.map +1 -0
  105. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts +3 -7
  106. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts.map +1 -1
  107. package/libs/ui/elements/src/lib/kind-badge/kind-badge.component.d.ts +3 -1
  108. package/libs/ui/elements/src/lib/kind-badge/kind-badge.component.d.ts.map +1 -1
  109. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts +16 -0
  110. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts.map +1 -0
  111. package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts +8 -1
  112. package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts.map +1 -1
  113. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts +1 -0
  114. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts.map +1 -1
  115. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +2 -1
  116. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  117. package/libs/ui/inputs/src/index.d.ts +1 -0
  118. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  119. package/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.d.ts +17 -0
  120. package/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.d.ts.map +1 -0
  121. package/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.d.ts +15 -8
  122. package/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.d.ts.map +1 -1
  123. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts +15 -6
  124. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts.map +1 -1
  125. package/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.d.ts +6 -2
  126. package/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.d.ts.map +1 -1
  127. package/libs/ui/search/src/lib/results-list/results-list.component.d.ts.map +1 -1
  128. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +5 -1
  129. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  130. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
  131. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  132. package/package.json +2 -2
  133. package/src/libs/api/metadata-converter/src/lib/common/distribution.mapper.ts +1 -0
  134. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +55 -4
  135. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +0 -1
  136. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +2 -1
  137. package/src/libs/api/repository/src/lib/gn4/elasticsearch/constant.ts +1 -0
  138. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +2 -2
  139. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +50 -5
  140. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +9 -2
  141. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +2 -0
  142. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +10 -0
  143. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +14 -0
  144. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +1 -1
  145. package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.html +12 -9
  146. package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.ts +54 -10
  147. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +37 -0
  148. package/src/libs/feature/dataviz/src/lib/table-view/table-view.component.html +1 -0
  149. package/src/libs/feature/dataviz/src/lib/table-view/table-view.component.ts +27 -1
  150. package/src/libs/feature/record/src/index.ts +1 -2
  151. package/src/libs/feature/record/src/lib/data-view/data-view.component.html +2 -0
  152. package/src/libs/feature/record/src/lib/map-view/map-view.component.html +4 -1
  153. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +35 -4
  154. package/src/libs/feature/record/src/lib/state/mdview.actions.ts +10 -0
  155. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +22 -0
  156. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +22 -15
  157. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +12 -0
  158. package/src/libs/feature/record/src/lib/state/mdview.selectors.ts +9 -0
  159. package/src/libs/feature/search/src/lib/constants.ts +1 -0
  160. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +2 -0
  161. package/src/libs/ui/dataviz/src/lib/chart/chart.component.ts +2 -1
  162. package/src/libs/ui/dataviz/src/lib/data-table/data-table.component.html +6 -3
  163. package/src/libs/ui/dataviz/src/lib/data-table/data-table.component.ts +5 -4
  164. package/src/libs/ui/elements/src/index.ts +2 -0
  165. package/src/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.css +4 -0
  166. package/src/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.html +13 -0
  167. package/src/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.ts +54 -0
  168. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +133 -138
  169. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +19 -47
  170. package/src/libs/ui/elements/src/lib/kind-badge/kind-badge.component.html +7 -5
  171. package/src/libs/ui/elements/src/lib/kind-badge/kind-badge.component.ts +21 -2
  172. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +6 -3
  173. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +4 -0
  174. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.html +1 -1
  175. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.html +48 -0
  176. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.ts +52 -0
  177. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.html +8 -29
  178. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.ts +14 -1
  179. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.html +15 -1
  180. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.ts +9 -1
  181. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +3 -1
  182. package/src/libs/ui/inputs/src/index.ts +1 -0
  183. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
  184. package/src/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.css +0 -0
  185. package/src/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.html +43 -0
  186. package/src/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.ts +77 -0
  187. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.html +1 -2
  188. package/src/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.html +24 -8
  189. package/src/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.ts +36 -10
  190. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +1 -0
  191. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.html +8 -10
  192. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.ts +75 -7
  193. package/src/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.html +3 -3
  194. package/src/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.ts +27 -3
  195. package/src/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.html +9 -81
  196. package/src/libs/ui/search/src/lib/results-hits-search-kind/results-hits-search-kind.component.html +1 -0
  197. package/src/libs/ui/search/src/lib/results-list/results-layout.config.ts +2 -2
  198. package/src/libs/ui/search/src/lib/results-list/results-list.component.html +1 -0
  199. package/src/libs/ui/search/src/lib/results-list/results-list.component.ts +0 -1
  200. package/src/libs/ui/search/src/lib/results-table/results-table.component.css +4 -0
  201. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +26 -16
  202. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +20 -10
  203. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +3 -0
  204. package/src/libs/util/shared/src/lib/links/link-utils.ts +3 -0
  205. package/translations/de.json +7 -2
  206. package/translations/en.json +8 -5
  207. package/translations/es.json +7 -2
  208. package/translations/fr.json +7 -4
  209. package/translations/it.json +39 -34
  210. package/translations/nl.json +7 -2
  211. package/translations/pt.json +7 -2
  212. package/translations/sk.json +7 -2
@@ -12,6 +12,8 @@ import {
12
12
  Organization,
13
13
  } from '../../../../../../libs/common/domain/src/lib/model/record'
14
14
  import { NgClass, NgIf, NgTemplateOutlet } from '@angular/common'
15
+ import { GeoDataBadgeComponent } from '../geo-data-badge/geo-data-badge.component'
16
+ import { KindBadgeComponent } from '../kind-badge/kind-badge.component'
15
17
  import { MarkdownParserComponent } from '../markdown-parser/markdown-parser.component'
16
18
  import { MetadataQualityComponent } from '../metadata-quality/metadata-quality.component'
17
19
  import { ThumbnailComponent } from '../thumbnail/thumbnail.component'
@@ -31,16 +33,10 @@ import {
31
33
  matPhoneOutline,
32
34
  matLocationOnOutline,
33
35
  } from '@ng-icons/material-icons/outline'
34
- import { matCode } from '@ng-icons/material-icons/baseline'
35
- import { iconoirDatabase, iconoirMap, iconoirInternet } from '@ng-icons/iconoir'
36
+ import { iconoirInternet } from '@ng-icons/iconoir'
36
37
  import { TranslateModule } from '@ngx-translate/core'
37
- import { marker } from '@biesbjerg/ngx-translate-extract-marker'
38
38
  import { fromEvent, Subscription } from 'rxjs'
39
39
 
40
- marker('record.kind.data')
41
- marker('record.kind.reuse')
42
- marker('record.kind.service')
43
-
44
40
  type CardSize = 'L' | 'M' | 'S' | 'XS'
45
41
 
46
42
  @Component({
@@ -54,15 +50,14 @@ type CardSize = 'L' | 'M' | 'S' | 'XS'
54
50
  NgTemplateOutlet,
55
51
  NgIconComponent,
56
52
  TranslateModule,
53
+ GeoDataBadgeComponent,
54
+ KindBadgeComponent,
57
55
  MarkdownParserComponent,
58
56
  ],
59
57
  providers: [
60
58
  provideIcons({
61
- matLocationSearchingOutline,
62
- matCode,
63
- iconoirDatabase,
64
- iconoirMap,
65
59
  iconoirInternet,
60
+ matLocationSearchingOutline,
66
61
  matEmailOutline,
67
62
  matPhoneOutline,
68
63
  matLocationOnOutline,
@@ -76,10 +71,10 @@ type CardSize = 'L' | 'M' | 'S' | 'XS'
76
71
  })
77
72
  export class InternalLinkCardComponent implements OnInit {
78
73
  @Input() record: CatalogRecord
74
+ @Input() linkTarget = '_blank'
75
+ @Input() linkHref: string = null
79
76
  @Input() metadataQualityDisplay: boolean
80
77
  @Input() favoriteTemplate: TemplateRef<{ $implicit: CatalogRecord }>
81
- @Input() linkHref: string = null
82
- @Input() isGeodata: boolean
83
78
  @Input() set size(value: CardSize) {
84
79
  this._size = value
85
80
  this.cardClass = this.sizeClassMap[value] || ''
@@ -99,24 +94,24 @@ export class InternalLinkCardComponent implements OnInit {
99
94
  private _size: CardSize = 'M'
100
95
 
101
96
  private readonly sizeClassMap: Record<CardSize, string> = {
102
- L: 'min-h-[190px] md:w-[992px] py-3 px-3 flex items-start gap-5',
103
- M: 'min-h-[140px] md:w-[570px] py-3 px-3 flex items-start gap-4',
104
- S: 'min-h-[220px] md:w-[370px] py-3 px-3 flex gap-4',
105
- XS: 'min-h-[108px] md:w-[570px] py-3 px-3 flex gap-4',
97
+ L: 'min-h-[190px] w-full py-3 px-3 flex items-start gap-5',
98
+ M: 'min-h-[140px] py-3 px-3 flex items-start gap-4',
99
+ S: 'min-h-[220px] py-3 px-3 flex gap-4',
100
+ XS: 'min-h-[108px] py-3 px-3 flex gap-4',
106
101
  }
107
102
 
108
103
  private readonly thumbnailSizeClassMap: Record<CardSize, string> = {
109
- L: 'w-[190px] h-[180px] rounded-lg overflow-hidden shrink-0',
104
+ L: 'w-full md:w-[190px] h-[180px] rounded-lg overflow-hidden shrink-0',
110
105
  M: 'w-[110px] h-[140px] rounded-lg overflow-hidden shrink-0',
111
106
  S: 'hidden',
112
107
  XS: 'hidden',
113
108
  }
114
109
 
115
110
  private readonly titleClassMap: Record<CardSize, string> = {
116
- L: 'text-xl line-clamp-2',
111
+ L: 'text-xl line-clamp-1',
117
112
  M: 'text-base line-clamp-2',
118
- S: 'text-base line-clamp-3',
119
- XS: 'text-base mt-3 line-clamp-2',
113
+ S: 'text-base line-clamp-3 ml-2',
114
+ XS: 'text-base line-clamp-1 ml-2',
120
115
  }
121
116
 
122
117
  constructor(protected elementRef: ElementRef) {}
@@ -124,12 +119,8 @@ export class InternalLinkCardComponent implements OnInit {
124
119
  ngOnInit(): void {
125
120
  this.abstract = removeWhitespace(stripHtml(this.record?.abstract))
126
121
  this.subscription.add(
127
- fromEvent(this.elementRef.nativeElement, 'click').subscribe(
128
- (event: Event) => {
129
- event.preventDefault()
130
- propagateToDocumentOnly(event)
131
- this.mdSelect.emit(this.record)
132
- }
122
+ fromEvent(this.elementRef.nativeElement, 'click').subscribe(() =>
123
+ this.mdSelect.emit(this.record)
133
124
  )
134
125
  )
135
126
  }
@@ -147,11 +138,7 @@ export class InternalLinkCardComponent implements OnInit {
147
138
  }
148
139
 
149
140
  getTitleClass() {
150
- return (
151
- this.titleClassMap[this._size] +
152
- ' ' +
153
- (this.record.ownerOrganization?.name ? '' : 'mt-3') || ''
154
- )
141
+ return this.titleClassMap[this._size]
155
142
  }
156
143
 
157
144
  openExternalUrl(event: Event, url: URL): void {
@@ -172,19 +159,4 @@ export class InternalLinkCardComponent implements OnInit {
172
159
  get shouldShowThumbnail(): boolean {
173
160
  return this.size === 'L' || this.size === 'M'
174
161
  }
175
-
176
- getKindInfo(): { text: string; icon: string } {
177
- if (!this.record?.kind) return { text: '', icon: '' }
178
-
179
- switch (this.record.kind.toLowerCase()) {
180
- case 'dataset':
181
- return { text: 'record.kind.data', icon: 'iconoirDatabase' }
182
- case 'reuse':
183
- return { text: 'record.kind.reuse', icon: 'iconoirMap' }
184
- case 'service':
185
- return { text: 'record.kind.service', icon: 'matCode' }
186
- default:
187
- return { text: '', icon: '' }
188
- }
189
- }
190
162
  }
@@ -1,9 +1,11 @@
1
- <ng-icon [name]="iconKind" class="mr-1"></ng-icon>
1
+ <div [class]="badgeClasses" *ngIf="kind">
2
+ <ng-icon [name]="iconKind" class="mr-1 text-[0.85em]"></ng-icon>
2
3
 
3
- <ng-container *ngIf="contentTemplate; else defaultContent">
4
- <ng-container *ngTemplateOutlet="contentTemplate"></ng-container>
5
- </ng-container>
4
+ <ng-container *ngIf="contentTemplate; else defaultContent">
5
+ <ng-container *ngTemplateOutlet="contentTemplate"></ng-container>
6
+ </ng-container>
7
+ </div>
6
8
 
7
9
  <ng-template #defaultContent>
8
- {{ kind | translate }}
10
+ {{ 'record.kind.' + kind | translate }}
9
11
  </ng-template>
@@ -13,8 +13,12 @@ import {
13
13
  iconoirCreditCard,
14
14
  } from '@ng-icons/iconoir'
15
15
  import { NgIconsModule } from '@ng-icons/core'
16
- import { BadgeComponent } from '../../../../../../libs/ui/inputs/src'
17
16
  import { TranslateModule } from '@ngx-translate/core'
17
+ import { marker } from '@biesbjerg/ngx-translate-extract-marker'
18
+
19
+ marker('record.kind.dataset')
20
+ marker('record.kind.reuse')
21
+ marker('record.kind.service')
18
22
 
19
23
  enum KindConfig {
20
24
  all = 'iconoirAppleWallet', // (this one is for filter)
@@ -37,9 +41,10 @@ enum KindConfig {
37
41
  ],
38
42
  changeDetection: ChangeDetectionStrategy.OnPush,
39
43
  standalone: true,
40
- imports: [NgIconsModule, CommonModule, BadgeComponent, TranslateModule],
44
+ imports: [NgIconsModule, CommonModule, TranslateModule],
41
45
  })
42
46
  export class KindBadgeComponent {
47
+ @Input() styling = 'default'
43
48
  @Input() contentTemplate: TemplateRef<unknown>
44
49
  @Input() kind: string
45
50
 
@@ -48,4 +53,18 @@ export class KindBadgeComponent {
48
53
  get iconKind() {
49
54
  return KindConfig[this.kind] || KindConfig.dataset
50
55
  }
56
+
57
+ get badgeClasses(): string {
58
+ const baseClasses =
59
+ 'badge-btn text-white text-xs px-2 font-bold shrink-0 flex items-center h-6 min-h-6'
60
+
61
+ switch (this.styling) {
62
+ case 'outline':
63
+ return `${baseClasses} bg-transparent border border-white py-1.5`
64
+ case 'default':
65
+ return `${baseClasses} bg-primary py-0.5`
66
+ default:
67
+ return 'flex items-center'
68
+ }
69
+ }
51
70
  }
@@ -1,5 +1,8 @@
1
- <div class="py-5 px-5 rounded-lg bg-gray-100 text-black">
2
- <div class="grid grid-cols-1 gap-3 overflow-hidden">
1
+ <div
2
+ class="py-5 px-5 rounded bg-gray-100 text-black"
3
+ data-cy="metadata-organization"
4
+ >
5
+ <div class="grid gap-3 overflow-hidden">
3
6
  <div>
4
7
  <p class="text-base font-medium" translate>record.metadata.contact</p>
5
8
  </div>
@@ -18,7 +21,7 @@
18
21
  <div
19
22
  class="font-title text-21 mr-2 cursor-pointer hover:underline"
20
23
  (click)="onOrganizationClick()"
21
- data-cy="organization-name"
24
+ data-cy="organization-name-link"
22
25
  >
23
26
  {{ shownOrganization?.name }}
24
27
  </div>
@@ -46,6 +46,7 @@
46
46
  metadata.otherConstraints
47
47
  "
48
48
  [title]="'record.metadata.usage' | translate"
49
+ data-test="usage-panel"
49
50
  >
50
51
  <div class="flex flex-col gap-[10px] mr-4 py-[12px] rounded text-gray-900">
51
52
  <ng-container *ngFor="let license of licenses">
@@ -105,6 +106,7 @@
105
106
  (metadata.kind === 'dataset' && metadata.status)
106
107
  "
107
108
  [title]="'record.metadata.details' | translate"
109
+ data-test="details-panel"
108
110
  >
109
111
  <div *ngIf="metadata.lineage" class="text-gray-900 flex flex-col mt-4 gap-2">
110
112
  <p class="whitespace-pre-line break-words text-gray-900" gnUiLinkify>
@@ -231,6 +233,7 @@
231
233
  <gn-ui-expandable-panel
232
234
  *ngIf="metadata.kind !== 'dataset' && metadata.spatialExtents"
233
235
  [title]="'service.metadata.spatialExtent' | translate"
236
+ data-test="spatial-extent-panel"
234
237
  >
235
238
  <gn-ui-spatial-extent
236
239
  class="flex h-[271px] w-full rounded-lg border border-gray-100 mt-3 mb-6"
@@ -240,6 +243,7 @@
240
243
  <gn-ui-expandable-panel
241
244
  *ngIf="metadata.landingPage"
242
245
  [title]="'service.metadata.other' | translate"
246
+ data-test="other-panel"
243
247
  >
244
248
  <div class="flex flex-col gap-4 mr-4 py-5 rounded text-gray-700">
245
249
  <div *ngIf="metadata.recordUpdated">
@@ -2,7 +2,7 @@
2
2
  <div
3
3
  class="flex items-center"
4
4
  [class]="min - w - 0"
5
- [ngClass]="{ 'leading-[8px] m-h-[120px]': smaller }"
5
+ [ngClass]="{ 'text-xs leading-[8px] m-h-[120px]': smaller }"
6
6
  >
7
7
  <gn-ui-progress-bar
8
8
  tabindex="0"
@@ -0,0 +1,48 @@
1
+ <div class="flex flex-col gap-2 py-5 px-5 h-[562px] overflow-y-auto">
2
+ <div
3
+ *ngFor="let featureType of filteredFeatureCatalog?.featureTypes"
4
+ class="rounded shadow bg-white"
5
+ >
6
+ <gn-ui-expandable-panel
7
+ [collapsed]="filteredFeatureCatalog?.featureTypes?.length !== 1"
8
+ iconColor="black"
9
+ >
10
+ <ng-template #titleTemplate>
11
+ <div class="px-2">
12
+ <div class="text-lg font-bold">{{ featureType.name }}</div>
13
+ <div class="text-sm" *ngIf="featureType.definition">
14
+ {{ featureType.definition }}
15
+ </div>
16
+ </div>
17
+ </ng-template>
18
+ <div
19
+ class="grid gap-0"
20
+ [style.grid-template-columns]="gridTemplateColumns"
21
+ data-cy="feature-type-content"
22
+ >
23
+ <div
24
+ class="py-1 px-2 text-sm font-bold text-left border-t"
25
+ [class.border-l]="i > 0"
26
+ [class.border-gray-300]="i > 0"
27
+ *ngFor="let col of columns; let i = index"
28
+ data-test="column-label"
29
+ >
30
+ {{ col.label | translate }}
31
+ </div>
32
+ <ng-container *ngFor="let row of featureType.attributes">
33
+ <div
34
+ class="bg-white text-sm font-normal text-left border-t"
35
+ [class.border-l]="i > 0"
36
+ [class.border-gray-300]="i > 0"
37
+ *ngFor="let col of columns; let i = index"
38
+ >
39
+ <gn-ui-truncated-text
40
+ extraClass="py-3 px-2"
41
+ [text]="row[col.key]"
42
+ ></gn-ui-truncated-text>
43
+ </div>
44
+ </ng-container>
45
+ </div>
46
+ </gn-ui-expandable-panel>
47
+ </div>
48
+ </div>
@@ -0,0 +1,52 @@
1
+ import { Component, Input, OnInit } from '@angular/core'
2
+ import { CommonModule } from '@angular/common'
3
+ import { TranslateModule } from '@ngx-translate/core'
4
+ import { DatasetFeatureCatalog } from '../../../../../../../libs/common/domain/src/lib/model/record'
5
+ import {
6
+ ExpandablePanelComponent,
7
+ TruncatedTextComponent,
8
+ } from '../../../../../../../libs/ui/layout/src'
9
+
10
+ @Component({
11
+ selector: 'gn-ui-feature-catalog-list',
12
+ templateUrl: './feature-catalog-list.component.html',
13
+ standalone: true,
14
+ imports: [
15
+ CommonModule,
16
+ TranslateModule,
17
+ ExpandablePanelComponent,
18
+ TruncatedTextComponent,
19
+ ],
20
+ })
21
+ export class FeatureCatalogListComponent implements OnInit {
22
+ @Input() filteredFeatureCatalog: DatasetFeatureCatalog
23
+
24
+ columns = [
25
+ {
26
+ key: 'type',
27
+ label: 'feature.catalog.attribute.type',
28
+ width: '19%',
29
+ },
30
+ {
31
+ key: 'name',
32
+ label: 'feature.catalog.attribute.name',
33
+ width: '32%',
34
+ },
35
+ {
36
+ key: 'code',
37
+ label: 'feature.catalog.attribute.code',
38
+ width: '24%',
39
+ },
40
+ {
41
+ key: 'title',
42
+ label: 'feature.catalog.attribute.description',
43
+ width: '25%',
44
+ },
45
+ ]
46
+
47
+ gridTemplateColumns = ''
48
+
49
+ ngOnInit(): void {
50
+ this.gridTemplateColumns = this.columns.map((col) => col.width).join(' ')
51
+ }
52
+ }
@@ -1,30 +1,9 @@
1
- <a
2
- [class]="classList"
3
- [routerLink]="['/dataset', record.uniqueIdentifier]"
4
- target="_blank"
1
+ <gn-ui-internal-link-card
2
+ [linkHref]="linkHref"
3
+ [linkTarget]="'_blank'"
4
+ [record]="record"
5
+ [favoriteTemplate]="favoriteTemplate"
6
+ [metadataQualityDisplay]="metadataQualityDisplay"
7
+ [size]="size"
5
8
  >
6
- <div class="h-52 bg-gray-100">
7
- <gn-ui-thumbnail
8
- class="h-52 w-full object-cover"
9
- [thumbnailUrl]="record.overviews?.[0]?.url.toString()"
10
- ></gn-ui-thumbnail>
11
- </div>
12
- <div class="flex flex-col justify-between h-44 px-5 pt-4 pb-6">
13
- <h4
14
- class="max-h-24 font-title text-21 text-black text-ellipsis overflow-hidden"
15
- >
16
- {{ record.title }}
17
- </h4>
18
- <div>
19
- <button
20
- [matTooltip]="'tooltip.url.open' | translate"
21
- matTooltipPosition="above"
22
- >
23
- <ng-icon
24
- class="align-middle text-secondary"
25
- name="matOpenInNew"
26
- ></ng-icon>
27
- </button>
28
- </div>
29
- </div>
30
- </a>
9
+ </gn-ui-internal-link-card>
@@ -1,11 +1,19 @@
1
- import { ChangeDetectionStrategy, Component, Input } from '@angular/core'
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ EventEmitter,
5
+ Input,
6
+ Output,
7
+ } from '@angular/core'
2
8
  import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
3
9
  import { ThumbnailComponent } from '../thumbnail/thumbnail.component'
10
+ import { InternalLinkCardComponent } from '../internal-link-card/internal-link-card.component'
4
11
  import { RouterLink } from '@angular/router'
5
12
  import { MatTooltipModule } from '@angular/material/tooltip'
6
13
  import { NgIcon, provideIcons } from '@ng-icons/core'
7
14
  import { TranslateModule } from '@ngx-translate/core'
8
15
  import { matOpenInNew } from '@ng-icons/material-icons/baseline'
16
+ import { TemplateRef } from '@angular/core'
9
17
 
10
18
  @Component({
11
19
  selector: 'gn-ui-related-record-card',
@@ -13,6 +21,7 @@ import { matOpenInNew } from '@ng-icons/material-icons/baseline'
13
21
  styleUrls: ['./related-record-card.component.css'],
14
22
  changeDetection: ChangeDetectionStrategy.OnPush,
15
23
  imports: [
24
+ InternalLinkCardComponent,
16
25
  ThumbnailComponent,
17
26
  RouterLink,
18
27
  MatTooltipModule,
@@ -25,8 +34,12 @@ import { matOpenInNew } from '@ng-icons/material-icons/baseline'
25
34
  export class RelatedRecordCardComponent {
26
35
  private readonly baseClasses: string
27
36
 
37
+ @Input() linkHref: string = null
28
38
  @Input() record: CatalogRecord
29
39
  @Input() extraClass = ''
40
+ @Input() favoriteTemplate: TemplateRef<{ $implicit: CatalogRecord }>
41
+ @Input() metadataQualityDisplay: boolean
42
+ @Input() size: string
30
43
 
31
44
  constructor() {
32
45
  this.baseClasses = [
@@ -16,17 +16,31 @@
16
16
  <div class="h-14 md:w-2/5 w-full mb-4 flex flex-row relative">
17
17
  <gn-ui-text-input
18
18
  class="w-full"
19
+ [(value)]="searchQuery"
19
20
  [extraClass]="getExtraInputClass()"
20
21
  [placeholder]="'service.metadata.search' | translate"
21
22
  (input)="onSearchChange($event)"
22
23
  (keydown.enter)="onSearchEnter($event)"
23
24
  >
24
25
  </gn-ui-text-input>
26
+ <div
27
+ class="absolute right-14 h-14 w-14 flex items-center justify-center"
28
+ >
29
+ <button
30
+ #inputBtn
31
+ *ngIf="searchQuery"
32
+ [aria-label]="'service.metadata.search.clear' | translate"
33
+ (click)="clearSearch()"
34
+ class="h-12 w-12 border-0 flex items-center justify-center"
35
+ >
36
+ <ng-icon name="matClose"></ng-icon>
37
+ </button>
38
+ </div>
25
39
  <div class="border-l absolute border-gray-200 right-0 h-14 w-14">
26
40
  <gn-ui-button
27
41
  #inputBtn
28
42
  type="outline"
29
- extraClass="h-12 w-12 border-0 absolute right-1 top-1"
43
+ extraClass="h-12 w-12 border-0 absolute right-1 top-1 bg-white"
30
44
  (buttonClick)="searchLayers()"
31
45
  >
32
46
  <ng-icon name="iconoirSearch"></ng-icon>
@@ -16,6 +16,7 @@ import {
16
16
  WmsLayerFull,
17
17
  WmtsLayer,
18
18
  } from '@camptocamp/ogc-client'
19
+ import { matClose } from '@ng-icons/material-icons/baseline'
19
20
 
20
21
  marker(`service.metadata.search`)
21
22
  marker(`service.metadata.capabilities.title`)
@@ -48,6 +49,7 @@ marker(`service.metadata.capabilities.attribution`)
48
49
  provideIcons({
49
50
  iconoirSearch,
50
51
  matInfoOutline,
52
+ matClose,
51
53
  }),
52
54
  ],
53
55
  templateUrl: './service-capabilities.component.html',
@@ -104,6 +106,12 @@ export class ServiceCapabilitiesComponent implements OnInit {
104
106
  }
105
107
  }
106
108
 
109
+ clearSearch() {
110
+ this.searchActive = false
111
+ this.searchQuery = ''
112
+ this.filteredLayers = this.availableLayers
113
+ }
114
+
107
115
  async loadLayers() {
108
116
  if (
109
117
  this.apiLinks.length > 0 &&
@@ -176,7 +184,7 @@ export class ServiceCapabilitiesComponent implements OnInit {
176
184
  }
177
185
 
178
186
  getExtraClass(layerItem) {
179
- return layerItem.title === this.selectedLayer?.title
187
+ return layerItem === this.selectedLayer
180
188
  ? `h-8 rounded-lg bg-primary-darker text-white hover:text-primary-darker hover:bg-white`
181
189
  : `h-8 rounded-lg`
182
190
  }
@@ -15,6 +15,7 @@ import { provideNgIconsConfig } from '@ng-icons/core'
15
15
  import { TranslateModule } from '@ngx-translate/core'
16
16
  import { AvatarComponent } from './avatar/avatar.component'
17
17
  import { ImageInputComponent } from './image-input/image-input.component'
18
+ import { GeoDataBadgeComponent } from './geo-data-badge/geo-data-badge.component'
18
19
  import { MarkdownParserComponent } from './markdown-parser/markdown-parser.component'
19
20
  import { KindBadgeComponent } from './kind-badge/kind-badge.component'
20
21
  import { ThumbnailComponent } from './thumbnail/thumbnail.component'
@@ -23,7 +24,6 @@ import { UserPreviewComponent } from './user-preview/user-preview.component'
23
24
  import { ApplicationBannerComponent } from './application-banner/application-banner.component'
24
25
  import { InternalLinkCardComponent } from './internal-link-card/internal-link-card.component'
25
26
  import { ServiceCapabilitiesComponent } from './service-capabilities/service-capabilities.component'
26
-
27
27
  @NgModule({
28
28
  imports: [
29
29
  CommonModule,
@@ -48,6 +48,7 @@ import { ServiceCapabilitiesComponent } from './service-capabilities/service-cap
48
48
  InternalLinkCardComponent,
49
49
  ServiceCapabilitiesComponent,
50
50
  KindBadgeComponent,
51
+ GeoDataBadgeComponent,
51
52
  ],
52
53
  providers: [
53
54
  provideNgIconsConfig({
@@ -65,6 +66,7 @@ import { ServiceCapabilitiesComponent } from './service-capabilities/service-cap
65
66
  InternalLinkCardComponent,
66
67
  ServiceCapabilitiesComponent,
67
68
  KindBadgeComponent,
69
+ GeoDataBadgeComponent,
68
70
  ],
69
71
  })
70
72
  export class UiElementsModule {}
@@ -24,3 +24,4 @@ export * from './lib/text-input/text-input.component'
24
24
  export * from './lib/ui-inputs.module'
25
25
  export * from './lib/url-input/url-input.component'
26
26
  export * from './lib/viewport-intersector/viewport-intersector.component'
27
+ export * from './lib/search-feature-catalog/search-feature-catalog.component'
@@ -79,7 +79,7 @@
79
79
  <mat-option
80
80
  *ngFor="let suggestion of suggestions$ | async"
81
81
  [value]="suggestion"
82
- class="p-2 suggestion"
82
+ class="p-2 suggestion text-start"
83
83
  >
84
84
  {{ displayWithFnInternal(suggestion) }}
85
85
  </mat-option>
@@ -0,0 +1,43 @@
1
+ <div
2
+ class="flex items-center justify-between p-3 mt-8 bg-white rounded-lg border-b solid border-gray-300"
3
+ >
4
+ <div
5
+ class="relative shrink-0"
6
+ *ngIf="featureCatalog?.featureTypes?.length > 1"
7
+ >
8
+ <input
9
+ type="text"
10
+ [placeholder]="'search.filter.into.feature.catalog' | translate"
11
+ class="w-[220px] h-8 pl-3 pr-10 py-2 border rounded-md"
12
+ [(ngModel)]="searchTerm"
13
+ (ngModelChange)="filterAction(searchTerm)"
14
+ />
15
+ <ng-icon
16
+ class="absolute right-2.5 top-1 w-6 h-6 text-black"
17
+ name="iconoirSearch"
18
+ ></ng-icon>
19
+ </div>
20
+ <div class="text-sm px-1 ml-auto hidden sm:inline">
21
+ <ng-container *ngIf="featureCatalog?.featureTypes?.length > 1">
22
+ <span
23
+ class="text-sm font-medium text-gray-900"
24
+ data-cy="total-objects-label"
25
+ translate
26
+ >record.feature.catalog.number.total.object</span
27
+ ><span
28
+ class="text-sm font-bold px-1 text-gray-900"
29
+ data-cy="total-objects"
30
+ >{{ totalObjects }}</span
31
+ >
32
+ <span class="px-1.5">|</span>
33
+ </ng-container>
34
+ <span
35
+ class="text-sm font-medium px-1 text-gray-900"
36
+ data-cy="total-attributes-label"
37
+ translate
38
+ >record.feature.catalog.number.total.attribute</span
39
+ ><span class="text-sm font-bold text-gray-900" data-cy="total-attributes">{{
40
+ totalAttributes
41
+ }}</span>
42
+ </div>
43
+ </div>