geonetwork-ui 2.8.0-dev.c77b0c7dd → 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/auth/auth.service.mjs +2 -2
- package/esm2022/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.mjs +7 -3
- 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/data-access/gn4/src/openapi/model/user.api.model.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/map-view/map-view.component.mjs +2 -1
- 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/error/error.component.mjs +3 -3
- 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 +11 -5
- package/esm2022/translations/es.json +9 -2
- package/esm2022/translations/fr.json +11 -4
- package/esm2022/translations/it.json +12 -5
- 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 +189 -75
- 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/auth/auth.service.d.ts.map +1 -1
- package/libs/api/repository/src/lib/gn4/platform/gn4-platform.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/data-access/gn4/src/openapi/model/user.api.model.d.ts +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/map-view/map-view.component.d.ts.map +1 -1
- 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/auth/auth.service.ts +4 -1
- package/src/libs/api/repository/src/lib/gn4/platform/gn4-platform.mapper.ts +12 -4
- 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/data-access/gn4/src/openapi/model/user.api.model.ts +1 -1
- 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/map-view/map-view.component.ts +1 -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/error/error.component.html +5 -1
- 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 +58 -16
- 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 +11 -5
- package/translations/es.json +9 -2
- package/translations/fr.json +11 -4
- package/translations/it.json +12 -5
- 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
|
@@ -512,6 +512,8 @@ export class Gn4FieldMapper {
|
|
|
512
512
|
/^OGC:WMTS/.test(protocol) ||
|
|
513
513
|
/TMS/i.test(protocol) ||
|
|
514
514
|
/ogc\W*api\W*features/i.test(protocol) ||
|
|
515
|
+
/^DB:POSTGIS/i.test(protocol) ||
|
|
516
|
+
/stac\W*items/i.test(protocol) ||
|
|
515
517
|
(/^WWW:DOWNLOAD-/.test(protocol) && /data.geopf.fr/.test(url)) // TO DO : change with the good protocol when decided
|
|
516
518
|
) {
|
|
517
519
|
return 'service'
|
|
@@ -33,7 +33,10 @@ export class AuthService {
|
|
|
33
33
|
return baseUrl
|
|
34
34
|
.replace(
|
|
35
35
|
'${current_url}',
|
|
36
|
-
new URL(
|
|
36
|
+
new URL(
|
|
37
|
+
this.location.prepareExternalUrl(this.location.path()),
|
|
38
|
+
window.location.href
|
|
39
|
+
).toString()
|
|
37
40
|
)
|
|
38
41
|
.replace('${lang2}', toLang2(this.translateService.currentLang))
|
|
39
42
|
.replace('${lang3}', toLang3(this.translateService.currentLang))
|
|
@@ -43,18 +43,26 @@ export class Gn4PlatformMapper {
|
|
|
43
43
|
userFromApi(apiUser: UserApiModel): UserModel {
|
|
44
44
|
if (!apiUser) return null
|
|
45
45
|
const {
|
|
46
|
-
|
|
46
|
+
addresses,
|
|
47
47
|
emailAddresses,
|
|
48
|
-
|
|
48
|
+
enabled,
|
|
49
|
+
id,
|
|
49
50
|
kind,
|
|
50
51
|
lastLoginDate,
|
|
52
|
+
security,
|
|
53
|
+
primaryAddress,
|
|
54
|
+
authorities,
|
|
51
55
|
accountNonExpired,
|
|
52
56
|
accountNonLocked,
|
|
53
|
-
id,
|
|
54
57
|
credentialsNonExpired,
|
|
55
58
|
...user
|
|
56
59
|
} = apiUser
|
|
57
|
-
|
|
60
|
+
|
|
61
|
+
return {
|
|
62
|
+
...user,
|
|
63
|
+
id: id.toString(),
|
|
64
|
+
email: emailAddresses ? emailAddresses[0] || '' : '',
|
|
65
|
+
} as UserModel
|
|
58
66
|
}
|
|
59
67
|
|
|
60
68
|
keywordsFromApi(
|
|
@@ -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
|
})
|
|
@@ -21,7 +21,7 @@ export interface UserApiModel {
|
|
|
21
21
|
emailAddresses?: Set<string>
|
|
22
22
|
addresses?: Set<AddressApiModel>
|
|
23
23
|
primaryAddress?: AddressApiModel
|
|
24
|
-
|
|
24
|
+
organisation?: string
|
|
25
25
|
kind?: string
|
|
26
26
|
lastLoginDate?: string
|
|
27
27
|
authorities?: Array<GrantedAuthorityApiModel>
|
|
@@ -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
|
+
}
|
|
@@ -114,6 +114,7 @@ export class MapViewComponent implements AfterViewInit {
|
|
|
114
114
|
_styleFromConfig = null
|
|
115
115
|
|
|
116
116
|
linkMap: Map<string, DatasetOnlineResource> = new Map()
|
|
117
|
+
// FIXME the map view component should not need a selectedView
|
|
117
118
|
@Input() set selectedView(value: string) {
|
|
118
119
|
this.selectedView$.next(value)
|
|
119
120
|
}
|
|
@@ -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,5 +1,9 @@
|
|
|
1
1
|
<div
|
|
2
|
-
class="p-[1.7em]
|
|
2
|
+
class="p-[1.7em] text-[1.5em] text-center rounded-lg"
|
|
3
|
+
[ngClass]="{
|
|
4
|
+
'bg-red-50 text-red-800': type !== types.DATASET_HAS_NO_LINK,
|
|
5
|
+
'bg-gray-100 text-black': type === types.DATASET_HAS_NO_LINK,
|
|
6
|
+
}"
|
|
3
7
|
>
|
|
4
8
|
<div
|
|
5
9
|
*ngIf="type === types.COULD_NOT_REACH_API"
|
|
@@ -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
|
}
|