geonetwork-ui 2.6.0-dev.9df114cd4 → 2.6.0-dev.d216c4dea

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 (186) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/base.converter.mjs +1 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +3 -3
  3. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/read-parts.mjs +3 -3
  4. package/esm2022/libs/api/metadata-converter/src/lib/iso19139/write-parts.mjs +4 -4
  5. package/esm2022/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.mjs +2 -10
  6. package/esm2022/libs/api/repository/src/lib/gn4/gn4.provider.mjs +7 -1
  7. package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +1 -1
  8. package/esm2022/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.mjs +2 -3
  9. package/esm2022/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.mjs +1 -1
  10. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.mjs +5 -5
  11. package/esm2022/libs/feature/record/src/index.mjs +1 -2
  12. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +5 -9
  13. package/esm2022/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.mjs +7 -11
  14. package/esm2022/libs/feature/record/src/lib/record-meta/record-meta.component.mjs +1 -1
  15. package/esm2022/libs/feature/record/src/lib/state/mdview.effects.mjs +8 -5
  16. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +4 -6
  17. package/esm2022/libs/feature/router/src/lib/default/constants.mjs +3 -1
  18. package/esm2022/libs/feature/router/src/lib/default/router.config.mjs +1 -1
  19. package/esm2022/libs/feature/router/src/lib/default/router.service.mjs +10 -2
  20. package/esm2022/libs/feature/router/src/lib/default/state/router.facade.mjs +9 -3
  21. package/esm2022/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.mjs +4 -4
  22. package/esm2022/libs/feature/search/src/lib/feature-search.module.mjs +2 -15
  23. package/esm2022/libs/feature/search/src/lib/record-url.token.mjs +4 -2
  24. package/esm2022/libs/feature/search/src/lib/results-list/results-list.container.component.mjs +26 -10
  25. package/esm2022/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.mjs +3 -3
  26. package/esm2022/libs/ui/elements/src/index.mjs +2 -1
  27. package/esm2022/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.mjs +3 -3
  28. package/esm2022/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.mjs +3 -3
  29. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +8 -5
  30. package/esm2022/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.mjs +161 -0
  31. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +10 -4
  32. package/esm2022/libs/ui/layout/src/lib/interactive-table/interactive-table.component.mjs +15 -3
  33. package/esm2022/libs/ui/map/src/index.mjs +2 -1
  34. package/esm2022/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.mjs +79 -0
  35. package/esm2022/libs/ui/search/src/lib/results-table/results-table.component.mjs +5 -4
  36. package/esm2022/libs/util/app-config/src/lib/app-config.mjs +2 -1
  37. package/esm2022/libs/util/app-config/src/lib/fixtures.mjs +2 -1
  38. package/esm2022/libs/util/shared/src/index.mjs +2 -1
  39. package/esm2022/libs/util/shared/src/lib/gn-ui-version.mjs +6 -0
  40. package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +2 -1
  41. package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +13 -6
  42. package/esm2022/translations/de.json +24 -3
  43. package/esm2022/translations/en.json +26 -5
  44. package/esm2022/translations/es.json +24 -3
  45. package/esm2022/translations/fr.json +24 -3
  46. package/esm2022/translations/it.json +24 -3
  47. package/esm2022/translations/nl.json +24 -3
  48. package/esm2022/translations/pt.json +24 -3
  49. package/fesm2022/geonetwork-ui.mjs +882 -451
  50. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  51. package/libs/api/metadata-converter/src/lib/base.converter.d.ts.map +1 -1
  52. package/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.d.ts.map +1 -1
  53. package/libs/api/repository/src/lib/gn4/gn4.provider.d.ts.map +1 -1
  54. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +2 -2
  55. package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
  56. package/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.d.ts.map +1 -1
  57. package/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.d.ts +6 -6
  58. package/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.d.ts.map +1 -1
  59. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.d.ts.map +1 -1
  60. package/libs/feature/record/src/index.d.ts +0 -1
  61. package/libs/feature/record/src/index.d.ts.map +1 -1
  62. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts +9 -1
  63. package/libs/feature/record/src/lib/data-view/data-view.component.d.ts.map +1 -1
  64. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +2 -3
  65. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
  66. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +1 -2
  67. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
  68. package/libs/feature/record/src/lib/record-meta/record-meta.component.d.ts +2 -2
  69. package/libs/feature/record/src/lib/state/mdview.effects.d.ts +3 -1
  70. package/libs/feature/record/src/lib/state/mdview.effects.d.ts.map +1 -1
  71. package/libs/feature/record/src/lib/state/mdview.facade.d.ts +7 -7
  72. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  73. package/libs/feature/router/src/lib/default/constants.d.ts +2 -0
  74. package/libs/feature/router/src/lib/default/constants.d.ts.map +1 -1
  75. package/libs/feature/router/src/lib/default/router.config.d.ts +2 -0
  76. package/libs/feature/router/src/lib/default/router.config.d.ts.map +1 -1
  77. package/libs/feature/router/src/lib/default/router.service.d.ts.map +1 -1
  78. package/libs/feature/router/src/lib/default/state/router.facade.d.ts +5 -0
  79. package/libs/feature/router/src/lib/default/state/router.facade.d.ts.map +1 -1
  80. package/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.d.ts.map +1 -1
  81. package/libs/feature/search/src/lib/feature-search.module.d.ts.map +1 -1
  82. package/libs/feature/search/src/lib/record-url.token.d.ts +3 -1
  83. package/libs/feature/search/src/lib/record-url.token.d.ts.map +1 -1
  84. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts +5 -3
  85. package/libs/feature/search/src/lib/results-list/results-list.container.component.d.ts.map +1 -1
  86. package/libs/ui/elements/src/index.d.ts +1 -0
  87. package/libs/ui/elements/src/index.d.ts.map +1 -1
  88. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts +2 -2
  89. package/libs/ui/elements/src/lib/metadata-info/metadata-info.component.d.ts.map +1 -1
  90. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts +30 -0
  91. package/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.d.ts.map +1 -0
  92. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +2 -1
  93. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  94. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts +2 -0
  95. package/libs/ui/layout/src/lib/interactive-table/interactive-table.component.d.ts.map +1 -1
  96. package/libs/ui/map/src/index.d.ts +1 -0
  97. package/libs/ui/map/src/index.d.ts.map +1 -1
  98. package/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.d.ts +15 -0
  99. package/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.d.ts.map +1 -0
  100. package/libs/ui/search/src/lib/results-table/results-table.component.d.ts.map +1 -1
  101. package/libs/util/app-config/src/lib/app-config.d.ts.map +1 -1
  102. package/libs/util/app-config/src/lib/fixtures.d.ts.map +1 -1
  103. package/libs/util/shared/src/index.d.ts +1 -0
  104. package/libs/util/shared/src/index.d.ts.map +1 -1
  105. package/libs/util/shared/src/lib/gn-ui-version.d.ts +3 -0
  106. package/libs/util/shared/src/lib/gn-ui-version.d.ts.map +1 -0
  107. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts +3 -3
  108. package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
  109. package/libs/util/shared/src/lib/links/link-utils.d.ts +14 -7
  110. package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
  111. package/package.json +1 -1
  112. package/src/libs/api/metadata-converter/src/lib/base.converter.ts +1 -4
  113. package/src/libs/api/metadata-converter/src/lib/fixtures/geo2france.records.service+eaux-usees.ts +2 -2
  114. package/src/libs/api/metadata-converter/src/lib/fixtures/geocat-ch.records.ts +2 -2
  115. package/src/libs/api/metadata-converter/src/lib/fixtures/metawal.records.ts +2 -2
  116. package/src/libs/api/metadata-converter/src/lib/fixtures/wallonie.records.service+napitswallonia.ts +2 -2
  117. package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +2 -2
  118. package/src/libs/api/metadata-converter/src/lib/iso19139/read-parts.ts +2 -2
  119. package/src/libs/api/metadata-converter/src/lib/iso19139/write-parts.ts +3 -3
  120. package/src/libs/api/repository/src/lib/gn4/elasticsearch/elasticsearch.service.ts +1 -9
  121. package/src/libs/api/repository/src/lib/gn4/gn4.provider.ts +6 -0
  122. package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +2 -2
  123. package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +26 -26
  124. package/src/libs/common/fixtures/src/lib/link.fixtures.ts +2 -2
  125. package/src/libs/common/fixtures/src/lib/record-link.fixtures.ts +5 -5
  126. package/src/libs/feature/editor/src/lib/components/online-resource-card/online-resource-card.component.ts +1 -2
  127. package/src/libs/feature/editor/src/lib/components/online-service-resource-input/online-service-resource-input.component.ts +2 -2
  128. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.html +2 -2
  129. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-spatial-extent/form-field-spatial-extent.component.ts +2 -2
  130. package/src/libs/feature/record/src/index.ts +0 -1
  131. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +2 -3
  132. package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +4 -5
  133. package/src/libs/feature/record/src/lib/record-meta/record-meta.component.ts +2 -2
  134. package/src/libs/feature/record/src/lib/state/mdview.effects.ts +5 -3
  135. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +4 -7
  136. package/src/libs/feature/router/src/lib/default/constants.ts +2 -0
  137. package/src/libs/feature/router/src/lib/default/router.config.ts +2 -0
  138. package/src/libs/feature/router/src/lib/default/router.service.ts +10 -0
  139. package/src/libs/feature/router/src/lib/default/state/router.facade.ts +10 -1
  140. package/src/libs/feature/search/src/lib/favorites/favorite-star/favorite-star.component.ts +2 -2
  141. package/src/libs/feature/search/src/lib/feature-search.module.ts +0 -8
  142. package/src/libs/feature/search/src/lib/record-url.token.ts +10 -1
  143. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.html +1 -0
  144. package/src/libs/feature/search/src/lib/results-list/results-list.container.component.ts +24 -5
  145. package/src/libs/ui/catalog/src/lib/language-switcher/language-switcher.component.html +1 -1
  146. package/src/libs/ui/elements/src/index.ts +1 -0
  147. package/src/libs/ui/elements/src/lib/internal-link-card/internal-link-card.component.ts +2 -2
  148. package/src/libs/ui/elements/src/lib/metadata-contact/metadata-contact.component.html +1 -1
  149. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.css +9 -0
  150. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +13 -4
  151. package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.ts +12 -4
  152. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.html +96 -0
  153. package/src/libs/ui/elements/src/lib/service-capabilities/service-capabilities.component.ts +183 -0
  154. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +3 -0
  155. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.html +3 -7
  156. package/src/libs/ui/layout/src/lib/interactive-table/interactive-table.component.ts +13 -0
  157. package/src/libs/ui/map/src/index.ts +1 -0
  158. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.css +0 -0
  159. package/src/libs/ui/map/src/lib/components/spatial-extent/spatial-extent.component.html +4 -0
  160. package/src/libs/{feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.ts → ui/map/src/lib/components/spatial-extent/spatial-extent.component.ts} +7 -8
  161. package/src/libs/ui/search/src/lib/results-table/results-table.component.html +7 -4
  162. package/src/libs/ui/search/src/lib/results-table/results-table.component.ts +2 -1
  163. package/src/libs/util/app-config/src/lib/app-config.ts +1 -0
  164. package/src/libs/util/app-config/src/lib/fixtures.ts +1 -0
  165. package/src/libs/util/shared/src/index.ts +1 -0
  166. package/src/libs/util/shared/src/lib/gn-ui-version.ts +8 -0
  167. package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +12 -3
  168. package/src/libs/util/shared/src/lib/links/link-utils.ts +30 -12
  169. package/tailwind.base.css +3 -3
  170. package/translations/de.json +24 -3
  171. package/translations/en.json +26 -5
  172. package/translations/es.json +24 -3
  173. package/translations/fr.json +24 -3
  174. package/translations/it.json +24 -3
  175. package/translations/nl.json +24 -3
  176. package/translations/pt.json +24 -3
  177. package/translations/sk.json +24 -3
  178. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.mjs +0 -79
  179. package/esm2022/libs/feature/record/src/lib/gn-ui-version.token.mjs +0 -3
  180. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.d.ts +0 -15
  181. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.d.ts.map +0 -1
  182. package/libs/feature/record/src/lib/gn-ui-version.token.d.ts +0 -3
  183. package/libs/feature/record/src/lib/gn-ui-version.token.d.ts.map +0 -1
  184. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.html +0 -1
  185. package/src/libs/feature/record/src/lib/gn-ui-version.token.ts +0 -3
  186. /package/src/libs/{feature/editor/src/lib/components/record-form/form-field/form-field-map-container/form-field-map-container.component.css → ui/elements/src/lib/service-capabilities/service-capabilities.component.css} +0 -0
@@ -7,10 +7,10 @@ import {
7
7
  import { Configuration } from '../../../../../../libs/data-access/gn4/src'
8
8
  import { MdViewFacade } from '../state'
9
9
  import { BehaviorSubject, combineLatest, map } from 'rxjs'
10
- import { GN_UI_VERSION } from '../gn-ui-version.token'
11
10
  import { CopyTextButtonComponent } from '../../../../../../libs/ui/inputs/src'
12
11
  import { CommonModule } from '@angular/common'
13
12
  import { TranslateModule } from '@ngx-translate/core'
13
+ import { GEONETWORK_UI_TAG_NAME } from '../../../../../../libs/util/shared/src'
14
14
 
15
15
  @Component({
16
16
  selector: 'gn-ui-data-view-web-component',
@@ -36,7 +36,7 @@ export class DataViewWebComponentComponent {
36
36
  if (config) {
37
37
  const { aggregation, xProperty, yProperty, chartType } = config
38
38
  return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${
39
- this.version
39
+ GEONETWORK_UI_TAG_NAME
40
40
  }/gn-wc.js"></script>
41
41
  <gn-dataset-view-chart
42
42
  api-url="${new URL(
@@ -59,7 +59,7 @@ export class DataViewWebComponentComponent {
59
59
  return ''
60
60
  } else if (viewType === 'table') {
61
61
  return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${
62
- this.version
62
+ GEONETWORK_UI_TAG_NAME
63
63
  }/gn-wc.js"></script>
64
64
  <gn-dataset-view-table
65
65
  api-url="${new URL(
@@ -76,7 +76,7 @@ export class DataViewWebComponentComponent {
76
76
  ></gn-dataset-view-table>`
77
77
  } else {
78
78
  return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${
79
- this.version
79
+ GEONETWORK_UI_TAG_NAME
80
80
  }/gn-wc.js"></script>
81
81
  <gn-dataset-view-map
82
82
  api-url="${new URL(
@@ -97,7 +97,6 @@ export class DataViewWebComponentComponent {
97
97
 
98
98
  constructor(
99
99
  @Inject(Configuration) private config: Configuration,
100
- @Inject(GN_UI_VERSION) private version: string,
101
100
  private facade: MdViewFacade
102
101
  ) {}
103
102
  }
@@ -6,7 +6,7 @@ import {
6
6
  OnDestroy,
7
7
  } from '@angular/core'
8
8
  import { Meta } from '@angular/platform-browser'
9
- import { DatasetRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
9
+ import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
10
10
 
11
11
  @Component({
12
12
  selector: 'gn-ui-record-meta',
@@ -15,7 +15,7 @@ import { DatasetRecord } from '../../../../../../libs/common/domain/src/lib/mode
15
15
  standalone: true,
16
16
  })
17
17
  export class RecordMetaComponent implements OnDestroy, OnChanges {
18
- @Input() metadata: DatasetRecord
18
+ @Input() metadata: CatalogRecord
19
19
 
20
20
  constructor(private meta: Meta) {}
21
21
 
@@ -1,16 +1,18 @@
1
1
  import { Injectable } from '@angular/core'
2
2
  import { Actions, createEffect, ofType } from '@ngrx/effects'
3
3
  import { exhaustMap, mergeMap, of } from 'rxjs'
4
- import { catchError, filter, map, switchMap, take } from 'rxjs/operators'
4
+ import { catchError, filter, map, switchMap } from 'rxjs/operators'
5
5
  import * as MdViewActions from './mdview.actions'
6
6
  import { RecordsRepositoryInterface } from '../../../../../../libs/common/domain/src/lib/repository/records-repository.interface'
7
7
  import { PlatformServiceInterface } from '../../../../../../libs/common/domain/src/lib/platform.service.interface'
8
+ import { Router } from '@angular/router'
8
9
  @Injectable()
9
10
  export class MdViewEffects {
10
11
  constructor(
11
12
  private actions$: Actions,
12
13
  private recordsRepository: RecordsRepositoryInterface,
13
- private platformServiceInterface: PlatformServiceInterface
14
+ private platformServiceInterface: PlatformServiceInterface,
15
+ private router: Router
14
16
  ) {}
15
17
 
16
18
  /*
@@ -21,7 +23,7 @@ export class MdViewEffects {
21
23
  ofType(MdViewActions.loadFullMetadata),
22
24
  switchMap(({ uuid }) => this.recordsRepository.getRecord(uuid)),
23
25
  map((record) => {
24
- if (record === null) {
26
+ if (record === null || !this.router.url.includes(record.kind)) {
25
27
  return MdViewActions.loadFullMetadataFailure({ notFound: true })
26
28
  }
27
29
  return MdViewActions.loadFullMetadataSuccess({ full: record })
@@ -16,6 +16,7 @@ import { DatavizConfigurationModel } from '../../../../../../libs/common/domain/
16
16
  import {
17
17
  CatalogRecord,
18
18
  DatasetServiceDistribution,
19
+ ServiceEndpoint,
19
20
  UserFeedback,
20
21
  } from '../../../../../../libs/common/domain/src/lib/model/record'
21
22
  import { AvatarServiceInterface } from '../../../../../../libs/api/repository/src'
@@ -79,11 +80,7 @@ export class MdViewFacade {
79
80
  chartConfig$ = this.store.pipe(select(MdViewSelectors.getChartConfig))
80
81
 
81
82
  allLinks$ = this.metadata$.pipe(
82
- map((record) =>
83
- record.kind === 'dataset' && 'onlineResources' in record
84
- ? record.onlineResources
85
- : []
86
- )
83
+ map((record) => ('onlineResources' in record ? record.onlineResources : []))
87
84
  )
88
85
 
89
86
  apiLinks$ = this.allLinks$.pipe(
@@ -92,8 +89,8 @@ export class MdViewFacade {
92
89
  .filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.API))
93
90
  // Put links to IGN Géoplateforme first
94
91
  .sort((dd1, dd2) => {
95
- return (dd2 as DatasetServiceDistribution).accessServiceProtocol ===
96
- 'GPFDL'
92
+ return (dd2 as DatasetServiceDistribution | ServiceEndpoint)
93
+ .accessServiceProtocol === 'GPFDL'
97
94
  ? 1
98
95
  : undefined // do not change the sorting otherwise
99
96
  })
@@ -4,6 +4,8 @@ export const ROUTER_STATE_KEY = 'router'
4
4
 
5
5
  export const ROUTER_ROUTE_SEARCH = 'search'
6
6
  export const ROUTER_ROUTE_DATASET = 'dataset'
7
+ export const ROUTER_ROUTE_SERVICE = 'service'
8
+ export const ROUTER_ROUTE_REUSE = 'reuse'
7
9
  export const ROUTER_ROUTE_ORGANIZATION = 'organization'
8
10
 
9
11
  export enum ROUTE_PARAMS {
@@ -4,6 +4,8 @@ export interface RouterConfigModel {
4
4
  searchStateId: string
5
5
  searchRouteComponent: Type<any>
6
6
  recordRouteComponent: Type<any>
7
+ serviceRouteComponent: Type<any>
8
+ reuseRouteComponent: Type<any>
7
9
  organizationRouteComponent: Type<any>
8
10
  }
9
11
 
@@ -3,6 +3,8 @@ import {
3
3
  ROUTER_ROUTE_DATASET,
4
4
  ROUTER_ROUTE_ORGANIZATION,
5
5
  ROUTER_ROUTE_SEARCH,
6
+ ROUTER_ROUTE_SERVICE,
7
+ ROUTER_ROUTE_REUSE,
6
8
  } from '.'
7
9
  import { Router, Routes } from '@angular/router'
8
10
  import { ROUTER_CONFIG, RouterConfigModel } from './router.config'
@@ -34,6 +36,14 @@ export class RouterService {
34
36
  path: `${ROUTER_ROUTE_DATASET}/:metadataUuid`,
35
37
  component: this.routerConfig.recordRouteComponent,
36
38
  },
39
+ {
40
+ path: `${ROUTER_ROUTE_SERVICE}/:metadataUuid`,
41
+ component: this.routerConfig.recordRouteComponent,
42
+ },
43
+ {
44
+ path: `${ROUTER_ROUTE_REUSE}/:metadataUuid`,
45
+ component: this.routerConfig.recordRouteComponent,
46
+ },
37
47
  {
38
48
  path: `${ROUTER_ROUTE_ORGANIZATION}/:name`,
39
49
  component: this.routerConfig.organizationRouteComponent,
@@ -7,6 +7,8 @@ import { distinctUntilChanged, filter, map, take } from 'rxjs/operators'
7
7
  import {
8
8
  ROUTER_ROUTE_DATASET,
9
9
  ROUTER_ROUTE_SEARCH,
10
+ ROUTER_ROUTE_SERVICE,
11
+ ROUTER_ROUTE_REUSE,
10
12
  SearchRouteParams,
11
13
  } from '../constants'
12
14
  import {
@@ -32,12 +34,19 @@ export class RouterFacade {
32
34
  map(expandQueryParams)
33
35
  )
34
36
 
37
+ routeMap = {
38
+ dataset: ROUTER_ROUTE_DATASET,
39
+ service: ROUTER_ROUTE_SERVICE,
40
+ reuse: ROUTER_ROUTE_REUSE,
41
+ }
42
+
35
43
  constructor(
36
44
  private store: Store<RouterReducerState>,
37
45
  private routerService: RouterService
38
46
  ) {}
39
47
 
40
48
  goToMetadata(metadata: CatalogRecord) {
49
+ const selectedRoute = this.routeMap[metadata.kind] || ROUTER_ROUTE_DATASET
41
50
  this.pathParams$
42
51
  .pipe(
43
52
  take(1),
@@ -45,7 +54,7 @@ export class RouterFacade {
45
54
  )
46
55
  .subscribe(() => {
47
56
  this.go({
48
- path: `${ROUTER_ROUTE_DATASET}/${metadata.uniqueIdentifier}`,
57
+ path: `${selectedRoute}/${metadata.uniqueIdentifier}`,
49
58
  })
50
59
  this.store.dispatch(
51
60
  MdViewActions.setIncompleteMetadata({ incomplete: metadata })
@@ -16,7 +16,7 @@ import {
16
16
  withLatestFrom,
17
17
  } from 'rxjs/operators'
18
18
  import tippy from 'tippy.js'
19
- import { TranslateService } from '@ngx-translate/core'
19
+ import { TranslateModule, TranslateService } from '@ngx-translate/core'
20
20
  import { StarToggleComponent } from '../../../../../../../libs/ui/inputs/src'
21
21
  import { Observable, Subscription } from 'rxjs'
22
22
  import { CatalogRecord } from '../../../../../../../libs/common/domain/src/lib/model/record'
@@ -30,7 +30,7 @@ import { CommonModule } from '@angular/common'
30
30
  styleUrls: ['./favorite-star.component.css'],
31
31
  changeDetection: ChangeDetectionStrategy.OnPush,
32
32
  standalone: true,
33
- imports: [CommonModule, StarToggleComponent],
33
+ imports: [CommonModule, StarToggleComponent, TranslateModule],
34
34
  })
35
35
  export class FavoriteStarComponent implements AfterViewInit, OnDestroy {
36
36
  @Input() displayCount? = true
@@ -26,8 +26,6 @@ import {
26
26
  SpinningLoaderComponent,
27
27
  UiWidgetsModule,
28
28
  } from '../../../../../libs/ui/widgets/src'
29
- import { RecordsRepositoryInterface } from '../../../../../libs/common/domain/src/lib/repository/records-repository.interface'
30
- import { Gn4Repository } from '../../../../../libs/api/repository/src'
31
29
  import { FavoriteStarComponent } from './favorites/favorite-star/favorite-star.component'
32
30
 
33
31
  @NgModule({
@@ -72,11 +70,5 @@ import { FavoriteStarComponent } from './favorites/favorite-star/favorite-star.c
72
70
  SearchStateContainerDirective,
73
71
  FilterDropdownComponent,
74
72
  ],
75
- providers: [
76
- {
77
- provide: RecordsRepositoryInterface,
78
- useClass: Gn4Repository,
79
- },
80
- ],
81
73
  })
82
74
  export class FeatureSearchModule {}
@@ -1,4 +1,13 @@
1
1
  import { InjectionToken } from '@angular/core'
2
2
 
3
3
  // expects the replacement key ${uuid}
4
- export const RECORD_URL_TOKEN = new InjectionToken<string>('record-url-token')
4
+ export const RECORD_DATASET_URL_TOKEN = new InjectionToken<string>(
5
+ 'record-dataset-url-token'
6
+ )
7
+ export const RECORD_SERVICE_URL_TOKEN = new InjectionToken<string>(
8
+ 'record-service-url-token'
9
+ )
10
+
11
+ export const RECORD_REUSE_URL_TOKEN = new InjectionToken<string>(
12
+ 'record-reuse-url-token'
13
+ )
@@ -16,6 +16,7 @@
16
16
  type="secondary"
17
17
  (buttonClick)="onShowMore()"
18
18
  extraClass="m-auto !p-[22px]"
19
+ [style.--gn-ui-button-width]="!auto"
19
20
  >
20
21
  <span class="uppercase font-medium tracking-widest" translate
21
22
  >results.showMore</span
@@ -17,7 +17,11 @@ import {
17
17
  ResultsLayoutConfigItem,
18
18
  ResultsLayoutConfigModel,
19
19
  } from '../../../../../../libs/ui/search/src'
20
- import { RECORD_URL_TOKEN } from '../record-url.token'
20
+ import {
21
+ RECORD_DATASET_URL_TOKEN,
22
+ RECORD_SERVICE_URL_TOKEN,
23
+ RECORD_REUSE_URL_TOKEN,
24
+ } from '../record-url.token'
21
25
  import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
22
26
 
23
27
  export type ResultsListShowMoreStrategy = 'auto' | 'button' | 'none'
@@ -49,8 +53,12 @@ export class ResultsListContainerComponent implements OnInit {
49
53
  @Inject(RESULTS_LAYOUT_CONFIG)
50
54
  private resultsLayoutConfig: ResultsLayoutConfigModel,
51
55
  @Optional()
52
- @Inject(RECORD_URL_TOKEN)
53
- private recordUrlTemplate: string
56
+ @Inject(RECORD_DATASET_URL_TOKEN)
57
+ private recordDatasetUrlTemplate: string,
58
+ @Inject(RECORD_SERVICE_URL_TOKEN)
59
+ private recordServiceUrlTemplate: string,
60
+ @Inject(RECORD_REUSE_URL_TOKEN)
61
+ private recordReuseUrlTemplate: string
54
62
  ) {}
55
63
 
56
64
  ngOnInit(): void {
@@ -103,7 +111,18 @@ export class ResultsListContainerComponent implements OnInit {
103
111
  }
104
112
 
105
113
  getRecordUrl(metadata: CatalogRecord) {
106
- if (!this.recordUrlTemplate) return null
107
- return this.recordUrlTemplate.replace('${uuid}', metadata.uniqueIdentifier)
114
+ const tokenMap = {
115
+ dataset: this.recordDatasetUrlTemplate,
116
+ service: this.recordServiceUrlTemplate,
117
+ reuse: this.recordReuseUrlTemplate,
118
+ }
119
+ if (
120
+ !this.recordDatasetUrlTemplate &&
121
+ !this.recordServiceUrlTemplate &&
122
+ !this.recordReuseUrlTemplate
123
+ )
124
+ return null
125
+ const urlKind = tokenMap[metadata.kind]
126
+ return urlKind.replace('${uuid}', metadata.uniqueIdentifier)
108
127
  }
109
128
  }
@@ -5,6 +5,6 @@
5
5
  [selected]="currentLang"
6
6
  ariaName="languages"
7
7
  [showTitle]="false"
8
- extraBtnClass="bg-transparent flex justify-items-center !pl-2 !py-1"
8
+ extraBtnClass="bg-transparent flex justify-items-center !pl-2 !py-1 rounded-lg"
9
9
  >
10
10
  </gn-ui-dropdown-selector>
@@ -24,3 +24,4 @@ export * from './lib/user-feedback-item/user-feedback-item.component'
24
24
  export * from './lib/user-preview/user-preview.component'
25
25
  export * from './lib/application-banner/application-banner.component'
26
26
  export * from './lib/internal-link-card/internal-link-card.component'
27
+ export * from './lib/service-capabilities/service-capabilities.component'
@@ -37,7 +37,7 @@ import { TranslateModule } from '@ngx-translate/core'
37
37
  import { marker } from '@biesbjerg/ngx-translate-extract-marker'
38
38
  import { fromEvent, Subscription } from 'rxjs'
39
39
 
40
- marker('record.kind.dataset')
40
+ marker('record.kind.data')
41
41
  marker('record.kind.reuse')
42
42
  marker('record.kind.service')
43
43
 
@@ -178,7 +178,7 @@ export class InternalLinkCardComponent implements OnInit {
178
178
 
179
179
  switch (this.record.kind.toLowerCase()) {
180
180
  case 'dataset':
181
- return { text: 'record.kind.dataset', icon: 'iconoirDatabase' }
181
+ return { text: 'record.kind.data', icon: 'iconoirDatabase' }
182
182
  case 'reuse':
183
183
  return { text: 'record.kind.reuse', icon: 'iconoirMap' }
184
184
  case 'service':
@@ -1,4 +1,4 @@
1
- <div class="py-5 px-5 rounded bg-gray-100 text-black mb-6">
1
+ <div class="py-5 px-5 rounded bg-gray-100 text-black">
2
2
  <div class="grid gap-3 overflow-hidden">
3
3
  <div>
4
4
  <p class="text-sm font-medium" translate>record.metadata.contact</p>
@@ -11,3 +11,12 @@
11
11
  :host ::ng-deep gn-ui-copy-text-button button ng-icon {
12
12
  transform: scale(0.8);
13
13
  }
14
+
15
+ :host {
16
+ --gn-ui-badge-background-color: var(--color-primary-white);
17
+ --gn-ui-badge-text-color: var(--color-primary-darkest);
18
+ }
19
+
20
+ :host ::ng-deep gn-ui-badge:hover {
21
+ --gn-ui-badge-text-color: white;
22
+ }
@@ -13,7 +13,7 @@
13
13
  </gn-ui-content-ghost>
14
14
 
15
15
  <p
16
- class="mt-6 mb-3 font-medium text-primary text-sm"
16
+ class="mt-6 mb-3 font-medium text-black text-sm"
17
17
  translate
18
18
  *ngIf="!fieldReady('keywords') || metadata.keywords?.length"
19
19
  >
@@ -96,10 +96,10 @@
96
96
  </gn-ui-expandable-panel>
97
97
  <gn-ui-expandable-panel
98
98
  *ngIf="
99
- metadata.lineage ||
99
+ (metadata.kind === 'dataset' && metadata.lineage) ||
100
100
  metadata.resourceUpdated ||
101
101
  metadata.updateFrequency ||
102
- metadata.status
102
+ (metadata.kind === 'dataset' && metadata.status)
103
103
  "
104
104
  [title]="'record.metadata.details' | translate"
105
105
  >
@@ -225,9 +225,18 @@
225
225
  </div>
226
226
  </div>
227
227
  </gn-ui-expandable-panel>
228
+ <gn-ui-expandable-panel
229
+ *ngIf="metadata.kind !== 'dataset' && metadata.spatialExtents"
230
+ [title]="'service.metadata.spatialExtent' | translate"
231
+ >
232
+ <gn-ui-spatial-extent
233
+ class="flex h-[271px] w-full rounded-lg border border-gray-100 mt-3 mb-6"
234
+ [spatialExtents]="metadata.spatialExtents"
235
+ ></gn-ui-spatial-extent>
236
+ </gn-ui-expandable-panel>
228
237
  <gn-ui-expandable-panel
229
238
  *ngIf="metadata.landingPage"
230
- [title]="'record.metadata.technical' | translate"
239
+ [title]="'service.metadata.other' | translate"
231
240
  >
232
241
  <div class="flex flex-col gap-4 mr-4 py-5 rounded text-gray-700">
233
242
  <div *ngIf="metadata.recordUpdated">
@@ -6,7 +6,7 @@ import {
6
6
  Output,
7
7
  } from '@angular/core'
8
8
  import {
9
- DatasetRecord,
9
+ CatalogRecord,
10
10
  Keyword,
11
11
  } from '../../../../../../libs/common/domain/src/lib/model/record'
12
12
  import { DateService, getTemporalRangeUnion } from '../../../../../../libs/util/shared/src'
@@ -22,12 +22,17 @@ import {
22
22
  } from '../../../../../../libs/ui/inputs/src'
23
23
  import { ContentGhostComponent } from '../content-ghost/content-ghost.component'
24
24
  import { NgIcon, provideIcons } from '@ng-icons/core'
25
- import { CommonModule } from '@angular/common'
26
25
  import { matOpenInNew } from '@ng-icons/material-icons/baseline'
27
26
  import { matMailOutline } from '@ng-icons/material-icons/outline'
28
27
  import { ThumbnailComponent } from '../thumbnail/thumbnail.component'
29
28
  import { GnUiLinkifyDirective } from './linkify.directive'
30
29
 
30
+ import { CommonModule } from '@angular/common'
31
+ import {
32
+ MapContainerComponent,
33
+ SpatialExtentComponent,
34
+ } from '../../../../../../libs/ui/map/src'
35
+
31
36
  @Component({
32
37
  selector: 'gn-ui-metadata-info',
33
38
  templateUrl: './metadata-info.component.html',
@@ -46,6 +51,8 @@ import { GnUiLinkifyDirective } from './linkify.directive'
46
51
  CopyTextButtonComponent,
47
52
  NgIcon,
48
53
  GnUiLinkifyDirective,
54
+ MapContainerComponent,
55
+ SpatialExtentComponent,
49
56
  ],
50
57
  viewProviders: [
51
58
  provideIcons({
@@ -55,7 +62,7 @@ import { GnUiLinkifyDirective } from './linkify.directive'
55
62
  ],
56
63
  })
57
64
  export class MetadataInfoComponent {
58
- @Input() metadata: Partial<DatasetRecord>
65
+ @Input() metadata: Partial<CatalogRecord>
59
66
  @Input() incomplete: boolean
60
67
  @Output() keyword = new EventEmitter<Keyword>()
61
68
  updatedTimes: number
@@ -122,7 +129,8 @@ export class MetadataInfoComponent {
122
129
  }
123
130
 
124
131
  get temporalExtent(): { start: string; end: string } {
125
- const temporalExtents = this.metadata.temporalExtents
132
+ const temporalExtents =
133
+ this.metadata.kind === 'dataset' ? this.metadata.temporalExtents : []
126
134
  return getTemporalRangeUnion(temporalExtents, this.dateService)
127
135
  }
128
136
 
@@ -0,0 +1,96 @@
1
+ <div style="height: 652px" id="preview" *ngIf="apiLinks.length > 0">
2
+ <div class="bg-primary-opacity-10 overflow-visible" style="height: 512px">
3
+ <div class="container-lg px-4 lg:mx-auto">
4
+ <div>
5
+ <div class="gn-ui-section-title mb-6" translate>
6
+ service.metadata.capabilities
7
+ </div>
8
+ <div
9
+ *ngIf="loading"
10
+ class="flex justify-center w-full h-[200px] items-center"
11
+ >
12
+ <gn-ui-spinning-loader></gn-ui-spinning-loader>
13
+ </div>
14
+ <div *ngIf="!loading">
15
+ <div class="flex flex-row gap-5">
16
+ <div class="h-14 md:w-2/5 w-full mb-4 flex flex-row relative">
17
+ <gn-ui-text-input
18
+ class="w-full"
19
+ [extraClass]="getExtraInputClass()"
20
+ [placeholder]="'service.metadata.search' | translate"
21
+ (input)="onSearchChange($event)"
22
+ (keydown.enter)="onSearchEnter($event)"
23
+ >
24
+ </gn-ui-text-input>
25
+ <div class="border-l absolute border-gray-200 right-0 h-14 w-14">
26
+ <gn-ui-button
27
+ #inputBtn
28
+ type="outline"
29
+ extraClass="h-12 w-12 border-0 absolute right-1 top-1"
30
+ (buttonClick)="searchLayers()"
31
+ >
32
+ <ng-icon name="iconoirSearch"></ng-icon>
33
+ </gn-ui-button>
34
+ </div>
35
+ </div>
36
+ <gn-ui-popover
37
+ [content]="popoverItems"
38
+ theme="light"
39
+ class="w-14 h-14 border border-gray-300 rounded-lg flex justify-center items-center"
40
+ >
41
+ <ng-icon name="matInfoOutline" class="w-6 h-6 pt-0.5"></ng-icon>
42
+ </gn-ui-popover>
43
+ </div>
44
+ <div
45
+ style="height: 500px"
46
+ class="bg-white shadow-xl rounded p-0 flex md:flex-row flex-col"
47
+ >
48
+ <div
49
+ class="flex flex-col gap-2 bg-gray-100 md:w-1/2 md:h-full w-full h-1/2 rounded-l overflow-y-auto py-5 pr-1 pl-3"
50
+ data-test="layer-list"
51
+ >
52
+ <gn-ui-button
53
+ *ngFor="let layerItem of filteredLayers"
54
+ type="outline"
55
+ [extraClass]="getExtraClass(layerItem)"
56
+ (buttonClick)="selectLayer(layerItem)"
57
+ >
58
+ {{ layerItem.title || layerItem.name }}
59
+ </gn-ui-button>
60
+ <span *ngIf="filteredLayers.length === 0" class="text-gray-800">
61
+ {{ 'service.metadata.filter.noLayers' | translate }}
62
+ </span>
63
+ </div>
64
+ <div
65
+ data-test="layer-information"
66
+ class="flex flex-col gap-4 md:h-full md:w-1/2 w-full h-1/2 py-5 px-10 overflow-y-auto"
67
+ >
68
+ <div
69
+ *ngFor="let item of layerInformation"
70
+ class="flex flex-row gap-4 border-b border-gray-200"
71
+ >
72
+ <span class="font-semibold w-24">{{ item.displayName }}</span>
73
+ <div *ngIf="isList(item.value)">
74
+ <div
75
+ *ngFor="let subItem of item.value"
76
+ class="flex flex-row break-words max-w-72"
77
+ >
78
+ {{ subItem }}
79
+ </div>
80
+ </div>
81
+ <div class="break-words max-w-72" *ngIf="!isList(item.value)">
82
+ {{ item.value }}
83
+ </div>
84
+ </div>
85
+ </div>
86
+ </div>
87
+ </div>
88
+ </div>
89
+ </div>
90
+ </div>
91
+ </div>
92
+ <ng-template #popoverItems>
93
+ <div class="p-2 py-4">
94
+ <div translate>service.metadata.filter</div>
95
+ </div>
96
+ </ng-template>