From 89fa15583a710e7759611ac10b4f10ba55afe109 Mon Sep 17 00:00:00 2001 From: mmohad Date: Wed, 11 Sep 2024 16:02:51 +0200 Subject: [PATCH 01/21] Add(IGN-dwonload): add api card to request Ign download api --- apps/datahub/src/app/app.module.ts | 8 +- .../record-apis/record-apis.component.html | 19 +- .../record-apis/record-apis.component.spec.ts | 2 +- .../record-apis/record-apis.component.ts | 5 +- .../src/lib/common/distribution.mapper.ts | 1 + .../src/lib/gn4/gn4.field.mapper.ts | 3 +- .../src/lib/model/record/metadata.model.ts | 1 + libs/feature/record/src/index.ts | 1 + .../record/src/lib/feature-record.module.ts | 13 + .../lib/ign-api-dl/ign-api-dl.component.css | 22 ++ .../lib/ign-api-dl/ign-api-dl.component.html | 108 ++++++++ .../ign-api-dl/ign-api-dl.component.spec.ts | 150 +++++++++++ .../lib/ign-api-dl/ign-api-dl.component.ts | 249 ++++++++++++++++++ .../ign-api-produit.component.css | 0 .../ign-api-produit.component.html | 37 +++ .../ign-api-produit.component.ts | 45 ++++ .../record/src/lib/state/mdview.facade.ts | 10 +- .../src/lib/api-card/api-card.component.html | 11 + .../src/lib/api-card/api-card.component.ts | 3 +- .../src/lib/links/link-classifier.service.ts | 2 + translations/en.json | 2 + translations/fr.json | 2 + 22 files changed, 684 insertions(+), 10 deletions(-) create mode 100644 libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.css create mode 100644 libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.html create mode 100644 libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.spec.ts create mode 100644 libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts create mode 100644 libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.css create mode 100644 libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.html create mode 100644 libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.ts diff --git a/apps/datahub/src/app/app.module.ts b/apps/datahub/src/app/app.module.ts index 5e40bd2a8d..4d85c9c4eb 100644 --- a/apps/datahub/src/app/app.module.ts +++ b/apps/datahub/src/app/app.module.ts @@ -36,6 +36,7 @@ import { import { UiInputsModule } from '@geonetwork-ui/ui/inputs' import { UiLayoutModule } from '@geonetwork-ui/ui/layout' import { UiSearchModule } from '@geonetwork-ui/ui/search' +import { IgnApiDlComponent } from '@geonetwork-ui/feature/record' import { getGlobalConfig, getMapContextLayerFromConfig, @@ -103,6 +104,7 @@ import { } from '@ng-icons/material-icons/outline' import { NgIconsModule, provideNgIconsConfig } from '@ng-icons/core' import { MAX_FEATURE_COUNT } from './record/record-data-preview/record-data-preview.component' +import { MatButtonToggleModule } from '@angular/material/button-toggle' export const metaReducers: MetaReducer[] = !environment.production ? [] : [] @@ -176,6 +178,7 @@ export const metaReducers: MetaReducer[] = !environment.production ? [] : [] }), OrganisationsComponent, LanguageSwitcherComponent, + MatButtonToggleModule, ], providers: [ provideNgIconsConfig({ @@ -273,10 +276,7 @@ export const metaReducers: MetaReducer[] = !environment.production ? [] : [] bootstrap: [AppComponent], }) export class AppModule { - constructor( - router: Router, - @Inject(DOCUMENT) private document: Document - ) { + constructor(router: Router, @Inject(DOCUMENT) private document: Document) { ThemeService.applyCssVariables( getThemeConfig().PRIMARY_COLOR, getThemeConfig().SECONDARY_COLOR, diff --git a/apps/datahub/src/app/record/record-apis/record-apis.component.html b/apps/datahub/src/app/record/record-apis/record-apis.component.html index c2fe71348d..c70cb24888 100644 --- a/apps/datahub/src/app/record/record-apis/record-apis.component.html +++ b/apps/datahub/src/app/record/record-apis/record-apis.component.html @@ -38,9 +38,20 @@
-

+

record.metadata.api.form.title

+

+ record.metadata.api.form.title.gpf +

+ +
diff --git a/apps/datahub/src/app/record/record-apis/record-apis.component.spec.ts b/apps/datahub/src/app/record/record-apis/record-apis.component.spec.ts index 4581894788..b3a65b02db 100644 --- a/apps/datahub/src/app/record/record-apis/record-apis.component.spec.ts +++ b/apps/datahub/src/app/record/record-apis/record-apis.component.spec.ts @@ -50,7 +50,7 @@ describe('RecordApisComponent', () => { expect(component.selectedApiLink).toEqual(serviceDistributionMock) }) it('should update maxHeight for transition', () => { - expect(component.maxHeight).toEqual('500px') + expect(component.maxHeight).toEqual('700px') }) it('should update opacity for transition', () => { expect(component.opacity).toEqual(1) diff --git a/apps/datahub/src/app/record/record-apis/record-apis.component.ts b/apps/datahub/src/app/record/record-apis/record-apis.component.ts index 38fee9edb2..de5461c86b 100644 --- a/apps/datahub/src/app/record/record-apis/record-apis.component.ts +++ b/apps/datahub/src/app/record/record-apis/record-apis.component.ts @@ -46,6 +46,7 @@ export class RecordApisComponent implements OnInit { maxHeight = '0px' opacity = 0 + displayApiIgnForm: boolean selectedApiLink: DatasetServiceDistribution apiLinks$ = this.facade.apiLinks$ @@ -65,6 +66,8 @@ export class RecordApisComponent implements OnInit { } openRecordApiForm(link: DatasetServiceDistribution) { + this.displayApiIgnForm = + link.accessServiceProtocol === 'GPFDL' ? true : false this.selectedApiLink = link this.setStyle(link) } @@ -75,7 +78,7 @@ export class RecordApisComponent implements OnInit { } setStyle(link: DatasetServiceDistribution) { - this.maxHeight = link === undefined ? '0px' : '500px' + this.maxHeight = link === undefined ? '0px' : '700px' this.opacity = link === undefined ? 0 : 1 } } diff --git a/libs/api/metadata-converter/src/lib/common/distribution.mapper.ts b/libs/api/metadata-converter/src/lib/common/distribution.mapper.ts index e5d66e3b66..172fc2190c 100644 --- a/libs/api/metadata-converter/src/lib/common/distribution.mapper.ts +++ b/libs/api/metadata-converter/src/lib/common/distribution.mapper.ts @@ -7,6 +7,7 @@ export function matchProtocol(protocol: string): ServiceProtocol { if (/wps/i.test(protocol)) return 'wps' if (/ogc\W*api\W*features/i.test(protocol)) return 'ogcFeatures' if (/esri/i.test(protocol)) return 'esriRest' + if (/DOWNLOAD-1/i.test(protocol)) return 'GPFDL' return 'other' } diff --git a/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts b/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts index bc64feefac..ef8613048c 100644 --- a/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts +++ b/libs/api/metadata-converter/src/lib/gn4/gn4.field.mapper.ts @@ -394,7 +394,8 @@ export class Gn4FieldMapper { /^OGC:WMS/.test(protocol) || /^OGC:WFS/.test(protocol) || /^OGC:WMTS/.test(protocol) || - /ogc\W*api\W*features/i.test(protocol) + /ogc\W*api\W*features/i.test(protocol) || + /^WWW:DOWNLOAD-/.test(protocol) ) { return 'service' } diff --git a/libs/common/domain/src/lib/model/record/metadata.model.ts b/libs/common/domain/src/lib/model/record/metadata.model.ts index 29ef5d8a32..4bcb0cbfe2 100644 --- a/libs/common/domain/src/lib/model/record/metadata.model.ts +++ b/libs/common/domain/src/lib/model/record/metadata.model.ts @@ -129,6 +129,7 @@ export type ServiceProtocol = | 'wmts' | 'esriRest' | 'ogcFeatures' + | 'GPFDL' | 'other' export type OnlineResourceType = 'service' | 'download' | 'link' | 'endpoint' diff --git a/libs/feature/record/src/index.ts b/libs/feature/record/src/index.ts index c16e284f2a..44f45b315b 100644 --- a/libs/feature/record/src/index.ts +++ b/libs/feature/record/src/index.ts @@ -9,3 +9,4 @@ export * from './lib/external-viewer-button/external-viewer-button.component' export * from './lib/map-view/map-view.component' export * from './lib/record-meta/record-meta.component' export * from './lib/external-viewer-button/external-viewer-button.component' +export * from './lib/ign-api-dl/ign-api-dl.component' diff --git a/libs/feature/record/src/lib/feature-record.module.ts b/libs/feature/record/src/lib/feature-record.module.ts index eeca003147..c41670aea7 100644 --- a/libs/feature/record/src/lib/feature-record.module.ts +++ b/libs/feature/record/src/lib/feature-record.module.ts @@ -12,6 +12,8 @@ import { METADATA_VIEW_FEATURE_STATE_KEY, reducer, } from './state/mdview.reducer' +import { IgnApiDlComponent } from './ign-api-dl/ign-api-dl.component' +import { IgnApiProduitComponent } from './ign-api-produit/ign-api-produit.component' import { MatTabsModule } from '@angular/material/tabs' import { UiWidgetsModule } from '@geonetwork-ui/ui/widgets' import { TranslateModule } from '@ngx-translate/core' @@ -20,6 +22,16 @@ import { TableComponent } from '@geonetwork-ui/ui/dataviz' import { NgIconsModule, provideNgIconsConfig } from '@ng-icons/core' @NgModule({ + declarations: [ + MapViewComponent, + DataViewComponent, + ExternalViewerButtonComponent, + DataViewPermalinkComponent, + DataViewWebComponentComponent, + DataViewShareComponent, + IgnApiDlComponent, + IgnApiProduitComponent, + ], imports: [ CommonModule, StoreModule.forFeature(METADATA_VIEW_FEATURE_STATE_KEY, reducer), @@ -40,6 +52,7 @@ import { NgIconsModule, provideNgIconsConfig } from '@ng-icons/core' provideNgIconsConfig({ size: '1.5em', }), + IgnApiDlComponent, ], }) export class FeatureRecordModule {} diff --git a/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.css b/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.css new file mode 100644 index 0000000000..0aa4ba7d0b --- /dev/null +++ b/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.css @@ -0,0 +1,22 @@ +:host ::ng-deep input { + color: black; + opacity: 1; +} + +:host ::ng-deep gn-ui-copy-text-button input[type='text'] { + color: black; + background-color: white; +} + +:host ::ng-deep gn-ui-copy-text-button button, +host ::ng-deep gn-ui-copy-text-button button:hover { + background-color: var(--color-secondary) !important; +} + +:host ::ng-deep gn-ui-copy-text-button button mat-icon { + color: white !important; + opacity: 1 !important; +} +:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon { + color: lightgrey !important; +} diff --git a/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.html b/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.html new file mode 100644 index 0000000000..3dc41b5f21 --- /dev/null +++ b/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.html @@ -0,0 +1,108 @@ +
+
+
+
+ record.metadata.api.form.create +
+ +
+
+
+ + + +
+
+ + + +
+
+ + + +
+
+
+
+ + + +
+
+ +
+
+ + +
+ +
+
+
+
+ {{ page$.value }}/{{ pageMax$ | async }} +
+
+
+ +
+
+ + +
+
+
+
+
diff --git a/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.spec.ts b/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.spec.ts new file mode 100644 index 0000000000..78d9cb64a6 --- /dev/null +++ b/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.spec.ts @@ -0,0 +1,150 @@ +import { TestBed, ComponentFixture } from '@angular/core/testing' + +import { DatasetServiceDistribution } from '@geonetwork-ui/common/domain/model/record' +import { firstValueFrom } from 'rxjs' +import { Choice, UiInputsModule } from '@geonetwork-ui/ui/inputs' +import { TranslateModule } from '@ngx-translate/core' +import { IgnApiDlComponent } from './ign-api-dl.component' +import { HttpClientTestingModule } from '@angular/common/http/testing' +import exp from 'constants' + +const mockDatasetServiceDistribution: DatasetServiceDistribution = { + url: new URL('https://api.example.com/data'), + type: 'service', + accessServiceProtocol: 'GPFDL', +} + +describe('IgnApiDlComponent', () => { + let component: IgnApiDlComponent + let fixture: ComponentFixture + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [IgnApiDlComponent], + imports: [ + UiInputsModule, + HttpClientTestingModule, + TranslateModule.forRoot(), + ], + }).compileComponents() + + fixture = TestBed.createComponent(IgnApiDlComponent) + component = fixture.componentInstance + component.apiLink = mockDatasetServiceDistribution + }) + + it('should create', () => { + expect(component).toBeTruthy() + }) + describe('When panel is opened', () => { + it('should set the links and initial values correctly', async () => { + expect(component.apiBaseUrl).toBe('https://api.example.com/data') + expect(component.format$.getValue()).toBe('') + expect(component.zone$.getValue()).toBe('') + expect(component.crs$.getValue()).toBe('') + const url = await firstValueFrom(component.apiQueryUrl$) + expect(url).toBe('https://api.example.com/data?pageSize=200&page=0') + //expect(component.apiLink.accessServiceProtocol).toBe('GPFDL') + }) + }) + describe('When URL params are changed', () => { + describe('When Format changed', () => { + const bucketFormat: Choice[] = [ + { value: 'SHP', label: 'SHP' }, + { value: 'json', label: 'json' }, + { value: 'SQL', label: 'SQL' }, + ] + const mockFormat = 'SHP' + const mockBadFormat = 'notAFormat' + it('should be a correct format', async () => { + jest.spyOn(component, 'resetPage') + component.bucketPromisesFormat = bucketFormat + component.setFormat(mockFormat) + expect(component.format$.getValue()).toBe(mockFormat) + expect(component.resetPage).toHaveBeenCalled() + }) + + it('should not be a correct format', async () => { + component.bucketPromisesFormat = bucketFormat + component.setFormat(mockBadFormat) + expect(component.format$.getValue()).toBe('') + }) + }) + describe('When CRS changed', () => { + const bucketCRS: Choice[] = [ + { value: 'CRS12', label: 'CRS1' }, + { value: 'CRS2', label: 'CRS2' }, + { value: 'CRS3', label: 'CRS3' }, + ] + const mockCRS = 'CRS12' + const mockBadCRS = 'notACRS' + it('should be a correct CRS', async () => { + jest.spyOn(component, 'resetPage') + component.bucketPromisesCrs = bucketCRS + component.setCrs(mockCRS) + expect(component.crs$.getValue()).toBe(mockCRS) + expect(component.resetPage).toHaveBeenCalled() + }) + + it('should not be a correct CRS', async () => { + component.bucketPromisesCrs = bucketCRS + component.setCrs(mockBadCRS) + expect(component.crs$.getValue()).toBe('') + }) + }) + describe('When Zone changed', () => { + const bucketZone: Choice[] = [ + { value: 'D01', label: 'D01' }, + { value: 'D02', label: 'D02' }, + { value: 'D03', label: 'D03' }, + ] + const mockZone = 'D03' + const mockBadZone = 'notAZone' + it('should be a correct Zone', async () => { + jest.spyOn(component, 'resetPage') + component.bucketPromisesZone = bucketZone + component.setZone(mockZone) + expect(component.zone$.getValue()).toBe(mockZone) + expect(component.resetPage).toHaveBeenCalled() + }) + + it('should not be a correct Zone', async () => { + component.bucketPromisesZone = bucketZone + component.setZone(mockBadZone) + expect(component.zone$.getValue()).toBe('') + }) + }) + + describe('When EditionDate changed', () => { + const mockEditionDate = '2022-04-30' + const mockBadEditionDate = '88-88-88' + it('hould be a correct edition date', () => { + jest.spyOn(component, 'resetPage') + component.setEditionDate(mockEditionDate) + expect(component.editionDate$.getValue()).toBe(mockEditionDate) + expect(component.resetPage).toHaveBeenCalled() + }) + it('should not be a correct edition date', () => { + component.setEditionDate(mockBadEditionDate) + expect(component.editionDate$.getValue()).toBe('') + }) + }) + + describe('When Url is reset', () => { + it('Should reset zone, format, crs, page and size value', () => { + component.resetUrl() + expect(component.zone$.getValue()).toBe('null') + expect(component.format$.getValue()).toBe('null') + expect(component.crs$.getValue()).toBe('null') + expect(component.page$.getValue()).toBe('0') + }) + }) + + describe('When page is reset', () => { + it('Should reset page value', () => { + component.resetPage() + expect(component.page$.getValue()).toBe('0') + }) + }) + }) +}) diff --git a/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts b/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts new file mode 100644 index 0000000000..a741abd5ec --- /dev/null +++ b/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts @@ -0,0 +1,249 @@ +import { + ChangeDetectionStrategy, + Component, + Input, + OnInit, +} from '@angular/core' +import { DatasetServiceDistribution } from '@geonetwork-ui/common/domain/model/record' +import { BehaviorSubject, Observable, combineLatest, map, mergeMap } from 'rxjs' +import { HttpClient } from '@angular/common/http' +import { Choice } from '@geonetwork-ui/ui/inputs' +import axios from 'axios' + +export interface Label { + label: string +} + +export interface FormatProduit { + title: string + update: string + format: Array + zone: Array +} + +export interface FormatSortieProduit { + label: string + value: string | number +} +export interface ListUrl { + url: string +} + +export interface listChoice { + zone: Choice[] + format: Choice[] + editionDate: Choice[] + crs: Choice[] +} + +export interface TermBucket { + term: string + label: string | number +} + +export interface Field { + entry: Array + link: any +} + +@Component({ + selector: 'gn-ui-ign-api-dl', + templateUrl: './ign-api-dl.component.html', + styleUrls: ['./ign-api-dl.component.css'], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class IgnApiDlComponent implements OnInit { + isOpen = false + collapsed = false + initialLimit = 50 + apiBaseUrl: string + editionDate$ = new BehaviorSubject('') + zone$ = new BehaviorSubject('') + format$ = new BehaviorSubject('') + crs$ = new BehaviorSubject('') + page$ = new BehaviorSubject(1) + // a passer en config + url = + 'https://data.geopf.fr/telechargement/capabilities?outputFormat=application/json' + choices: any + bucketPromisesZone: Choice[] + bucketPromisesFormat: Choice[] + bucketPromisesCrs: Choice[] + + constructor(protected http: HttpClient) {} + + @Input() set apiLink(value: DatasetServiceDistribution) { + this.apiBaseUrl = value ? value.url.href : undefined + } + + ngOnInit(): void { + this.bucketPromisesZone = [{ value: '', label: 'ZONE' }] + this.bucketPromisesFormat = [{ value: '', label: 'FORMAT' }] + this.bucketPromisesCrs = [{ value: '', label: 'CRS' }] + this.getFields() + } + + apiQueryUrl$ = combineLatest([ + this.zone$, + this.format$, + this.editionDate$, + this.crs$, + this.page$, + ]).pipe( + map(([zone, format, editionDate, crs, page]) => { + let outputUrl + if (this.apiBaseUrl) { + const url = new URL(this.apiBaseUrl) // initialisation de l'url avec l'url de base + const params = { + zone: zone, + format: format, + editionDate: editionDate, + crs: crs, + page: page, + } // initialisation des paramètres de filtres + for (const [key, value] of Object.entries(params)) { + if (value && value !== 'null') { + url.searchParams.set(key, String(value)) + } else { + url.searchParams.delete(key) + } + } + outputUrl = url.toString() + } else { + console.error('erreur apibaseUrl null') + } + return outputUrl + }) + // startWith(() => this.apiBaseUrl) + ) + + listFilteredProduct$ = this.apiQueryUrl$.pipe( + mergeMap((url) => { + console.log(url) + + return this.getFilteredProduct$(url).pipe( + map((response) => response['entry']) + // startWith([]) + ) + }) + ) + + pageMax$ = this.apiQueryUrl$.pipe( + mergeMap((url) => { + return this.getFilteredProduct$(url).pipe( + map((response) => + Math.ceil(response['totalentries'] / Number(this.initialLimit)) + ) + ) + }) + ) + + getFilteredProduct$(url): Observable { + return this.http.get(url) + } + + getLinkFormat(produit): string { + return produit['format'][0]['label'] + } + + setEditionDate(value: string) { + if (value.match(/[0-9]{4}-[0-1][0-9]-[0-3][0-9]/)) { + this.editionDate$.next(value) + this.resetPage() + } + } + + setZone(value: string) { + if (this.bucketPromisesZone.map((choice) => choice.value).includes(value)) { + this.zone$.next(value) + this.resetPage() + } + } + + setCrs(value: string) { + if (this.bucketPromisesCrs.map((choice) => choice.value).includes(value)) { + this.crs$.next(value) + this.resetPage() + } + } + + setFormat(value: string) { + if ( + this.bucketPromisesFormat.map((choice) => choice.value).includes(value) + ) { + this.format$.next(value) + this.resetPage() + } + } + + resetUrl() { + // this.offset$.next(DEFAULT_PARAMS.OFFSET) + this.zone$.next('null') + this.format$.next('null') + this.crs$.next('null') + this.page$.next(1) + } + moreResult(): void { + this.page$.next(this.page$.value + 1) + } + + lessResult(): void { + this.page$.next(this.page$.value - 1) + } + + resetPage(): void { + this.page$.next(1) + } + + async getCapabilities() { + let page = 0 + let choicesTest = undefined + let pageCount = 1 + + while (choicesTest === undefined && pageCount > page) { + const response = await axios.get( + this.url.concat(`&limit=200&page=${page}`) + ) + + choicesTest = response.data.entry.filter( + (element) => element['id'] == this.apiBaseUrl + )[0] + page += 1 + pageCount = response.data.pagecount + } + + return choicesTest + } + async getFields() { + this.choices = await this.getCapabilities() + + const tempZone = this.choices.zone.map((bucket) => ({ + value: bucket.label, + label: bucket.term, + })) + tempZone.sort((a, b) => (a.label > b.label ? 1 : -1)) + tempZone.unshift({ value: 'null', label: 'ZONE' }) + + this.bucketPromisesZone = tempZone + + const tempFormat = this.choices.format.map((bucket) => ({ + value: bucket.label, + label: bucket.term, + })) + tempFormat.sort((a, b) => (a.label > b.label ? 1 : -1)) + tempFormat.unshift({ value: 'null', label: 'FORMAT' }) + + this.bucketPromisesFormat = tempFormat + + const tempCrs = this.choices.category.map((bucket) => ({ + value: bucket.label, + label: bucket.label, + })) + tempCrs.sort((a, b) => (a.label > b.label ? 1 : -1)) + tempCrs.unshift({ value: 'null', label: 'CRS' }) + + this.bucketPromisesCrs = tempCrs + + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + } +} diff --git a/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.css b/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.html b/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.html new file mode 100644 index 0000000000..c413764ffa --- /dev/null +++ b/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.html @@ -0,0 +1,37 @@ + + + diff --git a/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.ts b/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.ts new file mode 100644 index 0000000000..e3ecbfc07f --- /dev/null +++ b/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.ts @@ -0,0 +1,45 @@ +import { HttpClient, HttpErrorResponse } from '@angular/common/http' +import { + ChangeDetectionStrategy, + Component, + EventEmitter, + Input, + OnInit, + Output, +} from '@angular/core' +import { Observable, catchError, map, mergeMap, tap, throwError } from 'rxjs' + +@Component({ + selector: 'gn-ui-ign-api-produit', + templateUrl: './ign-api-produit.component.html', + styleUrls: ['./ign-api-produit.component.css'], +}) +export class IgnApiProduitComponent implements OnInit { + @Input() link + @Input() color: string + @Input() format: string + @Input() isFromWfs: boolean + + constructor(protected http: HttpClient) {} + liste$: Observable + + ngOnInit(): void { + this.liste$ = this.http + .get(this.link['id']) + .pipe(map((response) => response['entry'])) + } + + downloadListe(): void { + this.http + .get(this.link['id']) + .pipe( + map((response) => response['entry']), + mergeMap((response) => response) + ) + .subscribe((reponse) => this.download(reponse['id'])) + } + + download(url): void { + this.http.get(url).subscribe() + } +} diff --git a/libs/feature/record/src/lib/state/mdview.facade.ts b/libs/feature/record/src/lib/state/mdview.facade.ts index 02c869e5d5..faed694ccf 100644 --- a/libs/feature/record/src/lib/state/mdview.facade.ts +++ b/libs/feature/record/src/lib/state/mdview.facade.ts @@ -15,6 +15,7 @@ import { LinkClassifierService, LinkUsage } from '@geonetwork-ui/util/shared' import { DatavizConfigurationModel } from '@geonetwork-ui/common/domain/model/dataviz/dataviz-configuration.model' import { CatalogRecord, + DatasetServiceDistribution, UserFeedback, } from '@geonetwork-ui/common/domain/model/record' import { AvatarServiceInterface } from '@geonetwork-ui/api/repository' @@ -72,7 +73,14 @@ export class MdViewFacade { apiLinks$ = this.allLinks$.pipe( map((links) => - links.filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.API)) + links + .filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.API)) + .sort((dd1, dd2) => { + return (dd2 as DatasetServiceDistribution).accessServiceProtocol === + 'GPFDL' + ? 1 + : -1 + }) ) ) diff --git a/libs/ui/elements/src/lib/api-card/api-card.component.html b/libs/ui/elements/src/lib/api-card/api-card.component.html index 5f5e83823a..e55631ee3f 100644 --- a/libs/ui/elements/src/lib/api-card/api-card.component.html +++ b/libs/ui/elements/src/lib/api-card/api-card.component.html @@ -9,12 +9,23 @@
{{ link.accessServiceProtocol }} + + record.metadata.api.gpfdl
Date: Fri, 27 Dec 2024 14:57:33 +0100 Subject: [PATCH 02/21] fix(import): fix wrong import --- .../record/record-apis/record-apis.component.html | 7 +++---- .../record/record-apis/record-apis.component.ts | 15 +++++++++------ .../record/src/lib/feature-record.module.ts | 15 ++++----------- .../src/lib/ign-api-dl/ign-api-dl.component.html | 1 + .../ign-api-produit/ign-api-produit.component.ts | 1 + 5 files changed, 18 insertions(+), 21 deletions(-) diff --git a/apps/datahub/src/app/record/record-apis/record-apis.component.html b/apps/datahub/src/app/record/record-apis/record-apis.component.html index c70cb24888..47797f8b70 100644 --- a/apps/datahub/src/app/record/record-apis/record-apis.component.html +++ b/apps/datahub/src/app/record/record-apis/record-apis.component.html @@ -71,10 +71,9 @@
- + hello + hello
diff --git a/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.ts b/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.ts index e3ecbfc07f..b04f9c5afe 100644 --- a/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.ts +++ b/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.ts @@ -7,6 +7,7 @@ import { OnInit, Output, } from '@angular/core' +import { TranslateModule } from '@ngx-translate/core' import { Observable, catchError, map, mergeMap, tap, throwError } from 'rxjs' @Component({ From 6dfa834cfc30eec40f9555289ff1961d5c17dbc5 Mon Sep 17 00:00:00 2001 From: mmohad Date: Fri, 27 Dec 2024 15:01:17 +0100 Subject: [PATCH 03/21] fix(app): supress import not use --- apps/datahub/src/app/app.module.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/datahub/src/app/app.module.ts b/apps/datahub/src/app/app.module.ts index 4d85c9c4eb..3394b6494c 100644 --- a/apps/datahub/src/app/app.module.ts +++ b/apps/datahub/src/app/app.module.ts @@ -89,6 +89,7 @@ import { MatTabsModule } from '@angular/material/tabs' import { UiWidgetsModule } from '@geonetwork-ui/ui/widgets' import { LetDirective } from '@ngrx/component' import { OrganizationPageComponent } from './organization/organization-page/organization-page.component' + import { BASEMAP_LAYERS, DO_NOT_USE_DEFAULT_BASEMAP, From 195dd1e4e35d9d804783ddace402243be4e5c0a3 Mon Sep 17 00:00:00 2001 From: mmohad Date: Fri, 27 Dec 2024 15:01:38 +0100 Subject: [PATCH 04/21] fix(ign-dl): supress hello --- .../src/app/record/record-apis/record-apis.component.html | 7 ++++--- .../record/src/lib/ign-api-dl/ign-api-dl.component.html | 1 - 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/datahub/src/app/record/record-apis/record-apis.component.html b/apps/datahub/src/app/record/record-apis/record-apis.component.html index 47797f8b70..c70cb24888 100644 --- a/apps/datahub/src/app/record/record-apis/record-apis.component.html +++ b/apps/datahub/src/app/record/record-apis/record-apis.component.html @@ -71,9 +71,10 @@
- hello + - hello
From 51098c12ee258099fb505a60c3f573cf95f06971 Mon Sep 17 00:00:00 2001 From: mmohad Date: Fri, 27 Dec 2024 15:02:37 +0100 Subject: [PATCH 05/21] fix(ign-dl):supress console.log --- .../datahub/src/app/record/record-apis/record-apis.component.ts | 2 -- libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts | 2 -- 2 files changed, 4 deletions(-) diff --git a/apps/datahub/src/app/record/record-apis/record-apis.component.ts b/apps/datahub/src/app/record/record-apis/record-apis.component.ts index 6ee71dfff9..6edc2bb19c 100644 --- a/apps/datahub/src/app/record/record-apis/record-apis.component.ts +++ b/apps/datahub/src/app/record/record-apis/record-apis.component.ts @@ -69,8 +69,6 @@ export class RecordApisComponent implements OnInit { openRecordApiForm(link: DatasetServiceDistribution) { this.displayApiIgnForm = link.accessServiceProtocol === 'GPFDL' - console.log(this.displayApiIgnForm) - this.selectedApiLink = link this.setStyle(link) } diff --git a/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts b/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts index a741abd5ec..9cc9507042 100644 --- a/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts +++ b/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts @@ -119,8 +119,6 @@ export class IgnApiDlComponent implements OnInit { listFilteredProduct$ = this.apiQueryUrl$.pipe( mergeMap((url) => { - console.log(url) - return this.getFilteredProduct$(url).pipe( map((response) => response['entry']) // startWith([]) From 14cc02576d7eed074edb6f1480e0a4289152bf02 Mon Sep 17 00:00:00 2001 From: mmohad Date: Fri, 27 Dec 2024 15:04:43 +0100 Subject: [PATCH 06/21] fix(records): pass two paragraph to one --- .../record/record-apis/record-apis.component.html | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/apps/datahub/src/app/record/record-apis/record-apis.component.html b/apps/datahub/src/app/record/record-apis/record-apis.component.html index c70cb24888..2e9e4b90b9 100644 --- a/apps/datahub/src/app/record/record-apis/record-apis.component.html +++ b/apps/datahub/src/app/record/record-apis/record-apis.component.html @@ -40,17 +40,14 @@

- record.metadata.api.form.title -

-

- record.metadata.api.form.title.gpf + {{ + selectedApiLink?.accessServiceProtocol === 'GPFDL' + ? 'record.metadata.api.form.title.gpf' + : 'record.metadata.api.form.title' + }}

-
-
- Date: Fri, 27 Dec 2024 15:09:28 +0100 Subject: [PATCH 08/21] fix(ign): change to upper case --- libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts b/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts index 9cc9507042..2575d72b83 100644 --- a/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts +++ b/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts @@ -29,7 +29,7 @@ export interface ListUrl { url: string } -export interface listChoice { +export interface ListChoice { zone: Choice[] format: Choice[] editionDate: Choice[] From cf35e0d2b385d0f0ee058f86670acc711df62b89 Mon Sep 17 00:00:00 2001 From: mmohad Date: Fri, 27 Dec 2024 15:09:43 +0100 Subject: [PATCH 09/21] fix(comment): supress not use comment --- .../feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts b/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts index 2575d72b83..62327e88c3 100644 --- a/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts +++ b/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts @@ -62,7 +62,6 @@ export class IgnApiDlComponent implements OnInit { format$ = new BehaviorSubject('') crs$ = new BehaviorSubject('') page$ = new BehaviorSubject(1) - // a passer en config url = 'https://data.geopf.fr/telechargement/capabilities?outputFormat=application/json' choices: any @@ -114,14 +113,12 @@ export class IgnApiDlComponent implements OnInit { } return outputUrl }) - // startWith(() => this.apiBaseUrl) ) listFilteredProduct$ = this.apiQueryUrl$.pipe( mergeMap((url) => { return this.getFilteredProduct$(url).pipe( map((response) => response['entry']) - // startWith([]) ) }) ) @@ -175,7 +172,6 @@ export class IgnApiDlComponent implements OnInit { } resetUrl() { - // this.offset$.next(DEFAULT_PARAMS.OFFSET) this.zone$.next('null') this.format$.next('null') this.crs$.next('null') From 979b5abcfb3864f97f30f41549c91a14d3a50a9b Mon Sep 17 00:00:00 2001 From: mmohad Date: Fri, 27 Dec 2024 15:29:05 +0100 Subject: [PATCH 10/21] fix(icon): migrate mat to ng-icon --- .../ign-api-produit/ign-api-produit.component.html | 10 +++++----- .../ign-api-produit/ign-api-produit.component.ts | 14 +++----------- 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.html b/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.html index c413764ffa..d6d0cbea56 100644 --- a/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.html +++ b/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.html @@ -26,12 +26,12 @@
diff --git a/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.ts b/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.ts index b04f9c5afe..700d1ef62d 100644 --- a/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.ts +++ b/libs/feature/record/src/lib/ign-api-produit/ign-api-produit.component.ts @@ -1,14 +1,6 @@ -import { HttpClient, HttpErrorResponse } from '@angular/common/http' -import { - ChangeDetectionStrategy, - Component, - EventEmitter, - Input, - OnInit, - Output, -} from '@angular/core' -import { TranslateModule } from '@ngx-translate/core' -import { Observable, catchError, map, mergeMap, tap, throwError } from 'rxjs' +import { HttpClient } from '@angular/common/http' +import { Component, Input, OnInit } from '@angular/core' +import { Observable, map, mergeMap } from 'rxjs' @Component({ selector: 'gn-ui-ign-api-produit', From b3248094ebab9f435a579cda49bfe54bb93444d7 Mon Sep 17 00:00:00 2001 From: mmohad Date: Fri, 27 Dec 2024 15:36:15 +0100 Subject: [PATCH 11/21] change(css): supress !important --- libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.css b/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.css index 0aa4ba7d0b..6e5deb7cff 100644 --- a/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.css +++ b/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.css @@ -10,7 +10,7 @@ :host ::ng-deep gn-ui-copy-text-button button, host ::ng-deep gn-ui-copy-text-button button:hover { - background-color: var(--color-secondary) !important; + background-color: var(--color-secondary); } :host ::ng-deep gn-ui-copy-text-button button mat-icon { From 315338235e67ee37cf4333d43c3623c0ba383421 Mon Sep 17 00:00:00 2001 From: mmohad Date: Wed, 8 Jan 2025 14:45:42 +0100 Subject: [PATCH 12/21] rename(gpf-api): renmae file ign-api-dl to gpf-api-dl --- apps/datahub/src/app/app.module.ts | 2 +- .../record/record-apis/record-apis.component.html | 4 ++-- libs/feature/record/src/index.ts | 1 + libs/feature/record/src/lib/feature-record.module.ts | 8 ++++---- .../gpf-api-dl-produit.component.css} | 0 .../gpf-api-dl-produit.component.html} | 0 .../gpf-api-dl-produit.component.ts} | 8 ++++---- .../gpf-api-dl.component.css} | 0 .../gpf-api-dl.component.html} | 4 ++-- .../gpf-api-dl.component.spec.ts} | 12 ++++++------ .../gpf-api-dl.component.ts} | 8 ++++---- 11 files changed, 24 insertions(+), 23 deletions(-) rename libs/feature/record/src/lib/{ign-api-produit/ign-api-produit.component.css => gpf-api-dl-produit/gpf-api-dl-produit.component.css} (100%) rename libs/feature/record/src/lib/{ign-api-produit/ign-api-produit.component.html => gpf-api-dl-produit/gpf-api-dl-produit.component.html} (100%) rename libs/feature/record/src/lib/{ign-api-produit/ign-api-produit.component.ts => gpf-api-dl-produit/gpf-api-dl-produit.component.ts} (79%) rename libs/feature/record/src/lib/{ign-api-dl/ign-api-dl.component.css => gpf-api-dl/gpf-api-dl.component.css} (100%) rename libs/feature/record/src/lib/{ign-api-dl/ign-api-dl.component.html => gpf-api-dl/gpf-api-dl.component.html} (97%) rename libs/feature/record/src/lib/{ign-api-dl/ign-api-dl.component.spec.ts => gpf-api-dl/gpf-api-dl.component.spec.ts} (94%) rename libs/feature/record/src/lib/{ign-api-dl/ign-api-dl.component.ts => gpf-api-dl/gpf-api-dl.component.ts} (97%) diff --git a/apps/datahub/src/app/app.module.ts b/apps/datahub/src/app/app.module.ts index 3394b6494c..c19fbb2069 100644 --- a/apps/datahub/src/app/app.module.ts +++ b/apps/datahub/src/app/app.module.ts @@ -36,7 +36,7 @@ import { import { UiInputsModule } from '@geonetwork-ui/ui/inputs' import { UiLayoutModule } from '@geonetwork-ui/ui/layout' import { UiSearchModule } from '@geonetwork-ui/ui/search' -import { IgnApiDlComponent } from '@geonetwork-ui/feature/record' +import { GpfApiDlComponent } from '@geonetwork-ui/feature/record' import { getGlobalConfig, getMapContextLayerFromConfig, diff --git a/apps/datahub/src/app/record/record-apis/record-apis.component.html b/apps/datahub/src/app/record/record-apis/record-apis.component.html index 2e9e4b90b9..5ab26c235f 100644 --- a/apps/datahub/src/app/record/record-apis/record-apis.component.html +++ b/apps/datahub/src/app/record/record-apis/record-apis.component.html @@ -68,10 +68,10 @@
- + >
- + >
diff --git a/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.spec.ts b/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.spec.ts similarity index 94% rename from libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.spec.ts rename to libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.spec.ts index 78d9cb64a6..56c8b3b62b 100644 --- a/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.spec.ts +++ b/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.spec.ts @@ -4,7 +4,7 @@ import { DatasetServiceDistribution } from '@geonetwork-ui/common/domain/model/r import { firstValueFrom } from 'rxjs' import { Choice, UiInputsModule } from '@geonetwork-ui/ui/inputs' import { TranslateModule } from '@ngx-translate/core' -import { IgnApiDlComponent } from './ign-api-dl.component' +import { GpfApiDlComponent as GpfApiDlComponent } from './gpf-api-dl.component' import { HttpClientTestingModule } from '@angular/common/http/testing' import exp from 'constants' @@ -14,13 +14,13 @@ const mockDatasetServiceDistribution: DatasetServiceDistribution = { accessServiceProtocol: 'GPFDL', } -describe('IgnApiDlComponent', () => { - let component: IgnApiDlComponent - let fixture: ComponentFixture +describe('GpfApiDlComponent', () => { + let component: GpfApiDlComponent + let fixture: ComponentFixture beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [IgnApiDlComponent], + declarations: [GpfApiDlComponent], imports: [ UiInputsModule, HttpClientTestingModule, @@ -28,7 +28,7 @@ describe('IgnApiDlComponent', () => { ], }).compileComponents() - fixture = TestBed.createComponent(IgnApiDlComponent) + fixture = TestBed.createComponent(GpfApiDlComponent) component = fixture.componentInstance component.apiLink = mockDatasetServiceDistribution }) diff --git a/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts b/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.ts similarity index 97% rename from libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts rename to libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.ts index 62327e88c3..4d546980ca 100644 --- a/libs/feature/record/src/lib/ign-api-dl/ign-api-dl.component.ts +++ b/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.ts @@ -47,12 +47,12 @@ export interface Field { } @Component({ - selector: 'gn-ui-ign-api-dl', - templateUrl: './ign-api-dl.component.html', - styleUrls: ['./ign-api-dl.component.css'], + selector: 'gn-ui-gpf-api-dl', + templateUrl: './gpf-api-dl.component.html', + styleUrls: ['./gpf-api-dl.component.css'], changeDetection: ChangeDetectionStrategy.OnPush, }) -export class IgnApiDlComponent implements OnInit { +export class GpfApiDlComponent implements OnInit { isOpen = false collapsed = false initialLimit = 50 From 57202a45d574a45e7ad36e47928a73a7885dcb16 Mon Sep 17 00:00:00 2001 From: mmohad Date: Wed, 8 Jan 2025 15:42:29 +0100 Subject: [PATCH 13/21] style(gpf-dla): make the form look less squished --- .../lib/gpf-api-dl/gpf-api-dl.component.css | 6 +- .../lib/gpf-api-dl/gpf-api-dl.component.html | 218 ++++++++++-------- translations/en.json | 19 +- translations/fr.json | 19 +- 4 files changed, 158 insertions(+), 104 deletions(-) diff --git a/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.css b/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.css index 6e5deb7cff..646edacfe9 100644 --- a/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.css +++ b/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.css @@ -10,13 +10,13 @@ :host ::ng-deep gn-ui-copy-text-button button, host ::ng-deep gn-ui-copy-text-button button:hover { - background-color: var(--color-secondary); + background-color: var(--color-secondary) !important; } -:host ::ng-deep gn-ui-copy-text-button button mat-icon { +:host ::ng-deep gn-ui-copy-text-button button ng-icon { color: white !important; opacity: 1 !important; } -:host ::ng-deep gn-ui-copy-text-button button:hover mat-icon { +:host ::ng-deep gn-ui-copy-text-button button:hover ng-icon { color: lightgrey !important; } diff --git a/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.html b/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.html index d99fcb2128..f72df8af95 100644 --- a/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.html +++ b/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.html @@ -1,105 +1,125 @@ -
-
-
-
- record.metadata.api.form.create -
- +
+ + +
+ + + + + +
+ + +
+

+ record.metadata.api.form.items +

+
+
-

- record.metadata.api.form.reset -

- -
-
-
- - -
-
- - -
-
- - +
-
-
- - - -
-
- -
-
- - -
- -
-
-
-
- {{ page$.value }}/{{ pageMax$ | async }} -
-
-
- -
-
- - -
-
+
+ + +
+ +
+ {{ page$.value }}/{{ pageMax$ | async }}
+
diff --git a/translations/en.json b/translations/en.json index aeca1a54a8..a133e09cc9 100644 --- a/translations/en.json +++ b/translations/en.json @@ -405,19 +405,36 @@ "record.feature.limit": "The resource contains more than {count} features and cannot be displayed here.", "record.metadata.about": "Description", "record.metadata.api": "API", - "record.metadata.api.gpfdl": "Data download", "record.metadata.api.form.closeButton": "Close", "record.metadata.api.form.closeForm": "Close the form", "record.metadata.api.form.create": "Create your request", "record.metadata.api.form.customUrl": "Custom URL", + "record.metadata.api.form.filter": "Filters", + "record.metadata.api.form.filterDescription": "Section for refining displayed elements", + "record.metadata.api.form.formatTitle": "Format", + "record.metadata.api.form.formatTooltip": "Dropdown for selecting a element format", + "record.metadata.api.form.crsTitle": "Coordinate System", + "record.metadata.api.form.crsTooltip": "Dropdown for selecting a coordinate reference system", + "record.metadata.api.form.items": "Available Items", + "record.metadata.api.form.itemsDescription": "List of items", + "record.metadata.api.form.itemsTooltip": "Scroll to view all available items", "record.metadata.api.form.limit": "Number of records", "record.metadata.api.form.limit.all": "All", + "record.metadata.api.form.nextPage": "Next", + "record.metadata.api.form.nextPageTooltip": "Go to the next page", "record.metadata.api.form.offset": "Offset", "record.metadata.api.form.openForm": "Open the form", + "record.metadata.api.form.paginationDescription": "Pagination of displayed items", + "record.metadata.api.form.previousPage": "Previous", + "record.metadata.api.form.previousPageTooltip": "Go to the previous page", "record.metadata.api.form.reset": "Reset", + "record.metadata.api.form.resetTooltip": "Reset all filters", "record.metadata.api.form.title": "Generate a custom URL", "record.metadata.api.form.title.gpf": "Download data", "record.metadata.api.form.type": "Output format", + "record.metadata.api.form.zoneTitle": "Zone", + "record.metadata.api.form.zoneTooltip": "Dropdown for selecting a geographic zone", + "record.metadata.api.gpfdl": "Data download", "record.metadata.catalog": "Catalog", "record.metadata.contact": "Contact", "record.metadata.creation": "Date of creation", diff --git a/translations/fr.json b/translations/fr.json index 585f829483..781cd7e099 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -406,18 +406,35 @@ "record.metadata.about": "Description", "record.metadata.api": "API", "record.metadata.api.form.closeButton": "Fermer", - "record.metadata.api.gpfdl": "Téléchargement", "record.metadata.api.form.closeForm": "Fermer le panneau de personnalisation", "record.metadata.api.form.create": "Paramétrer votre requête", "record.metadata.api.form.customUrl": "URL personnalisée", + "record.metadata.api.form.filter": "Filtres", + "record.metadata.api.form.filterDescription": "Section pour affiner les éléments affichés", + "record.metadata.api.form.formatTitle": "Format", + "record.metadata.api.form.formatTooltip": "Menu déroulant pour sélectionner un format de données", + "record.metadata.api.form.crsTitle": "Système de coordonnées", + "record.metadata.api.form.crsTooltip": "Menu déroulant pour sélectionner un système de coordonnées (CRS)", + "record.metadata.api.form.items": "Eléments disponibles", + "record.metadata.api.form.itemsDescription": "Liste des éléments", + "record.metadata.api.form.itemsTooltip": "Faites défiler pour voir tous les éléments disponibles ou filtrés", "record.metadata.api.form.limit": "Nombre d'enregistrements", "record.metadata.api.form.limit.all": "Tous", + "record.metadata.api.form.nextPage": "Suivant", + "record.metadata.api.form.nextPageTooltip": "Aller à la page suivante", "record.metadata.api.form.offset": "Numéro du 1er enregistrement", "record.metadata.api.form.openForm": "Ouvrir le panneau de personnalisation", + "record.metadata.api.form.paginationDescription": "Pagination des éléments affichés", + "record.metadata.api.form.previousPage": "Précédent", + "record.metadata.api.form.previousPageTooltip": "Aller à la page précédente", "record.metadata.api.form.reset": "Réinitialiser", + "record.metadata.api.form.resetTooltip": "Réinitialiser tous les filtres", "record.metadata.api.form.title": "Générer une URL personnalisée", "record.metadata.api.form.title.gpf": "Téléchargement de données", "record.metadata.api.form.type": "Format en sortie", + "record.metadata.api.form.zoneTitle": "Zone", + "record.metadata.api.form.zoneTooltip": "Menu déroulant pour sélectionner une zone géographique", + "record.metadata.api.gpfdl": "Téléchargement", "record.metadata.catalog": "Catalogue", "record.metadata.contact": "Contact", "record.metadata.creation": "Date de création", From 9a538fb3a79d51fcec8c3a37344cfb14a6e571e5 Mon Sep 17 00:00:00 2001 From: mmohad Date: Tue, 28 Jan 2025 11:51:00 +0100 Subject: [PATCH 14/21] fix(filters): wrong label and term use --- .../record/src/lib/gpf-api-dl/gpf-api-dl.component.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.ts b/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.ts index 4d546980ca..51de3d540e 100644 --- a/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.ts +++ b/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.ts @@ -212,8 +212,8 @@ export class GpfApiDlComponent implements OnInit { this.choices = await this.getCapabilities() const tempZone = this.choices.zone.map((bucket) => ({ - value: bucket.label, - label: bucket.term, + value: bucket.term, + label: bucket.label, })) tempZone.sort((a, b) => (a.label > b.label ? 1 : -1)) tempZone.unshift({ value: 'null', label: 'ZONE' }) @@ -221,8 +221,8 @@ export class GpfApiDlComponent implements OnInit { this.bucketPromisesZone = tempZone const tempFormat = this.choices.format.map((bucket) => ({ - value: bucket.label, - label: bucket.term, + value: bucket.term, + label: bucket.label, })) tempFormat.sort((a, b) => (a.label > b.label ? 1 : -1)) tempFormat.unshift({ value: 'null', label: 'FORMAT' }) @@ -230,7 +230,7 @@ export class GpfApiDlComponent implements OnInit { this.bucketPromisesFormat = tempFormat const tempCrs = this.choices.category.map((bucket) => ({ - value: bucket.label, + value: bucket.term, label: bucket.label, })) tempCrs.sort((a, b) => (a.label > b.label ? 1 : -1)) From 9e7baea3e78a196dc932a021cede1bb70d151a44 Mon Sep 17 00:00:00 2001 From: mmohad Date: Tue, 28 Jan 2025 12:13:24 +0100 Subject: [PATCH 15/21] rename(gpf-dl) rename produit to list item --- libs/feature/record/src/lib/feature-record.module.ts | 4 ++-- .../gpf-api-dl-list-item.component.css} | 0 .../gpf-api-dl-list-item.component.html} | 0 .../gpf-api-dl-list-item.component.ts} | 8 ++++---- .../record/src/lib/gpf-api-dl/gpf-api-dl.component.html | 4 ++-- 5 files changed, 8 insertions(+), 8 deletions(-) rename libs/feature/record/src/lib/{gpf-api-dl-produit/gpf-api-dl-produit.component.css => gpf-api-dl-list-item/gpf-api-dl-list-item.component.css} (100%) rename libs/feature/record/src/lib/{gpf-api-dl-produit/gpf-api-dl-produit.component.html => gpf-api-dl-list-item/gpf-api-dl-list-item.component.html} (100%) rename libs/feature/record/src/lib/{gpf-api-dl-produit/gpf-api-dl-produit.component.ts => gpf-api-dl-list-item/gpf-api-dl-list-item.component.ts} (78%) diff --git a/libs/feature/record/src/lib/feature-record.module.ts b/libs/feature/record/src/lib/feature-record.module.ts index 8b201bc606..1bcd403aae 100644 --- a/libs/feature/record/src/lib/feature-record.module.ts +++ b/libs/feature/record/src/lib/feature-record.module.ts @@ -13,7 +13,7 @@ import { reducer, } from './state/mdview.reducer' import { GpfApiDlComponent } from './gpf-api-dl/gpf-api-dl.component' -import { GpfApiDlProduitComponent } from './gpf-api-dl-produit/gpf-api-dl-produit.component' +import { GpfApiDlListItemComponent } from './gpf-api-dl-list-item/gpf-api-dl-list-item.component' import { MatTabsModule } from '@angular/material/tabs' import { UiWidgetsModule } from '@geonetwork-ui/ui/widgets' import { TranslateModule } from '@ngx-translate/core' @@ -23,7 +23,7 @@ import { NgIconsModule, provideNgIconsConfig } from '@ng-icons/core' import { DropdownSelectorComponent } from '@geonetwork-ui/ui/inputs' @NgModule({ - declarations: [GpfApiDlComponent, GpfApiDlProduitComponent], + declarations: [GpfApiDlComponent, GpfApiDlListItemComponent], imports: [ CommonModule, StoreModule.forFeature(METADATA_VIEW_FEATURE_STATE_KEY, reducer), diff --git a/libs/feature/record/src/lib/gpf-api-dl-produit/gpf-api-dl-produit.component.css b/libs/feature/record/src/lib/gpf-api-dl-list-item/gpf-api-dl-list-item.component.css similarity index 100% rename from libs/feature/record/src/lib/gpf-api-dl-produit/gpf-api-dl-produit.component.css rename to libs/feature/record/src/lib/gpf-api-dl-list-item/gpf-api-dl-list-item.component.css diff --git a/libs/feature/record/src/lib/gpf-api-dl-produit/gpf-api-dl-produit.component.html b/libs/feature/record/src/lib/gpf-api-dl-list-item/gpf-api-dl-list-item.component.html similarity index 100% rename from libs/feature/record/src/lib/gpf-api-dl-produit/gpf-api-dl-produit.component.html rename to libs/feature/record/src/lib/gpf-api-dl-list-item/gpf-api-dl-list-item.component.html diff --git a/libs/feature/record/src/lib/gpf-api-dl-produit/gpf-api-dl-produit.component.ts b/libs/feature/record/src/lib/gpf-api-dl-list-item/gpf-api-dl-list-item.component.ts similarity index 78% rename from libs/feature/record/src/lib/gpf-api-dl-produit/gpf-api-dl-produit.component.ts rename to libs/feature/record/src/lib/gpf-api-dl-list-item/gpf-api-dl-list-item.component.ts index 80dfc26978..d4f2e09d25 100644 --- a/libs/feature/record/src/lib/gpf-api-dl-produit/gpf-api-dl-produit.component.ts +++ b/libs/feature/record/src/lib/gpf-api-dl-list-item/gpf-api-dl-list-item.component.ts @@ -3,11 +3,11 @@ import { Component, Input, OnInit } from '@angular/core' import { Observable, map, mergeMap } from 'rxjs' @Component({ - selector: 'gn-ui-gpf-api-dl-produit', - templateUrl: './gpf-api-dl-produit.component.html', - styleUrls: ['./gpf-api-dl-produit.component.css'], + selector: 'gn-ui-gpf-api-dl-list-item', + templateUrl: './gpf-api-dl-list-item.component.html', + styleUrls: ['./gpf-api-dl-list-item.component.css'], }) -export class GpfApiDlProduitComponent implements OnInit { +export class GpfApiDlListItemComponent implements OnInit { @Input() link @Input() color: string @Input() format: string diff --git a/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.html b/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.html index f72df8af95..b79e95bd6f 100644 --- a/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.html +++ b/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.html @@ -76,7 +76,7 @@ *ngFor="let link of listFilteredProduct$ | async" class="mb-2 sm:mb-3" > - + >
From d5d4b1726edd705990d95a7db4634efd482dbf02 Mon Sep 17 00:00:00 2001 From: mmohad Date: Tue, 28 Jan 2025 15:57:24 +0100 Subject: [PATCH 16/21] style(button): disabled and standalone componenent --- .../record-apis/record-apis.component.ts | 2 ++ .../record/src/lib/feature-record.module.ts | 4 +--- .../gpf-api-dl-list-item.component.ts | 5 +++++ .../lib/gpf-api-dl/gpf-api-dl.component.html | 21 ++++++++++++------- .../lib/gpf-api-dl/gpf-api-dl.component.ts | 12 ++++++++++- 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/apps/datahub/src/app/record/record-apis/record-apis.component.ts b/apps/datahub/src/app/record/record-apis/record-apis.component.ts index 6edc2bb19c..4bf3bff3f9 100644 --- a/apps/datahub/src/app/record/record-apis/record-apis.component.ts +++ b/apps/datahub/src/app/record/record-apis/record-apis.component.ts @@ -8,6 +8,7 @@ import { import { DatasetServiceDistribution } from '@geonetwork-ui/common/domain/model/record' import { FeatureRecordModule, + GpfApiDlComponent, MdViewFacade, } from '@geonetwork-ui/feature/record' import { CarouselComponent } from '@geonetwork-ui/ui/layout' @@ -36,6 +37,7 @@ import { TranslateModule } from '@ngx-translate/core' NgIcon, TranslateModule, FeatureRecordModule, + GpfApiDlComponent, ], viewProviders: [ provideIcons({ diff --git a/libs/feature/record/src/lib/feature-record.module.ts b/libs/feature/record/src/lib/feature-record.module.ts index 1bcd403aae..287395677a 100644 --- a/libs/feature/record/src/lib/feature-record.module.ts +++ b/libs/feature/record/src/lib/feature-record.module.ts @@ -13,7 +13,6 @@ import { reducer, } from './state/mdview.reducer' import { GpfApiDlComponent } from './gpf-api-dl/gpf-api-dl.component' -import { GpfApiDlListItemComponent } from './gpf-api-dl-list-item/gpf-api-dl-list-item.component' import { MatTabsModule } from '@angular/material/tabs' import { UiWidgetsModule } from '@geonetwork-ui/ui/widgets' import { TranslateModule } from '@ngx-translate/core' @@ -23,7 +22,6 @@ import { NgIconsModule, provideNgIconsConfig } from '@ng-icons/core' import { DropdownSelectorComponent } from '@geonetwork-ui/ui/inputs' @NgModule({ - declarations: [GpfApiDlComponent, GpfApiDlListItemComponent], imports: [ CommonModule, StoreModule.forFeature(METADATA_VIEW_FEATURE_STATE_KEY, reducer), @@ -39,6 +37,7 @@ import { DropdownSelectorComponent } from '@geonetwork-ui/ui/inputs' TableComponent, NgIconsModule, DropdownSelectorComponent, + GpfApiDlComponent, ], providers: [ MdViewFacade, @@ -46,6 +45,5 @@ import { DropdownSelectorComponent } from '@geonetwork-ui/ui/inputs' size: '1.5em', }), ], - exports: [GpfApiDlComponent], }) export class FeatureRecordModule {} diff --git a/libs/feature/record/src/lib/gpf-api-dl-list-item/gpf-api-dl-list-item.component.ts b/libs/feature/record/src/lib/gpf-api-dl-list-item/gpf-api-dl-list-item.component.ts index d4f2e09d25..b72cd9461b 100644 --- a/libs/feature/record/src/lib/gpf-api-dl-list-item/gpf-api-dl-list-item.component.ts +++ b/libs/feature/record/src/lib/gpf-api-dl-list-item/gpf-api-dl-list-item.component.ts @@ -1,11 +1,16 @@ +import { CommonModule } from '@angular/common' import { HttpClient } from '@angular/common/http' import { Component, Input, OnInit } from '@angular/core' +import { NgIconsModule } from '@ng-icons/core' +import { TranslateModule } from '@ngx-translate/core' import { Observable, map, mergeMap } from 'rxjs' @Component({ selector: 'gn-ui-gpf-api-dl-list-item', templateUrl: './gpf-api-dl-list-item.component.html', styleUrls: ['./gpf-api-dl-list-item.component.css'], + standalone: true, + imports: [CommonModule, TranslateModule, NgIconsModule], }) export class GpfApiDlListItemComponent implements OnInit { @Input() link diff --git a/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.html b/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.html index b79e95bd6f..b69bb9e419 100644 --- a/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.html +++ b/libs/feature/record/src/lib/gpf-api-dl/gpf-api-dl.component.html @@ -93,9 +93,13 @@
diff --git a/apps/datahub/src/app/record/record-apis/record-apis.component.ts b/apps/datahub/src/app/record/record-apis/record-apis.component.ts index cda508971c..b4da674ad7 100644 --- a/apps/datahub/src/app/record/record-apis/record-apis.component.ts +++ b/apps/datahub/src/app/record/record-apis/record-apis.component.ts @@ -47,7 +47,6 @@ export class RecordApisComponent implements OnInit { maxHeight = '0px' opacity = 0 - displayApiIgnForm: boolean selectedApiLink: DatasetServiceDistribution apiLinks$ = this.facade.apiLinks$ @@ -67,7 +66,6 @@ export class RecordApisComponent implements OnInit { } openRecordApiForm(link: DatasetServiceDistribution) { - this.displayApiIgnForm = link.accessServiceProtocol === 'GPFDL' this.selectedApiLink = link this.setStyle(link) } diff --git a/libs/feature/record/src/lib/state/mdview.facade.ts b/libs/feature/record/src/lib/state/mdview.facade.ts index faed694ccf..bba7c3ea6e 100644 --- a/libs/feature/record/src/lib/state/mdview.facade.ts +++ b/libs/feature/record/src/lib/state/mdview.facade.ts @@ -75,11 +75,12 @@ export class MdViewFacade { map((links) => links .filter((link) => this.linkClassifier.hasUsage(link, LinkUsage.API)) + // Put links to IGN Géoplateforme first .sort((dd1, dd2) => { return (dd2 as DatasetServiceDistribution).accessServiceProtocol === 'GPFDL' ? 1 - : -1 + : undefined // do not change the sorting otherwise }) ) ) diff --git a/libs/feature/search/src/lib/feature-search.module.ts b/libs/feature/search/src/lib/feature-search.module.ts index 0bd7c501b7..ef0a063a3e 100644 --- a/libs/feature/search/src/lib/feature-search.module.ts +++ b/libs/feature/search/src/lib/feature-search.module.ts @@ -59,6 +59,7 @@ import { FavoriteStarComponent } from './favorites/favorite-star/favorite-star.c SpinningLoaderComponent, ErrorComponent, FavoriteStarComponent, + DateRangeDropdownComponent, ], exports: [ SortByComponent,