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,13 +1,17 @@
1
- <div class="w-full h-full flex flex-col p-1">
2
- <gn-ui-dropdown-selector
3
- *ngIf="dropdownChoices$ | async as choices"
4
- [ngClass]="{ hidden: !displaySource }"
5
- [title]="'table.select.data' | translate"
6
- class="truncate p-1 -mx-1 self-end mb-1"
7
- extraBtnClass="!text-primary font-sans font-medium"
8
- [choices]="choices"
9
- (selectValue)="selectLink($event)"
10
- ></gn-ui-dropdown-selector>
1
+ <div class="w-full h-full flex flex-col gap-[13px]">
2
+ <div
3
+ class="w-full py-4 px-5 bg-white border border-color-border rounded-lg mt-6"
4
+ >
5
+ <gn-ui-dropdown-selector
6
+ *ngIf="dropdownChoices$ | async as choices"
7
+ [ngClass]="{ hidden: !displaySource }"
8
+ [title]="'table.select.data' | translate"
9
+ class="h-[44px] w-full"
10
+ extraBtnClass="font-sans font-bold"
11
+ [choices]="choices"
12
+ (selectValue)="selectLink($event)"
13
+ ></gn-ui-dropdown-selector>
14
+ </div>
11
15
  <ng-container *ngIf="hidePreview; else dataView">
12
16
  <gn-ui-popup-alert
13
17
  type="warning"
@@ -23,12 +27,14 @@
23
27
  *ngIf="mode === 'table'"
24
28
  [cacheActive]="cacheActive$ | async"
25
29
  [link]="selectedLink$ | async"
30
+ [featureCatalog]="mdViewFacade.featureCatalog$ | async"
26
31
  ></gn-ui-table-view>
27
32
  <gn-ui-chart-view
28
33
  *ngIf="mode === 'chart'"
29
34
  (chartConfig$)="setChartConfig($event)"
30
35
  [cacheActive]="cacheActive$ | async"
31
36
  [link]="selectedLink$ | async"
37
+ [featureCatalog]="mdViewFacade.featureCatalog$ | async"
32
38
  ></gn-ui-chart-view>
33
39
  </div>
34
40
  </ng-template>
@@ -1,4 +1,4 @@
1
- <div class="px-5 my-1">
1
+ <div>
2
2
  <mat-tab-group
3
3
  [selectedIndex]="0"
4
4
  animationDuration="0ms"
@@ -1,9 +1,9 @@
1
1
  <gn-ui-button
2
2
  *ngIf="externalViewer"
3
3
  (buttonClick)="openInExternalViewer()"
4
- type="secondary"
4
+ type="primary"
5
5
  [title]="'record.externalViewer.open' | translate"
6
- extraClass="ms-2 !rounded-lg"
6
+ [extraClass]="extraClass + 'bg-primary ms-2 !rounded-lg'"
7
7
  >
8
8
  <ng-icon name="matOpenInNew"></ng-icon>
9
9
  </gn-ui-button>
@@ -36,6 +36,7 @@ export const EXTERNAL_VIEWER_OPEN_NEW_TAB = new InjectionToken<boolean>(
36
36
  })
37
37
  export class ExternalViewerButtonComponent {
38
38
  @Input() link: DatasetOnlineResource
39
+ @Input() extraClass = ''
39
40
 
40
41
  get externalViewer() {
41
42
  return !!this.urlTemplate && !!this.supportedLinkLayerType
@@ -1,18 +1,24 @@
1
- <div class="w-full h-full flex flex-col p-1">
2
- <div class="w-full flex justify-end">
3
- <gn-ui-dropdown-selector
4
- [ngClass]="{ hidden: !displaySource }"
5
- class="truncate p-1 -mx-1 mb-1"
6
- extraBtnClass="!text-primary font-sans font-medium"
7
- [title]="'map.select.layer' | translate"
8
- [choices]="dropdownChoices$ | async"
9
- (selectValue)="selectLinkToDisplay($event)"
10
- ></gn-ui-dropdown-selector>
11
- <gn-ui-external-viewer-button
12
- class="shrink-0 py-1 place-self-end"
13
- [link]="selectedLink$ | async"
14
- >
15
- </gn-ui-external-viewer-button>
1
+ <div class="w-full h-full flex flex-col gap-[13px]">
2
+ <div
3
+ class="flex py-4 px-5 bg-white border border-color-border rounded-lg mt-6"
4
+ >
5
+ <div class="grow min-w-0">
6
+ <gn-ui-dropdown-selector
7
+ [ngClass]="{ hidden: !displaySource }"
8
+ class="w-full"
9
+ extraBtnClass="font-sans font-bold"
10
+ [title]="'map.select.layer' | translate"
11
+ [choices]="dropdownChoices$ | async"
12
+ (selectValue)="selectLinkToDisplay($event)"
13
+ ></gn-ui-dropdown-selector>
14
+ </div>
15
+ <div class="self-end">
16
+ <gn-ui-external-viewer-button
17
+ extraClass="w-[44px] h-[44px]"
18
+ [link]="selectedLink$ | async"
19
+ >
20
+ </gn-ui-external-viewer-button>
21
+ </div>
16
22
  </div>
17
23
  <ng-container *ngIf="hidePreview; else mapView">
18
24
  <gn-ui-popup-alert
@@ -49,7 +55,10 @@
49
55
  >
50
56
  <ng-icon name="matClose" class="align-middle text-sm"></ng-icon>
51
57
  </gn-ui-button>
52
- <gn-ui-feature-detail [feature]="selection"></gn-ui-feature-detail>
58
+ <gn-ui-feature-detail
59
+ [featureCatalog]="mdViewFacade.featureCatalog$ | async"
60
+ [feature]="selection"
61
+ ></gn-ui-feature-detail>
53
62
  </div>
54
63
 
55
64
  <div
@@ -39,8 +39,8 @@ import {
39
39
  import {
40
40
  FeatureDetailComponent,
41
41
  MapContainerComponent,
42
- prioritizePageScroll,
43
42
  MapLegendComponent,
43
+ prioritizePageScroll,
44
44
  } from '../../../../../../libs/ui/map/src'
45
45
  import { Feature } from 'geojson'
46
46
  import { NgIconComponent, provideIcons } from '@ng-icons/core'
@@ -109,9 +109,20 @@ export class MapViewComponent implements AfterViewInit {
109
109
  this.mdViewFacade.mapApiLinks$,
110
110
  this.mdViewFacade.geoDataLinksWithGeometry$,
111
111
  ]).pipe(
112
- map(([mapApiLinks, geoDataLinksWithGeometry]) => {
113
- return [...mapApiLinks, ...geoDataLinksWithGeometry]
114
- })
112
+ switchMap(async ([mapApiLinks, geoDataLinksWithGeometry]) => {
113
+ // looking for TMS links to process
114
+ let processedMapApiLinks = await Promise.all(
115
+ mapApiLinks.map((link) => {
116
+ if (link.type === 'service' && link.accessServiceProtocol === 'tms') {
117
+ return this.dataService.getGeodataLinksFromTms(link)
118
+ }
119
+ return link
120
+ })
121
+ )
122
+ processedMapApiLinks = processedMapApiLinks.flat()
123
+ return [...processedMapApiLinks, ...geoDataLinksWithGeometry]
124
+ }),
125
+ shareReplay(1)
115
126
  )
116
127
 
117
128
  dropdownChoices$ = this.compatibleMapLinks$.pipe(
@@ -239,6 +250,26 @@ export class MapViewComponent implements AfterViewInit {
239
250
  type: 'wms',
240
251
  name: link.name,
241
252
  })
253
+ } else if (
254
+ link.type === 'service' &&
255
+ link.accessServiceProtocol === 'tms'
256
+ ) {
257
+ // FIXME: here we're assuming that the TMS serves vector tiles only; should be checked with ogc-client first
258
+ return of({
259
+ url: link.url.toString().replace(/\/?$/, '/{z}/{x}/{y}.pbf'),
260
+ type: 'xyz',
261
+ tileFormat: 'application/vnd.mapbox-vector-tile',
262
+ name: link.name,
263
+ })
264
+ } else if (
265
+ link.type === 'service' &&
266
+ link.accessServiceProtocol === 'maplibre-style'
267
+ ) {
268
+ return of({
269
+ type: 'maplibre-style',
270
+ name: link.name,
271
+ styleUrl: link.url.toString(),
272
+ })
242
273
  } else if (
243
274
  link.type === 'service' &&
244
275
  link.accessServiceProtocol === 'wmts'
@@ -6,6 +6,7 @@ import {
6
6
  filter,
7
7
  map,
8
8
  mergeMap,
9
+ shareReplay,
9
10
  switchMap,
10
11
  toArray,
11
12
  } from 'rxjs/operators'
@@ -15,13 +16,11 @@ import { LinkClassifierService, LinkUsage } from '../../../../../../libs/util/sh
15
16
  import { DatavizConfigurationModel } from '../../../../../../libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model'
16
17
  import {
17
18
  CatalogRecord,
18
- DatasetServiceDistribution,
19
- ServiceEndpoint,
20
19
  UserFeedback,
21
20
  } from '../../../../../../libs/common/domain/src/lib/model/record'
22
21
  import { AvatarServiceInterface } from '../../../../../../libs/api/repository/src'
23
22
  import { OgcApiRecord } from '@camptocamp/ogc-client'
24
- import { from, of } from 'rxjs'
23
+ import { from, of, Observable } from 'rxjs'
25
24
  import { DataService } from '../../../../../../libs/feature/dataviz/src'
26
25
 
27
26
  @Injectable()
@@ -80,21 +79,17 @@ export class MdViewFacade {
80
79
  chartConfig$ = this.store.pipe(select(MdViewSelectors.getChartConfig))
81
80
 
82
81
  allLinks$ = this.metadata$.pipe(
83
- map((record) => ('onlineResources' in record ? record.onlineResources : []))
82
+ map((record) =>
83
+ 'onlineResources' in record ? record.onlineResources : []
84
+ ),
85
+ shareReplay(1)
84
86
  )
85
87
 
86
88
  apiLinks$ = this.allLinks$.pipe(
87
89
  map((links) =>
88
- links
89
- .filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.API))
90
- // Put links to IGN Géoplateforme first
91
- .sort((dd1, dd2) => {
92
- return (dd2 as DatasetServiceDistribution | ServiceEndpoint)
93
- .accessServiceProtocol === 'GPFDL'
94
- ? 1
95
- : undefined // do not change the sorting otherwise
96
- })
97
- )
90
+ links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.API))
91
+ ),
92
+ shareReplay(1)
98
93
  )
99
94
 
100
95
  mapApiLinks$ = this.allLinks$.pipe(
@@ -102,7 +97,8 @@ export class MdViewFacade {
102
97
  links.filter((link) =>
103
98
  this.linkClassifier.hasUsage(link, LinkUsage.MAP_API)
104
99
  )
105
- )
100
+ ),
101
+ shareReplay(1)
106
102
  )
107
103
 
108
104
  downloadLinks$ = this.allLinks$.pipe(
@@ -216,4 +212,11 @@ export class MdViewFacade {
216
212
  loadUserFeedbacks(datasetUuid: string) {
217
213
  this.store.dispatch(MdViewActions.loadUserFeedbacks({ datasetUuid }))
218
214
  }
215
+
216
+ /**
217
+ * loadFeatureCatalog
218
+ */
219
+ loadFeatureCatalog(metadata: CatalogRecord) {
220
+ this.store.dispatch(MdViewActions.loadFeatureCatalog({ metadata }))
221
+ }
219
222
  }
@@ -57,6 +57,7 @@ export class ChartComponent implements OnChanges, AfterViewInit {
57
57
  this.dataRaw = value
58
58
  }
59
59
  @Input() labelProperty: string
60
+ @Input() prettyLabel: string
60
61
  @Input() valueProperty: string
61
62
  @Input() secondaryValueProperty: string
62
63
  @Input() type: InputChartType = 'bar'
@@ -95,7 +96,7 @@ export class ChartComponent implements OnChanges, AfterViewInit {
95
96
  labels: this.getDataProxy(this.labelProperty) as string[],
96
97
  datasets: [
97
98
  {
98
- label: this.valueProperty,
99
+ label: this.prettyLabel,
99
100
  data,
100
101
  },
101
102
  ],
@@ -8,21 +8,24 @@
8
8
  [matSortDisableClear]="true"
9
9
  *ngrxLet="properties$ as properties"
10
10
  >
11
- <ng-container *ngFor="let prop of properties" [matColumnDef]="prop">
11
+ <ng-container
12
+ *ngFor="let attr of _featureAttributes"
13
+ [matColumnDef]="attr.value"
14
+ >
12
15
  <th
13
16
  mat-header-cell
14
17
  *matHeaderCellDef
15
18
  mat-sort-header
16
19
  class="text-sm text-black bg-white"
17
20
  >
18
- {{ prop }}
21
+ {{ attr.label }}
19
22
  </th>
20
23
  <td
21
24
  mat-cell
22
25
  *matCellDef="let element"
23
26
  class="whitespace-nowrap pr-1 truncate"
24
27
  >
25
- {{ element[prop] }}
28
+ {{ element[attr.value] }}
26
29
  </td>
27
30
  </ng-container>
28
31
 
@@ -61,13 +61,14 @@ export interface TableItemModel {
61
61
  changeDetection: ChangeDetectionStrategy.OnPush,
62
62
  })
63
63
  export class DataTableComponent implements OnInit, AfterViewInit, OnChanges {
64
+ _featureAttributes = []
65
+ @Input() set featureAttributes(value: { value: string; label: string }[]) {
66
+ this._featureAttributes = value
67
+ this.properties$.next(value.map((attr) => attr.value))
68
+ }
64
69
  @Input() set dataset(value: BaseReader) {
65
- this.properties$.next(null)
66
70
  this.dataset_ = value
67
71
  this.dataset_.load()
68
- this.dataset_.properties.then((properties) =>
69
- this.properties$.next(properties.map((p) => p.name))
70
- )
71
72
  this.dataset_.info.then((info) => (this.count = info.itemsCount))
72
73
  }
73
74
  @Input() activeId: TableItemId
@@ -26,3 +26,4 @@ export * from './lib/user-preview/user-preview.component'
26
26
  export * from './lib/application-banner/application-banner.component'
27
27
  export * from './lib/internal-link-card/internal-link-card.component'
28
28
  export * from './lib/service-capabilities/service-capabilities.component'
29
+ export * from './lib/record-feature-catalog/feature-catalog-list/feature-catalog-list.component'
@@ -1,12 +1,12 @@
1
1
  <div
2
- class="group flex justify-between rounded filter overflow-hidden"
2
+ class="group flex justify-between rounded filter overflow-hidden card-shadow"
3
3
  [ngClass]="cardClass"
4
4
  >
5
5
  <ng-container *ngIf="size !== 'S'">
6
- <div>
6
+ <div class="flex-1 min-w-0">
7
7
  <ng-container *ngTemplateOutlet="content"></ng-container>
8
8
  </div>
9
- <div class="flex items-center">
9
+ <div class="flex items-center min-w-[32px]">
10
10
  <ng-container *ngTemplateOutlet="buttons"></ng-container>
11
11
  </div>
12
12
  </ng-container>
@@ -51,7 +51,7 @@
51
51
  </ng-template>
52
52
 
53
53
  <ng-template #content>
54
- <div>
54
+ <div class="flex-1 min-w-0">
55
55
  <div class="gn-ui-card-title">
56
56
  {{ link.description || link.name }}
57
57
  </div>
@@ -1,20 +1,20 @@
1
1
  <a
2
2
  href="{{ link.url }}"
3
3
  target="_blank"
4
- class="group flex flex-row justify-between card-shadow cursor-pointer rounded overflow-hidden"
4
+ class="group flex flex-row justify-between card-shadow cursor-pointer rounded overflow-hidden w-full"
5
5
  rel="noopener"
6
6
  [ngClass]="cardClass"
7
7
  >
8
- <div class="flex flex-col justify-between">
8
+ <div class="flex flex-col flex-1 justify-between min-w-0">
9
9
  <div class="gn-ui-card-title" [title]="link.description || link.name">
10
10
  {{ link.description || link.name }}
11
11
  </div>
12
12
  <div class="gn-ui-card-detail">
13
13
  {{ link.name }}
14
14
  </div>
15
- <div class="flex flex-row gap-2 items-center pt-1">
15
+ <div class="flex flex-row gap-2 items-center pt-1 min-w-0">
16
16
  <span
17
- class="inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded transition-opacity opacity-70 group-hover:opacity-100"
17
+ class="inline-flex items-center justify-center px-2 py-1 text-13 font-medium leading-none text-white rounded transition-opacity opacity-70 group-hover:opacity-100 whitespace-nowrap"
18
18
  [style.background-color]="color"
19
19
  data-cy="download-format"
20
20
  >{{ format || ('downloads.format.unknown' | translate) }}</span
@@ -24,7 +24,10 @@
24
24
  >
25
25
  </div>
26
26
  </div>
27
- <div class="flex" [ngClass]="size === 'S' ? 'items-end' : 'items-center'">
27
+ <div
28
+ class="flex min-w-[32px] flex-shrink-0"
29
+ [ngClass]="size === 'S' ? 'items-end' : 'items-center'"
30
+ >
28
31
  <div class="gn-ui-card-icon">
29
32
  <ng-icon
30
33
  class="inline-block card-icon align-middle"
@@ -27,7 +27,7 @@ type CardSize = 'L' | 'M' | 'S' | 'XS'
27
27
  ],
28
28
  })
29
29
  export class DownloadItemComponent {
30
- private _size: 'L' | 'M' | 'S' | 'XS'
30
+ private _size: CardSize
31
31
  @Input() link: DatasetOnlineResource
32
32
  @Input() color: string
33
33
  @Input() format: string
@@ -43,7 +43,7 @@ export class DownloadItemComponent {
43
43
  this._size = value
44
44
  this.cardClass = this.sizeClassMap[value]
45
45
  }
46
- get size(): 'L' | 'M' | 'S' | 'XS' {
46
+ get size(): CardSize {
47
47
  return this._size
48
48
  }
49
49
  cardClass = ''
@@ -2,12 +2,23 @@
2
2
  class="flex flex-wrap justify-between items-center pb-4"
3
3
  *ngIf="links && links.length > 0"
4
4
  >
5
- <div
6
- class="font-title text-xl text-title font-medium mr-4 text-center sm:text-left"
7
- translate
8
- >
9
- record.metadata.download
5
+ <div class="flex flex-row items-center gap-x-4">
6
+ <div>
7
+ <h3
8
+ class="inline-block font-title text-xl text-title font-medium mr-4"
9
+ translate
10
+ >
11
+ record.metadata.download
12
+ </h3>
13
+ <span class="px-3">({{ linksCount }})</span>
14
+ </div>
15
+ <gn-ui-previous-next-buttons
16
+ class="md:block hidden"
17
+ *ngIf="_list?.pagesCount > 1"
18
+ [listComponent]="_list"
19
+ ></gn-ui-previous-next-buttons>
10
20
  </div>
21
+
11
22
  <div
12
23
  class="flex flex-wrap justify-start sm:justify-end"
13
24
  data-cy="download-format-filters"
@@ -26,9 +37,29 @@
26
37
  </gn-ui-button>
27
38
  </div>
28
39
  </div>
29
- <div class="mb-2 sm:mb-3" *ngFor="let link of filteredLinks">
40
+
41
+ <ng-container>
42
+ <gn-ui-block-list
43
+ class="md:block hidden"
44
+ #blockList
45
+ (listChanges)="updateList($event)"
46
+ containerClass="gap-4 pt-5 pb-7"
47
+ >
48
+ <gn-ui-download-item
49
+ #block
50
+ *ngFor="let link of filteredLinks"
51
+ [link]="link"
52
+ [color]="getLinkColor(link)"
53
+ [format]="getLinkFormat(link)"
54
+ [isFromApi]="isFromApi(link)"
55
+ [size]="blockList.subComponentSize"
56
+ ></gn-ui-download-item>
57
+ </gn-ui-block-list>
58
+ </ng-container>
59
+
60
+ <div class="mb-5 md:hidden block" *ngFor="let link of filteredLinks">
30
61
  <gn-ui-download-item
31
- size="L"
62
+ size="M"
32
63
  [link]="link"
33
64
  [color]="getLinkColor(link)"
34
65
  [format]="getLinkFormat(link)"
@@ -1,4 +1,11 @@
1
- import { ChangeDetectionStrategy, Component, Input } from '@angular/core'
1
+ import {
2
+ AfterViewInit,
3
+ ChangeDetectionStrategy,
4
+ ChangeDetectorRef,
5
+ Component,
6
+ Input,
7
+ ViewChild,
8
+ } from '@angular/core'
2
9
  import { TranslateModule, TranslateService } from '@ngx-translate/core'
3
10
  import { marker } from '@biesbjerg/ngx-translate-extract-marker'
4
11
  import { getBadgeColor, getFileFormat } from '../../../../../../libs/util/shared/src'
@@ -6,6 +13,11 @@ import { DatasetDownloadDistribution } from '../../../../../../libs/common/domai
6
13
  import { CommonModule } from '@angular/common'
7
14
  import { ButtonComponent } from '../../../../../../libs/ui/inputs/src'
8
15
  import { DownloadItemComponent } from '../download-item/download-item.component'
16
+ import {
17
+ BlockListComponent,
18
+ Paginable,
19
+ PreviousNextButtonsComponent,
20
+ } from '../../../../../../libs/ui/layout/src'
9
21
 
10
22
  marker('datahub.search.filter.all')
11
23
  marker('datahub.search.filter.others')
@@ -22,17 +34,32 @@ type FilterFormat = (typeof FILTER_FORMATS)[number]
22
34
  imports: [
23
35
  CommonModule,
24
36
  ButtonComponent,
37
+ BlockListComponent,
25
38
  DownloadItemComponent,
26
39
  TranslateModule,
40
+ PreviousNextButtonsComponent,
27
41
  ],
28
42
  })
29
43
  export class DownloadsListComponent {
30
- constructor(private translateService: TranslateService) {}
44
+ constructor(
45
+ private translateService: TranslateService,
46
+ private changeDetector: ChangeDetectorRef
47
+ ) {}
31
48
 
49
+ _list: BlockListComponent
32
50
  @Input() links: DatasetDownloadDistribution[]
33
51
 
52
+ get linksCount(): number {
53
+ return this.filteredLinks?.length || 0
54
+ }
55
+
34
56
  activeFilterFormats: FilterFormat[] = ['all']
35
57
 
58
+ updateList($event: BlockListComponent) {
59
+ this._list = $event
60
+ this.changeDetector.detectChanges()
61
+ }
62
+
36
63
  private removeDuplicateFormats(
37
64
  links: DatasetDownloadDistribution[]
38
65
  ): DatasetDownloadDistribution[] {
@@ -5,7 +5,7 @@
5
5
  <div
6
6
  *ngIf="imageUrl"
7
7
  data-cy="record-thumbnail"
8
- class="shrink-0 bg-gray-100 rounded-lg overflow-hidden border border-gray-300 group-hover:shadow-xl group-hover:border-0 h-full w-full"
8
+ class="shrink-0 rounded-lg overflow-hidden group-hover:shadow-xl group-hover:border-0 h-full w-full"
9
9
  >
10
10
  <gn-ui-thumbnail
11
11
  class="relative h-full w-full"
@@ -5,7 +5,7 @@
5
5
  [ngClass]="cardClass"
6
6
  [title]="title"
7
7
  >
8
- <div class="flex flex-col justify-between">
8
+ <div class="flex flex-col justify-between flex-1 min-w-0">
9
9
  <div class="gn-ui-card-title">
10
10
  {{ link.description || link.name }}
11
11
  </div>
@@ -26,7 +26,10 @@
26
26
  >
27
27
  </div>
28
28
  </div>
29
- <div class="flex" [ngClass]="size === 'S' ? 'items-end' : 'items-center'">
29
+ <div
30
+ class="flex min-w-[32px]"
31
+ [ngClass]="size === 'S' ? 'items-end' : 'items-center'"
32
+ >
30
33
  <div class="gn-ui-card-icon">
31
34
  <ng-icon
32
35
  class="inline-block card-icon align-middle"
@@ -1,9 +1,5 @@
1
1
  import { ChangeDetectionStrategy, Component, Input } from '@angular/core'
2
- import {
3
- DatasetDownloadDistribution,
4
- DatasetOnlineResource,
5
- DatasetServiceDistribution,
6
- } from '../../../../../../libs/common/domain/src/lib/model/record'
2
+ import { DatasetOnlineResource } from '../../../../../../libs/common/domain/src/lib/model/record'
7
3
  import { CommonModule } from '@angular/common'
8
4
  import {
9
5
  NgIconComponent,
@@ -30,7 +26,7 @@ type CardSize = 'L' | 'M' | 'S' | 'XS'
30
26
  ],
31
27
  })
32
28
  export class LinkCardComponent {
33
- private _size: 'L' | 'M' | 'S' | 'XS'
29
+ private _size: CardSize
34
30
  @Input() link: DatasetOnlineResource
35
31
  private readonly sizeClassMap: Record<CardSize, string> = {
36
32
  L: 'gn-ui-card-l py-2 px-5',
@@ -43,7 +39,7 @@ export class LinkCardComponent {
43
39
  this._size = value
44
40
  this.cardClass = this.sizeClassMap[value]
45
41
  }
46
- get size(): 'L' | 'M' | 'S' | 'XS' {
42
+ get size(): CardSize {
47
43
  return this._size
48
44
  }
49
45
  cardClass = ''
@@ -1,8 +1,6 @@
1
- <div>
2
- <p class="text-gray-900 text-xs mb-3 uppercase" translate>
3
- record.metadata.catalog
4
- </p>
5
- <p class="text-primary font-title text-21 mb-1">
1
+ <div class="text-black">
2
+ <p class="text-base mb-3" translate>record.metadata.catalog</p>
3
+ <p class="font-title text-21 mb-1">
6
4
  {{ sourceLabel }}
7
5
  </p>
8
6
  </div>