geonetwork-ui 2.8.0-dev.c06b26576 → 2.8.0-dev.e9cfb9381
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.
- package/esm2022/index.mjs +2 -1
- package/esm2022/libs/api/metadata-converter/src/lib/common/distribution.mapper.mjs +5 -1
- package/esm2022/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.mjs +3 -1
- package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.mjs +10 -10
- package/esm2022/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.mjs +3 -2
- package/esm2022/libs/common/domain/src/index.mjs +3 -0
- package/esm2022/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.mjs +1 -1
- package/esm2022/libs/common/domain/src/lib/model/record/metadata.model.mjs +3 -1
- package/esm2022/libs/common/domain/src/lib/model/search/sort-by.model.mjs +6 -1
- package/esm2022/libs/common/domain/src/lib/platform.service.interface.mjs +1 -1
- package/esm2022/libs/feature/dataviz/src/index.mjs +2 -1
- package/esm2022/libs/feature/dataviz/src/lib/chart-view/chart-view.component.mjs +3 -1
- package/esm2022/libs/feature/dataviz/src/lib/stac-view/stac-view.component.mjs +22 -0
- package/esm2022/libs/feature/record/src/lib/state/mdview.facade.mjs +2 -1
- package/esm2022/libs/feature/router/src/lib/default/router.service.mjs +5 -1
- package/esm2022/libs/feature/router/src/lib/default/state/router.effects.mjs +9 -7
- package/esm2022/libs/feature/search/src/lib/sort-by/sort-by.component.mjs +8 -12
- package/esm2022/libs/ui/elements/src/lib/external-link-card/external-link-card.component.mjs +11 -4
- package/esm2022/libs/ui/elements/src/lib/metadata-info/metadata-info.component.mjs +3 -3
- package/esm2022/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.mjs +2 -3
- package/esm2022/libs/util/shared/src/lib/links/link-classifier.service.mjs +5 -1
- package/esm2022/libs/util/shared/src/lib/links/link-utils.mjs +12 -1
- package/esm2022/libs/util/shared/src/lib/services/proxy.service.mjs +9 -11
- package/esm2022/libs/util/shared/src/lib/utils/sort-by.mjs +9 -6
- package/esm2022/translations/de.json +10 -3
- package/esm2022/translations/en.json +10 -4
- package/esm2022/translations/es.json +9 -2
- package/esm2022/translations/fr.json +10 -3
- package/esm2022/translations/it.json +11 -4
- package/esm2022/translations/nl.json +9 -2
- package/esm2022/translations/pt.json +9 -2
- package/esm2022/translations/sk.json +10 -3
- package/fesm2022/geonetwork-ui.mjs +176 -67
- package/fesm2022/geonetwork-ui.mjs.map +1 -1
- package/index.d.ts +1 -0
- package/index.d.ts.map +1 -1
- package/index.ts +1 -0
- package/libs/api/metadata-converter/src/lib/common/distribution.mapper.d.ts.map +1 -1
- package/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts +7 -7
- package/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.d.ts.map +1 -1
- package/libs/common/domain/src/index.d.ts +3 -0
- package/libs/common/domain/src/index.d.ts.map +1 -0
- package/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.d.ts +1 -1
- package/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts +1 -1
- package/libs/common/domain/src/lib/model/record/metadata.model.d.ts.map +1 -1
- package/libs/common/domain/src/lib/model/search/sort-by.model.d.ts.map +1 -1
- package/libs/common/domain/src/lib/platform.service.interface.d.ts +1 -1
- package/libs/common/domain/src/lib/platform.service.interface.d.ts.map +1 -1
- package/libs/feature/dataviz/src/index.d.ts +1 -0
- package/libs/feature/dataviz/src/index.d.ts.map +1 -1
- package/libs/feature/dataviz/src/lib/chart-view/chart-view.component.d.ts.map +1 -1
- package/libs/feature/dataviz/src/lib/stac-view/stac-view.component.d.ts +11 -0
- package/libs/feature/dataviz/src/lib/stac-view/stac-view.component.d.ts.map +1 -0
- package/libs/feature/record/src/lib/state/mdview.facade.d.ts +24 -24
- package/libs/feature/record/src/lib/state/mdview.facade.d.ts.map +1 -1
- package/libs/feature/router/src/lib/default/router.service.d.ts +2 -0
- package/libs/feature/router/src/lib/default/router.service.d.ts.map +1 -1
- package/libs/feature/router/src/lib/default/state/router.effects.d.ts +3 -1
- package/libs/feature/router/src/lib/default/state/router.effects.d.ts.map +1 -1
- package/libs/feature/search/src/lib/sort-by/sort-by.component.d.ts +4 -3
- package/libs/feature/search/src/lib/sort-by/sort-by.component.d.ts.map +1 -1
- package/libs/ui/elements/src/lib/downloads-list/downloads-list.component.d.ts +1 -1
- package/libs/ui/elements/src/lib/external-link-card/external-link-card.component.d.ts +3 -2
- package/libs/ui/elements/src/lib/external-link-card/external-link-card.component.d.ts.map +1 -1
- package/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.d.ts.map +1 -1
- package/libs/util/shared/src/lib/links/link-classifier.service.d.ts.map +1 -1
- package/libs/util/shared/src/lib/links/link-utils.d.ts +6 -0
- package/libs/util/shared/src/lib/links/link-utils.d.ts.map +1 -1
- package/libs/util/shared/src/lib/services/proxy.service.d.ts +5 -4
- package/libs/util/shared/src/lib/services/proxy.service.d.ts.map +1 -1
- package/libs/util/shared/src/lib/utils/sort-by.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/libs/api/metadata-converter/src/lib/common/distribution.mapper.ts +2 -0
- package/src/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +2 -0
- package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.service.ts +37 -36
- package/src/libs/api/repository/src/lib/gn4/settings/gn4-settings.service.ts +3 -2
- package/src/libs/common/domain/src/index.ts +2 -0
- package/src/libs/common/domain/src/lib/model/dataviz/dataviz-configuration.model.ts +1 -1
- package/src/libs/common/domain/src/lib/model/record/metadata.model.ts +4 -0
- package/src/libs/common/domain/src/lib/model/search/sort-by.model.ts +5 -0
- package/src/libs/common/domain/src/lib/platform.service.interface.ts +1 -1
- package/src/libs/common/fixtures/src/lib/elasticsearch/metadata-links.fixtures.ts +5 -0
- package/src/libs/common/fixtures/src/lib/link.fixtures.ts +19 -0
- package/src/libs/feature/dataviz/src/index.ts +1 -0
- package/src/libs/feature/dataviz/src/lib/chart-view/chart-view.component.ts +1 -0
- package/src/libs/feature/dataviz/src/lib/stac-view/stac-view.component.css +0 -0
- package/src/libs/feature/dataviz/src/lib/stac-view/stac-view.component.html +5 -0
- package/src/libs/feature/dataviz/src/lib/stac-view/stac-view.component.ts +27 -0
- package/src/libs/feature/record/src/lib/state/mdview.facade.ts +11 -1
- package/src/libs/feature/router/src/lib/default/router.service.ts +8 -0
- package/src/libs/feature/router/src/lib/default/state/router.effects.ts +6 -7
- package/src/libs/feature/search/src/lib/sort-by/sort-by.component.ts +8 -12
- package/src/libs/ui/elements/src/lib/external-link-card/external-link-card.component.html +43 -22
- package/src/libs/ui/elements/src/lib/external-link-card/external-link-card.component.ts +12 -3
- package/src/libs/ui/elements/src/lib/metadata-info/metadata-info.component.html +56 -14
- package/src/libs/ui/inputs/src/lib/dropdown-selector/dropdown-selector.component.ts +4 -2
- package/src/libs/util/shared/src/lib/links/link-classifier.service.ts +4 -0
- package/src/libs/util/shared/src/lib/links/link-utils.ts +11 -0
- package/src/libs/util/shared/src/lib/services/proxy.service.ts +6 -2
- package/src/libs/util/shared/src/lib/utils/sort-by.ts +8 -5
- package/translations/de.json +10 -3
- package/translations/en.json +10 -4
- package/translations/es.json +9 -2
- package/translations/fr.json +10 -3
- package/translations/it.json +11 -4
- package/translations/nl.json +9 -2
- package/translations/pt.json +9 -2
- package/translations/sk.json +10 -3
- package/src/libs/common/domain/src/lib/index.ts +0 -2
|
@@ -1,12 +1,21 @@
|
|
|
1
|
+
import { HttpClient, HttpEventType } from '@angular/common/http'
|
|
1
2
|
import { Inject, Injectable, InjectionToken, Optional } from '@angular/core'
|
|
2
3
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
KeywordApiResponse,
|
|
5
|
+
ThesaurusApiResponse,
|
|
6
|
+
} from '../../../../../../../libs/api/metadata-converter/src'
|
|
7
|
+
import {
|
|
8
|
+
CatalogRecord,
|
|
9
|
+
Keyword,
|
|
10
|
+
Organization,
|
|
11
|
+
UserFeedback,
|
|
12
|
+
} from '../../../../../../../libs/common/domain/src/lib/model/record'
|
|
13
|
+
import { KeywordType } from '../../../../../../../libs/common/domain/src/lib/model/thesaurus'
|
|
14
|
+
import { UserModel } from '../../../../../../../libs/common/domain/src/lib/model/user/user.model'
|
|
15
|
+
import {
|
|
16
|
+
PlatformServiceInterface,
|
|
17
|
+
UploadEvent,
|
|
18
|
+
} from '../../../../../../../libs/common/domain/src/lib/platform.service.interface'
|
|
10
19
|
import {
|
|
11
20
|
MeApiService,
|
|
12
21
|
RecordsApiService,
|
|
@@ -15,26 +24,9 @@ import {
|
|
|
15
24
|
UserfeedbackApiService,
|
|
16
25
|
UsersApiService,
|
|
17
26
|
} from '../../../../../../../libs/data-access/gn4/src'
|
|
18
|
-
import {
|
|
19
|
-
PlatformServiceInterface,
|
|
20
|
-
UploadEvent,
|
|
21
|
-
} from '../../../../../../../libs/common/domain/src/lib/platform.service.interface'
|
|
22
|
-
import { UserModel } from '../../../../../../../libs/common/domain/src/lib/model/user/user.model'
|
|
23
|
-
import {
|
|
24
|
-
CatalogRecord,
|
|
25
|
-
Keyword,
|
|
26
|
-
Organization,
|
|
27
|
-
UserFeedback,
|
|
28
|
-
} from '../../../../../../../libs/common/domain/src/lib/model/record'
|
|
29
|
-
import { Gn4PlatformMapper } from './gn4-platform.mapper'
|
|
30
|
-
import { ltr } from 'semver'
|
|
31
|
-
import { HttpClient, HttpEventType } from '@angular/common/http'
|
|
32
|
-
import {
|
|
33
|
-
KeywordApiResponse,
|
|
34
|
-
ThesaurusApiResponse,
|
|
35
|
-
} from '../../../../../../../libs/api/metadata-converter/src'
|
|
36
|
-
import { KeywordType } from '../../../../../../../libs/common/domain/src/lib/model/thesaurus'
|
|
27
|
+
import { toLang3 } from '../../../../../../../libs/util/i18n/src'
|
|
37
28
|
import { noDuplicateFileName } from '../../../../../../../libs/util/shared/src'
|
|
29
|
+
import { TranslateService } from '@ngx-translate/core'
|
|
38
30
|
import {
|
|
39
31
|
combineLatest,
|
|
40
32
|
forkJoin,
|
|
@@ -43,9 +35,17 @@ import {
|
|
|
43
35
|
switchMap,
|
|
44
36
|
throwError,
|
|
45
37
|
} from 'rxjs'
|
|
46
|
-
import {
|
|
47
|
-
|
|
38
|
+
import {
|
|
39
|
+
catchError,
|
|
40
|
+
filter,
|
|
41
|
+
map,
|
|
42
|
+
mergeMap,
|
|
43
|
+
shareReplay,
|
|
44
|
+
tap,
|
|
45
|
+
} from 'rxjs/operators'
|
|
46
|
+
import { ltr } from 'semver'
|
|
48
47
|
import { Gn4SettingsService } from '../settings/gn4-settings.service'
|
|
48
|
+
import { Gn4PlatformMapper } from './gn4-platform.mapper'
|
|
49
49
|
|
|
50
50
|
const minApiVersion = '4.2.2'
|
|
51
51
|
|
|
@@ -56,7 +56,6 @@ export const DISABLE_AUTH = new InjectionToken<boolean>('gnDisableAuth', {
|
|
|
56
56
|
@Injectable()
|
|
57
57
|
export class Gn4PlatformService implements PlatformServiceInterface {
|
|
58
58
|
private readonly type = 'GeoNetwork'
|
|
59
|
-
private readonly me$: Observable<UserModel>
|
|
60
59
|
private readonly users$: Observable<UserModel[]>
|
|
61
60
|
private readonly isUserAnonymous$: Observable<boolean>
|
|
62
61
|
private readonly gnParseVersion = '4.2.5'
|
|
@@ -70,6 +69,15 @@ export class Gn4PlatformService implements PlatformServiceInterface {
|
|
|
70
69
|
}),
|
|
71
70
|
shareReplay(1)
|
|
72
71
|
)
|
|
72
|
+
|
|
73
|
+
private me$ = this.disableAuth
|
|
74
|
+
? of(null)
|
|
75
|
+
: of(true).pipe(
|
|
76
|
+
switchMap(() => this.meApi.getMe()),
|
|
77
|
+
switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)),
|
|
78
|
+
shareReplay({ bufferSize: 1, refCount: true })
|
|
79
|
+
)
|
|
80
|
+
|
|
73
81
|
/**
|
|
74
82
|
* A map of already loaded thesauri (groups of keywords); the key is a URI
|
|
75
83
|
* @private
|
|
@@ -93,13 +101,6 @@ export class Gn4PlatformService implements PlatformServiceInterface {
|
|
|
93
101
|
private settingsService: Gn4SettingsService,
|
|
94
102
|
@Inject(DISABLE_AUTH) @Optional() private disableAuth: boolean
|
|
95
103
|
) {
|
|
96
|
-
this.me$ = this.disableAuth
|
|
97
|
-
? of(null)
|
|
98
|
-
: this.meApi.getMe().pipe(
|
|
99
|
-
switchMap((apiUser) => this.mapper.userFromMeApi(apiUser)),
|
|
100
|
-
shareReplay({ bufferSize: 1, refCount: true })
|
|
101
|
-
)
|
|
102
|
-
|
|
103
104
|
this.isUserAnonymous$ = this.me$.pipe(
|
|
104
105
|
map((user) => !user || !('id' in user))
|
|
105
106
|
)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Injectable } from '@angular/core'
|
|
2
2
|
import { SiteApiService } from '../../../../../../../libs/data-access/gn4/src'
|
|
3
|
+
import { Observable, of, switchMap } from 'rxjs'
|
|
3
4
|
import { map, shareReplay } from 'rxjs/operators'
|
|
4
|
-
import { Observable } from 'rxjs'
|
|
5
5
|
|
|
6
6
|
@Injectable({
|
|
7
7
|
providedIn: 'root',
|
|
@@ -25,7 +25,8 @@ export class Gn4SettingsService {
|
|
|
25
25
|
constructor(private siteApiService: SiteApiService) {}
|
|
26
26
|
|
|
27
27
|
private getSettingsSetValueByKey(key: string) {
|
|
28
|
-
return
|
|
28
|
+
return of(true).pipe(
|
|
29
|
+
switchMap(() => this.siteApiService.getSettingsSet(null, [key])),
|
|
29
30
|
map((v) => v[key]),
|
|
30
31
|
shareReplay({ bufferSize: 1, refCount: true })
|
|
31
32
|
)
|
|
@@ -163,6 +163,8 @@ export type ServiceProtocol =
|
|
|
163
163
|
| 'GPFDL'
|
|
164
164
|
| 'tms'
|
|
165
165
|
| 'maplibre-style'
|
|
166
|
+
| 'postgis'
|
|
167
|
+
| 'stac'
|
|
166
168
|
| 'other'
|
|
167
169
|
|
|
168
170
|
marker('record.metadata.api.accessServiceProtocol.wms')
|
|
@@ -174,6 +176,8 @@ marker('record.metadata.api.accessServiceProtocol.ogcFeatures')
|
|
|
174
176
|
marker('record.metadata.api.accessServiceProtocol.GPFDL')
|
|
175
177
|
marker('record.metadata.api.accessServiceProtocol.tms')
|
|
176
178
|
marker('record.metadata.api.accessServiceProtocol.maplibre-style')
|
|
179
|
+
marker('record.metadata.api.accessServiceProtocol.postgis')
|
|
180
|
+
marker('record.metadata.api.accessServiceProtocol.stac')
|
|
177
181
|
marker('record.metadata.api.accessServiceProtocol.other')
|
|
178
182
|
|
|
179
183
|
export type OnlineResourceType = 'service' | 'download' | 'link' | 'endpoint'
|
|
@@ -6,4 +6,9 @@ export const SortByEnum: Record<string, SortByField> = {
|
|
|
6
6
|
RELEVANCY: ['desc', '_score'],
|
|
7
7
|
QUALITY_SCORE: ['desc', 'qualityScore'],
|
|
8
8
|
CHANGE_DATE: ['desc', 'changeDate'],
|
|
9
|
+
RESOURCE_DATES: [
|
|
10
|
+
['desc', 'revisionDateForResource'],
|
|
11
|
+
['desc', 'publicationDateForResource'],
|
|
12
|
+
['desc', 'creationDateForResource'],
|
|
13
|
+
],
|
|
9
14
|
}
|
|
@@ -45,6 +45,7 @@ export abstract class PlatformServiceInterface {
|
|
|
45
45
|
thesaurusId: string
|
|
46
46
|
): Observable<Keyword[]>
|
|
47
47
|
|
|
48
|
+
abstract getFeedbacksAllowed(): Observable<boolean>
|
|
48
49
|
abstract getUserFeedbacks(recordUuid: string): Observable<UserFeedback[]>
|
|
49
50
|
abstract postUserFeedbacks(recordUuid: UserFeedback): Observable<void>
|
|
50
51
|
|
|
@@ -58,5 +59,4 @@ export abstract class PlatformServiceInterface {
|
|
|
58
59
|
removeDuplicate?: boolean
|
|
59
60
|
): Observable<UploadEvent>
|
|
60
61
|
abstract getFileContent(url: URL): Observable<any>
|
|
61
|
-
abstract getFeedbacksAllowed(): Observable<boolean>
|
|
62
62
|
}
|
|
@@ -154,4 +154,9 @@ export const elasticLinkFixture = (): Record<string, unknown> => ({
|
|
|
154
154
|
name: 'myothertmslayer',
|
|
155
155
|
url: 'https://my.tms.server/MapServer',
|
|
156
156
|
},
|
|
157
|
+
stacItems: {
|
|
158
|
+
accessServiceProtocol: 'STAC:Items',
|
|
159
|
+
name: 'stac layer',
|
|
160
|
+
url: ' https://stacapi-cdos.apps.okd.crocc.meso.umontpellier.fr/collections/lidarhd/items',
|
|
161
|
+
},
|
|
157
162
|
})
|
|
@@ -259,4 +259,23 @@ export const aSetOfLinksFixture = () => ({
|
|
|
259
259
|
accessServiceProtocol: 'wms',
|
|
260
260
|
type: 'endpoint',
|
|
261
261
|
}) as ServiceEndpoint,
|
|
262
|
+
postgisLink: () =>
|
|
263
|
+
({
|
|
264
|
+
name: 'France_Regions',
|
|
265
|
+
description:
|
|
266
|
+
'Boundaries for the administrative regions of metropolitan France.',
|
|
267
|
+
url: new URL('http://geo.local:5432/france_demo'),
|
|
268
|
+
type: 'service',
|
|
269
|
+
accessServiceProtocol: 'postgis',
|
|
270
|
+
}) as DatasetServiceDistribution,
|
|
271
|
+
stacLink: () =>
|
|
272
|
+
({
|
|
273
|
+
name: 'Lidar HD point cloud (COPC)',
|
|
274
|
+
description: 'Lidar HD classified point clouds from IGN',
|
|
275
|
+
url: new URL(
|
|
276
|
+
'https://stacapi-cdos.apps.okd.crocc.meso.umontpellier.fr/collections/lidarhd/items'
|
|
277
|
+
),
|
|
278
|
+
type: 'service',
|
|
279
|
+
accessServiceProtocol: 'stac',
|
|
280
|
+
}) as DatasetServiceDistribution,
|
|
262
281
|
})
|
|
@@ -3,3 +3,4 @@ export * from './lib/chart-view/chart-view.component'
|
|
|
3
3
|
export * from './lib/figure/figure-container/figure-container.component'
|
|
4
4
|
export * from './lib/geo-table-view/geo-table-view.component'
|
|
5
5
|
export * from './lib/table-view/table-view.component'
|
|
6
|
+
export * from './lib/stac-view/stac-view.component'
|
|
@@ -108,6 +108,7 @@ export class ChartViewComponent {
|
|
|
108
108
|
chartType$ = new BehaviorSubject<InputChartType>('bar')
|
|
109
109
|
|
|
110
110
|
@Input() set userChartConfig(config: DatavizChartConfigModel) {
|
|
111
|
+
if (!config) return
|
|
111
112
|
this.aggregation$.next(config.aggregation)
|
|
112
113
|
this.xProperty$.next(config.xProperty)
|
|
113
114
|
this.yProperty$.next(config.yProperty)
|
|
File without changes
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { CommonModule } from '@angular/common'
|
|
2
|
+
import {
|
|
3
|
+
ChangeDetectionStrategy,
|
|
4
|
+
Component,
|
|
5
|
+
Input,
|
|
6
|
+
OnDestroy,
|
|
7
|
+
} from '@angular/core'
|
|
8
|
+
import { DatasetServiceDistribution } from '../../../../../../libs/common/domain/src/lib/model/record'
|
|
9
|
+
import { TranslatePipe } from '@ngx-translate/core'
|
|
10
|
+
import { Subscription } from 'rxjs'
|
|
11
|
+
|
|
12
|
+
@Component({
|
|
13
|
+
selector: 'gn-ui-stac-view',
|
|
14
|
+
templateUrl: './stac-view.component.html',
|
|
15
|
+
styleUrls: ['./stac-view.component.css'],
|
|
16
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
17
|
+
standalone: true,
|
|
18
|
+
imports: [CommonModule, TranslatePipe],
|
|
19
|
+
})
|
|
20
|
+
export class StacViewComponent implements OnDestroy {
|
|
21
|
+
@Input() link: DatasetServiceDistribution
|
|
22
|
+
private subscription = new Subscription()
|
|
23
|
+
|
|
24
|
+
ngOnDestroy() {
|
|
25
|
+
this.subscription.unsubscribe()
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
} from '../../../../../../libs/common/domain/src/lib/model/record'
|
|
21
21
|
import { AvatarServiceInterface } from '../../../../../../libs/api/repository/src'
|
|
22
22
|
import { OgcApiRecord } from '@camptocamp/ogc-client'
|
|
23
|
-
import { from, of
|
|
23
|
+
import { from, of } from 'rxjs'
|
|
24
24
|
import { DataService } from '../../../../../../libs/feature/dataviz/src'
|
|
25
25
|
|
|
26
26
|
@Injectable()
|
|
@@ -105,6 +105,16 @@ export class MdViewFacade {
|
|
|
105
105
|
shareReplay(1)
|
|
106
106
|
)
|
|
107
107
|
|
|
108
|
+
stacLinks$ = this.allLinks$.pipe(
|
|
109
|
+
map((links) =>
|
|
110
|
+
links.filter(
|
|
111
|
+
(link) =>
|
|
112
|
+
link.type === 'service' && link.accessServiceProtocol === 'stac'
|
|
113
|
+
)
|
|
114
|
+
),
|
|
115
|
+
shareReplay(1)
|
|
116
|
+
)
|
|
117
|
+
|
|
108
118
|
downloadLinks$ = this.allLinks$.pipe(
|
|
109
119
|
map((links) =>
|
|
110
120
|
links.filter((link) =>
|
|
@@ -8,6 +8,10 @@ import {
|
|
|
8
8
|
} from '.'
|
|
9
9
|
import { Router, Routes } from '@angular/router'
|
|
10
10
|
import { ROUTER_CONFIG, RouterConfigModel } from './router.config'
|
|
11
|
+
import {
|
|
12
|
+
SortByEnum,
|
|
13
|
+
SortByField,
|
|
14
|
+
} from '../../../../../../libs/common/domain/src/lib/model/search'
|
|
11
15
|
|
|
12
16
|
@Injectable({
|
|
13
17
|
providedIn: 'root',
|
|
@@ -58,4 +62,8 @@ export class RouterService {
|
|
|
58
62
|
getOrganizationPageRoute(): string {
|
|
59
63
|
return ROUTER_ROUTE_ORGANIZATION
|
|
60
64
|
}
|
|
65
|
+
|
|
66
|
+
getDefaultSort(): SortByField {
|
|
67
|
+
return SortByEnum.RESOURCE_DATES
|
|
68
|
+
}
|
|
61
69
|
}
|
|
@@ -9,10 +9,7 @@ import {
|
|
|
9
9
|
SetFilters,
|
|
10
10
|
SetSortBy,
|
|
11
11
|
} from '../../../../../../../libs/feature/search/src'
|
|
12
|
-
import {
|
|
13
|
-
FieldFilters,
|
|
14
|
-
SortByEnum,
|
|
15
|
-
} from '../../../../../../../libs/common/domain/src/lib/model/search'
|
|
12
|
+
import { FieldFilters } from '../../../../../../../libs/common/domain/src/lib/model/search'
|
|
16
13
|
import { Actions, createEffect, ofType } from '@ngrx/effects'
|
|
17
14
|
import { navigation } from '@ngrx/router-store/data-persistence'
|
|
18
15
|
import { of, pairwise, startWith } from 'rxjs'
|
|
@@ -22,6 +19,7 @@ import { RouterFacade } from './router.facade'
|
|
|
22
19
|
import { ROUTE_PARAMS } from '../constants'
|
|
23
20
|
import { sortByFromString } from '../../../../../../../libs/util/shared/src'
|
|
24
21
|
import { ROUTER_CONFIG, RouterConfigModel } from '../router.config'
|
|
22
|
+
import { RouterService } from '../router.service'
|
|
25
23
|
|
|
26
24
|
@Injectable()
|
|
27
25
|
export class RouterEffects {
|
|
@@ -31,7 +29,8 @@ export class RouterEffects {
|
|
|
31
29
|
private _location: Location,
|
|
32
30
|
private facade: RouterFacade,
|
|
33
31
|
@Inject(ROUTER_CONFIG) private routerConfig: RouterConfigModel,
|
|
34
|
-
private fieldsService: FieldsService
|
|
32
|
+
private fieldsService: FieldsService,
|
|
33
|
+
private routerService: RouterService
|
|
35
34
|
) {}
|
|
36
35
|
|
|
37
36
|
navigate$ = createEffect(
|
|
@@ -61,7 +60,7 @@ export class RouterEffects {
|
|
|
61
60
|
let sortBy =
|
|
62
61
|
ROUTE_PARAMS.SORT in newParams
|
|
63
62
|
? sortByFromString(newParams[ROUTE_PARAMS.SORT])
|
|
64
|
-
:
|
|
63
|
+
: this.routerService.getDefaultSort()
|
|
65
64
|
let pageNumber =
|
|
66
65
|
ROUTE_PARAMS.PAGE in newParams
|
|
67
66
|
? parseInt(newParams[ROUTE_PARAMS.PAGE])
|
|
@@ -70,7 +69,7 @@ export class RouterEffects {
|
|
|
70
69
|
const oldSort =
|
|
71
70
|
ROUTE_PARAMS.SORT in oldParams
|
|
72
71
|
? sortByFromString(oldParams[ROUTE_PARAMS.SORT])
|
|
73
|
-
:
|
|
72
|
+
: this.routerService.getDefaultSort()
|
|
74
73
|
if (JSON.stringify(sortBy) === JSON.stringify(oldSort)) {
|
|
75
74
|
sortBy = null
|
|
76
75
|
}
|
|
@@ -13,7 +13,7 @@ import { TranslatePipe } from '@ngx-translate/core'
|
|
|
13
13
|
|
|
14
14
|
interface SortChoice {
|
|
15
15
|
label: string
|
|
16
|
-
value:
|
|
16
|
+
value: SortByField
|
|
17
17
|
}
|
|
18
18
|
|
|
19
19
|
@Component({
|
|
@@ -27,24 +27,20 @@ export class SortByComponent implements OnInit {
|
|
|
27
27
|
choices: SortChoice[] = [
|
|
28
28
|
{
|
|
29
29
|
label: marker('results.sortBy.relevancy'),
|
|
30
|
-
value: SortByEnum.RELEVANCY
|
|
30
|
+
value: SortByEnum.RELEVANCY,
|
|
31
31
|
},
|
|
32
32
|
{
|
|
33
33
|
label: marker('results.sortBy.dateStamp'),
|
|
34
|
-
value: SortByEnum.
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
label: marker('results.sortBy.changeDate'),
|
|
38
|
-
value: SortByEnum.CHANGE_DATE.join(','),
|
|
34
|
+
value: SortByEnum.RESOURCE_DATES,
|
|
39
35
|
},
|
|
40
36
|
{
|
|
41
37
|
label: marker('results.sortBy.popularity'),
|
|
42
|
-
value: SortByEnum.POPULARITY
|
|
38
|
+
value: SortByEnum.POPULARITY,
|
|
43
39
|
},
|
|
44
40
|
]
|
|
45
41
|
currentSortBy$ = this.facade.sortBy$.pipe(
|
|
46
42
|
filter((sortBy) => !!sortBy),
|
|
47
|
-
map((sortBy) => sortBy
|
|
43
|
+
map((sortBy) => sortBy)
|
|
48
44
|
)
|
|
49
45
|
|
|
50
46
|
constructor(
|
|
@@ -56,12 +52,12 @@ export class SortByComponent implements OnInit {
|
|
|
56
52
|
if (this.isQualitySortable) {
|
|
57
53
|
this.choices.push({
|
|
58
54
|
label: marker('results.sortBy.qualityScore'),
|
|
59
|
-
value: SortByEnum.QUALITY_SCORE
|
|
55
|
+
value: SortByEnum.QUALITY_SCORE,
|
|
60
56
|
})
|
|
61
57
|
}
|
|
62
58
|
}
|
|
63
59
|
|
|
64
|
-
changeSortBy(
|
|
65
|
-
this.searchService.setSortBy(
|
|
60
|
+
changeSortBy(criteria: SortByField): void {
|
|
61
|
+
this.searchService.setSortBy(criteria)
|
|
66
62
|
}
|
|
67
63
|
}
|
|
@@ -1,15 +1,48 @@
|
|
|
1
|
-
<
|
|
2
|
-
[
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
>
|
|
1
|
+
<ng-container *ngIf="isDatabase; else clickableLink">
|
|
2
|
+
<div [ngClass]="cardClass" [title]="title">
|
|
3
|
+
<ng-container *ngTemplateOutlet="cardContent"></ng-container>
|
|
4
|
+
<div
|
|
5
|
+
class="flex min-w-[32px]"
|
|
6
|
+
[ngClass]="size === 'S' ? 'items-end' : 'items-center'"
|
|
7
|
+
>
|
|
8
|
+
<div
|
|
9
|
+
class="gn-ui-card-icon"
|
|
10
|
+
[title]="'record.metadata.link.postgis.tooltip' | translate"
|
|
11
|
+
>
|
|
12
|
+
<ng-icon
|
|
13
|
+
class="inline-block card-icon align-middle"
|
|
14
|
+
name="iconoirDatabase"
|
|
15
|
+
></ng-icon>
|
|
16
|
+
</div>
|
|
17
|
+
</div>
|
|
18
|
+
</div>
|
|
19
|
+
</ng-container>
|
|
20
|
+
|
|
21
|
+
<ng-template #clickableLink>
|
|
22
|
+
<a [href]="link.url" target="_blank" [ngClass]="cardClass" [title]="title">
|
|
23
|
+
<ng-container *ngTemplateOutlet="cardContent"></ng-container>
|
|
24
|
+
<div
|
|
25
|
+
class="flex min-w-[32px]"
|
|
26
|
+
[ngClass]="size === 'S' ? 'items-end' : 'items-center'"
|
|
27
|
+
>
|
|
28
|
+
<div class="gn-ui-card-icon">
|
|
29
|
+
<ng-icon
|
|
30
|
+
class="inline-block card-icon align-middle"
|
|
31
|
+
name="matOpenInNew"
|
|
32
|
+
></ng-icon>
|
|
33
|
+
</div>
|
|
34
|
+
</div>
|
|
35
|
+
</a>
|
|
36
|
+
</ng-template>
|
|
37
|
+
<ng-template #cardContent>
|
|
8
38
|
<div class="flex flex-col justify-between flex-1 min-w-0">
|
|
9
39
|
<div class="gn-ui-card-title">
|
|
10
40
|
{{ link.description || link.name }}
|
|
11
41
|
</div>
|
|
12
42
|
<div class="gn-ui-card-detail">
|
|
43
|
+
<ng-container *ngIf="isDatabase">
|
|
44
|
+
{{ 'record.metadata.link.postgis.table' | translate }}
|
|
45
|
+
</ng-container>
|
|
13
46
|
{{ link.name }}
|
|
14
47
|
</div>
|
|
15
48
|
<p *ngIf="!link.name && !link.description" class="gn-ui-card-title">
|
|
@@ -20,21 +53,9 @@
|
|
|
20
53
|
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"
|
|
21
54
|
[style.background-color]="getLinkColor(link)"
|
|
22
55
|
data-cy="download-format"
|
|
23
|
-
>{{
|
|
24
|
-
getLinkFormat(link) || ('downloads.format.unknown' | translate)
|
|
25
|
-
}}</span
|
|
26
56
|
>
|
|
57
|
+
{{ getLinkFormat(link) || ('downloads.format.unknown' | translate) }}
|
|
58
|
+
</span>
|
|
27
59
|
</div>
|
|
28
60
|
</div>
|
|
29
|
-
|
|
30
|
-
class="flex min-w-[32px]"
|
|
31
|
-
[ngClass]="size === 'S' ? 'items-end' : 'items-center'"
|
|
32
|
-
>
|
|
33
|
-
<div class="gn-ui-card-icon">
|
|
34
|
-
<ng-icon
|
|
35
|
-
class="inline-block card-icon align-middle"
|
|
36
|
-
name="matOpenInNew"
|
|
37
|
-
></ng-icon>
|
|
38
|
-
</div>
|
|
39
|
-
</div>
|
|
40
|
-
</a>
|
|
61
|
+
</ng-template>
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
provideNgIconsConfig,
|
|
8
8
|
} from '@ng-icons/core'
|
|
9
9
|
import { matOpenInNew } from '@ng-icons/material-icons/baseline'
|
|
10
|
+
import { iconoirDatabase } from '@ng-icons/iconoir'
|
|
10
11
|
import { getBadgeColor, getFileFormat } from '../../../../../../libs/util/shared/src'
|
|
11
12
|
import { TranslatePipe } from '@ngx-translate/core'
|
|
12
13
|
|
|
@@ -21,6 +22,7 @@ type CardSize = 'L' | 'M' | 'S' | 'XS'
|
|
|
21
22
|
providers: [
|
|
22
23
|
provideIcons({
|
|
23
24
|
matOpenInNew,
|
|
25
|
+
iconoirDatabase,
|
|
24
26
|
}),
|
|
25
27
|
provideNgIconsConfig({ size: '1.5em' }),
|
|
26
28
|
],
|
|
@@ -37,7 +39,7 @@ export class ExternalLinkCardComponent {
|
|
|
37
39
|
|
|
38
40
|
@Input() set size(value: CardSize) {
|
|
39
41
|
this._size = value
|
|
40
|
-
this.cardClass = this.sizeClassMap[value]
|
|
42
|
+
this.cardClass = `group flex flex-row justify-between card-shadow rounded overflow-hidden ${this.sizeClassMap[value]}`
|
|
41
43
|
}
|
|
42
44
|
get size(): CardSize {
|
|
43
45
|
return this._size
|
|
@@ -51,11 +53,18 @@ export class ExternalLinkCardComponent {
|
|
|
51
53
|
return this.link.name || this.link.description || ''
|
|
52
54
|
}
|
|
53
55
|
|
|
54
|
-
|
|
56
|
+
get isDatabase(): boolean {
|
|
57
|
+
return (
|
|
58
|
+
this.link.type === 'service' &&
|
|
59
|
+
this.link.accessServiceProtocol === 'postgis'
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
getLinkFormat(link: DatasetOnlineResource): string {
|
|
55
64
|
return getFileFormat(link)
|
|
56
65
|
}
|
|
57
66
|
|
|
58
|
-
getLinkColor(link:
|
|
67
|
+
getLinkColor(link: DatasetOnlineResource): string {
|
|
59
68
|
return getBadgeColor(getFileFormat(link))
|
|
60
69
|
}
|
|
61
70
|
}
|