From 02fa38478d6968b53b8dece439e0842a6ea4c229 Mon Sep 17 00:00:00 2001 From: jdestin <jeremy.destin@inra.fr> Date: Wed, 20 Mar 2019 14:44:43 +0100 Subject: [PATCH 01/14] refactor: Use angular-coordinates to display the coordinates with degrees on site card. Issue #15 --- .../app/site-card/site-card.component.html | 14 +++++--- .../app/site-card/site-card.component.spec.ts | 9 ++++-- .../src/app/site-card/site-card.component.ts | 32 ++----------------- 3 files changed, 20 insertions(+), 35 deletions(-) diff --git a/frontend/src/app/site-card/site-card.component.html b/frontend/src/app/site-card/site-card.component.html index f2882f3f..654ad2a8 100644 --- a/frontend/src/app/site-card/site-card.component.html +++ b/frontend/src/app/site-card/site-card.component.html @@ -75,13 +75,19 @@ <faidare-card-row label="Latitude" - [value]="formatCoordinates(location.latitude, 'latitude')"> - </faidare-card-row> + [test]="location.latitude"> + <ng-template> + {{ location.latitude }} ({{ location.latitude | coordinates:type.ToDegrees:direction.Latitude }}) + </ng-template> + </gpds-card-row> <faidare-card-row label="Longitude" - [value]="formatCoordinates(location.longitude, 'longitude')"> - </faidare-card-row> + [test]="location.longitude"> + <ng-template> + {{ location.longitude }} ({{ location.longitude | coordinates:type.ToDegrees:direction.Longitude }}) + </ng-template> + </gpds-card-row> <faidare-card-row label="Geographical location" diff --git a/frontend/src/app/site-card/site-card.component.spec.ts b/frontend/src/app/site-card/site-card.component.spec.ts index a8d0604c..bbf6a293 100644 --- a/frontend/src/app/site-card/site-card.component.spec.ts +++ b/frontend/src/app/site-card/site-card.component.spec.ts @@ -14,6 +14,7 @@ import { DataDiscoverySource } from '../models/data-discovery.model'; import { GnpisService } from '../gnpis.service'; import { MockComponent } from 'ng-mocks'; import { XrefsComponent } from '../xrefs/xrefs.component'; +import { CoordinatesPipe, CoordinatesService } from 'angular-coordinates'; describe('SiteCardComponent', () => { @@ -23,6 +24,10 @@ describe('SiteCardComponent', () => { const gnpisService = jasmine.createSpyObj( 'GnpisService', ['getSource'] ); + const coordinatesService = jasmine.createSpyObj( + 'CoordinatesService', ['transform'] + ); + const response: BrapiResult<BrapiLocation> = { metadata: null, result: { @@ -65,12 +70,13 @@ describe('SiteCardComponent', () => { TestBed.configureTestingModule({ declarations: [ SiteCardComponent, MapComponent, LoadingSpinnerComponent, - CardRowComponent, CardSectionComponent, CardTableComponent, + CardRowComponent, CardSectionComponent, CardTableComponent, CoordinatesPipe, MockComponent(XrefsComponent) ], providers: [ { provide: BrapiService, useValue: brapiService }, { provide: GnpisService, useValue: gnpisService }, + { provide: CoordinatesService, useValue: coordinatesService }, { provide: ActivatedRoute, useValue: { @@ -89,7 +95,6 @@ describe('SiteCardComponent', () => { it('should display site', () => { const fixture = TestBed.createComponent(SiteCardComponent); - const component = fixture.componentInstance; brapiService.location.and.returnValues(of(response)); gnpisService.getSource.and.returnValue(of(source)); fixture.detectChanges(); diff --git a/frontend/src/app/site-card/site-card.component.ts b/frontend/src/app/site-card/site-card.component.ts index a376c2e7..3e2e2aaa 100644 --- a/frontend/src/app/site-card/site-card.component.ts +++ b/frontend/src/app/site-card/site-card.component.ts @@ -5,6 +5,7 @@ import { BrapiLocation } from '../models/brapi.model'; import { KeyValueObject, toKeyValueObjects } from '../utils'; import { DataDiscoverySource } from '../models/data-discovery.model'; import { GnpisService } from '../gnpis.service'; +import { Direction, TransformationType } from 'angular-coordinates'; @Component({ selector: 'faidare-site-card', @@ -16,6 +17,8 @@ export class SiteCardComponent implements OnInit { location: BrapiLocation; locationSource: DataDiscoverySource; additionalInfos: KeyValueObject[]; + direction = Direction; + type = TransformationType; loading = true; constructor(private brapiService: BrapiService, private gnpisService: GnpisService, private route: ActivatedRoute) { @@ -73,34 +76,5 @@ export class SiteCardComponent implements OnInit { } } } - - formatCoordinates(decimalDegrees: number, type: string): string { - if (decimalDegrees && type) { - const degree = Math.floor(decimalDegrees); - const decimalMinute = (decimalDegrees - degree) * 60; - const minute = Math.floor(decimalMinute); - const decimalSeconde = (decimalMinute - minute) * 60; - const seconde = Math.floor(decimalSeconde); - - let direction = ''; - if (type === 'latitude') { - if (decimalDegrees >= 0) { - direction = 'N'; - } else { - direction = 'S'; - } - } else if (type === 'longitude') { - if (decimalDegrees >= 0) { - direction = 'E'; - } else { - direction = 'W'; - } - } - return decimalDegrees + '° (' + degree + '° ' + minute + '\' ' + seconde + '\'\' ' + direction + ')'; - } else { - return null; - } - } - } -- GitLab From a414a4c0d35c7839ceddc68901e46af124c94f11 Mon Sep 17 00:00:00 2001 From: jdestin <jeremy.destin@inra.fr> Date: Thu, 21 Mar 2019 10:31:59 +0100 Subject: [PATCH 02/14] fix: Center horizontally the image on small screen. Use auto for popover placement. Add non breakable space and space for some field to break on small screen. Fix the point of the markers. Issue #16 --- .../germplasm-card/germplasm-card.component.html | 16 +++++++++------- frontend/src/app/map/map.component.ts | 3 ++- .../app/result-page/result-page.component.html | 2 +- frontend/src/styles.scss | 4 ++++ 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/frontend/src/app/germplasm-card/germplasm-card.component.html b/frontend/src/app/germplasm-card/germplasm-card.component.html index a7d4ccd8..0389ea88 100644 --- a/frontend/src/app/germplasm-card/germplasm-card.component.html +++ b/frontend/src/app/germplasm-card/germplasm-card.component.html @@ -2,7 +2,7 @@ <ng-container *ngIf="germplasmGnpis"> <h3 class="mb-4"> - <img *ngIf="germplasmGnpis.holdingGenbank && germplasmGnpis.holdingGenbank.instituteName" + <img *ngIf="!loading && germplasmGnpis.holdingGenbank && germplasmGnpis.holdingGenbank.instituteName" [src]="germplasmGnpis.holdingGenbank.logo" align="right"/> Germplasm: {{ germplasmGnpis.germplasmName }} @@ -11,7 +11,7 @@ <!-- Display the map --> <faidare-map [locations]="germplasmLocations"></faidare-map> - <div class="row align-items-center"> + <div class="row align-items-center justify-content-center"> <!--Templates for gerplasm card--> @@ -169,6 +169,8 @@ </ng-template> <!--Section for the image representing the germplasm and the details about this image--> + <div class="col-auto field" *ngIf="germplasmGnpis.photo && germplasmGnpis.photo.thumbnailFileName"> + <a class="btn popovers" data-boundary="window" placement="auto" [ngbPopover]="imageTemplate" <div class="col-auto field" *ngIf="germplasmGnpis.photo && germplasmGnpis.photo.thumbnailFile"> <a class="btn popovers" data-boundary="window" placement="auto" [autoClose]="'outside'" @@ -339,7 +341,7 @@ {{ germplasmGnpis.holdingInstitute.instituteName }}</a> </ng-template> </faidare-card-row> - + <faidare-card-row label="Stock center name" [test]="germplasmGnpis.holdingGenbank.instituteName && germplasmGnpis.holdingGenbank.webSite"> @@ -401,15 +403,15 @@ </faidare-card-row> <faidare-card-row - label="Acquisition/Creation date" + label="Acquisition / Creation date" [test]="germplasmGnpis.collector.accessionCreationDate"> <ng-template> - {{ germplasmGnpis.collector.accessionCreationDate | amParse:'YYYYMMDD' | amDateFormat:'YYYY-MM-DD' }} + {{ germplasmGnpis.collector.accessionCreationDate }} </ng-template> </faidare-card-row> <faidare-card-row - label="Acquisition/Creation date" + label="Acquisition / Creation date" [test]="germplasmGnpis.acquisitionDate && !germplasmGnpis.collector.accessionCreationDate"> <ng-template> {{ germplasmGnpis.acquisitionDate }} @@ -519,7 +521,7 @@ <td>{{ row.donationDate }}</td> <td>{{ row.donorAccessionNumber }}</td> <td>{{ row.donorGermplasmPUI }}</td> - </tr> + </tr> </ng-template> </faidare-card-table> diff --git a/frontend/src/app/map/map.component.ts b/frontend/src/app/map/map.component.ts index 90ee33ac..979f5415 100644 --- a/frontend/src/app/map/map.component.ts +++ b/frontend/src/app/map/map.component.ts @@ -37,7 +37,8 @@ export class MapComponent implements OnInit { const markers = new MarkerClusterGroup(); for (const location of this.curatedLocationList) { const icon = L.icon({ - iconUrl: this.getMarkerIconUrl(location) + iconUrl: this.getMarkerIconUrl(location), + iconAnchor: [12, 41], // point of the icon which will correspond to marker's location }); const popupText = ` <b>${location.locationName}</b><br/> diff --git a/frontend/src/app/result-page/result-page.component.html b/frontend/src/app/result-page/result-page.component.html index 33af7dba..c2771854 100644 --- a/frontend/src/app/result-page/result-page.component.html +++ b/frontend/src/app/result-page/result-page.component.html @@ -48,7 +48,7 @@ <div class="container"> <div class="row result align-content-center"> <span class="col-4 mt-2 bolder"> - Results : + Results : </span> <span *ngIf="pagination.totalResult" class="col-8 text-right small text-muted mt-3"> From {{ pagination.startResult | number }} to {{ pagination.endResult | number }} diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss index e5b4643c..03303a34 100644 --- a/frontend/src/styles.scss +++ b/frontend/src/styles.scss @@ -46,3 +46,7 @@ h3 { left: 720px; background-color: #F9F9F9; } + +.popover { + width: 100%; +} -- GitLab From e5c1ecd823bb34eeb15c01e0b99c8dcb269ff74e Mon Sep 17 00:00:00 2001 From: jdestin <jeremy.destin@inra.fr> Date: Thu, 21 Mar 2019 18:14:25 +0100 Subject: [PATCH 03/14] refactor: Set all the sources images to the same size. Issue #16 --- frontend/src/app/germplasm-card/germplasm-card.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/app/germplasm-card/germplasm-card.component.html b/frontend/src/app/germplasm-card/germplasm-card.component.html index 0389ea88..1440723d 100644 --- a/frontend/src/app/germplasm-card/germplasm-card.component.html +++ b/frontend/src/app/germplasm-card/germplasm-card.component.html @@ -243,7 +243,7 @@ <ng-template> <a target="_blank" [href]="germplasmSource['schema:url']"> - <img [src]="germplasmSource['schema:image']" alt="Germplasm source image"/> + <img [src]="germplasmSource['schema:image']" alt="Germplasm source image" style="height: 60px"/> </a> </ng-template> </faidare-card-row> -- GitLab From 8ec313dcba21b79b58ad71b097c976554ee71401 Mon Sep 17 00:00:00 2001 From: jdestin <jeremy.destin@inra.fr> Date: Mon, 25 Mar 2019 16:38:49 +0100 Subject: [PATCH 04/14] fix: Fix some issues reference in Issue #15 --- .../app/card-table/card-table.component.html | 32 ++-- .../app/card-table/card-table.component.scss | 20 +- .../germplasm-card.component.html | 25 +-- .../germplasm-card.component.spec.ts | 4 +- .../germplasm-card.component.ts | 7 + frontend/src/app/map/map.component.scss | 4 +- frontend/src/app/navbar/navbar.component.html | 4 +- .../document/document.component.html | 14 +- .../result-page/result-page.component.html | 2 +- .../app/site-card/site-card.component.html | 4 +- .../app/study-card/study-card.component.html | 172 +++++++++--------- frontend/src/app/xrefs/xrefs.component.html | 26 +-- frontend/src/environments/environment.ts | 6 +- frontend/src/styles.scss | 19 +- 14 files changed, 183 insertions(+), 156 deletions(-) diff --git a/frontend/src/app/card-table/card-table.component.html b/frontend/src/app/card-table/card-table.component.html index 93b0d733..ad60e888 100644 --- a/frontend/src/app/card-table/card-table.component.html +++ b/frontend/src/app/card-table/card-table.component.html @@ -1,17 +1,15 @@ -<div class="table-responsive scroll-table table-card-body"> - <table class="table table-sm table-striped"> - <thead *ngIf="headers"> - <tr> - <th *ngFor="let header of headers" scope="col"> - {{ header }} - </th> - </tr> - </thead> - <tbody> - <ng-container *ngFor="let row of rows" - [ngTemplateOutlet]="template" - [ngTemplateOutletContext]="{$implicit: row}"> - </ng-container> - </tbody> - </table> -</div> +<table class="table table-sm table-striped"> + <thead *ngIf="headers"> + <tr> + <th *ngFor="let header of headers" scope="col"> + {{ header }} + </th> + </tr> + </thead> + <tbody> + <ng-container *ngFor="let row of rows" + [ngTemplateOutlet]="template" + [ngTemplateOutletContext]="{$implicit: row}"> + </ng-container> + </tbody> +</table> diff --git a/frontend/src/app/card-table/card-table.component.scss b/frontend/src/app/card-table/card-table.component.scss index 85f3be7e..bcf9e148 100644 --- a/frontend/src/app/card-table/card-table.component.scss +++ b/frontend/src/app/card-table/card-table.component.scss @@ -1,19 +1,7 @@ -.scroll-table { - max-height: 200px; - overflow-y: auto; - - thead th { - position: sticky; - top: 0; - background-color: white; - } +thead th { + position: sticky; + top: 0; + background-color: white; } -.table-card-body { - padding: 0; - border: 2px solid rgb(195, 214, 226); - border-top-width: 0px; - border-bottom-left-radius: 0.25rem; - border-bottom-right-radius: 0.25rem; -} diff --git a/frontend/src/app/germplasm-card/germplasm-card.component.html b/frontend/src/app/germplasm-card/germplasm-card.component.html index 1440723d..0e97b317 100644 --- a/frontend/src/app/germplasm-card/germplasm-card.component.html +++ b/frontend/src/app/germplasm-card/germplasm-card.component.html @@ -179,8 +179,8 @@ <img [src]="germplasmGnpis.photo.thumbnailFile" class="img-fluid"> - <figcaption class="figure-caption"> - Click to see more details + <figcaption class="figure-caption" style="color: #0f6fa1;"> + © {{ germplasmGnpis.photo.copyright }} </figcaption> </a> @@ -253,7 +253,7 @@ [test]="germplasmSource['schema:identifier'] && germplasmGnpis.documentationURL"> <ng-template> <a target="_blank" [href]="germplasmGnpis.documentationURL"> - Link to this study on {{ germplasmSource['schema:identifier'] }} + Link to this germplasm on {{ germplasmSource['schema:name'] }} </a> </ng-template> </faidare-card-row> @@ -324,8 +324,8 @@ </div> <!--Section for the information about the holding of the germplasm--> - <faidare-card-section - header="Holding" + <gpds-card-section + header="Depositary" [test]="germplasmGnpis.holdingInstitute"> <ng-template> <div class="card-body card-section-body"> @@ -371,7 +371,7 @@ <!--Section for the information about the collector of the germplasm--> <faidare-card-section - header="Collecting" + header="Collector" [test]="checkCollecting()"> <ng-template> <div class="card-body card-section-body"> @@ -492,7 +492,7 @@ header="Donor" [test]="germplasmGnpis.donors && germplasmGnpis.donors.length > 0"> <ng-template> - + <div class="table-responsive scroll-table table-card-body"> <faidare-card-table [headers]="[ 'Institute name', @@ -525,6 +525,8 @@ </ng-template> </faidare-card-table> + </faidare-card-table> + </div> </ng-template> </faidare-card-section> @@ -533,6 +535,7 @@ header="Distributor" [test]="germplasmGnpis.distributors && germplasmGnpis.distributors.length>0"> <ng-template> + <div class="table-responsive scroll-table table-card-body"> <!--TODO : Add order column when ordering URL will be available--> <faidare-card-table @@ -561,8 +564,9 @@ <td>{{ row.distributionStatus }}</td> </tr> </ng-template> - </faidare-card-table> + </faidare-card-table> + </div> </ng-template> </faidare-card-section> @@ -768,9 +772,8 @@ <ng-template> <div class="card-body card-section-body"> <ng-container *ngFor="let panel of germplasmGnpis.panel"> - - <faidare-card-row - [label]="panel.type ? panel.name + ' (' + panel.type + ')' : panel.name"> + <gpds-card-row + [label]="panel.type ? panel.name.replace(toReplace, ' ') + ' (' + panel.type + ')' : panel.name.replace(toReplace,' ')"> <ng-template> <a [routerLink]="['/']" [queryParams]="{germplasmLists: panel.name, types: 'Germplasm'}"> diff --git a/frontend/src/app/germplasm-card/germplasm-card.component.spec.ts b/frontend/src/app/germplasm-card/germplasm-card.component.spec.ts index 2ca7f83f..a104f5e3 100644 --- a/frontend/src/app/germplasm-card/germplasm-card.component.spec.ts +++ b/frontend/src/app/germplasm-card/germplasm-card.component.spec.ts @@ -246,8 +246,8 @@ describe('GermplasmCardComponent', () => { tester.detectChanges(); expect(tester.title).toContainText('Germplasm: test'); expect(tester.cardHeader[0]).toContainText('Identification'); - expect(tester.cardHeader[1]).toContainText('Holding'); - expect(tester.cardHeader[2]).toContainText('Collecting'); + expect(tester.cardHeader[1]).toContainText('Depositary'); + expect(tester.cardHeader[2]).toContainText('Collector'); expect(tester.cardHeader[3]).toContainText('Breeder'); expect(tester.cardHeader[4]).toContainText('Donor'); expect(tester.cardHeader[5]).toContainText('Distributor'); diff --git a/frontend/src/app/germplasm-card/germplasm-card.component.ts b/frontend/src/app/germplasm-card/germplasm-card.component.ts index e02c0cdf..aeb15d32 100644 --- a/frontend/src/app/germplasm-card/germplasm-card.component.ts +++ b/frontend/src/app/germplasm-card/germplasm-card.component.ts @@ -45,6 +45,13 @@ export class GermplasmCardComponent implements OnInit { germplasmTaxon: string; germplasmTaxonAuthor: string; germplasmSource: DataDiscoverySource; + toReplace = /_/g; + + // TODO extract those url in a configuration file. URL maybe be added during extraction. + IMAGES_ACCESSION_URL = 'https://urgi.versailles.inra.fr/files/siregal/images/accession/'; + IMAGES_INSTITUTION_URL = 'https://urgi.versailles.inra.fr/files/siregal/images//institution/'; + IMAGES_BRC_URL = 'https://urgi.versailles.inra.fr/files/siregal/images/grc/inra_brc_en.png'; + loaded: Promise<any>; loading = true; diff --git a/frontend/src/app/map/map.component.scss b/frontend/src/app/map/map.component.scss index 5f9ab2fd..90a43b30 100644 --- a/frontend/src/app/map/map.component.scss +++ b/frontend/src/app/map/map.component.scss @@ -1,7 +1,7 @@ #map { border: #0f6e9f solid 1px; - height: 600px; - width: 100% + height: 400px; + width: 100%; } #maplegend { diff --git a/frontend/src/app/navbar/navbar.component.html b/frontend/src/app/navbar/navbar.component.html index c73c9936..33094e1e 100644 --- a/frontend/src/app/navbar/navbar.component.html +++ b/frontend/src/app/navbar/navbar.component.html @@ -11,13 +11,13 @@ <li class="nav-item" *ngFor="let link of navbar.links"> <!-- Simple link --> - <div *ngIf="!link.subMenu"> + <div class="mr-2" *ngIf="!link.subMenu"> <a class="nav-link d-flex align-items-center" [href]="link.url" target="_blank">{{ link.label }}</a> </div> <!-- OR Dropdown button --> - <div *ngIf="link.subMenu" class="dropdown-container" ngbDropdown> + <div class="mr-2" *ngIf="link.subMenu" class="dropdown-container" ngbDropdown> <!-- Toggle button --> <a class="nav-link d-flex align-items-center dropdown-toggle" ngbDropdownToggle diff --git a/frontend/src/app/result-page/document/document.component.html b/frontend/src/app/result-page/document/document.component.html index af8a669f..9933a612 100644 --- a/frontend/src/app/result-page/document/document.component.html +++ b/frontend/src/app/result-page/document/document.component.html @@ -13,16 +13,18 @@ </a> <a class="title" *ngIf="getRouterLink() && !document['@type'].includes('Phenotyping Study')" [routerLink]="getRouterLink()" [queryParams]="getQueryParam()"> - {{ document["schema:name"] }} + {{ document["schema:name"] }}, </a> + <small> + or link to this + <a *ngIf="getURL()" [href]="getURL()" target="_blank"> + {{ document['@type'] }} on {{ document['schema:includedInDataCatalog']['schema:name'] }} + </a> + </small> </h5> - <h5> - <a class="title" *ngIf="getURL()" [href]="getURL()" target="_blank"> - ({{ document['schema:includedInDataCatalog']['schema:identifier'] }} data source link) - </a> - </h5> <span class="text-justify description"> + <strong>Description :</strong><br> <ng-container *ngIf="!needTruncation || opened"> {{ document["schema:description"] }} diff --git a/frontend/src/app/result-page/result-page.component.html b/frontend/src/app/result-page/result-page.component.html index c2771854..c6157b7d 100644 --- a/frontend/src/app/result-page/result-page.component.html +++ b/frontend/src/app/result-page/result-page.component.html @@ -48,7 +48,7 @@ <div class="container"> <div class="row result align-content-center"> <span class="col-4 mt-2 bolder"> - Results : + Results: </span> <span *ngIf="pagination.totalResult" class="col-8 text-right small text-muted mt-3"> From {{ pagination.startResult | number }} to {{ pagination.endResult | number }} diff --git a/frontend/src/app/site-card/site-card.component.html b/frontend/src/app/site-card/site-card.component.html index 654ad2a8..4b4fec56 100644 --- a/frontend/src/app/site-card/site-card.component.html +++ b/frontend/src/app/site-card/site-card.component.html @@ -22,7 +22,7 @@ <ng-template> <a target="_blank" [href]="locationSource['schema:url']"> - <img [src]="locationSource['schema:image']" alt="Location source image"/> + <img [src]="locationSource['schema:image']" alt="Location source image" style="height: 60px"/> </a> </ng-template> </faidare-card-row> @@ -32,7 +32,7 @@ [test]="location && location['schema:identifier'] && location.documentationURL"> <ng-template> <a target="_blank" [href]="location.documentationURL"> - Link to this study on {{ location['schema:identifier'] }} + Link to this site on {{ location['schema:name'] }} </a> </ng-template> </faidare-card-row> diff --git a/frontend/src/app/study-card/study-card.component.html b/frontend/src/app/study-card/study-card.component.html index 3218208f..89508f4c 100644 --- a/frontend/src/app/study-card/study-card.component.html +++ b/frontend/src/app/study-card/study-card.component.html @@ -36,7 +36,7 @@ <ng-template> <a target="_blank" [href]="studySource['schema:url']"> - <img [src]="studySource['schema:image']" alt="Study source image"/> + <img [src]="studySource['schema:image']" alt="Study source image" style="height: 60px"/> </a> </ng-template> </faidare-card-row> @@ -46,7 +46,7 @@ [test]="studySource && studySource['schema:identifier'] && study.documentationURL"> <ng-template> <a target="_blank" [href]="study.documentationURL"> - Link to this study on {{ studySource["schema:identifier"] }} + Link to this study on {{ studySource["schema:name"] }} </a> </ng-template> </faidare-card-row> @@ -118,25 +118,27 @@ header="Genotype" [test]="studyGermplasms && studyGermplasms.length != 0"> <ng-template> - <faidare-card-table - [headers]="[ + <div class="table-responsive scroll-table table-card-body"> + <faidare-card-table + [headers]="[ 'Accession number', 'Name', 'Taxon' ]" - [rows]="studyGermplasms"> - <ng-template let-row> - <tr> - <td> - <a [routerLink]="'/germplasm'" [queryParams]="{id:row.germplasmDbId}"> - {{ row.accessionNumber }} - </a> - </td> - <td>{{ row.germplasmName }}</td> - <td>{{ row.genus }} {{ row.species }} {{ row.subtaxa }}</td> - </tr> - </ng-template> - </faidare-card-table> + [rows]="studyGermplasms"> + <ng-template let-row> + <tr> + <td> + <a [routerLink]="'/germplasm'" [queryParams]="{id:row.germplasmDbId}"> + {{ row.accessionNumber }} + </a> + </td> + <td>{{ row.germplasmName }}</td> + <td>{{ row.genus }} {{ row.species }} {{ row.subtaxa }}</td> + </tr> + </ng-template> + </faidare-card-table> + </div> </ng-template> </faidare-card-section> @@ -145,31 +147,33 @@ header="Variables" [test]="studyObservationVariables && studyObservationVariables.length != 0"> <ng-template> - <faidare-card-table - [headers]="[ + <div class="table-responsive scroll-table table-card-body"> + <faidare-card-table + [headers]="[ 'Variable id', 'Variable short name', 'Variable long name', 'Ontology name', 'Trait description' ]" - [rows]="studyObservationVariables"> - <ng-template let-row> - <tr> - <td> - <ng-template #name>{{ row.observationVariableDbId }}</ng-template> - <ng-template #link> - <a target="_blank" [href]=row.documentationURL>{{ row.observationVariableDbId }}</a> - </ng-template> - <ng-container *ngIf="row.documentationURL; then link else name"></ng-container> - </td> - <td>{{ row.name }}</td> - <td>{{ row.synonyms[0] }}</td> - <td>{{ row.ontologyName }}</td> - <td>{{ row.trait.description }}</td> - </tr> - </ng-template> - </faidare-card-table> + [rows]="studyObservationVariables"> + <ng-template let-row> + <tr> + <td> + <ng-template #name>{{ row.observationVariableDbId }}</ng-template> + <ng-template #link> + <a target="_blank" [href]=row.documentationURL>{{ row.observationVariableDbId }}</a> + </ng-template> + <ng-container *ngIf="row.documentationURL; then link else name"></ng-container> + </td> + <td>{{ row.name }}</td> + <td>{{ row.synonyms[0] }}</td> + <td>{{ row.ontologyName }}</td> + <td>{{ row.trait.description }}</td> + </tr> + </ng-template> + </faidare-card-table> + </div> </ng-template> </faidare-card-section> @@ -177,34 +181,36 @@ header="Data Set" [test]="studyDataset && studyDataset.length != 0"> <ng-template> - <faidare-card-table - [headers]="[ + <div class="table-responsive scroll-big-table table-card-body"> + <faidare-card-table + [headers]="[ 'Name', 'Type', 'Linked studies identifiers' ]" - [rows]="studyDataset"> - <ng-template let-row> - <tr> - <td> - <ng-template #name>{{ row.trialName }}</ng-template> - <ng-template #link> - <a target="_blank" [href]=row.documentationURL>{{ row.trialName }}</a> - </ng-template> - <ng-container *ngIf="row.documentationURL; then link else name"></ng-container> - </td> - <td>{{ row.trialType }}</td> - <td width="60%"> - <ng-container *ngFor="let trialStudy of row.studies"> - <a - [routerLink]="['/studies', trialStudy.studyDbId]"> - {{ trialStudy.studyName.trim() }} - </a>; - </ng-container> - </td> - </tr> - </ng-template> - </faidare-card-table> + [rows]="studyDataset"> + <ng-template let-row> + <tr> + <td> + <ng-template #name>{{ row.trialName }}</ng-template> + <ng-template #link> + <a target="_blank" [href]=row.documentationURL>{{ row.trialName }}</a> + </ng-template> + <ng-container *ngIf="row.documentationURL; then link else name"></ng-container> + </td> + <td>{{ row.trialType }}</td> + <td width="60%"> + <ng-container *ngFor="let trialStudy of row.studies"> + <a + [routerLink]="['/studies', trialStudy.studyDbId]"> + {{ trialStudy.studyName.trim() }} + </a>; + </ng-container> + </td> + </tr> + </ng-template> + </faidare-card-table> + </div> </ng-template> </faidare-card-section> @@ -212,23 +218,25 @@ header="Contact" [test]="study.contacts && study.contacts.length != 0"> <ng-template> - <faidare-card-table - [headers]="[ + <div class="table-responsive scroll-table table-card-body"> + <faidare-card-table + [headers]="[ 'Role', 'Name', 'Email', 'Institution' ]" - [rows]="study.contacts"> - <ng-template let-row> - <tr> - <td>{{ row.type }}</td> - <td>{{ row.name }}</td> - <td>{{ row.email }}</td> - <td>{{ row.institutionName }}</td> - </tr> - </ng-template> - </faidare-card-table> + [rows]="study.contacts"> + <ng-template let-row> + <tr> + <td>{{ row.type }}</td> + <td>{{ row.name }}</td> + <td>{{ row.email.replace('@', ' at ') }}</td> + <td>{{ row.institutionName }}</td> + </tr> + </ng-template> + </faidare-card-table> + </div> </ng-template> </faidare-card-section> @@ -236,15 +244,17 @@ header="Additional information" [test]="additionalInfos && additionalInfos.length != 0"> <ng-template> - <faidare-card-table - [rows]="additionalInfos"> - <ng-template let-row> - <tr> - <td width="50%">{{ row.key }}</td> - <td>{{ row.value }}</td> - </tr> - </ng-template> - </faidare-card-table> + <div class="table-responsive scroll-table table-card-body"> + <faidare-card-table + [rows]="additionalInfos"> + <ng-template let-row> + <tr> + <td width="50%">{{ row.key }}</td> + <td>{{ row.value }}</td> + </tr> + </ng-template> + </faidare-card-table> + </div> </ng-template> </faidare-card-section> diff --git a/frontend/src/app/xrefs/xrefs.component.html b/frontend/src/app/xrefs/xrefs.component.html index d4015a23..e893b664 100644 --- a/frontend/src/app/xrefs/xrefs.component.html +++ b/frontend/src/app/xrefs/xrefs.component.html @@ -1,22 +1,24 @@ <faidare-card-section *ngIf="xrefs.length > 0" header="Cross References"> <ng-template> - <faidare-card-table - [headers]="[ + <div class="table-responsive scroll-big-table table-card-body"> + <faidare-card-table + [headers]="[ 'Name', 'Source', 'Type', 'Description' ]" - [rows]=xrefs> - <ng-template let-crossRef> - <tr> - <td><a [href]="crossRef.url">{{ crossRef.db_version }}</a></td> - <td>{{ crossRef.database_name }}</td> - <td>{{ crossRef.entry_type }}</td> - <td>{{ crossRef.description | slice:0:120 }}...</td> - </tr> - </ng-template> - </faidare-card-table> + [rows]=xrefs> + <ng-template let-crossRef> + <tr> + <td><a [href]="crossRef.url" target="_blank">{{ crossRef.db_version }}</a></td> + <td>{{ crossRef.database_name }}</td> + <td>{{ crossRef.entry_type }}</td> + <td>{{ crossRef.description | slice:0:120 }}...</td> + </tr> + </ng-template> + </faidare-card-table> + </div> </ng-template> </faidare-card-section> diff --git a/frontend/src/environments/environment.ts b/frontend/src/environments/environment.ts index 8119eb8d..988a9ca2 100644 --- a/frontend/src/environments/environment.ts +++ b/frontend/src/environments/environment.ts @@ -19,9 +19,9 @@ export const environment = { ] }, { label: 'GNPIS', url: 'https://urgi.versailles.inra.fr/gnpis/' }, - { label: 'CIRAD', url: 'http://tropgenedb.cirad.fr/' }, - { label: 'VIB', url: 'http://pippa.psb.ugent.be' }, - { label: 'IBET', url: 'https://biodata.pt' } + { label: 'CIRAD TropGENE', url: 'http://tropgenedb.cirad.fr/' }, + { label: 'VIB Pippa', url: 'http://pippa.psb.ugent.be' }, + { label: 'IBET BioData', url: 'https://biodata.pt' } ], contributor: { diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss index 03303a34..704f989f 100644 --- a/frontend/src/styles.scss +++ b/frontend/src/styles.scss @@ -22,6 +22,14 @@ h3 { border-bottom-right-radius: 0.25rem; } +.table-card-body { + padding: 0; + border: 2px solid rgb(195, 214, 226); + border-top-width: 0px; + border-bottom-left-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; +} + .row-sep { border-top: 1px solid #f0f0f0; } @@ -31,7 +39,7 @@ h3 { } .content-overflow { - max-height: 175px; + max-height: 200px; overflow-y: auto; } @@ -39,6 +47,15 @@ h3 { max-height: 275px; overflow: auto; } +.scroll-table { + max-height: 200px; + overflow-y: auto; +} + +.scroll-big-table { + max-height: 500px; + overflow-y: auto; +} .display-spinner-front { position: absolute; -- GitLab From 313ad09005580fda3f59fdf0349592bef549b1f8 Mon Sep 17 00:00:00 2001 From: jdestin <jeremy.destin@inra.fr> Date: Tue, 26 Mar 2019 17:07:34 +0100 Subject: [PATCH 05/14] fix: Use subscribe on queryParams to reload germplasm card. Fix a max size for popover. Fix prod environment. Change logo name to see if fix image display. #15 --- .../repository/file/datasources.jsonld | 2 +- .../faidare/repository/file/logos/VIB_40h.png | Bin 359 -> 0 bytes .../germplasm-card.component.html | 2 +- .../germplasm-card.component.spec.ts | 19 ++--- .../germplasm-card.component.ts | 79 ++++++++---------- .../document/document.component.html | 10 +-- frontend/src/app/xrefs/xrefs.component.html | 6 +- frontend/src/app/xrefs/xrefs.component.ts | 1 - frontend/src/environments/environment.prod.ts | 6 +- frontend/src/styles.scss | 1 + 10 files changed, 58 insertions(+), 68 deletions(-) delete mode 100644 backend/src/main/resources/fr/inra/urgi/faidare/repository/file/logos/VIB_40h.png diff --git a/backend/src/main/resources/fr/inra/urgi/faidare/repository/file/datasources.jsonld b/backend/src/main/resources/fr/inra/urgi/faidare/repository/file/datasources.jsonld index 6b319a01..a019c38e 100644 --- a/backend/src/main/resources/fr/inra/urgi/faidare/repository/file/datasources.jsonld +++ b/backend/src/main/resources/fr/inra/urgi/faidare/repository/file/datasources.jsonld @@ -17,7 +17,7 @@ "schema:identifier": "VIB", "schema:name": "VIB PIPPA", "schema:url": "http://pippa.psb.ugent.be", - "schema:image": "./logos/VIB_40h.png" + "schema:image": "./logos/VIB.png" }, { "@type": "schema:DataCatalog", diff --git a/backend/src/main/resources/fr/inra/urgi/faidare/repository/file/logos/VIB_40h.png b/backend/src/main/resources/fr/inra/urgi/faidare/repository/file/logos/VIB_40h.png deleted file mode 100644 index fa3f1568791db864b4a981d200258e5e75c9840b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 359 zcmV-t0hs=YP)<h;3K|Lk000e1NJLTq002q=001Zi0{{R3tHN;;0000RP)t-sM{rDL zR*guvw>rDIS~87lqpaa`M)Pkr0RaJVxwLlx0004WQchC<K<3zH0002`Nkl<Zcmd7O zF=_)b6olciAwp%2V7wOy)(H$bKp+=L=QdqhmG9U=`}2auGN{c|Yw__*Sf^KsUAL>; zPIs|$Ywc#$J2ADfi&ghbnHY-L*7jLN40O9VMXWKah&A@+6tPu{*h&%G7K+&C;{PIc zwvR^<<H`@Oh`nsQ>YuFq{O!9&*I0yV#Qrfhjvh~nlR7C_S*tE$D5dHLMGVD3JSl$i zvb7?Hs)5o`5ku|3sA3fpd!QshpH&wtDC%JpF{ikZ7^?0{sd&H?Lq(lceiB2;tBj@U zUX@f~6|te}LDfL9g5oR{>j+|2i4hx0vzk)u3&kM{q+cQO?KvH@Y@q-E002ovPDHLk FV1h3wm(u_M diff --git a/frontend/src/app/germplasm-card/germplasm-card.component.html b/frontend/src/app/germplasm-card/germplasm-card.component.html index 0e97b317..a5658eca 100644 --- a/frontend/src/app/germplasm-card/germplasm-card.component.html +++ b/frontend/src/app/germplasm-card/germplasm-card.component.html @@ -188,7 +188,7 @@ <div class="card ngb-popover-window "> <img class="card-img-top" [src]="germplasmGnpis.photo.file" - alt="" width="250px"> + alt="" style="max-width:500px; max-height:550px"> <div class="card-body"> <faidare-card-row diff --git a/frontend/src/app/germplasm-card/germplasm-card.component.spec.ts b/frontend/src/app/germplasm-card/germplasm-card.component.spec.ts index a104f5e3..99d66db6 100644 --- a/frontend/src/app/germplasm-card/germplasm-card.component.spec.ts +++ b/frontend/src/app/germplasm-card/germplasm-card.component.spec.ts @@ -1,9 +1,9 @@ import { async, TestBed } from '@angular/core/testing'; import { GermplasmCardComponent } from './germplasm-card.component'; -import { ComponentTester, speculoosMatchers } from 'ngx-speculoos'; +import { ComponentTester, fakeRoute, speculoosMatchers } from 'ngx-speculoos'; import { GnpisService } from '../gnpis.service'; import { BrapiService } from '../brapi.service'; -import { ActivatedRoute, convertToParamMap } from '@angular/router'; +import { ActivatedRoute } from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; import { of } from 'rxjs'; @@ -205,6 +205,10 @@ describe('GermplasmCardComponent', () => { 'schema:image': null }; + const activatedRoute = fakeRoute({ + queryParams: of({ id: 'test' }) + }); + beforeEach(async(() => { TestBed.configureTestingModule({ imports: [RouterTestingModule, NgbPopoverModule, MomentModule], @@ -215,16 +219,7 @@ describe('GermplasmCardComponent', () => { providers: [ { provide: BrapiService, useValue: brapiService }, { provide: GnpisService, useValue: gnpisService }, - { - provide: ActivatedRoute, - useValue: { - snapshot: { - queryParams: convertToParamMap({ - id: 'test' - }) - } - } - } + { provide: ActivatedRoute, useValue: activatedRoute }, ] }); })); diff --git a/frontend/src/app/germplasm-card/germplasm-card.component.ts b/frontend/src/app/germplasm-card/germplasm-card.component.ts index aeb15d32..77f4ecd3 100644 --- a/frontend/src/app/germplasm-card/germplasm-card.component.ts +++ b/frontend/src/app/germplasm-card/germplasm-card.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; +import { ActivatedRoute } from '@angular/router'; import { BrapiService } from '../brapi.service'; import { GnpisService } from '../gnpis.service'; import { BrapiAttributeData, BrapiGermplasmPedigree, BrapiLocation, BrapiTaxonIds } from '../models/brapi.model'; @@ -18,15 +18,7 @@ export class GermplasmCardComponent implements OnInit { constructor(private brapiService: BrapiService, private gnpisService: GnpisService, - private route: ActivatedRoute, - private router: Router) { - - this.router.events.subscribe((event: any) => { - // If it is a NavigationEnd event re-initalise the component - if (this.alreadyInitialize && event instanceof NavigationEnd) { - this.ngOnInit(); - } - }); + private route: ActivatedRoute) { } NCBI_URL = 'https://www.ncbi.nlm.nih.gov/Taxonomy/Browser/wwwtax.cgi?mode=Info&id='; @@ -57,42 +49,45 @@ export class GermplasmCardComponent implements OnInit { loading = true; ngOnInit() { - this.germplasmId = this.route.snapshot.queryParams.id; - this.germplasmPuid = this.route.snapshot.queryParams.pui; - - const germplasm$ = this.getGermplasm(this.germplasmId, this.germplasmPuid); - germplasm$.then(result => { - const germplasmId = this.germplasmId ? this.germplasmId : result.germplasmDbId; - - // TODO use the progeny call when the information about parent will be added. - /*const germplasmProgeny$ = this.brapiService.germplasmProgeny(germplasmId).toPromise(); - germplasmProgeny$ - .then(germplasmProgeny => { - this.germplasmProgeny = germplasmProgeny.result; - });*/ - - const germplasmPedigree$ = this.brapiService.germplasmPedigree(germplasmId).toPromise(); - germplasmPedigree$ - .then(germplasmPedigree => { - this.germplasmPedigree = germplasmPedigree.result; - }); - const germplasmAttributes$ = this.brapiService.germplasmAttributes(germplasmId).toPromise(); - germplasmAttributes$ - .then(germplasmAttributes => { - if (germplasmAttributes.result.data) { - this.germplasmAttributes = germplasmAttributes.result.data.sort(this.compareAttributes); - } + this.route.queryParams.subscribe(queryParams => { - }); - }); + this.germplasmId = queryParams.id; + this.germplasmPuid = queryParams.pui; - this.loaded = Promise.all([germplasm$]); - this.loaded.then(() => { - this.loading = false; - this.alreadyInitialize = true; - }); + const germplasm$ = this.getGermplasm(this.germplasmId, this.germplasmPuid); + germplasm$.then(result => { + const germplasmId = this.germplasmId ? this.germplasmId : result.germplasmDbId; + // TODO use the progeny call when the information about parent will be added. + /*const germplasmProgeny$ = this.brapiService.germplasmProgeny(germplasmId).toPromise(); + germplasmProgeny$ + .then(germplasmProgeny => { + this.germplasmProgeny = germplasmProgeny.result; + });*/ + + const germplasmPedigree$ = this.brapiService.germplasmPedigree(germplasmId).toPromise(); + germplasmPedigree$ + .then(germplasmPedigree => { + this.germplasmPedigree = germplasmPedigree.result; + }); + + const germplasmAttributes$ = this.brapiService.germplasmAttributes(germplasmId).toPromise(); + germplasmAttributes$ + .then(germplasmAttributes => { + if (germplasmAttributes.result && germplasmAttributes.result.data) { + this.germplasmAttributes = germplasmAttributes.result.data.sort(this.compareAttributes); + } + + }); + }); + + this.loaded = Promise.all([germplasm$]); + this.loaded.then(() => { + this.loading = false; + this.alreadyInitialize = true; + }); + }); } getGermplasm(id: string, pui: string): Promise<Germplasm> { diff --git a/frontend/src/app/result-page/document/document.component.html b/frontend/src/app/result-page/document/document.component.html index 9933a612..9d45b021 100644 --- a/frontend/src/app/result-page/document/document.component.html +++ b/frontend/src/app/result-page/document/document.component.html @@ -13,12 +13,12 @@ </a> <a class="title" *ngIf="getRouterLink() && !document['@type'].includes('Phenotyping Study')" [routerLink]="getRouterLink()" [queryParams]="getQueryParam()"> - {{ document["schema:name"] }}, + {{ document["schema:name"] }} </a> - <small> - or link to this - <a *ngIf="getURL()" [href]="getURL()" target="_blank"> - {{ document['@type'] }} on {{ document['schema:includedInDataCatalog']['schema:name'] }} + <small *ngIf="getURL()"> + or link to + <a [href]="getURL()" target="_blank"> + this {{ document['@type'] }} on {{ document['schema:includedInDataCatalog']['schema:name'] }} </a> </small> </h5> diff --git a/frontend/src/app/xrefs/xrefs.component.html b/frontend/src/app/xrefs/xrefs.component.html index e893b664..05baed89 100644 --- a/frontend/src/app/xrefs/xrefs.component.html +++ b/frontend/src/app/xrefs/xrefs.component.html @@ -5,9 +5,9 @@ <faidare-card-table [headers]="[ 'Name', - 'Source', - 'Type', - 'Description' + 'Source', + 'Type', + 'Description' ]" [rows]=xrefs> <ng-template let-crossRef> diff --git a/frontend/src/app/xrefs/xrefs.component.ts b/frontend/src/app/xrefs/xrefs.component.ts index fd97128c..d63a97f3 100644 --- a/frontend/src/app/xrefs/xrefs.component.ts +++ b/frontend/src/app/xrefs/xrefs.component.ts @@ -21,6 +21,5 @@ export class XrefsComponent implements OnInit { this.xrefs = xrefs; } ); - } } diff --git a/frontend/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts index 40182d5c..84e09f13 100644 --- a/frontend/src/environments/environment.prod.ts +++ b/frontend/src/environments/environment.prod.ts @@ -16,9 +16,9 @@ export const environment = { ] }, { label: 'GNPIS', url: 'https://urgi.versailles.inra.fr/gnpis/' }, - { label: 'CIRAD', url: 'http://tropgenedb.cirad.fr/' }, - { label: 'VIB', url: 'http://pippa.psb.ugent.be' }, - { label: 'IBET', url: 'https://biodata.pt' } + { label: 'CIRAD TropGENE', url: 'http://tropgenedb.cirad.fr/' }, + { label: 'VIB Pippa', url: 'http://pippa.psb.ugent.be' }, + { label: 'IBET BioData', url: 'https://biodata.pt' } ], contributor: { diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss index 704f989f..71d08582 100644 --- a/frontend/src/styles.scss +++ b/frontend/src/styles.scss @@ -66,4 +66,5 @@ h3 { .popover { width: 100%; + max-width:500px; } -- GitLab From b97be045e01838101ebc709f15bb05a076e4ec3a Mon Sep 17 00:00:00 2001 From: jdestin <jeremy.destin@inra.fr> Date: Wed, 24 Apr 2019 17:31:15 +0200 Subject: [PATCH 06/14] refactor: Add footer on result page and fix nav bar to the top. Issue #18 --- frontend/src/app/app.module.ts | 4 +- frontend/src/app/footer/footer.component.html | 19 +++++++++ frontend/src/app/footer/footer.component.scss | 38 ++++++++++++++++++ .../src/app/footer/footer.component.spec.ts | 25 ++++++++++++ frontend/src/app/footer/footer.component.ts | 16 ++++++++ frontend/src/app/navbar/navbar.component.html | 2 +- .../result-page/result-page.component.html | 3 +- frontend/src/assets/faidare/theme.scss | 5 +++ frontend/src/assets/gpds/elixir-logo.png | Bin 0 -> 15605 bytes 9 files changed, 109 insertions(+), 3 deletions(-) create mode 100644 frontend/src/app/footer/footer.component.html create mode 100644 frontend/src/app/footer/footer.component.scss create mode 100644 frontend/src/app/footer/footer.component.spec.ts create mode 100644 frontend/src/app/footer/footer.component.ts create mode 100644 frontend/src/assets/gpds/elixir-logo.png diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index a6a37d9d..4e09db83 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -25,6 +25,7 @@ import { CardTableComponent } from './card-table/card-table.component'; import { MomentModule } from 'ngx-moment'; import { XrefsComponent } from './xrefs/xrefs.component'; import { CoordinatesModule } from 'angular-coordinates'; +import { FooterComponent } from './footer/footer.component'; @NgModule({ @@ -46,7 +47,8 @@ import { CoordinatesModule } from 'angular-coordinates'; CardSectionComponent, LoadingSpinnerComponent, CardTableComponent, - XrefsComponent + XrefsComponent, + FooterComponent ], imports: [ BrowserModule, diff --git a/frontend/src/app/footer/footer.component.html b/frontend/src/app/footer/footer.component.html new file mode 100644 index 00000000..983ea8a6 --- /dev/null +++ b/frontend/src/app/footer/footer.component.html @@ -0,0 +1,19 @@ +<div class="row footer mt-4" xmlns="http://www.w3.org/1999/html"> + <div class="col-3 outer-div"> + <div class=" circleDiv centered"> + <a href="https://elixir-europe.org/platforms/interoperability" target="_blank"> + <img src="assets/elixir-logo.png" alt="Logo Elixir" height="45px" class="ml-2"/> + </a> + </div> + </div> + <div class="col-9"> + <div class="mt-1"> + <a href="https://elixir-europe.org/platforms/interoperability" target="_blank"> + <span class="font-weight-bold text-secondary" style="font-size: small">FAIR Data finder for Agro Research is part of the ELIXIR infrastructure</span><br> + <span class="text-muted" style="font-size: x-small">Faidare is part of the ELIXIR infrastructure</span> + </a> + </div> + </div> +</div> + + diff --git a/frontend/src/app/footer/footer.component.scss b/frontend/src/app/footer/footer.component.scss new file mode 100644 index 00000000..8e021578 --- /dev/null +++ b/frontend/src/app/footer/footer.component.scss @@ -0,0 +1,38 @@ +@import "theme"; + +.footer { + background-color: $theme-footer-bg-color; + height: 55px; + position: fixed; + bottom: 0; + left: 0; + right: 0; + z-index: 1100; +} + + +a { + color: black; + text-decoration: none; +} + +span { + font-size: large; +} + + +.circleDiv { + border-radius: 50%; + width: 70px; + height: 50px; + background-image: radial-gradient(#767c82, #8e959b, #c0c7cd); +} + +.centered { + margin: 0 auto; +} + +.outer-div { + padding: 3px; +} + diff --git a/frontend/src/app/footer/footer.component.spec.ts b/frontend/src/app/footer/footer.component.spec.ts new file mode 100644 index 00000000..896320aa --- /dev/null +++ b/frontend/src/app/footer/footer.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { FooterComponent } from './footer.component'; + +describe('FooterComponent', () => { + let component: FooterComponent; + let fixture: ComponentFixture<FooterComponent>; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [FooterComponent] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(FooterComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/frontend/src/app/footer/footer.component.ts b/frontend/src/app/footer/footer.component.ts new file mode 100644 index 00000000..bac0dea5 --- /dev/null +++ b/frontend/src/app/footer/footer.component.ts @@ -0,0 +1,16 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'gpds-footer', + templateUrl: './footer.component.html', + styleUrls: ['./footer.component.scss'] +}) +export class FooterComponent implements OnInit { + + constructor() { + } + + ngOnInit() { + } + +} diff --git a/frontend/src/app/navbar/navbar.component.html b/frontend/src/app/navbar/navbar.component.html index 33094e1e..7e20b754 100644 --- a/frontend/src/app/navbar/navbar.component.html +++ b/frontend/src/app/navbar/navbar.component.html @@ -1,4 +1,4 @@ -<nav class="navbar navbar-expand-md navbar-dark py-0 mb-4"> +<nav class="navbar fixed-top navbar-expand-md navbar-dark py-0 mb-4"> <div class="container px-0"> <a class="navbar-brand d-flex align-items-center mr-0 px-2" routerLink="/"> <img src="{{ navbar.logo }}" alt="{{ navbar.name }} logo" title="{{ navbar.title }}" height="60px"/> diff --git a/frontend/src/app/result-page/result-page.component.html b/frontend/src/app/result-page/result-page.component.html index c6157b7d..366178d9 100644 --- a/frontend/src/app/result-page/result-page.component.html +++ b/frontend/src/app/result-page/result-page.component.html @@ -82,7 +82,7 @@ <!-- Pagination --> <!--Bottom page navigator--> - <div class="d-flex justify-content-center mt-5" *ngIf="pagination.totalPages > 1"> + <div class="d-flex justify-content-center mt-5 mb-5" *ngIf="pagination.totalPages > 1"> <!-- we add 1 to the page because ngb-pagination is 1 based --> <ngb-pagination [page]="pagination.currentPage + 1" (pageChange)="changePage($event)" @@ -105,3 +105,4 @@ </div> </div> </div> +<gpds-footer></gpds-footer> diff --git a/frontend/src/assets/faidare/theme.scss b/frontend/src/assets/faidare/theme.scss index b4fae40f..b92fb692 100644 --- a/frontend/src/assets/faidare/theme.scss +++ b/frontend/src/assets/faidare/theme.scss @@ -77,3 +77,8 @@ $theme-navbar-bg-color: $_theme-light-gray; $theme-navbar-hover-color: $white; $theme-navbar-hover-bg-color: $_theme-gray; +// custom footer +$theme-footer-height: 3rem; +$theme-footer-color: $black; +$theme-footer-bg-color: $_theme-light-gray; + diff --git a/frontend/src/assets/gpds/elixir-logo.png b/frontend/src/assets/gpds/elixir-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4ab5f84477a00a439d7875691e4eab12e181ddfb GIT binary patch literal 15605 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 NO7iNcN?Egz{{wm@2k`&^ literal 0 HcmV?d00001 -- GitLab From b804abc5353fad9e0db2588ba001b8afe45b3825 Mon Sep 17 00:00:00 2001 From: jdestin <jeremy.destin@inra.fr> Date: Thu, 25 Apr 2019 15:54:32 +0200 Subject: [PATCH 07/14] refactor: Add go back to form button. --- frontend/src/app/footer/footer.component.html | 2 +- frontend/src/app/footer/footer.component.scss | 2 +- .../src/app/germplasm-card/germplasm-card.component.html | 6 ++++++ frontend/src/app/navbar/navbar.component.scss | 3 ++- frontend/src/app/result-page/result-page.component.html | 2 +- frontend/src/app/site-card/site-card.component.html | 8 +++++++- frontend/src/app/study-card/study-card.component.html | 8 +++++++- frontend/src/assets/faidare/theme.scss | 9 +++++++++ frontend/src/styles.scss | 4 ++++ 9 files changed, 38 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/footer/footer.component.html b/frontend/src/app/footer/footer.component.html index 983ea8a6..107b352c 100644 --- a/frontend/src/app/footer/footer.component.html +++ b/frontend/src/app/footer/footer.component.html @@ -1,5 +1,5 @@ <div class="row footer mt-4" xmlns="http://www.w3.org/1999/html"> - <div class="col-3 outer-div"> + <div class="col-3 outer-div mt-1"> <div class=" circleDiv centered"> <a href="https://elixir-europe.org/platforms/interoperability" target="_blank"> <img src="assets/elixir-logo.png" alt="Logo Elixir" height="45px" class="ml-2"/> diff --git a/frontend/src/app/footer/footer.component.scss b/frontend/src/app/footer/footer.component.scss index 8e021578..79e9e64d 100644 --- a/frontend/src/app/footer/footer.component.scss +++ b/frontend/src/app/footer/footer.component.scss @@ -2,7 +2,7 @@ .footer { background-color: $theme-footer-bg-color; - height: 55px; + height: 60px; position: fixed; bottom: 0; left: 0; diff --git a/frontend/src/app/germplasm-card/germplasm-card.component.html b/frontend/src/app/germplasm-card/germplasm-card.component.html index a5658eca..3712b3ac 100644 --- a/frontend/src/app/germplasm-card/germplasm-card.component.html +++ b/frontend/src/app/germplasm-card/germplasm-card.component.html @@ -1,5 +1,11 @@ <faidare-loading-spinner [loading]="loading" class="float-right"></faidare-loading-spinner> +<div class="text-right back-form-button"> + <button type="button" class="btn btn-secondary mt-1" routerLink="/"> + <span> < Back to form </span> + </button> +</div> + <ng-container *ngIf="germplasmGnpis"> <h3 class="mb-4"> <img *ngIf="!loading && germplasmGnpis.holdingGenbank && germplasmGnpis.holdingGenbank.instituteName" diff --git a/frontend/src/app/navbar/navbar.component.scss b/frontend/src/app/navbar/navbar.component.scss index 75a2c2d3..499ee112 100644 --- a/frontend/src/app/navbar/navbar.component.scss +++ b/frontend/src/app/navbar/navbar.component.scss @@ -1,7 +1,8 @@ @import "theme"; .navbar { - background-color: $theme-navbar-bg-color; + /*background-color: $theme-navbar-bg-color;*/ + background-image: linear-gradient($theme-navbar-bg-color, $theme-navbar-bg-color, #c9ced9); } .navbar-toggler { diff --git a/frontend/src/app/result-page/result-page.component.html b/frontend/src/app/result-page/result-page.component.html index 366178d9..b06da980 100644 --- a/frontend/src/app/result-page/result-page.component.html +++ b/frontend/src/app/result-page/result-page.component.html @@ -82,7 +82,7 @@ <!-- Pagination --> <!--Bottom page navigator--> - <div class="d-flex justify-content-center mt-5 mb-5" *ngIf="pagination.totalPages > 1"> + <div class="d-flex justify-content-center mt-4 mb-5" *ngIf="pagination.totalPages > 1"> <!-- we add 1 to the page because ngb-pagination is 1 based --> <ngb-pagination [page]="pagination.currentPage + 1" (pageChange)="changePage($event)" diff --git a/frontend/src/app/site-card/site-card.component.html b/frontend/src/app/site-card/site-card.component.html index 4b4fec56..628e57e4 100644 --- a/frontend/src/app/site-card/site-card.component.html +++ b/frontend/src/app/site-card/site-card.component.html @@ -1,7 +1,13 @@ <faidare-loading-spinner [loading]="loading" class="float-right"></faidare-loading-spinner> +<div class="text-right back-form-button"> + <button type="button" class="btn btn-secondary mt-1" routerLink="/"> + <span> < Back to form </span> + </button> +</div> + <ng-container *ngIf="location"> - <h3> + <h3 class="mb-4"> Site: {{ location.locationName }} diff --git a/frontend/src/app/study-card/study-card.component.html b/frontend/src/app/study-card/study-card.component.html index 89508f4c..a82e54bb 100644 --- a/frontend/src/app/study-card/study-card.component.html +++ b/frontend/src/app/study-card/study-card.component.html @@ -1,7 +1,13 @@ <faidare-loading-spinner [loading]="loading" class="float-right"></faidare-loading-spinner> +<div class="text-right back-form-button"> + <button type="button" class="btn btn-secondary mt-1" routerLink="/"> + <span> < Back to form </span> + </button> +</div> + <ng-container *ngIf="study"> - <h3> + <h3 class="mb-4"> Study {{ study.studyType }}: {{ study.studyName }} </h3> diff --git a/frontend/src/assets/faidare/theme.scss b/frontend/src/assets/faidare/theme.scss index b92fb692..c2f6f868 100644 --- a/frontend/src/assets/faidare/theme.scss +++ b/frontend/src/assets/faidare/theme.scss @@ -53,6 +53,15 @@ $enable-shadows: true; -ms-overflow-style: -ms-autohiding-scrollbar; } +.back-form-button { + top: 0; + right: 0; + position: fixed; + z-index: 1100; + margin-top: 8px; + margin-right: 100px; +} + h4 { color: #0f6191; } diff --git a/frontend/src/styles.scss b/frontend/src/styles.scss index 71d08582..365647f6 100644 --- a/frontend/src/styles.scss +++ b/frontend/src/styles.scss @@ -68,3 +68,7 @@ h3 { width: 100%; max-width:500px; } + +.mt-custom{ + margin-top: 75px; +} -- GitLab From b6d76d83f6740afa581e02366e52e7a2fd751a2f Mon Sep 17 00:00:00 2001 From: jdestin <jeremy.destin@inra.fr> Date: Thu, 2 May 2019 14:57:08 +0200 Subject: [PATCH 08/14] fix: Center the map zoom around markers. Issue#14 --- frontend/src/app/footer/footer.component.html | 2 +- frontend/src/app/map/map.component.ts | 26 ++++++++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/frontend/src/app/footer/footer.component.html b/frontend/src/app/footer/footer.component.html index 107b352c..dde80ef4 100644 --- a/frontend/src/app/footer/footer.component.html +++ b/frontend/src/app/footer/footer.component.html @@ -1,4 +1,4 @@ -<div class="row footer mt-4" xmlns="http://www.w3.org/1999/html"> +<div class="row footer mt-4"> <div class="col-3 outer-div mt-1"> <div class=" circleDiv centered"> <a href="https://elixir-europe.org/platforms/interoperability" target="_blank"> diff --git a/frontend/src/app/map/map.component.ts b/frontend/src/app/map/map.component.ts index 979f5415..51cd91d5 100644 --- a/frontend/src/app/map/map.component.ts +++ b/frontend/src/app/map/map.component.ts @@ -35,24 +35,38 @@ export class MapComponent implements OnInit { // add markers for all locations using markercluster plugin const markers = new MarkerClusterGroup(); + const mapMarkers = []; for (const location of this.curatedLocationList) { const icon = L.icon({ iconUrl: this.getMarkerIconUrl(location), - iconAnchor: [12, 41], // point of the icon which will correspond to marker's location + iconAnchor: [12, 41], // point of the icon which will correspond to marker's location }); const popupText = ` <b>${location.locationName}</b><br/> ${location.locationType}<br/> <a href="sites/${location.locationDbId}">Details</a> `; + const marker = L.marker( + [location.latitude, location.longitude], + { icon: icon } + ); markers.addLayer( - L.marker( - [location.latitude, location.longitude], - { icon: icon } - ).bindPopup(popupText) + marker.bindPopup(popupText) ); + mapMarkers.push(marker); + } + const initialZoom = map.getZoom(); + + + map.fitBounds(L.featureGroup(mapMarkers).getBounds()); + const markerZoom = map.getZoom(); + + setTimeout(() => { + map.setZoom(Math.min(initialZoom, markerZoom)); + map.addLayer(markers); } - map.addLayer(markers); + , 100); + } else { L.DomUtil.get('map').remove(); } -- GitLab From 009f082592c5333da25164d78fed7d29a2934b68 Mon Sep 17 00:00:00 2001 From: jdestin <jeremy.destin@inra.fr> Date: Tue, 7 May 2019 11:20:13 +0200 Subject: [PATCH 09/14] fix: Change message footer. #Issue18 --- .idea/modules/backend/gpds.backend.test.iml | 2 +- frontend/src/app/footer/footer.component.html | 3 +-- frontend/src/app/navbar/navbar.component.scss | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/.idea/modules/backend/gpds.backend.test.iml b/.idea/modules/backend/gpds.backend.test.iml index 5f1aabfe..fa6eb121 100644 --- a/.idea/modules/backend/gpds.backend.test.iml +++ b/.idea/modules/backend/gpds.backend.test.iml @@ -133,8 +133,8 @@ <orderEntry type="library" name="Gradle: org.junit.platform:junit-platform-commons:1.3.2" level="project" /> <orderEntry type="library" name="Gradle: org.apiguardian:apiguardian-api:1.0.0" level="project" /> <orderEntry type="library" name="Gradle: org.opentest4j:opentest4j:1.1.1" level="project" /> - <orderEntry type="library" name="Gradle: javax.annotation:javax.annotation-api:1.3.2" level="project" /> <orderEntry type="library" scope="RUNTIME" name="Gradle: org.junit.platform:junit-platform-engine:1.3.2" level="project" /> + <orderEntry type="library" name="Gradle: javax.annotation:javax.annotation-api:1.3.2" level="project" /> <orderEntry type="library" name="Gradle: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.14" level="project" /> <orderEntry type="library" name="Gradle: org.apache.tomcat.embed:tomcat-embed-core:9.0.14" level="project" /> <orderEntry type="library" name="Gradle: org.apache.tomcat.embed:tomcat-embed-el:9.0.14" level="project" /> diff --git a/frontend/src/app/footer/footer.component.html b/frontend/src/app/footer/footer.component.html index dde80ef4..98d077a7 100644 --- a/frontend/src/app/footer/footer.component.html +++ b/frontend/src/app/footer/footer.component.html @@ -9,11 +9,10 @@ <div class="col-9"> <div class="mt-1"> <a href="https://elixir-europe.org/platforms/interoperability" target="_blank"> - <span class="font-weight-bold text-secondary" style="font-size: small">FAIR Data finder for Agro Research is part of the ELIXIR infrastructure</span><br> + <span class="font-weight-bold text-secondary" style="font-size: small">FAIr Data-finder for Agronomic REsearch is part of the ELIXIR infrastructure</span><br> <span class="text-muted" style="font-size: x-small">Faidare is part of the ELIXIR infrastructure</span> </a> </div> </div> </div> - diff --git a/frontend/src/app/navbar/navbar.component.scss b/frontend/src/app/navbar/navbar.component.scss index 499ee112..f631e2b9 100644 --- a/frontend/src/app/navbar/navbar.component.scss +++ b/frontend/src/app/navbar/navbar.component.scss @@ -2,7 +2,7 @@ .navbar { /*background-color: $theme-navbar-bg-color;*/ - background-image: linear-gradient($theme-navbar-bg-color, $theme-navbar-bg-color, #c9ced9); + background-image: linear-gradient($theme-navbar-bg-color, $theme-navbar-bg-color, #D3D3D3); } .navbar-toggler { -- GitLab From b27886bd5ba13e388b1f8ea5c7a71bf106d43b61 Mon Sep 17 00:00:00 2001 From: jdestin <jeremy.destin@inra.fr> Date: Thu, 6 Jun 2019 14:21:45 +0200 Subject: [PATCH 10/14] rebase: Rebase master into code_review. Issue #15 --- .../repository/file/datasources.jsonld | 2 +- .../faidare/repository/file/logos/VIB_40h.png | Bin 0 -> 359 bytes frontend/src/app/app.component.html | 2 +- frontend/src/app/app.module.ts | 2 - frontend/src/app/footer/footer.component.html | 18 --- frontend/src/app/footer/footer.component.scss | 38 ------ .../src/app/footer/footer.component.spec.ts | 25 ---- frontend/src/app/footer/footer.component.ts | 16 --- .../germplasm-card.component.html | 114 +++++++++--------- .../germplasm-card.component.ts | 5 - .../src/app/navbar/navbar.component.spec.ts | 2 +- .../result-page/result-page.component.html | 1 - .../app/site-card/site-card.component.html | 4 +- .../faidare/{logo.png => applicationLogo.png} | Bin frontend/src/assets/gpds/elixir-logo.png | Bin 15605 -> 0 bytes frontend/src/environments/environment.prod.ts | 2 +- frontend/src/environments/environment.ts | 2 +- 17 files changed, 64 insertions(+), 169 deletions(-) create mode 100644 backend/src/main/resources/fr/inra/urgi/faidare/repository/file/logos/VIB_40h.png delete mode 100644 frontend/src/app/footer/footer.component.html delete mode 100644 frontend/src/app/footer/footer.component.scss delete mode 100644 frontend/src/app/footer/footer.component.spec.ts delete mode 100644 frontend/src/app/footer/footer.component.ts rename frontend/src/assets/faidare/{logo.png => applicationLogo.png} (100%) delete mode 100644 frontend/src/assets/gpds/elixir-logo.png diff --git a/backend/src/main/resources/fr/inra/urgi/faidare/repository/file/datasources.jsonld b/backend/src/main/resources/fr/inra/urgi/faidare/repository/file/datasources.jsonld index a019c38e..6b319a01 100644 --- a/backend/src/main/resources/fr/inra/urgi/faidare/repository/file/datasources.jsonld +++ b/backend/src/main/resources/fr/inra/urgi/faidare/repository/file/datasources.jsonld @@ -17,7 +17,7 @@ "schema:identifier": "VIB", "schema:name": "VIB PIPPA", "schema:url": "http://pippa.psb.ugent.be", - "schema:image": "./logos/VIB.png" + "schema:image": "./logos/VIB_40h.png" }, { "@type": "schema:DataCatalog", diff --git a/backend/src/main/resources/fr/inra/urgi/faidare/repository/file/logos/VIB_40h.png b/backend/src/main/resources/fr/inra/urgi/faidare/repository/file/logos/VIB_40h.png new file mode 100644 index 0000000000000000000000000000000000000000..fa3f1568791db864b4a981d200258e5e75c9840b GIT binary patch literal 359 zcmV-t0hs=YP)<h;3K|Lk000e1NJLTq002q=001Zi0{{R3tHN;;0000RP)t-sM{rDL zR*guvw>rDIS~87lqpaa`M)Pkr0RaJVxwLlx0004WQchC<K<3zH0002`Nkl<Zcmd7O zF=_)b6olciAwp%2V7wOy)(H$bKp+=L=QdqhmG9U=`}2auGN{c|Yw__*Sf^KsUAL>; zPIs|$Ywc#$J2ADfi&ghbnHY-L*7jLN40O9VMXWKah&A@+6tPu{*h&%G7K+&C;{PIc zwvR^<<H`@Oh`nsQ>YuFq{O!9&*I0yV#Qrfhjvh~nlR7C_S*tE$D5dHLMGVD3JSl$i zvb7?Hs)5o`5ku|3sA3fpd!QshpH&wtDC%JpF{ikZ7^?0{sd&H?Lq(lceiB2;tBj@U zUX@f~6|te}LDfL9g5oR{>j+|2i4hx0vzk)u3&kM{q+cQO?KvH@Y@q-E002ovPDHLk FV1h3wm(u_M literal 0 HcmV?d00001 diff --git a/frontend/src/app/app.component.html b/frontend/src/app/app.component.html index c790a3b8..19054abf 100644 --- a/frontend/src/app/app.component.html +++ b/frontend/src/app/app.component.html @@ -1,5 +1,5 @@ <faidare-navbar></faidare-navbar> -<div class="container"> +<div class="container" style="margin-top: 100px"> <faidare-error></faidare-error> <router-outlet></router-outlet> </div> diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts index 4e09db83..e5b359ee 100644 --- a/frontend/src/app/app.module.ts +++ b/frontend/src/app/app.module.ts @@ -25,7 +25,6 @@ import { CardTableComponent } from './card-table/card-table.component'; import { MomentModule } from 'ngx-moment'; import { XrefsComponent } from './xrefs/xrefs.component'; import { CoordinatesModule } from 'angular-coordinates'; -import { FooterComponent } from './footer/footer.component'; @NgModule({ @@ -48,7 +47,6 @@ import { FooterComponent } from './footer/footer.component'; LoadingSpinnerComponent, CardTableComponent, XrefsComponent, - FooterComponent ], imports: [ BrowserModule, diff --git a/frontend/src/app/footer/footer.component.html b/frontend/src/app/footer/footer.component.html deleted file mode 100644 index 98d077a7..00000000 --- a/frontend/src/app/footer/footer.component.html +++ /dev/null @@ -1,18 +0,0 @@ -<div class="row footer mt-4"> - <div class="col-3 outer-div mt-1"> - <div class=" circleDiv centered"> - <a href="https://elixir-europe.org/platforms/interoperability" target="_blank"> - <img src="assets/elixir-logo.png" alt="Logo Elixir" height="45px" class="ml-2"/> - </a> - </div> - </div> - <div class="col-9"> - <div class="mt-1"> - <a href="https://elixir-europe.org/platforms/interoperability" target="_blank"> - <span class="font-weight-bold text-secondary" style="font-size: small">FAIr Data-finder for Agronomic REsearch is part of the ELIXIR infrastructure</span><br> - <span class="text-muted" style="font-size: x-small">Faidare is part of the ELIXIR infrastructure</span> - </a> - </div> - </div> -</div> - diff --git a/frontend/src/app/footer/footer.component.scss b/frontend/src/app/footer/footer.component.scss deleted file mode 100644 index 79e9e64d..00000000 --- a/frontend/src/app/footer/footer.component.scss +++ /dev/null @@ -1,38 +0,0 @@ -@import "theme"; - -.footer { - background-color: $theme-footer-bg-color; - height: 60px; - position: fixed; - bottom: 0; - left: 0; - right: 0; - z-index: 1100; -} - - -a { - color: black; - text-decoration: none; -} - -span { - font-size: large; -} - - -.circleDiv { - border-radius: 50%; - width: 70px; - height: 50px; - background-image: radial-gradient(#767c82, #8e959b, #c0c7cd); -} - -.centered { - margin: 0 auto; -} - -.outer-div { - padding: 3px; -} - diff --git a/frontend/src/app/footer/footer.component.spec.ts b/frontend/src/app/footer/footer.component.spec.ts deleted file mode 100644 index 896320aa..00000000 --- a/frontend/src/app/footer/footer.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { FooterComponent } from './footer.component'; - -describe('FooterComponent', () => { - let component: FooterComponent; - let fixture: ComponentFixture<FooterComponent>; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [FooterComponent] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(FooterComponent); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/frontend/src/app/footer/footer.component.ts b/frontend/src/app/footer/footer.component.ts deleted file mode 100644 index bac0dea5..00000000 --- a/frontend/src/app/footer/footer.component.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { Component, OnInit } from '@angular/core'; - -@Component({ - selector: 'gpds-footer', - templateUrl: './footer.component.html', - styleUrls: ['./footer.component.scss'] -}) -export class FooterComponent implements OnInit { - - constructor() { - } - - ngOnInit() { - } - -} diff --git a/frontend/src/app/germplasm-card/germplasm-card.component.html b/frontend/src/app/germplasm-card/germplasm-card.component.html index 3712b3ac..9e94c9f0 100644 --- a/frontend/src/app/germplasm-card/germplasm-card.component.html +++ b/frontend/src/app/germplasm-card/germplasm-card.component.html @@ -113,7 +113,8 @@ </faidare-card-row> </ng-template> - <ng-template #instituteTemplate let-logo="logo" let-code="instituteCode" let-acronym="acronym" let-organisation="organisation" let-type="instituteType" let-webSite="webSite" let-address="address"> + <ng-template #instituteTemplate let-logo="logo" let-code="instituteCode" let-acronym="acronym" + let-organisation="organisation" let-type="instituteType" let-webSite="webSite" let-address="address"> <faidare-card-row label="" [test]="logo"> @@ -175,8 +176,6 @@ </ng-template> <!--Section for the image representing the germplasm and the details about this image--> - <div class="col-auto field" *ngIf="germplasmGnpis.photo && germplasmGnpis.photo.thumbnailFileName"> - <a class="btn popovers" data-boundary="window" placement="auto" [ngbPopover]="imageTemplate" <div class="col-auto field" *ngIf="germplasmGnpis.photo && germplasmGnpis.photo.thumbnailFile"> <a class="btn popovers" data-boundary="window" placement="auto" [autoClose]="'outside'" @@ -185,6 +184,7 @@ <img [src]="germplasmGnpis.photo.thumbnailFile" class="img-fluid"> + <figcaption class="figure-caption" style="color: #0f6fa1;"> © {{ germplasmGnpis.photo.copyright }} </figcaption> @@ -330,7 +330,7 @@ </div> <!--Section for the information about the holding of the germplasm--> - <gpds-card-section + <faidare-card-section header="Depositary" [test]="germplasmGnpis.holdingInstitute"> <ng-template> @@ -499,39 +499,38 @@ [test]="germplasmGnpis.donors && germplasmGnpis.donors.length > 0"> <ng-template> <div class="table-responsive scroll-table table-card-body"> - <faidare-card-table - [headers]="[ + <faidare-card-table + [headers]="[ 'Institute name', 'Institute code', 'Donation date', 'Accession number', 'Accession PUI' ]" - [rows]="germplasmGnpis.donors"> - <ng-template let-row> - <tr> - <ng-template #donorInstituteTemplate> - <ng-container *ngTemplateOutlet="instituteTemplate;context:row.donorInstitute"> - </ng-container> - </ng-template> + [rows]="germplasmGnpis.donors"> + <ng-template let-row> + <tr> + <ng-template #donorInstituteTemplate> + <ng-container *ngTemplateOutlet="instituteTemplate;context:row.donorInstitute"> + </ng-container> + </ng-template> - <td> - <a class="popovers" placement="auto" - [autoClose]="'outside'" - [ngbPopover]="donorInstituteTemplate" - [popoverTitle]="row.donorInstitute.instituteName"> - {{ row.donorInstitute.instituteName }} - </a> - </td> - <td>{{ row.donorInstituteCode }}</td> - <td>{{ row.donationDate }}</td> - <td>{{ row.donorAccessionNumber }}</td> - <td>{{ row.donorGermplasmPUI }}</td> - </tr> - </ng-template> - </faidare-card-table> + <td> + <a class="popovers" placement="auto" + [autoClose]="'outside'" + [ngbPopover]="donorInstituteTemplate" + [popoverTitle]="row.donorInstitute.instituteName"> + {{ row.donorInstitute.instituteName }} + </a> + </td> + <td>{{ row.donorInstituteCode }}</td> + <td>{{ row.donationDate }}</td> + <td>{{ row.donorAccessionNumber }}</td> + <td>{{ row.donorGermplasmPUI }}</td> + </tr> + </ng-template> + </faidare-card-table> - </faidare-card-table> </div> </ng-template> </faidare-card-section> @@ -543,35 +542,35 @@ <ng-template> <div class="table-responsive scroll-table table-card-body"> - <!--TODO : Add order column when ordering URL will be available--> - <faidare-card-table - [headers]="[ + <!--TODO : Add order column when ordering URL will be available--> + <faidare-card-table + [headers]="[ 'Institute', 'Accession number', 'Distribution status' ]" - [rows]="germplasmGnpis.distributors"> - <ng-template let-row> - <tr> - <ng-template #distributorInstituteTemplate> - <ng-container *ngTemplateOutlet="instituteTemplate;context:row.institute"> - </ng-container> - </ng-template> + [rows]="germplasmGnpis.distributors"> + <ng-template let-row> + <tr> + <ng-template #distributorInstituteTemplate> + <ng-container *ngTemplateOutlet="instituteTemplate;context:row.institute"> + </ng-container> + </ng-template> - <td> - <a class="popovers" placement="auto" - [autoClose]="'outside'" - [ngbPopover]="instituteTemplate" - [popoverTitle]="row.institute.instituteName"> - {{ row.institute.instituteName }} - </a> - </td> - <td>{{ row.accessionNumber }}</td> - <td>{{ row.distributionStatus }}</td> - </tr> - </ng-template> + <td> + <a class="popovers" placement="auto" + [autoClose]="'outside'" + [ngbPopover]="instituteTemplate" + [popoverTitle]="row.institute.instituteName"> + {{ row.institute.instituteName }} + </a> + </td> + <td>{{ row.accessionNumber }}</td> + <td>{{ row.distributionStatus }}</td> + </tr> + </ng-template> - </faidare-card-table> + </faidare-card-table> </div> </ng-template> </faidare-card-section> @@ -680,8 +679,8 @@ <ng-container *ngFor="let child of germplasmProgeny"> <faidare-card-row class="text" - [label]="child.secondParentName ? 'child(ren) of ' + child.firstParentName + ' x ' + child.secondParentName : 'child(ren) of ' + child.firstParentName" - [test]="checkProgeny()"> + [label]="child.secondParentName ? 'child(ren) of ' + child.firstParentName + ' x ' + child.secondParentName : 'child(ren) of ' + child.firstParentName" + [test]="checkProgeny()"> <ng-template> <ng-container *ngFor="let sibling of child.sibblings"> @@ -704,7 +703,7 @@ header="Population" [test]="germplasmGnpis.population && germplasmGnpis.population.length > 0"> <ng-template> - <div class="card-body card-section-body card-section-body"> + <div class="card-body card-section-body card-section-body"> <ng-container *ngFor="let population of germplasmGnpis.population"> <faidare-card-row @@ -778,8 +777,9 @@ <ng-template> <div class="card-body card-section-body"> <ng-container *ngFor="let panel of germplasmGnpis.panel"> - <gpds-card-row - [label]="panel.type ? panel.name.replace(toReplace, ' ') + ' (' + panel.type + ')' : panel.name.replace(toReplace,' ')"> + <faidare-card-row + [label]="panel.type ? panel.name.replace(toReplace, ' ') + ' (' + panel.type + ')' : + panel.name.replace(toReplace,' ')"> <ng-template> <a [routerLink]="['/']" [queryParams]="{germplasmLists: panel.name, types: 'Germplasm'}"> diff --git a/frontend/src/app/germplasm-card/germplasm-card.component.ts b/frontend/src/app/germplasm-card/germplasm-card.component.ts index 77f4ecd3..8ca15147 100644 --- a/frontend/src/app/germplasm-card/germplasm-card.component.ts +++ b/frontend/src/app/germplasm-card/germplasm-card.component.ts @@ -39,11 +39,6 @@ export class GermplasmCardComponent implements OnInit { germplasmSource: DataDiscoverySource; toReplace = /_/g; - // TODO extract those url in a configuration file. URL maybe be added during extraction. - IMAGES_ACCESSION_URL = 'https://urgi.versailles.inra.fr/files/siregal/images/accession/'; - IMAGES_INSTITUTION_URL = 'https://urgi.versailles.inra.fr/files/siregal/images//institution/'; - IMAGES_BRC_URL = 'https://urgi.versailles.inra.fr/files/siregal/images/grc/inra_brc_en.png'; - loaded: Promise<any>; loading = true; diff --git a/frontend/src/app/navbar/navbar.component.spec.ts b/frontend/src/app/navbar/navbar.component.spec.ts index f057050e..f66120ae 100644 --- a/frontend/src/app/navbar/navbar.component.spec.ts +++ b/frontend/src/app/navbar/navbar.component.spec.ts @@ -56,7 +56,7 @@ describe('NavbarComponent', () => { component.navbar = { name: 'FAIDARE', title: 'FAIR Data-finder for Agronomic REsearch', - logo: 'assets/logo.png', + logo: 'assets/applicationLogo.png', links: [ { label: 'INRA', url: 'http://www.inra.fr/' }, { label: 'URGI', url: 'https://urgi.versailles.inra.fr/' } diff --git a/frontend/src/app/result-page/result-page.component.html b/frontend/src/app/result-page/result-page.component.html index b06da980..b5a0c9d0 100644 --- a/frontend/src/app/result-page/result-page.component.html +++ b/frontend/src/app/result-page/result-page.component.html @@ -105,4 +105,3 @@ </div> </div> </div> -<gpds-footer></gpds-footer> diff --git a/frontend/src/app/site-card/site-card.component.html b/frontend/src/app/site-card/site-card.component.html index 628e57e4..2fe40d94 100644 --- a/frontend/src/app/site-card/site-card.component.html +++ b/frontend/src/app/site-card/site-card.component.html @@ -85,7 +85,7 @@ <ng-template> {{ location.latitude }} ({{ location.latitude | coordinates:type.ToDegrees:direction.Latitude }}) </ng-template> - </gpds-card-row> + </faidare-card-row> <faidare-card-row label="Longitude" @@ -93,7 +93,7 @@ <ng-template> {{ location.longitude }} ({{ location.longitude | coordinates:type.ToDegrees:direction.Longitude }}) </ng-template> - </gpds-card-row> + </faidare-card-row> <faidare-card-row label="Geographical location" diff --git a/frontend/src/assets/faidare/logo.png b/frontend/src/assets/faidare/applicationLogo.png similarity index 100% rename from frontend/src/assets/faidare/logo.png rename to frontend/src/assets/faidare/applicationLogo.png diff --git a/frontend/src/assets/gpds/elixir-logo.png b/frontend/src/assets/gpds/elixir-logo.png deleted file mode 100644 index 4ab5f84477a00a439d7875691e4eab12e181ddfb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15605 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 NO7iNcN?Egz{{wm@2k`&^ diff --git a/frontend/src/environments/environment.prod.ts b/frontend/src/environments/environment.prod.ts index 84e09f13..1b80c5f4 100644 --- a/frontend/src/environments/environment.prod.ts +++ b/frontend/src/environments/environment.prod.ts @@ -4,7 +4,7 @@ export const environment = { navbar: { name: 'FAIDARE', title: 'FAIR Data-finder for Agronomic REsearch', - logo: 'assets/logo.png', + logo: 'assets/applicationLogo.png', links: [ { label: 'URGI', diff --git a/frontend/src/environments/environment.ts b/frontend/src/environments/environment.ts index 988a9ca2..436d1da0 100644 --- a/frontend/src/environments/environment.ts +++ b/frontend/src/environments/environment.ts @@ -7,7 +7,7 @@ export const environment = { navbar: { name: 'FAIDARE', title: 'FAIR Data-finder for Agronomic REsearch', - logo: 'assets/logo.png', + logo: 'assets/applicationLogo.png', links: [ { label: 'URGI', -- GitLab From d65a96984de956feb60124e5e013e2552059102e Mon Sep 17 00:00:00 2001 From: jdestin <jeremy.destin@inra.fr> Date: Thu, 6 Jun 2019 16:33:45 +0200 Subject: [PATCH 11/14] fix: Remove back to form button. Issue #15 --- .../src/app/germplasm-card/germplasm-card.component.html | 6 ------ frontend/src/app/navbar/navbar.component.scss | 4 ++-- frontend/src/app/site-card/site-card.component.html | 6 ------ frontend/src/app/study-card/study-card.component.html | 6 ------ 4 files changed, 2 insertions(+), 20 deletions(-) diff --git a/frontend/src/app/germplasm-card/germplasm-card.component.html b/frontend/src/app/germplasm-card/germplasm-card.component.html index 9e94c9f0..12326d0f 100644 --- a/frontend/src/app/germplasm-card/germplasm-card.component.html +++ b/frontend/src/app/germplasm-card/germplasm-card.component.html @@ -1,11 +1,5 @@ <faidare-loading-spinner [loading]="loading" class="float-right"></faidare-loading-spinner> -<div class="text-right back-form-button"> - <button type="button" class="btn btn-secondary mt-1" routerLink="/"> - <span> < Back to form </span> - </button> -</div> - <ng-container *ngIf="germplasmGnpis"> <h3 class="mb-4"> <img *ngIf="!loading && germplasmGnpis.holdingGenbank && germplasmGnpis.holdingGenbank.instituteName" diff --git a/frontend/src/app/navbar/navbar.component.scss b/frontend/src/app/navbar/navbar.component.scss index f631e2b9..7319121e 100644 --- a/frontend/src/app/navbar/navbar.component.scss +++ b/frontend/src/app/navbar/navbar.component.scss @@ -1,8 +1,8 @@ @import "theme"; .navbar { - /*background-color: $theme-navbar-bg-color;*/ - background-image: linear-gradient($theme-navbar-bg-color, $theme-navbar-bg-color, #D3D3D3); + background-color: $theme-navbar-bg-color; + /*background-image: linear-gradient($theme-navbar-bg-color, #D3D3D3, $theme-navbar-bg-color);*/ } .navbar-toggler { diff --git a/frontend/src/app/site-card/site-card.component.html b/frontend/src/app/site-card/site-card.component.html index 2fe40d94..4f6affc4 100644 --- a/frontend/src/app/site-card/site-card.component.html +++ b/frontend/src/app/site-card/site-card.component.html @@ -1,11 +1,5 @@ <faidare-loading-spinner [loading]="loading" class="float-right"></faidare-loading-spinner> -<div class="text-right back-form-button"> - <button type="button" class="btn btn-secondary mt-1" routerLink="/"> - <span> < Back to form </span> - </button> -</div> - <ng-container *ngIf="location"> <h3 class="mb-4"> Site: {{ location.locationName }} diff --git a/frontend/src/app/study-card/study-card.component.html b/frontend/src/app/study-card/study-card.component.html index a82e54bb..d7332d84 100644 --- a/frontend/src/app/study-card/study-card.component.html +++ b/frontend/src/app/study-card/study-card.component.html @@ -1,11 +1,5 @@ <faidare-loading-spinner [loading]="loading" class="float-right"></faidare-loading-spinner> -<div class="text-right back-form-button"> - <button type="button" class="btn btn-secondary mt-1" routerLink="/"> - <span> < Back to form </span> - </button> -</div> - <ng-container *ngIf="study"> <h3 class="mb-4"> Study {{ study.studyType }}: {{ study.studyName }} -- GitLab From 4765537eeaae905410afd7af7f87a89c5c7c7328 Mon Sep 17 00:00:00 2001 From: jdestin <jeremy.destin@inra.fr> Date: Tue, 11 Jun 2019 19:49:23 +0200 Subject: [PATCH 12/14] feat: Add back to form button. Issue #15 --- frontend/src/app/navbar/navbar.component.html | 10 ++++++ frontend/src/app/navbar/navbar.component.ts | 32 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/frontend/src/app/navbar/navbar.component.html b/frontend/src/app/navbar/navbar.component.html index 7e20b754..ef756d3f 100644 --- a/frontend/src/app/navbar/navbar.component.html +++ b/frontend/src/app/navbar/navbar.component.html @@ -45,5 +45,15 @@ [href]="navbar.contributor.url" target="_blank"> <img src="{{ navbar.contributor.logo }}" alt="{{ navbar.contributor.name }} logo" height="60px"/> </a> + <div> + <a [routerLink]="['/']" + [queryParams]="previousQueryParam"> + <button *ngIf="displayBackButton" type="button" class="btn btn-secondary"> + < Back to form + </button> + </a> + </div> + + </div> </nav> diff --git a/frontend/src/app/navbar/navbar.component.ts b/frontend/src/app/navbar/navbar.component.ts index 78d66a1c..f39a9e08 100644 --- a/frontend/src/app/navbar/navbar.component.ts +++ b/frontend/src/app/navbar/navbar.component.ts @@ -1,5 +1,7 @@ import { Component } from '@angular/core'; import { environment } from '../../environments/environment'; +import { routes as appUrlRoutes } from '../app-routing.module'; +import { ActivatedRoute, Params, Router, RoutesRecognized } from '@angular/router'; @Component({ selector: 'faidare-navbar', @@ -8,10 +10,40 @@ import { environment } from '../../environments/environment'; }) export class NavbarComponent { + displayBackButton = false; + previousQueryParam: Params; + + constructor(private router: Router, private route: ActivatedRoute + ) { + + this.router.events.subscribe(event => { + if (event instanceof RoutesRecognized) { + if (this.checkIsFormPage(event.url)) { + this.displayBackButton = false; + this.route.queryParams.subscribe(queryParam => { + this.previousQueryParam = queryParam; + }); + } else { + this.displayBackButton = true; + } + } + }); + } + navbar = environment.navbar; navbarCollapsed = true; toggleNavbar() { this.navbarCollapsed = !this.navbarCollapsed; } + + checkIsFormPage(url: String) { + for (const route of appUrlRoutes) { + const routeType: string = route.path.split(':')[0]; + if (routeType !== '' && url.startsWith('/' + routeType)) { + return false; + } + } + return true; + } } -- GitLab From fdd467104e478a8eab2c9733995cc0b023418f74 Mon Sep 17 00:00:00 2001 From: Celia Michotey <celia.michotey@inra.fr> Date: Wed, 12 Jun 2019 17:48:18 +0200 Subject: [PATCH 13/14] Comment button and fix xref bug. GNP-5482 --- .../faidare/repository/es/XRefDocumentRepositoryImpl.java | 4 +++- frontend/src/app/navbar/navbar.component.html | 8 ++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/XRefDocumentRepositoryImpl.java b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/XRefDocumentRepositoryImpl.java index 7406617a..60be4c1c 100644 --- a/backend/src/main/java/fr/inra/urgi/faidare/repository/es/XRefDocumentRepositoryImpl.java +++ b/backend/src/main/java/fr/inra/urgi/faidare/repository/es/XRefDocumentRepositoryImpl.java @@ -11,6 +11,7 @@ import fr.inra.urgi.faidare.elasticsearch.query.impl.ESGenericQueryFactory; import fr.inra.urgi.faidare.repository.http.UserGroupsResourceClient; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; +import org.elasticsearch.action.support.IndicesOptions; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.index.query.QueryBuilder; @@ -71,7 +72,8 @@ public class XRefDocumentRepositoryImpl implements XRefDocumentRepository { SearchRequest searchRequest = new SearchRequest() .indices(aliases) - .source(source); + .source(source) + .indicesOptions(IndicesOptions.fromOptions(true, false, false, false)); SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); diff --git a/frontend/src/app/navbar/navbar.component.html b/frontend/src/app/navbar/navbar.component.html index ef756d3f..742e19c5 100644 --- a/frontend/src/app/navbar/navbar.component.html +++ b/frontend/src/app/navbar/navbar.component.html @@ -46,14 +46,14 @@ <img src="{{ navbar.contributor.logo }}" alt="{{ navbar.contributor.name }} logo" height="60px"/> </a> <div> - <a [routerLink]="['/']" + <!--<a *ngIf="displayBackButton" + [routerLink]="['/']" [queryParams]="previousQueryParam"> - <button *ngIf="displayBackButton" type="button" class="btn btn-secondary"> + <button type="button" class="btn btn-secondary"> < Back to form </button> - </a> + </a>--> </div> - </div> </nav> -- GitLab From e9ee5eabbe12bfe97ef90b880a00a60cd6dc5eff Mon Sep 17 00:00:00 2001 From: Celia Michotey <celia.michotey@inra.fr> Date: Wed, 12 Jun 2019 17:59:31 +0200 Subject: [PATCH 14/14] Comment button code. --- frontend/src/app/navbar/navbar.component.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/navbar/navbar.component.ts b/frontend/src/app/navbar/navbar.component.ts index f39a9e08..364f39bf 100644 --- a/frontend/src/app/navbar/navbar.component.ts +++ b/frontend/src/app/navbar/navbar.component.ts @@ -1,7 +1,5 @@ import { Component } from '@angular/core'; import { environment } from '../../environments/environment'; -import { routes as appUrlRoutes } from '../app-routing.module'; -import { ActivatedRoute, Params, Router, RoutesRecognized } from '@angular/router'; @Component({ selector: 'faidare-navbar', @@ -10,7 +8,7 @@ import { ActivatedRoute, Params, Router, RoutesRecognized } from '@angular/route }) export class NavbarComponent { - displayBackButton = false; + /*displayBackButton = false; previousQueryParam: Params; constructor(private router: Router, private route: ActivatedRoute @@ -28,7 +26,7 @@ export class NavbarComponent { } } }); - } + }*/ navbar = environment.navbar; navbarCollapsed = true; @@ -37,7 +35,7 @@ export class NavbarComponent { this.navbarCollapsed = !this.navbarCollapsed; } - checkIsFormPage(url: String) { + /*checkIsFormPage(url: String) { for (const route of appUrlRoutes) { const routeType: string = route.path.split(':')[0]; if (routeType !== '' && url.startsWith('/' + routeType)) { @@ -45,5 +43,5 @@ export class NavbarComponent { } } return true; - } + }*/ } -- GitLab