geonetwork-ui 2.6.0-dev.492bf4497 → 2.6.0-dev.4a61a87f9

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 (192) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +39 -4
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
  3. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.mjs +8 -4
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.mjs +5 -2
  5. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +4 -4
  6. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +2 -2
  7. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/constant.mjs +2 -1
  8. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +3 -3
  9. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +62 -11
  10. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +7 -1
  11. package/esm2022/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.mjs +2 -1
  12. package/esm2022/libs/common/domain/src/lib/repository/records-repository.interface.mjs +1 -1
  13. package/esm2022/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.mjs +266 -11
  14. package/esm2022/libs/feature/record/src/index.mjs +2 -3
  15. package/esm2022/libs/feature/record/src/lib/state/mdview.actions.mjs +3 -1
  16. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +7 -1
  17. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +3 -1
  18. package/esm2022/libs/feature/record/src/lib/state/mdview.reducer.mjs +7 -1
  19. package/esm2022/libs/feature/record/src/lib/state/mdview.selectors.mjs +3 -1
  20. package/esm2022/libs/feature/search/src/lib/constants.mjs +2 -1
  21. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +6 -2
  22. package/esm2022/libs/feature/search/src/lib/results-table/results-table-container.component.mjs +13 -10
  23. package/esm2022/libs/ui/elements/src/index.mjs +2 -1
  24. package/esm2022/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.mjs +55 -0
  25. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +42 -83
  26. package/esm2022/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.mjs +59 -0
  27. package/esm2022/libs/ui/elements/src/lib/kind-badge/kind-badge.component.mjs +22 -5
  28. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +3 -3
  29. package/esm2022/libs/ui/elements/src/lib/related-record-card/related-record-card.component.mjs +17 -7
  30. package/esm2022/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.mjs +12 -4
  31. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +10 -4
  32. package/esm2022/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.mjs +3 -3
  33. package/esm2022/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.mjs +3 -3
  34. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +20 -10
  35. package/esm2022/libs/ui/search/src/index.mjs +2 -1
  36. package/esm2022/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.mjs +4 -8
  37. package/esm2022/libs/ui/search/src/lib/results-hits-search-kind/results-hits-search-kind.component.mjs +3 -3
  38. package/esm2022/libs/ui/search/src/lib/results-list/results-layout.config.mjs +2 -2
  39. package/esm2022/libs/ui/search/src/lib/results-list/results-list.component.mjs +3 -3
  40. package/esm2022/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.mjs +21 -12
  41. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +39 -18
  42. package/esm2022/libs/ui/search/src/lib/ui-search.module.mjs +10 -4
  43. package/esm2022/libs/util/i18n/src/lib/i18n.constants.mjs +42 -1
  44. package/esm2022/libs/util/i18n/src/lib/language-codes.mjs +24 -2
  45. package/esm2022/translations/de.json +34 -12
  46. package/esm2022/translations/en.json +34 -14
  47. package/esm2022/translations/es.json +33 -11
  48. package/esm2022/translations/fr.json +34 -14
  49. package/esm2022/translations/it.json +66 -44
  50. package/esm2022/translations/nl.json +33 -11
  51. package/esm2022/translations/pt.json +33 -11
  52. package/fesm2022/geonetwork-ui.mjs +1441 -727
  53. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  54. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  55. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +0 -1
  56. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  57. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts +1 -0
  58. package/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.d.ts.map +1 -1
  59. package/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.d.ts.map +1 -1
  60. package/libs/api/metadata-converter/src/lib/iso19139/read-parts.d.ts.map +1 -1
  61. package/libs/api/metadata-converter/src/lib/iso19139/write-parts.d.ts.map +1 -1
  62. package/libs/api/repository/src/lib/gn4/elasticsearch/constant.d.ts.map +1 -1
  63. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts +1 -1
  64. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  65. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts +13 -2
  66. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  67. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +2 -0
  68. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  69. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts +1 -0
  70. package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts.map +1 -1
  71. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts +6 -0
  72. package/libs/common/domain/src/lib/repository/records-repository.interface.d.ts.map +1 -1
  73. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts +48 -3
  74. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts.map +1 -1
  75. package/libs/feature/record/src/index.d.ts +1 -2
  76. package/libs/feature/record/src/index.d.ts.map +1 -1
  77. package/libs/feature/record/src/lib/state/mdview.actions.d.ts +10 -0
  78. package/libs/feature/record/src/lib/state/mdview.actions.d.ts.map +1 -1
  79. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +6 -0
  80. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  81. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +2 -0
  82. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  83. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts +2 -0
  84. package/libs/feature/record/src/lib/state/mdview.reducer.d.ts.map +1 -1
  85. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts +2 -0
  86. package/libs/feature/record/src/lib/state/mdview.selectors.d.ts.map +1 -1
  87. package/libs/feature/search/src/lib/constants.d.ts.map +1 -1
  88. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts +1 -1
  89. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts.map +1 -1
  90. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts +6 -5
  91. package/libs/feature/search/src/lib/results-table/results-table-container.component.d.ts.map +1 -1
  92. package/libs/ui/elements/src/index.d.ts +1 -0
  93. package/libs/ui/elements/src/index.d.ts.map +1 -1
  94. package/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.d.ts +15 -0
  95. package/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.d.ts.map +1 -0
  96. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts +6 -13
  97. package/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.d.ts.map +1 -1
  98. package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts +14 -0
  99. package/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.d.ts.map +1 -0
  100. package/libs/ui/elements/src/lib/kind-badge/kind-badge.component.d.ts +3 -1
  101. package/libs/ui/elements/src/lib/kind-badge/kind-badge.component.d.ts.map +1 -1
  102. package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts +8 -1
  103. package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts.map +1 -1
  104. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts +1 -0
  105. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts.map +1 -1
  106. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +2 -1
  107. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  108. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +4 -2
  109. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -1
  110. package/libs/ui/search/src/index.d.ts +1 -0
  111. package/libs/ui/search/src/index.d.ts.map +1 -1
  112. package/libs/ui/search/src/lib/results-list/results-list.component.d.ts.map +1 -1
  113. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts +4 -3
  114. package/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.d.ts.map +1 -1
  115. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts +10 -4
  116. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  117. package/libs/ui/search/src/lib/ui-search.module.d.ts +2 -1
  118. package/libs/ui/search/src/lib/ui-search.module.d.ts.map +1 -1
  119. package/libs/util/i18n/src/lib/i18n.constants.d.ts +1 -0
  120. package/libs/util/i18n/src/lib/i18n.constants.d.ts.map +1 -1
  121. package/libs/util/i18n/src/lib/language-codes.d.ts +23 -1
  122. package/libs/util/i18n/src/lib/language-codes.d.ts.map +1 -1
  123. package/package.json +1 -1
  124. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +1 -1
  125. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +61 -4
  126. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +0 -1
  127. package/src/libs/api/metadata-converter/src/lib/iso19115-3/read-parts.ts +13 -3
  128. package/src/libs/api/metadata-converter/src/lib/iso19115-3/write-parts.ts +5 -1
  129. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +8 -4
  130. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +4 -1
  131. package/src/libs/api/repository/src/lib/gn4/elasticsearch/constant.ts +1 -0
  132. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +2 -2
  133. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +101 -11
  134. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +11 -0
  135. package/src/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.ts +3 -0
  136. package/src/libs/common/domain/src/lib/repository/records-repository.interface.ts +6 -0
  137. package/src/libs/common/fixtures/src/lib/records.fixtures.ts +50 -1
  138. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.html +117 -11
  139. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.ts +316 -6
  140. package/src/libs/feature/record/src/index.ts +1 -2
  141. package/src/libs/feature/record/src/lib/state/mdview.actions.ts +10 -0
  142. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +22 -0
  143. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +4 -0
  144. package/src/libs/feature/record/src/lib/state/mdview.reducer.ts +12 -0
  145. package/src/libs/feature/record/src/lib/state/mdview.selectors.ts +9 -0
  146. package/src/libs/feature/search/src/lib/constants.ts +1 -0
  147. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +2 -0
  148. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.html +1 -0
  149. package/src/libs/feature/search/src/lib/results-table/results-table-container.component.ts +13 -3
  150. package/src/libs/ui/elements/src/index.ts +1 -0
  151. package/src/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.css +4 -0
  152. package/src/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.html +13 -0
  153. package/src/libs/ui/elements/src/lib/geo-data-badge/geo-data-badge.component.ts +54 -0
  154. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.html +68 -141
  155. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +38 -97
  156. package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.html +69 -0
  157. package/src/libs/ui/elements/src/lib/internal-link-card-contact/internal-link-card-contact.component.ts +61 -0
  158. package/src/libs/ui/elements/src/lib/kind-badge/kind-badge.component.html +7 -5
  159. package/src/libs/ui/elements/src/lib/kind-badge/kind-badge.component.ts +21 -2
  160. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.html +1 -1
  161. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.html +8 -29
  162. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.ts +14 -1
  163. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.html +15 -1
  164. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.ts +9 -1
  165. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +3 -0
  166. package/src/libs/ui/inputs/src/lib/autocomplete/autocomplete.component.html +1 -1
  167. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.html +1 -2
  168. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +3 -2
  169. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +13 -6
  170. package/src/libs/ui/search/src/index.ts +1 -0
  171. package/src/libs/ui/search/src/lib/record-preview-row/record-preview-row.component.html +9 -81
  172. package/src/libs/ui/search/src/lib/results-hits-search-kind/results-hits-search-kind.component.html +1 -0
  173. package/src/libs/ui/search/src/lib/results-list/results-layout.config.ts +2 -2
  174. package/src/libs/ui/search/src/lib/results-list/results-list.component.html +1 -1
  175. package/src/libs/ui/search/src/lib/results-list/results-list.component.ts +0 -1
  176. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.html +16 -6
  177. package/src/libs/ui/search/src/lib/results-table/action-menu/action-menu.component.ts +15 -11
  178. package/src/libs/ui/search/src/lib/results-table/results-table.component.css +4 -0
  179. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +31 -27
  180. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +33 -15
  181. package/src/libs/ui/search/src/lib/ui-search.module.ts +3 -0
  182. package/src/libs/util/i18n/src/lib/i18n.constants.ts +42 -0
  183. package/src/libs/util/i18n/src/lib/language-codes.ts +23 -1
  184. package/tailwind.base.css +1 -1
  185. package/translations/de.json +34 -12
  186. package/translations/en.json +34 -14
  187. package/translations/es.json +33 -11
  188. package/translations/fr.json +34 -14
  189. package/translations/it.json +66 -44
  190. package/translations/nl.json +33 -11
  191. package/translations/pt.json +33 -11
  192. package/translations/sk.json +33 -11
@@ -1,156 +1,83 @@
1
- <div
2
- class="rounded-lg group card-shadow cursor-pointer overflow-hidden hover:bg-gray-50"
3
- [ngClass]="cardClass"
4
- >
5
- <div class="flex flex-row justify-between w-full">
1
+ <a [attr.href]="linkHref" [target]="linkTarget">
2
+ <div
3
+ class="group rounded-md bg-white hover:cursor-pointer hover:bg-slate-50 overflow-hidden w-full"
4
+ [ngClass]="cardClass"
5
+ >
6
6
  <div
7
- *ngIf="shouldShowThumbnail"
8
- [ngClass]="thumbnailContainerClass"
9
- class="mr-4 flex flex-col"
7
+ class="flex flex-row md:gap-0 justify-between w-full"
8
+ [ngClass]="{ 'flex-wrap md:flex-nowrap gap-3': size === 'L' }"
10
9
  >
11
- <gn-ui-thumbnail
12
- class="w-full h-full object-cover"
13
- [thumbnailUrl]="record.overviews?.[0]?.url?.toString() || ''"
14
- [fit]="'cover'"
15
- ></gn-ui-thumbnail>
16
- </div>
17
- <div
18
- class="flex flex-col flex-1 relative"
19
- [ngClass]="{
20
- 'justify-between': record.ownerOrganization?.name && size !== 'XS',
21
- }"
22
- >
23
- <div class="flex items-center space-x-2">
24
- <span
25
- *ngIf="getKindInfo().text"
26
- class="badge-btn text-white text-xs px-2 py-0.5 font-bold shrink-0 bg-primary leading-tight flex items-center justify-evenly h-6 min-h-6"
27
- >
28
- <ng-icon
29
- class="text-[0.9em] text-white mr-1"
30
- [name]="getKindInfo().icon"
31
- ></ng-icon>
32
- <span class="font-medium text-white text-xs" translate>
33
- {{ getKindInfo().text }}
34
- </span>
35
- </span>
36
- <span
37
- *ngIf="isGeodata"
38
- class="badge-btn text-black text-xs px-2 py-0.5 font-bold shrink-0 bg-primary-white leading-tight flex items-center justify-evenly h-6 min-h-6"
39
- [ngClass]="size === 'L' ? 'w-[164px]' : 'w-8'"
40
- >
41
- <ng-icon
42
- class="text-[0.9em] text-primary-darkest"
43
- name="matLocationSearchingOutline"
44
- ></ng-icon>
45
- <ng-container *ngIf="size === 'L'">
46
- <span
47
- class="font-medium text-primary-darkest text-xs ml-1"
48
- translate
49
- >
50
- record.metadata.type
51
- </span>
52
- </ng-container>
53
- </span>
54
- <div class="flex items-center">
55
- <gn-ui-metadata-quality
56
- [smaller]="true"
57
- [metadata]="record"
58
- [metadataQualityDisplay]="metadataQualityDisplay"
59
- ></gn-ui-metadata-quality>
60
- </div>
61
- <div class="absolute top-0 right-0 items-center">
62
- <ng-container
63
- *ngIf="size !== 'XS'"
64
- [ngTemplateOutlet]="favoriteTemplate"
65
- [ngTemplateOutletContext]="{ $implicit: record }"
66
- ></ng-container>
67
- </div>
68
- </div>
69
- <div
70
- class="font-medium text-title group-hover:text-primary overflow-hidden break-words"
71
- [ngClass]="getTitleClass()"
72
- >
73
- {{ record.title }}
74
- </div>
75
10
  <div
76
- *ngIf="size === 'L'"
77
- class="mt-1 mb-2 font-normal text-xs text-gray-900 line-clamp-2 overflow-hidden"
11
+ *ngIf="shouldShowThumbnail"
12
+ [ngClass]="thumbnailContainerClass"
13
+ class="border mr-4 flex flex-col"
78
14
  >
79
- <gn-ui-markdown-parser
80
- [textContent]="abstract"
81
- [whitoutStyles]="true"
82
- ></gn-ui-markdown-parser>
15
+ <gn-ui-thumbnail
16
+ class="w-full h-full object-cover"
17
+ [thumbnailUrl]="record.overviews?.[0]?.url?.toString() || ''"
18
+ [fit]="'cover'"
19
+ ></gn-ui-thumbnail>
83
20
  </div>
84
- <div
85
- *ngIf="size !== 'XS' && record.ownerOrganization?.name"
86
- class="flex items-center justify-evenly bg-gray-50 rounded-lg h-[53px] px-2"
87
- >
88
- <div class="flex items-center flex-1 min-w-0">
89
- <div
90
- class="w-[45px] h-[45px] rounded-lg overflow-hidden shrink-0 mr-3"
91
- >
92
- <gn-ui-thumbnail
93
- [thumbnailUrl]="
94
- record.ownerOrganization?.logoUrl?.toString() || ''
95
- "
96
- [fit]="'contain'"
97
- class="w-full h-full rounded-lg"
98
- ></gn-ui-thumbnail>
21
+ <div class="grow flex flex-col gap-3">
22
+ <div class="flex items-center gap-2">
23
+ <div class="grow flex flex-wrap items-center gap-2">
24
+ <gn-ui-kind-badge
25
+ [styling]="'default'"
26
+ [kind]="record?.kind"
27
+ ></gn-ui-kind-badge>
28
+ <gn-ui-geo-data-badge
29
+ [showLabel]="size === 'L'"
30
+ [styling]="'light'"
31
+ [record]="record"
32
+ ></gn-ui-geo-data-badge>
33
+ <gn-ui-metadata-quality
34
+ class="flex items-center"
35
+ [smaller]="true"
36
+ [metadata]="record"
37
+ [metadataQualityDisplay]="metadataQualityDisplay"
38
+ ></gn-ui-metadata-quality>
99
39
  </div>
100
- <div *ngIf="organization?.name" class="flex-1 w-0 overflow-hidden">
101
- <div
102
- class="text-xs text-black font-normal leading-tight truncate"
103
- translate
104
- >
105
- record.card.metadata.contact
106
- </div>
107
- <div class="text-xl text-primary-black font-medium truncate">
108
- {{ organization.name }}
109
- </div>
40
+ <div *ngIf="size !== 'XS'" data-cy="recordFav">
41
+ <ng-container
42
+ [ngTemplateOutlet]="favoriteTemplate"
43
+ [ngTemplateOutletContext]="{ $implicit: record }"
44
+ ></ng-container>
110
45
  </div>
111
46
  </div>
112
- <div *ngIf="size === 'L'" class="ml-2 flex space-x-2">
113
- <div *ngIf="organization?.website" class="flex">
114
- <button
115
- [title]="organization.website"
116
- class="w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest"
117
- (click)="openExternalUrl($event, organization.website)"
118
- >
119
- <ng-icon name="iconoirInternet"></ng-icon>
120
- </button>
121
- </div>
122
- <div *ngIf="contacts[0]?.email" class="flex">
123
- <button
124
- [title]="contacts[0].email"
125
- class="w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest"
126
- data-cy="contact-email"
127
- (click)="openMailto($event, contacts[0].email)"
128
- >
129
- <ng-icon name="matEmailOutline"></ng-icon>
130
- </button>
131
- </div>
132
- <div *ngIf="contacts[0]?.phone" class="flex">
133
- <button
134
- [title]="'Copy to clipboard'"
135
- class="w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group"
136
- data-cy="contact-phone"
137
- (click)="copyToClipboard($event, contacts[0].phone)"
47
+
48
+ <div class="grow flex flex-col gap-2">
49
+ <div
50
+ class="font-medium text-title group-hover:text-primary"
51
+ [title]="record.title"
52
+ >
53
+ <h4
54
+ class="mr-6 overflow-hidden"
55
+ [ngClass]="getTitleClass()"
56
+ data-cy="recordTitle"
57
+ [title]="record.title"
138
58
  >
139
- <ng-icon name="matPhoneOutline"></ng-icon>
140
- </button>
59
+ {{ record.title }}
60
+ </h4>
141
61
  </div>
142
- <div *ngIf="contacts[0]?.address" class="flex">
143
- <button
144
- [title]="'Copy to clipboard'"
145
- class="w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group"
146
- data-cy="contact-phone"
147
- (click)="copyToClipboard($event, contacts[0].address)"
148
- >
149
- <ng-icon name="matLocationOnOutline"></ng-icon>
150
- </button>
62
+ <div
63
+ *ngIf="displayAbstract()"
64
+ class="mr-6 text-xs text-gray-900 overflow-hidden"
65
+ [ngClass]="getAbstractClass()"
66
+ data-cy="recordAbstract"
67
+ >
68
+ <gn-ui-markdown-parser
69
+ [textContent]="abstract"
70
+ [whitoutStyles]="true"
71
+ ></gn-ui-markdown-parser>
151
72
  </div>
152
73
  </div>
74
+
75
+ <gn-ui-internal-link-card-contact
76
+ *ngIf="size !== 'XS' && record.ownerOrganization?.name"
77
+ [record]="record"
78
+ [size]="size"
79
+ ></gn-ui-internal-link-card-contact>
153
80
  </div>
154
81
  </div>
155
82
  </div>
156
- </div>
83
+ </a>
@@ -7,39 +7,20 @@ import {
7
7
  EventEmitter,
8
8
  ElementRef,
9
9
  } from '@angular/core'
10
- import {
11
- CatalogRecord,
12
- Organization,
13
- } from '../../../../../../libs/common/domain/src/lib/model/record'
10
+ import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
14
11
  import { NgClass, NgIf, NgTemplateOutlet } from '@angular/common'
12
+ import { GeoDataBadgeComponent } from '../geo-data-badge/geo-data-badge.component'
13
+ import { KindBadgeComponent } from '../kind-badge/kind-badge.component'
15
14
  import { MarkdownParserComponent } from '../markdown-parser/markdown-parser.component'
16
15
  import { MetadataQualityComponent } from '../metadata-quality/metadata-quality.component'
17
- import { ThumbnailComponent } from '../thumbnail/thumbnail.component'
18
- import {
19
- propagateToDocumentOnly,
20
- removeWhitespace,
21
- stripHtml,
22
- } from '../../../../../../libs/util/shared/src'
23
- import {
24
- NgIconComponent,
25
- provideIcons,
26
- provideNgIconsConfig,
27
- } from '@ng-icons/core'
28
- import {
29
- matLocationSearchingOutline,
30
- matEmailOutline,
31
- matPhoneOutline,
32
- matLocationOnOutline,
33
- } from '@ng-icons/material-icons/outline'
34
- import { matCode } from '@ng-icons/material-icons/baseline'
35
- import { iconoirDatabase, iconoirMap, iconoirInternet } from '@ng-icons/iconoir'
16
+ import { InternalLinkCardContactComponent } from '../internal-link-card-contact/internal-link-card-contact.component'
17
+ import { removeWhitespace, stripHtml } from '../../../../../../libs/util/shared/src'
18
+ import { provideIcons, provideNgIconsConfig } from '@ng-icons/core'
19
+ import { matLocationSearchingOutline } from '@ng-icons/material-icons/outline'
20
+ import { iconoirInternet } from '@ng-icons/iconoir'
36
21
  import { TranslateModule } from '@ngx-translate/core'
37
- import { marker } from '@biesbjerg/ngx-translate-extract-marker'
38
22
  import { fromEvent, Subscription } from 'rxjs'
39
-
40
- marker('record.kind.data')
41
- marker('record.kind.reuse')
42
- marker('record.kind.service')
23
+ import { ThumbnailComponent } from '../thumbnail/thumbnail.component'
43
24
 
44
25
  type CardSize = 'L' | 'M' | 'S' | 'XS'
45
26
 
@@ -49,23 +30,19 @@ type CardSize = 'L' | 'M' | 'S' | 'XS'
49
30
  imports: [
50
31
  NgClass,
51
32
  NgIf,
52
- ThumbnailComponent,
53
33
  MetadataQualityComponent,
54
34
  NgTemplateOutlet,
55
- NgIconComponent,
56
35
  TranslateModule,
36
+ GeoDataBadgeComponent,
37
+ KindBadgeComponent,
57
38
  MarkdownParserComponent,
39
+ InternalLinkCardContactComponent,
40
+ ThumbnailComponent,
58
41
  ],
59
42
  providers: [
60
43
  provideIcons({
61
- matLocationSearchingOutline,
62
- matCode,
63
- iconoirDatabase,
64
- iconoirMap,
65
44
  iconoirInternet,
66
- matEmailOutline,
67
- matPhoneOutline,
68
- matLocationOnOutline,
45
+ matLocationSearchingOutline,
69
46
  }),
70
47
  provideNgIconsConfig({
71
48
  size: '1.2em',
@@ -76,10 +53,10 @@ type CardSize = 'L' | 'M' | 'S' | 'XS'
76
53
  })
77
54
  export class InternalLinkCardComponent implements OnInit {
78
55
  @Input() record: CatalogRecord
56
+ @Input() linkTarget = '_blank'
57
+ @Input() linkHref: string = null
79
58
  @Input() metadataQualityDisplay: boolean
80
59
  @Input() favoriteTemplate: TemplateRef<{ $implicit: CatalogRecord }>
81
- @Input() linkHref: string = null
82
- @Input() isGeodata: boolean
83
60
  @Input() set size(value: CardSize) {
84
61
  this._size = value
85
62
  this.cardClass = this.sizeClassMap[value] || ''
@@ -99,24 +76,24 @@ export class InternalLinkCardComponent implements OnInit {
99
76
  private _size: CardSize = 'M'
100
77
 
101
78
  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',
79
+ L: 'min-h-[190px] w-full py-3 px-3 flex items-start gap-5',
80
+ M: 'min-h-[140px] py-3 px-3 flex items-start gap-4',
81
+ S: 'min-h-[220px] py-3 px-3 flex gap-4',
82
+ XS: 'min-h-[108px] py-3 px-3 flex gap-4',
106
83
  }
107
84
 
108
85
  private readonly thumbnailSizeClassMap: Record<CardSize, string> = {
109
- L: 'w-[190px] h-[180px] rounded-lg overflow-hidden shrink-0',
86
+ L: 'w-full md:w-[190px] h-[180px] rounded-lg overflow-hidden shrink-0',
110
87
  M: 'w-[110px] h-[140px] rounded-lg overflow-hidden shrink-0',
111
88
  S: 'hidden',
112
89
  XS: 'hidden',
113
90
  }
114
91
 
115
92
  private readonly titleClassMap: Record<CardSize, string> = {
116
- L: 'text-xl line-clamp-2',
93
+ L: 'text-xl line-clamp-1',
117
94
  M: 'text-base line-clamp-2',
118
- S: 'text-base line-clamp-3',
119
- XS: 'text-base mt-3 line-clamp-2',
95
+ S: 'text-base line-clamp-3 ml-2',
96
+ XS: 'text-base line-clamp-1 ml-2',
120
97
  }
121
98
 
122
99
  constructor(protected elementRef: ElementRef) {}
@@ -124,67 +101,31 @@ export class InternalLinkCardComponent implements OnInit {
124
101
  ngOnInit(): void {
125
102
  this.abstract = removeWhitespace(stripHtml(this.record?.abstract))
126
103
  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
- }
104
+ fromEvent(this.elementRef.nativeElement, 'click').subscribe(() =>
105
+ this.mdSelect.emit(this.record)
133
106
  )
134
107
  )
135
108
  }
136
109
 
137
- get organization(): Organization {
138
- return this.record.ownerOrganization
110
+ getTitleClass() {
111
+ return this.titleClassMap[this._size]
139
112
  }
140
-
141
- get contacts() {
142
- return (
143
- (this.record.kind === 'dataset'
144
- ? this.record.contactsForResource
145
- : this.record.contacts) || []
146
- )
113
+ getAbstractClass(): string {
114
+ const marginClass = ['S', 'XS'].includes(this.size) ? 'ml-2' : ''
115
+ const clampClass =
116
+ this.size === 'L' && !this.record.ownerOrganization?.name
117
+ ? 'line-clamp-6'
118
+ : 'line-clamp-2'
119
+ return `${clampClass} ${marginClass}`.trim()
147
120
  }
148
-
149
- getTitleClass() {
121
+ displayAbstract(): boolean {
150
122
  return (
151
- this.titleClassMap[this._size] +
152
- ' ' +
153
- (this.record.ownerOrganization?.name ? '' : 'mt-3') || ''
123
+ this.size === 'L' ||
124
+ (['M', 'S'].includes(this.size) && !this.record.ownerOrganization?.name)
154
125
  )
155
126
  }
156
127
 
157
- openExternalUrl(event: Event, url: URL): void {
158
- event.stopPropagation()
159
- window.open(url, '_blank')
160
- }
161
-
162
- openMailto(event: Event, email: string): void {
163
- event.stopPropagation()
164
- window.open(`mailto:${email}`, '_blank')
165
- }
166
-
167
- copyToClipboard(event: Event, text: string): void {
168
- event.stopPropagation()
169
- navigator.clipboard.writeText(text)
170
- }
171
-
172
128
  get shouldShowThumbnail(): boolean {
173
129
  return this.size === 'L' || this.size === 'M'
174
130
  }
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
131
  }
@@ -0,0 +1,69 @@
1
+ <div
2
+ data-cy="recordOrg"
3
+ class="flex items-center justify-evenly bg-gray-50 rounded-lg h-[53px] px-2"
4
+ >
5
+ <div class="flex items-center flex-1 min-w-0">
6
+ <div class="w-[45px] h-[45px] rounded-lg overflow-hidden shrink-0 mr-3">
7
+ <gn-ui-thumbnail
8
+ [thumbnailUrl]="record.ownerOrganization?.logoUrl?.toString() || ''"
9
+ [fit]="'contain'"
10
+ class="w-full h-full rounded-lg"
11
+ ></gn-ui-thumbnail>
12
+ </div>
13
+ <div *ngIf="organization?.name" class="flex-1 w-0 overflow-hidden">
14
+ <div
15
+ class="text-xs text-black font-normal leading-tight truncate"
16
+ translate
17
+ >
18
+ record.card.metadata.contact
19
+ </div>
20
+ <div
21
+ data-cy="recordOrgName"
22
+ class="text-xl text-primary-black font-medium truncate"
23
+ >
24
+ {{ organization.name }}
25
+ </div>
26
+ </div>
27
+ </div>
28
+ <div *ngIf="size === 'L'" class="ml-2 flex space-x-2">
29
+ <div *ngIf="organization?.website" class="flex">
30
+ <button
31
+ [title]="organization.website"
32
+ class="w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest"
33
+ (click)="openExternalUrl($event, organization.website)"
34
+ >
35
+ <ng-icon name="iconoirInternet"></ng-icon>
36
+ </button>
37
+ </div>
38
+ <div *ngIf="contacts[0]?.email" class="flex">
39
+ <button
40
+ [title]="contacts[0].email"
41
+ class="w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest"
42
+ data-cy="contact-email"
43
+ (click)="openMailto($event, contacts[0].email)"
44
+ >
45
+ <ng-icon name="matEmailOutline"></ng-icon>
46
+ </button>
47
+ </div>
48
+ <div *ngIf="contacts[0]?.phone" class="flex">
49
+ <button
50
+ [title]="'Copy to clipboard'"
51
+ class="w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group"
52
+ data-cy="contact-phone"
53
+ (click)="copyToClipboard($event, contacts[0].phone)"
54
+ >
55
+ <ng-icon name="matPhoneOutline"></ng-icon>
56
+ </button>
57
+ </div>
58
+ <div *ngIf="contacts[0]?.address" class="flex">
59
+ <button
60
+ [title]="'Copy to clipboard'"
61
+ class="w-[40px] h-[32px] flex items-center justify-center rounded-lg border border-[#D4D3D7] px-[8px] py-[4px] hover:bg-primary-lightest relative group"
62
+ data-cy="contact-phone"
63
+ (click)="copyToClipboard($event, contacts[0].address)"
64
+ >
65
+ <ng-icon name="matLocationOnOutline"></ng-icon>
66
+ </button>
67
+ </div>
68
+ </div>
69
+ </div>
@@ -0,0 +1,61 @@
1
+ import { Component, Input } from '@angular/core'
2
+ import { NgIf } from '@angular/common'
3
+ import {
4
+ CatalogRecord,
5
+ Organization,
6
+ } from '../../../../../../libs/common/domain/src/lib/model/record'
7
+ import { ThumbnailComponent } from '../thumbnail/thumbnail.component'
8
+ import { NgIconComponent, provideIcons } from '@ng-icons/core'
9
+ import {
10
+ matEmailOutline,
11
+ matPhoneOutline,
12
+ matLocationOnOutline,
13
+ } from '@ng-icons/material-icons/outline'
14
+ import { iconoirInternet } from '@ng-icons/iconoir'
15
+ import { TranslateModule } from '@ngx-translate/core'
16
+
17
+ @Component({
18
+ selector: 'gn-ui-internal-link-card-contact',
19
+ standalone: true,
20
+ imports: [NgIf, ThumbnailComponent, NgIconComponent, TranslateModule],
21
+ providers: [
22
+ provideIcons({
23
+ iconoirInternet,
24
+ matEmailOutline,
25
+ matPhoneOutline,
26
+ matLocationOnOutline,
27
+ }),
28
+ ],
29
+ templateUrl: './internal-link-card-contact.component.html',
30
+ })
31
+ export class InternalLinkCardContactComponent {
32
+ @Input() record: CatalogRecord
33
+ @Input() size: 'L' | 'M' | 'S' | 'XS' = 'M'
34
+
35
+ get organization(): Organization {
36
+ return this.record.ownerOrganization
37
+ }
38
+
39
+ get contacts() {
40
+ return (
41
+ (this.record.kind === 'dataset'
42
+ ? this.record.contactsForResource
43
+ : this.record.contacts) || []
44
+ )
45
+ }
46
+
47
+ openExternalUrl(event: Event, url: URL): void {
48
+ event.stopPropagation()
49
+ window.open(url, '_blank')
50
+ }
51
+
52
+ openMailto(event: Event, email: string): void {
53
+ event.stopPropagation()
54
+ window.open(`mailto:${email}`, '_blank')
55
+ }
56
+
57
+ copyToClipboard(event: Event, text: string): void {
58
+ event.stopPropagation()
59
+ navigator.clipboard.writeText(text)
60
+ }
61
+ }
@@ -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
  }
@@ -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"