geonetwork-ui 2.6.0-dev.3e7617888 → 2.6.0-dev.492bf4497

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 (196) 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 +2 -1
  3. package/esm2022/libs/api/repository/src/lib/gn4/gn4-repository.mjs +5 -2
  4. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  5. package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +45 -9
  6. package/esm2022/libs/feature/dataviz/src/lib/geo-table-view/geo-table-view.component.mjs +2 -2
  7. package/esm2022/libs/feature/dataviz/src/lib/service/data.service.mjs +32 -2
  8. package/esm2022/libs/feature/dataviz/src/lib/table-view/table-view.component.mjs +25 -6
  9. package/esm2022/libs/feature/editor/src/index.mjs +2 -1
  10. package/esm2022/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.mjs +18 -0
  11. package/esm2022/libs/feature/record/src/lib/data-view/data-view.component.mjs +3 -3
  12. package/esm2022/libs/feature/record/src/lib/data-view-share/data-view-share.component.mjs +3 -3
  13. package/esm2022/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.mjs +6 -3
  14. package/esm2022/libs/feature/record/src/lib/map-view/map-view.component.mjs +33 -7
  15. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +11 -13
  16. package/esm2022/libs/ui/dataviz/src/lib/chart/chart.component.mjs +5 -3
  17. package/esm2022/libs/ui/dataviz/src/lib/data-table/data-table.component.mjs +11 -6
  18. package/esm2022/libs/ui/elements/src/index.mjs +2 -1
  19. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -3
  20. package/esm2022/libs/ui/elements/src/lib/download-item/download-item.component.mjs +3 -3
  21. package/esm2022/libs/ui/elements/src/lib/downloads-list/downloads-list.component.mjs +18 -7
  22. package/esm2022/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.mjs +3 -3
  23. package/esm2022/libs/ui/elements/src/lib/link-card/link-card.component.mjs +3 -3
  24. package/esm2022/libs/ui/elements/src/lib/metadata-catalog/metadata-catalog.component.mjs +3 -3
  25. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  26. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +3 -3
  27. package/esm2022/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.mjs +3 -3
  28. package/esm2022/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.mjs +51 -0
  29. package/esm2022/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.mjs +3 -3
  30. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +1 -1
  31. package/esm2022/libs/ui/inputs/src/index.mjs +2 -1
  32. package/esm2022/libs/ui/inputs/src/lib/button/button.component.mjs +2 -2
  33. package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +3 -3
  34. package/esm2022/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.mjs +68 -0
  35. package/esm2022/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.mjs +3 -3
  36. package/esm2022/libs/ui/inputs/src/lib/ui-inputs.module.mjs +2 -8
  37. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  38. package/esm2022/libs/ui/layout/src/lib/block-list/block-list.component.mjs +48 -11
  39. package/esm2022/libs/ui/layout/src/lib/carousel/carousel.component.mjs +3 -3
  40. package/esm2022/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.mjs +34 -13
  41. package/esm2022/libs/ui/layout/src/lib/max-lines/max-lines.component.mjs +3 -3
  42. package/esm2022/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.mjs +6 -6
  43. package/esm2022/libs/ui/layout/src/lib/truncated-text/truncated-text.component.mjs +107 -0
  44. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +4 -12
  45. package/esm2022/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.mjs +29 -4
  46. package/esm2022/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.mjs +2 -1
  47. package/esm2022/libs/ui/search/src/lib/results-list/results-list.component.mjs +3 -3
  48. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +4 -1
  49. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +4 -1
  50. package/esm2022/translations/de.json +15 -4
  51. package/esm2022/translations/en.json +17 -4
  52. package/esm2022/translations/es.json +15 -4
  53. package/esm2022/translations/fr.json +18 -5
  54. package/esm2022/translations/it.json +15 -4
  55. package/esm2022/translations/nl.json +15 -4
  56. package/esm2022/translations/pt.json +15 -4
  57. package/fesm2022/geonetwork-ui.mjs +655 -155
  58. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  59. package/libs/api/metadata-converter/src/lib/common/distribution.mapper.d.ts.map +1 -1
  60. package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
  61. package/libs/api/repository/src/lib/gn4/gn4-repository.d.ts.map +1 -1
  62. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +4 -1
  63. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  64. package/libs/feature/dataviz/src/lib/chart-view/chart-view.component.d.ts +12 -8
  65. package/libs/feature/dataviz/src/lib/chart-view/chart-view.component.d.ts.map +1 -1
  66. package/libs/feature/dataviz/src/lib/service/data.service.d.ts +1 -0
  67. package/libs/feature/dataviz/src/lib/service/data.service.d.ts.map +1 -1
  68. package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts +5 -2
  69. package/libs/feature/dataviz/src/lib/table-view/table-view.component.d.ts.map +1 -1
  70. package/libs/feature/editor/src/index.d.ts +1 -0
  71. package/libs/feature/editor/src/index.d.ts.map +1 -1
  72. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts +7 -0
  73. package/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.d.ts.map +1 -0
  74. package/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.d.ts +2 -1
  75. package/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.d.ts.map +1 -1
  76. package/libs/feature/record/src/lib/map-view/map-view.component.d.ts.map +1 -1
  77. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +26 -21
  78. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  79. package/libs/ui/dataviz/src/lib/chart/chart.component.d.ts +2 -1
  80. package/libs/ui/dataviz/src/lib/chart/chart.component.d.ts.map +1 -1
  81. package/libs/ui/dataviz/src/lib/data-table/data-table.component.d.ts +6 -1
  82. package/libs/ui/dataviz/src/lib/data-table/data-table.component.d.ts.map +1 -1
  83. package/libs/ui/elements/src/index.d.ts +1 -0
  84. package/libs/ui/elements/src/index.d.ts.map +1 -1
  85. package/libs/ui/elements/src/lib/download-item/download-item.component.d.ts +1 -1
  86. package/libs/ui/elements/src/lib/download-item/download-item.component.d.ts.map +1 -1
  87. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +7 -1
  88. package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts.map +1 -1
  89. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts +1 -1
  90. package/libs/ui/elements/src/lib/link-card/link-card.component.d.ts.map +1 -1
  91. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts +16 -0
  92. package/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.d.ts.map +1 -0
  93. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  94. package/libs/ui/inputs/src/index.d.ts +1 -0
  95. package/libs/ui/inputs/src/index.d.ts.map +1 -1
  96. package/libs/ui/inputs/src/lib/button/button.component.d.ts +1 -1
  97. package/libs/ui/inputs/src/lib/button/button.component.d.ts.map +1 -1
  98. package/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.d.ts +17 -0
  99. package/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.d.ts.map +1 -0
  100. package/libs/ui/inputs/src/lib/ui-inputs.module.d.ts.map +1 -1
  101. package/libs/ui/layout/src/index.d.ts +1 -0
  102. package/libs/ui/layout/src/index.d.ts.map +1 -1
  103. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts +9 -2
  104. package/libs/ui/layout/src/lib/block-list/block-list.component.d.ts.map +1 -1
  105. package/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.d.ts +15 -8
  106. package/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.d.ts.map +1 -1
  107. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts +27 -0
  108. package/libs/ui/layout/src/lib/truncated-text/truncated-text.component.d.ts.map +1 -0
  109. package/libs/ui/layout/src/lib/ui-layout.module.d.ts.map +1 -1
  110. package/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.d.ts +6 -2
  111. package/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.d.ts.map +1 -1
  112. package/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.d.ts.map +1 -1
  113. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
  114. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  115. package/package.json +2 -2
  116. package/src/libs/api/metadata-converter/src/lib/common/distribution.mapper.ts +1 -0
  117. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +1 -0
  118. package/src/libs/api/repository/src/lib/gn4/gn4-repository.ts +4 -1
  119. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +9 -2
  120. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +10 -0
  121. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +14 -0
  122. package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.html +12 -9
  123. package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.ts +54 -10
  124. package/src/libs/feature/dataviz/src/lib/service/data.service.ts +37 -0
  125. package/src/libs/feature/dataviz/src/lib/table-view/table-view.component.html +1 -0
  126. package/src/libs/feature/dataviz/src/lib/table-view/table-view.component.ts +27 -1
  127. package/src/libs/feature/editor/src/index.ts +1 -0
  128. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.css +0 -0
  129. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.html +14 -0
  130. package/src/libs/feature/editor/src/lib/components/multilingual-panel/multilingual-panel.component.ts +15 -0
  131. package/src/libs/feature/record/src/lib/data-view/data-view.component.html +16 -10
  132. package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.html +1 -1
  133. package/src/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.html +2 -2
  134. package/src/libs/feature/record/src/lib/external-viewer-button/external-viewer-button.component.ts +1 -0
  135. package/src/libs/feature/record/src/lib/map-view/map-view.component.html +25 -16
  136. package/src/libs/feature/record/src/lib/map-view/map-view.component.ts +35 -4
  137. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +18 -15
  138. package/src/libs/ui/dataviz/src/lib/chart/chart.component.ts +2 -1
  139. package/src/libs/ui/dataviz/src/lib/data-table/data-table.component.html +6 -3
  140. package/src/libs/ui/dataviz/src/lib/data-table/data-table.component.ts +5 -4
  141. package/src/libs/ui/elements/src/index.ts +1 -0
  142. package/src/libs/ui/elements/src/lib/api-card/api-card.component.html +4 -4
  143. package/src/libs/ui/elements/src/lib/download-item/download-item.component.html +8 -5
  144. package/src/libs/ui/elements/src/lib/download-item/download-item.component.ts +2 -2
  145. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.html +38 -7
  146. package/src/libs/ui/elements/src/lib/downloads-list/downloads-list.component.ts +29 -2
  147. package/src/libs/ui/elements/src/lib/image-overlay-preview/image-overlay-preview.component.html +1 -1
  148. package/src/libs/ui/elements/src/lib/link-card/link-card.component.html +5 -2
  149. package/src/libs/ui/elements/src/lib/link-card/link-card.component.ts +3 -7
  150. package/src/libs/ui/elements/src/lib/metadata-catalog/metadata-catalog.component.html +3 -5
  151. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +12 -9
  152. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.css +1 -1
  153. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +11 -3
  154. package/src/libs/ui/elements/src/lib/metadata-quality/metadata-quality.component.html +2 -3
  155. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.html +48 -0
  156. package/src/libs/ui/elements/src/lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component.ts +52 -0
  157. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.html +1 -1
  158. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +0 -1
  159. package/src/libs/ui/inputs/src/index.ts +1 -0
  160. package/src/libs/ui/inputs/src/lib/button/button.component.ts +2 -2
  161. package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.html +1 -1
  162. package/src/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.css +0 -0
  163. package/src/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.html +43 -0
  164. package/src/libs/ui/inputs/src/lib/search-feature-catalog/search-feature-catalog.component.ts +77 -0
  165. package/src/libs/ui/inputs/src/lib/star-toggle/star-toggle.component.html +2 -2
  166. package/src/libs/ui/inputs/src/lib/ui-inputs.module.ts +0 -3
  167. package/src/libs/ui/layout/src/index.ts +1 -0
  168. package/src/libs/ui/layout/src/lib/block-list/block-list.component.css +22 -0
  169. package/src/libs/ui/layout/src/lib/block-list/block-list.component.html +2 -2
  170. package/src/libs/ui/layout/src/lib/block-list/block-list.component.ts +43 -5
  171. package/src/libs/ui/layout/src/lib/carousel/carousel.component.css +0 -1
  172. package/src/libs/ui/layout/src/lib/carousel/carousel.component.html +1 -1
  173. package/src/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.html +24 -8
  174. package/src/libs/ui/layout/src/lib/expandable-panel/expandable-panel.component.ts +36 -10
  175. package/src/libs/ui/layout/src/lib/max-lines/max-lines.component.html +1 -1
  176. package/src/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.html +17 -5
  177. package/src/libs/ui/layout/src/lib/previous-next-buttons/previous-next-buttons.component.ts +3 -3
  178. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.html +44 -0
  179. package/src/libs/ui/layout/src/lib/truncated-text/truncated-text.component.ts +130 -0
  180. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +1 -5
  181. package/src/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.html +3 -3
  182. package/src/libs/ui/map/src/lib/components/feature-detail/feature-detail.component.ts +27 -3
  183. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.ts +1 -0
  184. package/src/libs/ui/search/src/lib/results-list/results-list.component.html +1 -0
  185. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +3 -0
  186. package/src/libs/util/shared/src/lib/links/link-utils.ts +3 -0
  187. package/tailwind.base.config.js +3 -0
  188. package/tailwind.base.css +1 -13
  189. package/translations/de.json +15 -4
  190. package/translations/en.json +17 -4
  191. package/translations/es.json +15 -4
  192. package/translations/fr.json +18 -5
  193. package/translations/it.json +15 -4
  194. package/translations/nl.json +15 -4
  195. package/translations/pt.json +15 -4
  196. package/translations/sk.json +15 -4
@@ -1,7 +1,10 @@
1
- <div class="py-5 px-5 rounded bg-gray-100 text-black">
1
+ <div
2
+ class="py-5 px-5 rounded bg-gray-100 text-black"
3
+ data-cy="metadata-organization"
4
+ >
2
5
  <div class="grid gap-3 overflow-hidden">
3
6
  <div>
4
- <p class="text-sm font-medium" translate>record.metadata.contact</p>
7
+ <p class="text-base font-medium" translate>record.metadata.contact</p>
5
8
  </div>
6
9
  <div
7
10
  *ngIf="shownOrganization?.logoUrl?.href"
@@ -13,12 +16,12 @@
13
16
  fit="contain"
14
17
  ></gn-ui-thumbnail>
15
18
  </div>
16
- <div class="grid gap-1">
19
+ <div class="grid grid-cols-1 gap-1">
17
20
  <div class="flex">
18
21
  <div
19
- class="text-primary font-title text-21 mr-2 cursor-pointer hover:underline"
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>
@@ -27,7 +30,7 @@
27
30
  <a
28
31
  [href]="shownOrganization.website"
29
32
  target="_blank"
30
- class="contact-website text-primary text-sm cursor-pointer hover:underline transition-all"
33
+ class="contact-website text-sm cursor-pointer hover:underline transition-all"
31
34
  >{{ shownOrganization.website }}
32
35
  <ng-icon
33
36
  class="!w-[12px] !h-[12px] opacity-75 shrink-0"
@@ -36,7 +39,7 @@
36
39
  </a>
37
40
  </div>
38
41
  </div>
39
- <div class="grid gap-5 py-3 overflow-hidden">
42
+ <div class="grid grid-cols-1 gap-5 py-3 overflow-hidden">
40
43
  <div *ngIf="contacts[0]?.phone">
41
44
  <div class="flex">
42
45
  <ng-icon
@@ -49,7 +52,7 @@
49
52
  </div>
50
53
  </div>
51
54
  <div *ngIf="contacts[0]?.email">
52
- <div class="flex">
55
+ <div class="flex gap-2">
53
56
  <ng-icon
54
57
  class="!w-5 !h-5 !text-[20px] opacity-75 shrink-0"
55
58
  name="matMailOutline"
@@ -57,7 +60,7 @@
57
60
  <a
58
61
  *ngIf="contacts.length"
59
62
  [href]="'mailto:' + contacts[0].email"
60
- class="text-sm hover:underline ml-2"
63
+ class="break-all text-sm hover:underline"
61
64
  target="_blank"
62
65
  data-cy="contact-email"
63
66
  >{{ contacts[0].email }}</a
@@ -17,6 +17,6 @@
17
17
  --gn-ui-badge-text-color: var(--color-primary-darkest);
18
18
  }
19
19
 
20
- :host ::ng-deep gn-ui-badge:hover {
20
+ :host .metadata-info-keywords ::ng-deep gn-ui-badge:hover {
21
21
  --gn-ui-badge-text-color: white;
22
22
  }
@@ -25,7 +25,7 @@
25
25
  [showContent]="fieldReady('keywords')"
26
26
  >
27
27
  <div *ngIf="metadata.keywords?.length">
28
- <div class="sm:pb-4 flex flex-wrap gap-2">
28
+ <div class="metadata-info-keywords sm:pb-4 flex flex-wrap gap-2">
29
29
  <gn-ui-badge
30
30
  class="inline-block lowercase"
31
31
  (click)="onKeywordClick(keyword)"
@@ -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">
@@ -79,9 +80,12 @@
79
80
  </ng-container>
80
81
  <ng-container *ngIf="otherConstraints.length">
81
82
  <div gnUiLinkify *ngFor="let constraint of otherConstraints">
82
- <h5 translate class="font-medium text-black text-sm mb-[2px] mt-[16px]">
83
+ <span
84
+ translate
85
+ class="font-medium text-black text-sm mb-[2px] mt-[16px]"
86
+ >
83
87
  record.metadata.otherConstraints
84
- </h5>
88
+ </span>
85
89
  <div class="mb-6">
86
90
  <gn-ui-markdown-parser [textContent]="constraint">
87
91
  </gn-ui-markdown-parser>
@@ -102,6 +106,7 @@
102
106
  (metadata.kind === 'dataset' && metadata.status)
103
107
  "
104
108
  [title]="'record.metadata.details' | translate"
109
+ data-test="details-panel"
105
110
  >
106
111
  <div *ngIf="metadata.lineage" class="text-gray-900 flex flex-col mt-4 gap-2">
107
112
  <p class="whitespace-pre-line break-words text-gray-900" gnUiLinkify>
@@ -228,6 +233,7 @@
228
233
  <gn-ui-expandable-panel
229
234
  *ngIf="metadata.kind !== 'dataset' && metadata.spatialExtents"
230
235
  [title]="'service.metadata.spatialExtent' | translate"
236
+ data-test="spatial-extent-panel"
231
237
  >
232
238
  <gn-ui-spatial-extent
233
239
  class="flex h-[271px] w-full rounded-lg border border-gray-100 mt-3 mb-6"
@@ -237,6 +243,7 @@
237
243
  <gn-ui-expandable-panel
238
244
  *ngIf="metadata.landingPage"
239
245
  [title]="'service.metadata.other' | translate"
246
+ data-test="other-panel"
240
247
  >
241
248
  <div class="flex flex-col gap-4 mr-4 py-5 rounded text-gray-700">
242
249
  <div *ngIf="metadata.recordUpdated">
@@ -276,6 +283,7 @@
276
283
  <p class="text-sm mb-1" translate>record.metadata.topics</p>
277
284
  <div class="sm:pb-4 sm:pr-16">
278
285
  <gn-ui-badge
286
+ [clickable]="false"
279
287
  class="inline-block mr-2 mb-2 lowercase"
280
288
  *ngFor="let topic of metadata.topics"
281
289
  >{{ topic }}</gn-ui-badge
@@ -1,9 +1,8 @@
1
1
  <div *ngIf="metadataQualityDisplay" class="metadata-quality">
2
2
  <div
3
3
  class="flex items-center"
4
- [class]="
5
- smaller ? 'leading-[8px] min-w-[120px] m-h-[120px]' : 'min-w-[200px]'
6
- "
4
+ [class]="min - w - 0"
5
+ [ngClass]="{ 'leading-[8px] m-h-[120px]': smaller }"
7
6
  >
8
7
  <gn-ui-progress-bar
9
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,5 +1,5 @@
1
1
  <div style="height: 652px" id="preview" *ngIf="apiLinks.length > 0">
2
- <div class="bg-primary-opacity-10 overflow-visible" style="height: 512px">
2
+ <div class="bg-primary-opacity-10 overflow-visible" style="height: 420px">
3
3
  <div class="container-lg px-4 lg:mx-auto">
4
4
  <div>
5
5
  <div class="gn-ui-section-title mb-6" translate>
@@ -23,7 +23,6 @@ import { UserPreviewComponent } from './user-preview/user-preview.component'
23
23
  import { ApplicationBannerComponent } from './application-banner/application-banner.component'
24
24
  import { InternalLinkCardComponent } from './internal-link-card/internal-link-card.component'
25
25
  import { ServiceCapabilitiesComponent } from './service-capabilities/service-capabilities.component'
26
-
27
26
  @NgModule({
28
27
  imports: [
29
28
  CommonModule,
@@ -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'
@@ -56,14 +56,14 @@ export class ButtonComponent {
56
56
 
57
57
  @Input() disabled = false
58
58
  @Input() extraClass = ''
59
- @Output() buttonClick = new EventEmitter<void>()
59
+ @Output() buttonClick = new EventEmitter<Event>()
60
60
 
61
61
  get classList() {
62
62
  return `${this.btnClass} ${this.extraClass}`
63
63
  }
64
64
 
65
65
  handleClick(event: MouseEvent) {
66
- this.buttonClick.emit()
66
+ this.buttonClick.emit(event)
67
67
  event.preventDefault()
68
68
  ;(event.currentTarget as HTMLElement).blur()
69
69
  propagateToDocumentOnly(event)
@@ -19,7 +19,7 @@
19
19
  (keydown)="handleTriggerKeydown($event)"
20
20
  [disabled]="disabled"
21
21
  >
22
- <div class="grow font-medium truncate py-1 mr-2 text-left">
22
+ <div class="grow truncate py-1 mr-2 text-left">
23
23
  {{ getChoiceLabel() | translate }}
24
24
  </div>
25
25
  <ng-icon
@@ -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>
@@ -0,0 +1,77 @@
1
+ import { Component, Input, Output, EventEmitter } from '@angular/core'
2
+ import { CommonModule } from '@angular/common'
3
+ import { TranslateModule } from '@ngx-translate/core'
4
+ import { NgIcon, provideIcons, provideNgIconsConfig } from '@ng-icons/core'
5
+ import { DatasetFeatureCatalog } from '../../../../../../libs/common/domain/src/lib/model/record'
6
+ import { FormsModule } from '@angular/forms'
7
+ import { of } from 'rxjs'
8
+ import { debounceTime, distinctUntilChanged, tap } from 'rxjs/operators'
9
+ import { createFuzzyFilter } from '../../../../../../libs/util/shared/src'
10
+ import { iconoirSearch } from '@ng-icons/iconoir'
11
+
12
+ @Component({
13
+ selector: 'gn-ui-search-feature-catalog',
14
+ templateUrl: './search-feature-catalog.component.html',
15
+ styleUrls: ['./search-feature-catalog.component.css'],
16
+ standalone: true,
17
+ imports: [CommonModule, NgIcon, TranslateModule, FormsModule],
18
+ viewProviders: [
19
+ provideIcons({ iconoirSearch }),
20
+ provideNgIconsConfig({
21
+ size: '1.5rem',
22
+ }),
23
+ ],
24
+ })
25
+ export class SearchFeatureCatalogComponent {
26
+ private _featureCatalog: DatasetFeatureCatalog
27
+ searchTerm: any
28
+ @Input() set featureCatalog(value: DatasetFeatureCatalog) {
29
+ this._featureCatalog = value
30
+ this.filteredFeatureCatalog = value
31
+ }
32
+ get featureCatalog(): DatasetFeatureCatalog {
33
+ return this._featureCatalog
34
+ }
35
+
36
+ @Output() filteredFeatureCatalogChange =
37
+ new EventEmitter<DatasetFeatureCatalog>()
38
+ filteredFeatureCatalog: DatasetFeatureCatalog
39
+
40
+ filterAction = (searchTerm: string): void => {
41
+ of(searchTerm)
42
+ .pipe(
43
+ debounceTime(300),
44
+ distinctUntilChanged(),
45
+ tap(() => {
46
+ const filtered = (this.featureCatalog?.featureTypes || []).filter(
47
+ (featureType) => {
48
+ const fuzzyFilter = createFuzzyFilter(searchTerm)
49
+ return (
50
+ fuzzyFilter(featureType.name) ||
51
+ (featureType.definition && fuzzyFilter(featureType.definition))
52
+ )
53
+ }
54
+ )
55
+ this.filteredFeatureCatalog = {
56
+ ...this.featureCatalog,
57
+ featureTypes: filtered,
58
+ }
59
+ this.filteredFeatureCatalogChange.emit(this.filteredFeatureCatalog)
60
+ })
61
+ )
62
+ .subscribe()
63
+ }
64
+
65
+ get totalObjects(): number {
66
+ return this.filteredFeatureCatalog?.featureTypes?.length || 0
67
+ }
68
+
69
+ get totalAttributes(): number {
70
+ return (
71
+ this.filteredFeatureCatalog?.featureTypes?.reduce(
72
+ (total, featureType) => total + (featureType.attributes?.length || 0),
73
+ 0
74
+ ) || 0
75
+ )
76
+ }
77
+ }
@@ -1,13 +1,13 @@
1
1
  <div class="inline-block relative align-middle" style="line-height: 0.7em">
2
2
  <gn-ui-button
3
3
  [type]="'outline'"
4
+ [disabled]="disabled"
4
5
  class="-m-[8px] p-[8px]"
5
6
  (buttonClick)="toggle($event)"
6
7
  [ngClass]="{
7
8
  enabled: toggled,
8
- disabled: !toggled,
9
+ disabled: !toggled || disabled,
9
10
  'transition hover:scale-125 will-change-transform': !disabled,
10
- 'cursor-default': disabled,
11
11
  }"
12
12
  >
13
13
  <ng-icon [name]="toggled ? 'matStar' : 'matStarBorder'"></ng-icon>
@@ -77,9 +77,6 @@ import { ViewportIntersectorComponent } from './viewport-intersector/viewport-in
77
77
  matExpandMore,
78
78
  matExpandLess,
79
79
  }),
80
- provideNgIconsConfig({
81
- size: '0.9em',
82
- }),
83
80
  ],
84
81
  exports: [
85
82
  DropdownSelectorComponent,
@@ -16,3 +16,4 @@ export * from './lib/pagination-dots/pagination-dots.component'
16
16
  export * from './lib/previous-next-buttons/previous-next-buttons.component'
17
17
  export * from './lib/paginable.interface'
18
18
  export * from './lib/ui-layout.module'
19
+ export * from './lib/truncated-text/truncated-text.component'
@@ -5,3 +5,25 @@
5
5
  :host {
6
6
  position: relative;
7
7
  }
8
+
9
+ @media screen and (min-width: 769px) {
10
+ .size-L {
11
+ grid-template-columns: repeat(1, minmax(0, 1fr));
12
+ grid-auto-rows: minmax(0, min-content);
13
+ }
14
+
15
+ .size-M {
16
+ grid-template-columns: repeat(2, minmax(0, 1fr));
17
+ grid-auto-rows: minmax(0, min-content);
18
+ }
19
+
20
+ .size-S {
21
+ grid-template-columns: repeat(3, minmax(0, 1fr));
22
+ grid-auto-rows: minmax(0, min-content);
23
+ }
24
+
25
+ .size-XS {
26
+ grid-template-columns: repeat(2, minmax(0, 1fr));
27
+ grid-auto-rows: minmax(0, min-content);
28
+ }
29
+ }
@@ -1,7 +1,7 @@
1
1
  <div
2
- class="block-list-container flex flex-col"
2
+ class="grid gap-4 w-full md:grid-cols-2"
3
3
  #blockContainer
4
- [ngClass]="containerClass"
4
+ [ngClass]="[containerClass, 'size-' + subComponentSize]"
5
5
  [ngStyle]="{ minHeight: minHeight + 'px' }"
6
6
  >
7
7
  <ng-content></ng-content>
@@ -5,7 +5,9 @@ import {
5
5
  Component,
6
6
  ContentChildren,
7
7
  ElementRef,
8
+ EventEmitter,
8
9
  Input,
10
+ Output,
9
11
  QueryList,
10
12
  ViewChild,
11
13
  } from '@angular/core'
@@ -13,6 +15,7 @@ import { CommonModule } from '@angular/common'
13
15
  import { Paginable } from '../paginable.interface'
14
16
  import { PaginationDotsComponent } from '../pagination-dots/pagination-dots.component'
15
17
 
18
+ type ComponentSize = 'L' | 'M' | 'S' | 'XS'
16
19
  @Component({
17
20
  selector: 'gn-ui-block-list',
18
21
  templateUrl: './block-list.component.html',
@@ -22,15 +25,16 @@ import { PaginationDotsComponent } from '../pagination-dots/pagination-dots.comp
22
25
  imports: [CommonModule, PaginationDotsComponent],
23
26
  })
24
27
  export class BlockListComponent implements AfterViewInit, Paginable {
25
- @Input() pageSize = 5
28
+ pageSize = 4
26
29
  @Input() containerClass = ''
27
30
  @Input() paginationContainerClass = 'w-full bottom-0 top-auto'
28
31
  @ContentChildren('block', { read: ElementRef }) blocks: QueryList<
29
32
  ElementRef<HTMLElement>
30
33
  >
31
34
  @ViewChild('blockContainer') blockContainer: ElementRef<HTMLElement>
32
-
33
35
  protected minHeight = 0
36
+ @Output() listChanges = new EventEmitter<BlockListComponent>()
37
+ subComponentSize: ComponentSize = 'M'
34
38
 
35
39
  protected currentPage_ = 0
36
40
  protected get pages() {
@@ -47,18 +51,26 @@ export class BlockListComponent implements AfterViewInit, Paginable {
47
51
  return this.blocks ? Math.ceil(this.blocks.length / this.pageSize) : 1
48
52
  }
49
53
  get currentPage() {
50
- return this.currentPage_ + 1 // this is 1-based
54
+ return this.currentPage_ + 1
51
55
  }
52
56
 
53
57
  constructor(private changeDetector: ChangeDetectorRef) {}
54
58
 
55
59
  ngAfterViewInit() {
56
- this.blocks.changes.subscribe(this.refreshBlocksVisibility)
60
+ this.blocks.changes.subscribe(() => {
61
+ this.updateSizes()
62
+ this.refreshBlocksVisibility()
63
+ this.goToPage(1)
64
+ this.changeDetector.detectChanges()
65
+ this.listChanges.emit(this)
66
+ })
67
+ this.updateSizes()
57
68
  this.refreshBlocksVisibility()
58
69
 
59
70
  // we store the first height as the min-height of the list container
60
71
  this.minHeight = this.blockContainer.nativeElement.clientHeight
61
72
  this.changeDetector.detectChanges()
73
+ this.listChanges.emit(this)
62
74
  }
63
75
 
64
76
  protected refreshBlocksVisibility = () => {
@@ -71,7 +83,33 @@ export class BlockListComponent implements AfterViewInit, Paginable {
71
83
  })
72
84
  }
73
85
 
74
- // pageIndex is 1-based
86
+ protected updateSizes() {
87
+ this.subComponentSize = this.computeSubComponentSize()
88
+ this.pageSize = this.computePageSize()
89
+ }
90
+
91
+ protected computeSubComponentSize(): ComponentSize {
92
+ if (!this.blocks) return 'M'
93
+ const subComponentsCount = this.blocks.length
94
+ if (subComponentsCount <= 3) return 'L'
95
+ if (subComponentsCount <= 12) return 'M'
96
+ if (subComponentsCount <= 18) return 'S'
97
+ return 'XS'
98
+ }
99
+
100
+ protected computePageSize(): number {
101
+ switch (this.subComponentSize) {
102
+ case 'L':
103
+ return 3
104
+ case 'S':
105
+ return 6
106
+ case 'XS':
107
+ return 8
108
+ default:
109
+ return 4
110
+ }
111
+ }
112
+
75
113
  public goToPage(pageIndex: number) {
76
114
  this.currentPage_ = Math.max(
77
115
  Math.min(pageIndex - 1, this.pagesCount - 1),
@@ -1,4 +1,3 @@
1
1
  :host {
2
2
  position: relative;
3
- display: block;
4
3
  }
@@ -1,4 +1,4 @@
1
- <div #carouselOverflowContainer class="w-full">
1
+ <div #carouselOverflowContainer class="w-full block">
2
2
  <div class="carousel-container flex" [ngClass]="containerClass">
3
3
  <ng-content></ng-content>
4
4
  </div>
@@ -1,22 +1,38 @@
1
1
  <div
2
- class="group flex align-middle title border-b border-gray-100 cursor-pointer pt-2.5"
2
+ class="group flex items-center justify-between title border-b border-gray-100 cursor-pointer"
3
3
  (click)="toggle()"
4
+ data-cy="expandable-panel-header"
4
5
  >
5
- <div class="grow font-medium text-black text-sm">
6
- {{ title }}
6
+ <div class="grow py-2.5">
7
+ <ng-container *ngIf="titleTemplate; else simpleTitle">
8
+ <div data-cy="expandable-panel-custom-title">
9
+ <ng-container *ngTemplateOutlet="titleTemplate"></ng-container>
10
+ </div>
11
+ </ng-container>
12
+ <ng-template #simpleTitle>
13
+ <div
14
+ class="font-medium text-black text-sm"
15
+ data-cy="expandable-panel-title"
16
+ >
17
+ {{ title }}
18
+ </div>
19
+ </ng-template>
7
20
  </div>
8
21
  <div
9
- class="w-8 opacity-25 text-primary group-hover:opacity-100 transition-opacity"
22
+ class="w-8 opacity-25 text-primary group-hover:opacity-100 transition-opacity flex items-center shrink-0"
10
23
  >
11
- <ng-icon name="matAdd" *ngIf="collapsed"></ng-icon>
12
- <ng-icon name="matRemove" *ngIf="!collapsed"></ng-icon>
24
+ <ng-icon
25
+ [name]="collapsed ? 'matAdd' : 'matRemove'"
26
+ [style.color]="iconColor"
27
+ ></ng-icon>
13
28
  </div>
14
29
  </div>
15
30
  <div
16
- class="content overflow-hidden transition-[max-height] duration-300"
31
+ class="content overflow-hidden transition-all duration-300"
17
32
  [ngClass]="collapsed ? 'ease-out' : 'ease-in'"
18
- [style.maxHeight]="maxHeight"
19
33
  #contentDiv
34
+ *ngIf="!collapsed"
35
+ data-cy="expandable-panel-content"
20
36
  >
21
37
  <ng-content></ng-content>
22
38
  </div>