geonetwork-ui 2.4.0-dev.e1bb65c4 → 2.4.0-dev.e77c0f8c

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 (169) hide show
  1. package/esm2022/libs/api/metadata-converter/src/lib/gn4/atomic-operations.mjs +2 -1
  2. package/esm2022/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.mjs +1 -1
  3. package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-groups.service.mjs +2 -1
  4. package/esm2022/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.mjs +3 -1
  5. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +2 -2
  6. package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +9 -5
  7. package/esm2022/libs/common/domain/src/lib/model/record/organization.model.mjs +1 -1
  8. package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
  9. package/esm2022/libs/data-access/gn4/src/openapi/model/user.api.model.mjs +1 -1
  10. package/esm2022/libs/feature/catalog/src/index.mjs +2 -1
  11. package/esm2022/libs/feature/catalog/src/lib/feature-catalog.module.mjs +1 -1
  12. package/esm2022/libs/feature/catalog/src/lib/organisations/organisations.component.mjs +6 -6
  13. package/esm2022/libs/feature/catalog/src/lib/organization-url.token.mjs +4 -0
  14. package/esm2022/libs/feature/catalog/src/lib/records/records.service.mjs +4 -6
  15. package/esm2022/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.mjs +4 -2
  16. package/esm2022/libs/feature/editor/src/lib/fields.config.mjs +5 -5
  17. package/esm2022/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.mjs +42 -23
  18. package/esm2022/libs/feature/record/src/lib/data-view-share/data-view-share.component.mjs +13 -5
  19. package/esm2022/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.mjs +49 -15
  20. package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +6 -3
  21. package/esm2022/libs/feature/router/src/lib/default/constants.mjs +2 -1
  22. package/esm2022/libs/feature/router/src/lib/default/router.config.mjs +1 -1
  23. package/esm2022/libs/feature/router/src/lib/default/router.service.mjs +9 -2
  24. package/esm2022/libs/feature/router/src/lib/default/state/router.facade.mjs +8 -1
  25. package/esm2022/libs/feature/search/src/lib/state/search.facade.mjs +3 -2
  26. package/esm2022/libs/feature/search/src/lib/state/selectors.mjs +4 -1
  27. package/esm2022/libs/feature/search/src/lib/utils/service/fields.service.mjs +7 -3
  28. package/esm2022/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.mjs +5 -5
  29. package/esm2022/libs/ui/catalog/src/lib/ui-catalog.module.mjs +5 -2
  30. package/esm2022/libs/ui/dataviz/src/lib/figure/figure.component.mjs +5 -8
  31. package/esm2022/libs/ui/elements/src/index.mjs +1 -2
  32. package/esm2022/libs/ui/elements/src/lib/api-card/api-card.component.mjs +3 -3
  33. package/esm2022/libs/ui/elements/src/lib/error/error.component.mjs +5 -3
  34. package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +4 -4
  35. package/esm2022/libs/ui/elements/src/lib/related-record-card/related-record-card.component.mjs +24 -5
  36. package/esm2022/libs/ui/elements/src/lib/ui-elements.module.mjs +7 -9
  37. package/esm2022/libs/ui/layout/src/index.mjs +2 -1
  38. package/esm2022/libs/ui/layout/src/lib/max-lines/max-lines.component.mjs +71 -0
  39. package/esm2022/libs/ui/layout/src/lib/ui-layout.module.mjs +1 -1
  40. package/esm2022/translations/de.json +58 -33
  41. package/esm2022/translations/en.json +29 -4
  42. package/esm2022/translations/es.json +29 -4
  43. package/esm2022/translations/fr.json +30 -5
  44. package/esm2022/translations/it.json +29 -4
  45. package/esm2022/translations/nl.json +29 -4
  46. package/esm2022/translations/pt.json +29 -4
  47. package/fesm2022/geonetwork-ui.mjs +496 -204
  48. package/fesm2022/geonetwork-ui.mjs.map +1 -1
  49. package/libs/api/metadata-converter/src/lib/gn4/atomic-operations.d.ts.map +1 -1
  50. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts +1 -0
  51. package/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.d.ts.map +1 -1
  52. package/libs/api/repository/src/lib/gn4/organizations/organizations-from-groups.service.d.ts.map +1 -1
  53. package/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.d.ts.map +1 -1
  54. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +2 -1
  55. package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
  56. package/libs/common/domain/src/lib/model/record/organization.model.d.ts +1 -0
  57. package/libs/common/domain/src/lib/model/record/organization.model.d.ts.map +1 -1
  58. package/libs/common/domain/src/lib/platform.service.interface.d.ts +2 -1
  59. package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
  60. package/libs/data-access/gn4/src/openapi/model/user.api.model.d.ts +1 -1
  61. package/libs/feature/catalog/src/index.d.ts +1 -0
  62. package/libs/feature/catalog/src/index.d.ts.map +1 -1
  63. package/libs/feature/catalog/src/lib/feature-catalog.module.d.ts.map +1 -1
  64. package/libs/feature/catalog/src/lib/organisations/organisations.component.d.ts.map +1 -1
  65. package/libs/feature/catalog/src/lib/organization-url.token.d.ts +3 -0
  66. package/libs/feature/catalog/src/lib/organization-url.token.d.ts.map +1 -0
  67. package/libs/feature/catalog/src/lib/records/records.service.d.ts.map +1 -1
  68. package/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.d.ts.map +1 -1
  69. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts +4 -1
  70. package/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.d.ts.map +1 -1
  71. package/libs/feature/record/src/lib/data-view-share/data-view-share.component.d.ts +4 -1
  72. package/libs/feature/record/src/lib/data-view-share/data-view-share.component.d.ts.map +1 -1
  73. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts +4 -1
  74. package/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.d.ts.map +1 -1
  75. package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
  76. package/libs/feature/router/src/lib/default/constants.d.ts +1 -0
  77. package/libs/feature/router/src/lib/default/constants.d.ts.map +1 -1
  78. package/libs/feature/router/src/lib/default/router.config.d.ts +1 -0
  79. package/libs/feature/router/src/lib/default/router.config.d.ts.map +1 -1
  80. package/libs/feature/router/src/lib/default/router.service.d.ts +1 -0
  81. package/libs/feature/router/src/lib/default/router.service.d.ts.map +1 -1
  82. package/libs/feature/router/src/lib/default/state/router.facade.d.ts +1 -0
  83. package/libs/feature/router/src/lib/default/state/router.facade.d.ts.map +1 -1
  84. package/libs/feature/search/src/lib/state/search.facade.d.ts +1 -0
  85. package/libs/feature/search/src/lib/state/search.facade.d.ts.map +1 -1
  86. package/libs/feature/search/src/lib/state/selectors.d.ts +1 -0
  87. package/libs/feature/search/src/lib/state/selectors.d.ts.map +1 -1
  88. package/libs/feature/search/src/lib/utils/service/fields.service.d.ts.map +1 -1
  89. package/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.d.ts +2 -2
  90. package/libs/ui/catalog/src/lib/ui-catalog.module.d.ts +2 -1
  91. package/libs/ui/catalog/src/lib/ui-catalog.module.d.ts.map +1 -1
  92. package/libs/ui/dataviz/src/lib/figure/figure.component.d.ts +1 -2
  93. package/libs/ui/dataviz/src/lib/figure/figure.component.d.ts.map +1 -1
  94. package/libs/ui/elements/src/index.d.ts +0 -1
  95. package/libs/ui/elements/src/index.d.ts.map +1 -1
  96. package/libs/ui/elements/src/lib/error/error.component.d.ts +3 -1
  97. package/libs/ui/elements/src/lib/error/error.component.d.ts.map +1 -1
  98. package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts +5 -1
  99. package/libs/ui/elements/src/lib/related-record-card/related-record-card.component.d.ts.map +1 -1
  100. package/libs/ui/elements/src/lib/ui-elements.module.d.ts +19 -19
  101. package/libs/ui/elements/src/lib/ui-elements.module.d.ts.map +1 -1
  102. package/libs/ui/layout/src/index.d.ts +1 -0
  103. package/libs/ui/layout/src/index.d.ts.map +1 -1
  104. package/libs/ui/{elements → layout}/src/lib/max-lines/max-lines.component.d.ts +2 -2
  105. package/libs/ui/layout/src/lib/max-lines/max-lines.component.d.ts.map +1 -0
  106. package/libs/ui/layout/src/lib/ui-layout.module.d.ts.map +1 -1
  107. package/package.json +1 -1
  108. package/src/libs/api/metadata-converter/src/lib/gn4/atomic-operations.ts +1 -0
  109. package/src/libs/api/metadata-converter/src/lib/gn4/types/metadata.model.ts +1 -0
  110. package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-groups.service.ts +1 -0
  111. package/src/libs/api/repository/src/lib/gn4/organizations/organizations-from-metadata.service.ts +3 -1
  112. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +1 -1
  113. package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +26 -15
  114. package/src/libs/common/domain/src/lib/model/record/organization.model.ts +1 -0
  115. package/src/libs/common/domain/src/lib/platform.service.interface.ts +5 -1
  116. package/src/libs/common/fixtures/src/lib/organisations.fixture.ts +28 -0
  117. package/src/libs/data-access/datafeeder/src/openapi/model/datasetMetadata.api.model.ts +4 -0
  118. package/src/libs/data-access/datafeeder/src/openapi/model/datasetUploadStatus.api.model.ts +2 -0
  119. package/src/libs/data-access/gn4/src/openapi/model/user.api.model.ts +1 -1
  120. package/src/libs/feature/catalog/src/index.ts +1 -0
  121. package/src/libs/feature/catalog/src/lib/feature-catalog.module.ts +0 -1
  122. package/src/libs/feature/catalog/src/lib/organisations/organisations.component.html +1 -1
  123. package/src/libs/feature/catalog/src/lib/organisations/organisations.component.ts +2 -2
  124. package/src/libs/feature/catalog/src/lib/organization-url.token.ts +6 -0
  125. package/src/libs/feature/catalog/src/lib/records/records.service.ts +6 -8
  126. package/src/libs/feature/editor/src/lib/components/record-form/form-field/form-field-keywords/form-field-keywords.component.ts +8 -6
  127. package/src/libs/feature/editor/src/lib/fields.config.ts +4 -4
  128. package/src/libs/feature/record/src/lib/data-view-permalink/data-view-permalink.component.ts +36 -19
  129. package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.html +6 -2
  130. package/src/libs/feature/record/src/lib/data-view-share/data-view-share.component.ts +11 -0
  131. package/src/libs/feature/record/src/lib/data-view-web-component/data-view-web-component.component.ts +59 -12
  132. package/src/libs/feature/record/src/lib/state/mdview.facade.ts +6 -2
  133. package/src/libs/feature/router/src/lib/default/constants.ts +1 -0
  134. package/src/libs/feature/router/src/lib/default/router.config.ts +1 -0
  135. package/src/libs/feature/router/src/lib/default/router.service.ts +13 -1
  136. package/src/libs/feature/router/src/lib/default/state/router.facade.ts +9 -1
  137. package/src/libs/feature/search/src/lib/state/search.facade.ts +5 -0
  138. package/src/libs/feature/search/src/lib/state/selectors.ts +7 -0
  139. package/src/libs/feature/search/src/lib/utils/service/fields.service.ts +16 -2
  140. package/src/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.html +8 -6
  141. package/src/libs/ui/catalog/src/lib/organisation-preview/organisation-preview.component.ts +2 -2
  142. package/src/libs/ui/catalog/src/lib/ui-catalog.module.ts +2 -0
  143. package/src/libs/ui/dataviz/src/lib/figure/figure.component.html +11 -3
  144. package/src/libs/ui/dataviz/src/lib/figure/figure.component.ts +3 -7
  145. package/src/libs/ui/elements/src/index.ts +0 -1
  146. package/src/libs/ui/elements/src/lib/api-card/api-card.component.html +29 -29
  147. package/src/libs/ui/elements/src/lib/error/error.component.html +30 -6
  148. package/src/libs/ui/elements/src/lib/error/error.component.ts +2 -0
  149. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.html +1 -1
  150. package/src/libs/ui/elements/src/lib/related-record-card/related-record-card.component.ts +22 -1
  151. package/src/libs/ui/elements/src/lib/ui-elements.module.ts +2 -4
  152. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.css +31 -0
  153. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.html +15 -0
  154. package/src/libs/ui/inputs/src/lib/switch-toggle/switch-toggle.component.ts +38 -0
  155. package/src/libs/ui/layout/src/index.ts +1 -0
  156. package/src/libs/ui/{elements → layout}/src/lib/max-lines/max-lines.component.html +1 -0
  157. package/src/libs/ui/{elements → layout}/src/lib/max-lines/max-lines.component.ts +9 -5
  158. package/src/libs/ui/layout/src/lib/ui-layout.module.ts +0 -1
  159. package/translations/de.json +58 -33
  160. package/translations/en.json +29 -4
  161. package/translations/es.json +29 -4
  162. package/translations/fr.json +30 -5
  163. package/translations/it.json +29 -4
  164. package/translations/nl.json +29 -4
  165. package/translations/pt.json +29 -4
  166. package/translations/sk.json +30 -5
  167. package/esm2022/libs/ui/elements/src/lib/max-lines/max-lines.component.mjs +0 -69
  168. package/libs/ui/elements/src/lib/max-lines/max-lines.component.d.ts.map +0 -1
  169. /package/src/libs/ui/{elements → layout}/src/lib/max-lines/max-lines.component.css +0 -0
@@ -1,7 +1,12 @@
1
- import { ChangeDetectionStrategy, Component, Inject } from '@angular/core'
1
+ import {
2
+ ChangeDetectionStrategy,
3
+ Component,
4
+ Inject,
5
+ Input,
6
+ } from '@angular/core'
2
7
  import { Configuration } from '../../../../../../libs/data-access/gn4/src'
3
8
  import { MdViewFacade } from '../state'
4
- import { combineLatest, map } from 'rxjs'
9
+ import { BehaviorSubject, combineLatest, map } from 'rxjs'
5
10
  import { GN_UI_VERSION } from '../gn-ui-version.token'
6
11
 
7
12
  @Component({
@@ -11,35 +16,77 @@ import { GN_UI_VERSION } from '../gn-ui-version.token'
11
16
  changeDetection: ChangeDetectionStrategy.OnPush,
12
17
  })
13
18
  export class DataViewWebComponentComponent {
19
+ viewType$ = new BehaviorSubject<string>('map')
20
+ @Input()
21
+ set viewType(value: string) {
22
+ this.viewType$.next(value)
23
+ }
14
24
  webComponentHtml$ = combineLatest(
25
+ this.viewType$,
15
26
  this.facade.chartConfig$,
16
27
  this.facade.metadata$
17
28
  ).pipe(
18
- map(([config, metadata]) => {
19
- if (config) {
20
- const { aggregation, xProperty, yProperty, chartType } = config
29
+ map(([viewType, config, metadata]) => {
30
+ if (viewType === 'chart') {
31
+ if (config) {
32
+ const { aggregation, xProperty, yProperty, chartType } = config
33
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${
34
+ this.version
35
+ }/gn-wc.js"></script>
36
+ <gn-dataset-view-chart
37
+ api-url="${new URL(
38
+ this.config.basePath,
39
+ window.location.origin
40
+ ).toString()}"
41
+ dataset-id="${metadata.uniqueIdentifier}"
42
+ aggregation="${aggregation}"
43
+ x-property="${xProperty}"
44
+ y-property="${yProperty}"
45
+ chart-type="${chartType}"
46
+ primary-color="#0f4395"
47
+ secondary-color="#8bc832"
48
+ main-color="#555"
49
+ background-color="#fdfbff"
50
+ main-font="'Inter', sans-serif"
51
+ title-font="'DM Serif Display', serif"
52
+ ></gn-dataset-view-chart>`
53
+ }
54
+ return ''
55
+ } else if (viewType === 'table') {
21
56
  return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${
22
57
  this.version
23
58
  }/gn-wc.js"></script>
24
- <gn-dataset-view-chart
59
+ <gn-dataset-view-table
60
+ api-url="${new URL(
61
+ this.config.basePath,
62
+ window.location.origin
63
+ ).toString()}"
64
+ dataset-id="${metadata.uniqueIdentifier}"
65
+ primary-color="#0f4395"
66
+ secondary-color="#8bc832"
67
+ main-color="#555"
68
+ background-color="#fdfbff"
69
+ main-font="'Inter', sans-serif"
70
+ title-font="'DM Serif Display', serif"
71
+ ></gn-dataset-view-table>`
72
+ } else {
73
+ return `<script src="https://cdn.jsdelivr.net/gh/geonetwork/geonetwork-ui@wc-dist-${
74
+ this.version
75
+ }/gn-wc.js"></script>
76
+ <gn-dataset-view-map
25
77
  api-url="${new URL(
26
78
  this.config.basePath,
27
79
  window.location.origin
28
80
  ).toString()}"
29
81
  dataset-id="${metadata.uniqueIdentifier}"
30
- aggregation="${aggregation}"
31
- x-property="${xProperty}"
32
- y-property="${yProperty}"
33
- chart-type="${chartType}"
34
82
  primary-color="#0f4395"
35
83
  secondary-color="#8bc832"
36
84
  main-color="#555"
37
85
  background-color="#fdfbff"
38
86
  main-font="'Inter', sans-serif"
39
87
  title-font="'DM Serif Display', serif"
40
- ></gn-dataset-view-chart>`
88
+ ></gn-dataset-view-map>`
41
89
  }
42
- return ''
43
90
  })
44
91
  )
45
92
 
@@ -1,11 +1,11 @@
1
1
  import { Injectable } from '@angular/core'
2
2
  import { select, Store } from '@ngrx/store'
3
3
  import {
4
+ catchError,
4
5
  defaultIfEmpty,
5
6
  filter,
6
7
  map,
7
8
  mergeMap,
8
- scan,
9
9
  switchMap,
10
10
  toArray,
11
11
  } from 'rxjs/operators'
@@ -119,7 +119,11 @@ export class MdViewFacade {
119
119
  ? link
120
120
  : null
121
121
  }),
122
- defaultIfEmpty(null)
122
+ defaultIfEmpty(null),
123
+ catchError((e) => {
124
+ console.error(e)
125
+ return of(null)
126
+ })
123
127
  )
124
128
  } else {
125
129
  return of(link)
@@ -2,6 +2,7 @@ export const ROUTER_STATE_KEY = 'router'
2
2
 
3
3
  export const ROUTER_ROUTE_SEARCH = 'search'
4
4
  export const ROUTER_ROUTE_DATASET = 'dataset'
5
+ export const ROUTER_ROUTE_ORGANIZATION = 'organization'
5
6
 
6
7
  export enum ROUTE_PARAMS {
7
8
  SORT = '_sort',
@@ -4,6 +4,7 @@ export interface RouterConfigModel {
4
4
  searchStateId: string
5
5
  searchRouteComponent: Type<any>
6
6
  recordRouteComponent: Type<any>
7
+ organizationRouteComponent: Type<any>
7
8
  }
8
9
 
9
10
  export const ROUTER_CONFIG = new InjectionToken<RouterConfigModel>(
@@ -1,5 +1,9 @@
1
1
  import { Inject, Injectable } from '@angular/core'
2
- import { ROUTER_ROUTE_DATASET, ROUTER_ROUTE_SEARCH } from '.'
2
+ import {
3
+ ROUTER_ROUTE_DATASET,
4
+ ROUTER_ROUTE_ORGANIZATION,
5
+ ROUTER_ROUTE_SEARCH,
6
+ } from '.'
3
7
  import { Router, Routes } from '@angular/router'
4
8
  import { ROUTER_CONFIG, RouterConfigModel } from './router.config'
5
9
 
@@ -30,10 +34,18 @@ export class RouterService {
30
34
  path: `${ROUTER_ROUTE_DATASET}/:metadataUuid`,
31
35
  component: this.routerConfig.recordRouteComponent,
32
36
  },
37
+ {
38
+ path: `${ROUTER_ROUTE_ORGANIZATION}/:name`,
39
+ component: this.routerConfig.organizationRouteComponent,
40
+ },
33
41
  ]
34
42
  }
35
43
 
36
44
  getSearchRoute(): string {
37
45
  return ROUTER_ROUTE_SEARCH
38
46
  }
47
+
48
+ getOrganizationPageRoute(): string {
49
+ return ROUTER_ROUTE_ORGANIZATION
50
+ }
39
51
  }
@@ -3,7 +3,7 @@ import { MdViewActions } from '../../../../../../../libs/feature/record/src'
3
3
  import { RouterService } from '../router.service'
4
4
  import { RouterReducerState } from '@ngrx/router-store'
5
5
  import { select, Store } from '@ngrx/store'
6
- import { distinctUntilChanged, filter, map, take } from 'rxjs/operators'
6
+ import { distinctUntilChanged, filter, map, take, tap } from 'rxjs/operators'
7
7
  import {
8
8
  ROUTER_ROUTE_DATASET,
9
9
  ROUTER_ROUTE_SEARCH,
@@ -51,6 +51,14 @@ export class RouterFacade {
51
51
  })
52
52
  }
53
53
 
54
+ goToOrganization(organizationName: string) {
55
+ const path = `${this.routerService.getOrganizationPageRoute()}/${organizationName}`
56
+ this.go({
57
+ path,
58
+ queryParamsHandling: '',
59
+ })
60
+ }
61
+
54
62
  updateSearch(query?: SearchRouteParams) {
55
63
  this.go({
56
64
  path: this.routerService.getSearchRoute(),
@@ -37,6 +37,7 @@ import {
37
37
  getSearchResultsLoading,
38
38
  getSearchSortBy,
39
39
  getSpatialFilterEnabled,
40
+ isBeginningOfResults,
40
41
  isEndOfResults,
41
42
  totalPages,
42
43
  } from './selectors'
@@ -58,6 +59,7 @@ export class SearchFacade {
58
59
  layout$: Observable<string>
59
60
  sortBy$: Observable<SortByField>
60
61
  isLoading$: Observable<boolean>
62
+ isBeginningOfResults$: Observable<boolean>
61
63
  isEndOfResults$: Observable<boolean>
62
64
  totalPages$: Observable<number>
63
65
  currentPage$: Observable<number>
@@ -98,6 +100,9 @@ export class SearchFacade {
98
100
  this.isLoading$ = this.store.pipe(select(getSearchResultsLoading, searchId))
99
101
  this.searchFilters$ = this.store.pipe(select(getSearchFilters, searchId))
100
102
  this.resultsHits$ = this.store.pipe(select(getSearchResultsHits, searchId))
103
+ this.isBeginningOfResults$ = this.store.pipe(
104
+ select(isBeginningOfResults, searchId)
105
+ )
101
106
  this.isEndOfResults$ = this.store.pipe(select(isEndOfResults, searchId))
102
107
  this.totalPages$ = this.store.pipe(select(totalPages, searchId))
103
108
  this.currentPage$ = this.store.pipe(select(currentPage, searchId))
@@ -50,6 +50,13 @@ export const getSearchResultsHits = createSelector(
50
50
  (state: SearchStateSearch) => state.results.count
51
51
  )
52
52
 
53
+ export const isBeginningOfResults = createSelector(
54
+ getSearchStateSearch,
55
+ (state: SearchStateSearch) => {
56
+ return state.params.currentPage === 0
57
+ }
58
+ )
59
+
53
60
  export const isEndOfResults = createSelector(
54
61
  getSearchStateSearch,
55
62
  (state: SearchStateSearch) => {
@@ -25,19 +25,21 @@ marker('search.filters.keyword')
25
25
  marker('search.filters.isSpatial')
26
26
  marker('search.filters.license')
27
27
  marker('search.filters.publicationYear')
28
- marker('search.filters.publisher')
28
+ marker('search.filters.organization')
29
29
  marker('search.filters.representationType')
30
30
  marker('search.filters.resourceType')
31
31
  marker('search.filters.standard')
32
32
  marker('search.filters.topic')
33
33
  marker('search.filters.contact')
34
+ marker('search.filters.producerOrg')
35
+ marker('search.filters.publisherOrg')
34
36
 
35
37
  @Injectable({
36
38
  providedIn: 'root',
37
39
  })
38
40
  export class FieldsService {
39
41
  protected fields = {
40
- publisher: new OrganizationSearchField(this.injector),
42
+ organization: new OrganizationSearchField(this.injector),
41
43
  format: new SimpleSearchField('format', this.injector, 'asc'),
42
44
  resourceType: new TranslatedSearchField(
43
45
  'resourceType',
@@ -70,6 +72,18 @@ export class FieldsService {
70
72
  q: new FullTextSearchField(),
71
73
  license: new LicenseSearchField(this.injector),
72
74
  owner: new OwnerSearchField(this.injector),
75
+ producerOrg: new MultilingualSearchField(
76
+ 'originatorOrgForResourceObject',
77
+ this.injector,
78
+ 'asc',
79
+ 'key'
80
+ ),
81
+ publisherOrg: new MultilingualSearchField(
82
+ 'distributorOrgForResourceObject',
83
+ this.injector,
84
+ 'asc',
85
+ 'key'
86
+ ),
73
87
  } as Record<string, AbstractSearchField>
74
88
 
75
89
  get supportedFields() {
@@ -1,14 +1,14 @@
1
1
  <a href (click)="clickOrganisation($event)" [attr.href]="organisationUrl">
2
2
  <div
3
3
  class="group cursor-pointer rounded-lg h-full flex flex-col"
4
- [title]="organisation.name"
4
+ [title]="organization.name"
5
5
  >
6
6
  <div
7
7
  class="shrink-0 bg-gray-100 rounded-lg overflow-hidden w-full border border-gray-300 h-36"
8
8
  >
9
9
  <gn-ui-thumbnail
10
10
  class="relative h-full w-full"
11
- [thumbnailUrl]="organisation.logoUrl"
11
+ [thumbnailUrl]="organization.logoUrl"
12
12
  [fit]="'contain'"
13
13
  >
14
14
  </gn-ui-thumbnail>
@@ -18,22 +18,24 @@
18
18
  class="shrink-0 mb-3 mt-5 font-title text-21 text-title group-hover:text-primary line-clamp-2 sm:mt-2 transition-colors"
19
19
  data-cy="organizationName"
20
20
  >
21
- {{ organisation.name }}</span
21
+ {{ organization.name }}</span
22
22
  >
23
23
  <p
24
24
  class="abstract mt-4 mb-5 sm:mb-2 sm:mt-0 grow shrink-1 overflow-hidden"
25
25
  data-cy="organizationDesc"
26
26
  >
27
- {{ organisation.description }}
27
+ {{ organization.description }}
28
28
  </p>
29
29
  <div class="shrink-0 text-primary opacity-50 flex leading-6">
30
30
  <mat-icon class="material-symbols-outlined text-primary opacity-50 mr-1"
31
31
  >folder_open
32
32
  </mat-icon>
33
33
  <span class="mx-1" data-cy="organizationRecordsCount">{{
34
- organisation.recordCount
34
+ organization.recordCount
35
35
  }}</span>
36
- <span translate>record.metadata.publications</span>
36
+ <span translate [translateParams]="{ count: organization.recordCount }"
37
+ >record.metadata.publications</span
38
+ >
37
39
  </div>
38
40
  </div>
39
41
  </div>
@@ -14,12 +14,12 @@ import { Organization } from '../../../../../../libs/common/domain/src/lib/model
14
14
  changeDetection: ChangeDetectionStrategy.OnPush,
15
15
  })
16
16
  export class OrganisationPreviewComponent {
17
- @Input() organisation: Organization
17
+ @Input() organization: Organization
18
18
  @Input() organisationUrl: string
19
19
  @Output() clickedOrganisation = new EventEmitter<Organization>()
20
20
 
21
21
  clickOrganisation(event: Event) {
22
22
  event.preventDefault()
23
- this.clickedOrganisation.emit(this.organisation)
23
+ this.clickedOrganisation.emit(this.organization)
24
24
  }
25
25
  }
@@ -9,6 +9,7 @@ import { OrganisationsFilterComponent } from './organisations-filter/organisatio
9
9
  import { UiInputsModule } from '../../../../../libs/ui/inputs/src'
10
10
  import { LanguageSwitcherComponent } from './language-switcher/language-switcher.component'
11
11
  import { OrganisationsResultComponent } from './organisations-result/organisations-result.component'
12
+ import { RouterLink } from '@angular/router'
12
13
 
13
14
  @NgModule({
14
15
  declarations: [
@@ -24,6 +25,7 @@ import { OrganisationsResultComponent } from './organisations-result/organisatio
24
25
  UiElementsModule,
25
26
  UiInputsModule,
26
27
  MatIconModule,
28
+ RouterLink,
27
29
  ],
28
30
  exports: [
29
31
  CatalogTitleComponent,
@@ -1,7 +1,13 @@
1
1
  <div
2
- translate
3
2
  class="flex flex-row justify-start items-center overflow-hidden"
4
- [title]="hoverTitle"
3
+ data-test="figureTitle"
4
+ [title]="
5
+ figure.toString() +
6
+ ' ' +
7
+ unit +
8
+ ' ' +
9
+ (title | translate: { count: figure })
10
+ "
5
11
  >
6
12
  <mat-icon
7
13
  class="material-symbols-outlined {{ bgClass }} {{
@@ -13,7 +19,9 @@
13
19
  </mat-icon>
14
20
  <div class="shrink overflow-hidden">
15
21
  <div class="figure-block text-[1.5em] text-black">
16
- <span class="figure font-medium mr-[0.3em]">{{ figure }}</span>
22
+ <span class="figure font-medium mr-[0.3em]" data-test="figure">{{
23
+ figure
24
+ }}</span>
17
25
  <span class="unit text-[0.665em]">{{ unit }}</span>
18
26
  </div>
19
27
  <div translate class="title truncate" [translateParams]="{ count: figure }">
@@ -1,4 +1,4 @@
1
- import { Component, ChangeDetectionStrategy, Input } from '@angular/core'
1
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'
2
2
 
3
3
  @Component({
4
4
  selector: 'gn-ui-figure',
@@ -10,17 +10,13 @@ export class FigureComponent {
10
10
  @Input() icon!: string
11
11
  @Input() title!: string
12
12
  @Input() figure!: string | number
13
- @Input() unit?: string
13
+ @Input() unit = ''
14
14
  @Input() color: 'primary' | 'secondary' = 'primary'
15
15
 
16
- get hoverTitle() {
17
- return `${this.figure.toString()} ${this.unit || ''}
18
- ${this.title}`
19
- }
20
-
21
16
  get textClass() {
22
17
  return this.color === 'primary' ? 'text-primary' : 'text-secondary'
23
18
  }
19
+
24
20
  get bgClass() {
25
21
  return this.color === 'primary' ? 'bg-primary-white' : 'bg-secondary-white'
26
22
  }
@@ -8,7 +8,6 @@ export * from './lib/image-overlay-preview/image-overlay-preview.component'
8
8
  export * from './lib/link-card/link-card.component'
9
9
  export * from './lib/markdown-editor/markdown-editor.component'
10
10
  export * from './lib/markdown-parser/markdown-parser.component'
11
- export * from './lib/max-lines/max-lines.component'
12
11
  export * from './lib/metadata-catalog/metadata-catalog.component'
13
12
  export * from './lib/metadata-contact/metadata-contact.component'
14
13
  export * from './lib/metadata-info/metadata-info.component'
@@ -1,7 +1,5 @@
1
1
  <div
2
- class="group flex flex-col justify-between h-40 pt-5 pb-6 px-7 rounded filter overflow-hidden"
3
- [ngClass]="{ 'cursor-pointer': displayApiFormButton }"
4
- (click)="openRecordApiFormPanel()"
2
+ class="group flex flex-col justify-between h-40 pt-5 pb-6 px-7 rounded filter overflow-hidden cursor-default"
5
3
  >
6
4
  <div
7
5
  class="font-title font-medium text-21 text-black text-ellipsis overflow-hidden break-words pb-5 h-[4.5rem]"
@@ -17,35 +15,37 @@
17
15
  }"
18
16
  >{{ link.accessServiceProtocol }}</span
19
17
  >
20
- <gn-ui-copy-text-button
21
- *ngIf="!displayApiFormButton"
22
- [text]="link.url.toString()"
23
- [tooltipText]="'tooltip.url.copy' | translate"
24
- [displayText]="false"
25
- ></gn-ui-copy-text-button>
26
- <button
27
- *ngIf="displayApiFormButton"
28
- type="button"
29
- [ngClass]="{
30
- 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':
31
- displayText
32
- }"
33
- mat-raised-button
34
- [matTooltip]="
35
- !currentlyActive
36
- ? ('record.metadata.api.form.openForm' | translate)
37
- : ('record.metadata.api.form.closeForm' | translate)
38
- "
39
- matTooltipPosition="above"
40
- >
41
- <mat-icon
42
- class="material-symbols-outlined pointer-events-none align-middle card-icon"
18
+ <div class="flex flex-row gap-2 items-center">
19
+ <gn-ui-copy-text-button
20
+ [text]="link.url"
21
+ [tooltipText]="'tooltip.url.copy' | translate"
22
+ [displayText]="false"
23
+ ></gn-ui-copy-text-button>
24
+ <button
25
+ *ngIf="displayApiFormButton"
26
+ type="button"
43
27
  [ngClass]="{
44
- 'text-secondary opacity-100': currentlyActive
28
+ 'py-2 px-4 rounded-r-md bg-gray-400 hover:bg-gray-600 focus:bg-gray-800 text-white':
29
+ displayText
45
30
  }"
46
- >more_horiz</mat-icon
31
+ mat-raised-button
32
+ [matTooltip]="
33
+ !currentlyActive
34
+ ? ('record.metadata.api.form.openForm' | translate)
35
+ : ('record.metadata.api.form.closeForm' | translate)
36
+ "
37
+ matTooltipPosition="above"
38
+ (click)="openRecordApiFormPanel()"
47
39
  >
48
- </button>
40
+ <mat-icon
41
+ class="material-symbols-outlined pointer-events-none align-middle card-icon"
42
+ [ngClass]="{
43
+ 'text-secondary opacity-100': currentlyActive
44
+ }"
45
+ >more_horiz</mat-icon
46
+ >
47
+ </button>
48
+ </div>
49
49
  </div>
50
50
  </div>
51
51
  </div>
@@ -8,11 +8,11 @@
8
8
  <div class="relative opacity-40">
9
9
  <mat-icon class="material-symbols-outlined face">face</mat-icon>
10
10
  <mat-icon class="material-symbols-outlined question-mark1"
11
- >question_mark</mat-icon
12
- >
11
+ >question_mark
12
+ </mat-icon>
13
13
  <mat-icon class="material-symbols-outlined question-mark2"
14
- >question_mark</mat-icon
15
- >
14
+ >question_mark
15
+ </mat-icon>
16
16
  </div>
17
17
  <div translate>search.error.couldNotReachApi</div>
18
18
  </div>
@@ -32,6 +32,15 @@
32
32
  <div translate>search.error.receivedError</div>
33
33
  <div *ngIf="error">{{ error }}</div>
34
34
  </div>
35
+ <div *ngIf="type === types.ORGANIZATION_HAS_NO_DATASET">
36
+ <div class="relative opacity-40">
37
+ <mat-icon class="material-symbols-outlined computer">computer</mat-icon>
38
+ <mat-icon class="material-symbols-outlined computer-question-mark"
39
+ >question_mark
40
+ </mat-icon>
41
+ </div>
42
+ <div translate>search.error.organizationHasNoDataset</div>
43
+ </div>
35
44
  <div
36
45
  *ngIf="type === types.RECORD_NOT_FOUND"
37
46
  data-test="record-not-found-error"
@@ -39,12 +48,27 @@
39
48
  <div class="relative opacity-40">
40
49
  <mat-icon class="material-symbols-outlined computer">computer</mat-icon>
41
50
  <mat-icon class="material-symbols-outlined computer-question-mark"
42
- >question_mark</mat-icon
43
- >
51
+ >question_mark
52
+ </mat-icon>
44
53
  </div>
45
54
  <div translate [translateParams]="{ id: recordId }">
46
55
  search.error.recordNotFound
47
56
  </div>
48
57
  <div *ngIf="error">{{ error }}</div>
49
58
  </div>
59
+ <div
60
+ *ngIf="type === types.ORGANIZATION_NOT_FOUND"
61
+ data-test="org-not-found-error"
62
+ >
63
+ <div class="relative opacity-40">
64
+ <mat-icon class="material-symbols-outlined computer">computer</mat-icon>
65
+ <mat-icon class="material-symbols-outlined computer-question-mark"
66
+ >question_mark
67
+ </mat-icon>
68
+ </div>
69
+ <div translate [translateParams]="{ id: recordId }">
70
+ search.error.organizationNotFound
71
+ </div>
72
+ <div *ngIf="error">{{ error }}</div>
73
+ </div>
50
74
  </div>
@@ -5,6 +5,8 @@ export enum ErrorType {
5
5
  RECEIVED_ERROR,
6
6
  RECORD_NOT_FOUND,
7
7
  DATASET_HAS_NO_LINK,
8
+ ORGANIZATION_HAS_NO_DATASET,
9
+ ORGANIZATION_NOT_FOUND,
8
10
  }
9
11
 
10
12
  @Component({
@@ -1,5 +1,5 @@
1
1
  <a
2
- class="w-72 h-96 overflow-hidden rounded-lg bg-white cursor-pointer block hover:-translate-y-2 duration-[180ms]"
2
+ [class]="classList"
3
3
  [routerLink]="['/dataset', record.uniqueIdentifier]"
4
4
  target="_blank"
5
5
  >
@@ -1,4 +1,4 @@
1
- import { Component, ChangeDetectionStrategy, Input } from '@angular/core'
1
+ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'
2
2
  import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/model/record'
3
3
 
4
4
  @Component({
@@ -8,5 +8,26 @@ import { CatalogRecord } from '../../../../../../libs/common/domain/src/lib/mode
8
8
  changeDetection: ChangeDetectionStrategy.OnPush,
9
9
  })
10
10
  export class RelatedRecordCardComponent {
11
+ private readonly baseClasses: string
12
+
11
13
  @Input() record: CatalogRecord
14
+ @Input() extraClass = ''
15
+
16
+ constructor() {
17
+ this.baseClasses = [
18
+ 'w-72',
19
+ 'h-96',
20
+ 'overflow-hidden',
21
+ 'rounded-lg',
22
+ 'bg-white',
23
+ 'cursor-pointer',
24
+ 'block',
25
+ 'hover:-translate-y-2 ',
26
+ 'duration-[180ms]',
27
+ ].join(' ')
28
+ }
29
+
30
+ get classList() {
31
+ return `${this.baseClasses} ${this.extraClass}`
32
+ }
12
33
  }
@@ -10,7 +10,7 @@ import { DownloadItemComponent } from './download-item/download-item.component'
10
10
  import { DownloadsListComponent } from './downloads-list/downloads-list.component'
11
11
  import { ApiCardComponent } from './api-card/api-card.component'
12
12
  import { UiWidgetsModule } from '../../../../../libs/ui/widgets/src'
13
- import { UiLayoutModule } from '../../../../../libs/ui/layout/src'
13
+ import { MaxLinesComponent, UiLayoutModule } from '../../../../../libs/ui/layout/src'
14
14
  import { TranslateModule } from '@ngx-translate/core'
15
15
  import { RelatedRecordCardComponent } from './related-record-card/related-record-card.component'
16
16
  import { MetadataContactComponent } from './metadata-contact/metadata-contact.component'
@@ -26,7 +26,6 @@ import { AvatarComponent } from './avatar/avatar.component'
26
26
  import { UserPreviewComponent } from './user-preview/user-preview.component'
27
27
  import { GnUiLinkifyDirective } from './metadata-info/linkify.directive'
28
28
  import { PaginationButtonsComponent } from './pagination-buttons/pagination-buttons.component'
29
- import { MaxLinesComponent } from './max-lines/max-lines.component'
30
29
  import { RecordApiFormComponent } from './record-api-form/record-api-form.component'
31
30
  import { MarkdownParserComponent } from './markdown-parser/markdown-parser.component'
32
31
  import { ImageOverlayPreviewComponent } from './image-overlay-preview/image-overlay-preview.component'
@@ -50,6 +49,7 @@ import { TimeSincePipe } from './user-feedback-item/time-since.pipe'
50
49
  ThumbnailComponent,
51
50
  TimeSincePipe,
52
51
  BadgeComponent,
52
+ MaxLinesComponent,
53
53
  ],
54
54
  declarations: [
55
55
  MetadataInfoComponent,
@@ -68,7 +68,6 @@ import { TimeSincePipe } from './user-feedback-item/time-since.pipe'
68
68
  UserPreviewComponent,
69
69
  GnUiLinkifyDirective,
70
70
  PaginationButtonsComponent,
71
- MaxLinesComponent,
72
71
  RecordApiFormComponent,
73
72
  UserFeedbackItemComponent,
74
73
  ImageOverlayPreviewComponent,
@@ -90,7 +89,6 @@ import { TimeSincePipe } from './user-feedback-item/time-since.pipe'
90
89
  AvatarComponent,
91
90
  UserPreviewComponent,
92
91
  PaginationButtonsComponent,
93
- MaxLinesComponent,
94
92
  RecordApiFormComponent,
95
93
  MarkdownParserComponent,
96
94
  UserFeedbackItemComponent,