diff --git a/angular.json b/angular.json index 4a3e44c429bd1b5620e81bcfa4d6c62d6589fa29..02ab2fa6041cf36b5c8fdef41a9391ed82b4acd9 100644 --- a/angular.json +++ b/angular.json @@ -120,7 +120,8 @@ "node_modules/tinymce/plugins/table/plugin.min.js", "node_modules/echarts/dist/echarts.min.js", "node_modules/echarts/dist/extension/bmap.min.js", - "node_modules/chart.js/dist/Chart.min.js" + "node_modules/chart.js/dist/Chart.min.js", + "node_modules/marked/lib/marked.js" ], "styles": [ "node_modules/bootstrap/dist/css/bootstrap.css", diff --git a/package-lock.json b/package-lock.json index 8e88c4c0f2f64639561e4d9bf1c75917ec3b088b..44915bd40cc1e69847ee274a81ed1f8580a100a0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2982,6 +2982,11 @@ "@types/geojson": "*" } }, + "@types/marked": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-2.0.2.tgz", + "integrity": "sha512-P4zanhCQKs4tiWPPBGpB7lHflgFCP9DFGNI5YtpW9MALKoy2qs9rHNWJ+z55cegD9uCfnmsKuaosq9FNvbxrOw==" + }, "@types/minimatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", @@ -3423,16 +3428,6 @@ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" }, - "angular-auth-oidc-client": { - "version": "11.4.5", - "resolved": "https://registry.npmjs.org/angular-auth-oidc-client/-/angular-auth-oidc-client-11.4.5.tgz", - "integrity": "sha512-QNQIOFE4rYU/rhq9HgDDUC+6nt7CWfyo16B+BP6AokIoAijkSZIsHz7Tpbt9ZSQKVulkM0xgWmtNsbBsV/GTog==", - "requires": { - "common-tags": "^1.8.0", - "jsrsasign-reduced": "^8.0.15", - "tslib": "^2.0.0" - } - }, "angular2-chartjs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/angular2-chartjs/-/angular2-chartjs-0.4.1.tgz", @@ -4906,6 +4901,17 @@ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", "dev": true }, + "clipboard": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.8.tgz", + "integrity": "sha512-Y6WO0unAIQp5bLmk1zdThRhgJt/x3ks6f30s3oE3H1mgIEU33XyQjEf8gsf6DxC7NPX8Y1SsNWjUjL/ywLnnbQ==", + "optional": true, + "requires": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, "cliui": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", @@ -5255,11 +5261,6 @@ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, - "common-tags": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz", - "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==" - }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", @@ -7103,6 +7104,12 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==", + "optional": true + }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -7583,6 +7590,11 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, + "emoji-toolkit": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/emoji-toolkit/-/emoji-toolkit-6.5.1.tgz", + "integrity": "sha512-oY5E81cXvRUxXkbVgOI8NxYHKF5FeWfJhFCIYUKhbVfSmdCH8+bmJzgDdhufExa7t1+WEzpUFdHwYxJTXS90vQ==" + }, "emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", @@ -9333,6 +9345,15 @@ "sparkles": "^1.0.0" } }, + "good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha1-1TswzfkxPf+33JoNR3CWqm0UXFA=", + "optional": true, + "requires": { + "delegate": "^3.1.2" + } + }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", @@ -11480,11 +11501,6 @@ } } }, - "jsrsasign-reduced": { - "version": "8.0.15", - "resolved": "https://registry.npmjs.org/jsrsasign-reduced/-/jsrsasign-reduced-8.0.15.tgz", - "integrity": "sha512-Ig4W69nXCIUedzOSk3nqJWUr2DmSDENYfsmCqVK33GPETtPcjwREGQc92hV5jcJ6zavMvGD4tjhZ+T7JIiaSLA==" - }, "jszip": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", @@ -11983,6 +11999,21 @@ } } }, + "katex": { + "version": "0.13.5", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.13.5.tgz", + "integrity": "sha512-n2uEzFpNFUOAlWs0eCgmT82LQyP+BlS45yBgnLRqe+ENp3+FEM3lM+cJwZwwxxONFgayyq1fm6n+w35vo2MaUg==", + "requires": { + "commander": "^6.0.0" + }, + "dependencies": { + "commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==" + } + } + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -13417,6 +13448,26 @@ } } }, + "ngx-markdown": { + "version": "11.1.3", + "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-11.1.3.tgz", + "integrity": "sha512-z32q8l76ubrcP62L03mdvrizwueLBHV10LkT8MEDnFcjmY+8J1PytxFJ9EBTJpvc+CaPolgAoi7felN2XJZTSg==", + "requires": { + "@types/marked": "^2.0.0", + "emoji-toolkit": "^6.0.1", + "katex": "^0.13.0", + "marked": "^2.0.0", + "prismjs": "^1.23.0", + "tslib": "^2.0.0" + }, + "dependencies": { + "marked": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/marked/-/marked-2.0.3.tgz", + "integrity": "sha512-5otztIIcJfPc2qGTN8cVtOJEjNJZ0jwa46INMagrYfk0EvqtRuEHLsEe0LrFS0/q+ZRKT0+kXK7P2T1AN5lWRA==" + } + } + }, "ngx-owl-carousel-o": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/ngx-owl-carousel-o/-/ngx-owl-carousel-o-4.0.0.tgz", @@ -13432,6 +13483,11 @@ } } }, + "ngx-pagination": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ngx-pagination/-/ngx-pagination-5.0.0.tgz", + "integrity": "sha512-Ur0pTWRe2ZXoJ8impEzo0IZKxY5aEcQfSmL5uBqW1rHI2J6nfzgZAHsSLagKHFGchXq0PkRlDVVMcIaNxYJwvQ==" + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -16284,6 +16340,14 @@ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, + "prismjs": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.23.0.tgz", + "integrity": "sha512-c29LVsqOaLbBHuIbsTxaKENh1N2EQBOHaWv7gkHN4dgRbxSREqDnDbtFJYdpPauS4YCplMSNCABQ6Eeor69bAA==", + "requires": { + "clipboard": "^2.0.0" + } + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -18166,6 +18230,12 @@ } } }, + "select": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", + "integrity": "sha1-DnNQrN7ICxEIUoeG7B1EGNEbOW0=", + "optional": true + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -20442,6 +20512,12 @@ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", "dev": true }, + "tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==", + "optional": true + }, "tinymce": { "version": "4.5.7", "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-4.5.7.tgz", diff --git a/package.json b/package.json index 6e462deabb81b9dbb6adafc17bd00b73ac8b6d70..77b8d601939a014982984840fad9d491d4358a45 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "ng2-ckeditor": "^1.2.9", "ng2-smart-table": "^1.6.0", "ngx-echarts": "^4.2.2", + "ngx-markdown": "^11.1.3", "ngx-owl-carousel-o": "^4.0.0", "ngx-pagination": "^5.0.0", "node-sass": "^4.14.1", diff --git a/src/app/@theme/components/header/header.component.html b/src/app/@theme/components/header/header.component.html index 4ebef15960d8ba8858cdff143ee646eeaa38c5e6..97ea107315167181c8ab4e6f2c4cd4e0d66f72ff 100644 --- a/src/app/@theme/components/header/header.component.html +++ b/src/app/@theme/components/header/header.component.html @@ -18,7 +18,7 @@ <!-- *nbIsGranted="['view', 'user']" -> sta cosa disabilitava la vista del menĂ¹ da studiare --> - <nb-actions size="small"> + <nb-actions size="small" *ngIf="authenticationEnabled"> <nb-action class="user-action" diff --git a/src/app/@theme/components/header/header.component.ts b/src/app/@theme/components/header/header.component.ts index 48b7de27bda467ccc6c030e65e75cfcbc41b648e..442cfcede1733f0f0872590f2345cd63399130a0 100644 --- a/src/app/@theme/components/header/header.component.ts +++ b/src/app/@theme/components/header/header.component.ts @@ -11,6 +11,7 @@ import { NbAuthService } from '@nebular/auth'; import { Router } from '@angular/router'; import { OidcUserInformationService } from '../../../auth/services/oidc-user-information.service'; import { UserClaims } from '../../../auth/oidc/oidc'; +import { ConfigService } from '@ngx-config/core'; @Component({ selector: 'ngx-header', @@ -26,6 +27,8 @@ export class HeaderComponent implements OnInit, OnDestroy { currentTheme = 'default'; + authenticationEnabled:boolean=false; + userMenu: NbMenuItem[] = [{ title: 'Profile', hidden: true }, { title: 'Log out', data: { tag: "logout" } }]; public constructor( @@ -37,6 +40,7 @@ export class HeaderComponent implements OnInit, OnDestroy { private layoutService: LayoutService, private breakpointService: NbMediaBreakpointsService, private rippleService: RippleService, + private configService: ConfigService, @Inject(NB_WINDOW) private window ) { this.materialTheme$ = this.themeService.onThemeChange() @@ -48,7 +52,7 @@ export class HeaderComponent implements OnInit, OnDestroy { ngOnInit() { this.currentTheme = this.themeService.currentTheme; - + this.authenticationEnabled=this.configService.getSettings("enableAuthentication") this.userService.onUserChange() .subscribe((user: any) => this.user = user); // this.userService.getUser() diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 3f50ebf6dcc789a081bf8913ad37224d37065c10..0af8c9d51076388a597c343cfa1358d595c15a8d 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -27,6 +27,7 @@ import { NbRoleProvider, NbSecurityModule } from '@nebular/security'; import { TokenInterceptor } from './auth/services/token.interceptor'; import { AuthGuard } from './auth/services/auth.guard'; import { AuthLogoutComponent } from './auth/logout/auth-logout.component'; +import { MarkdownModule } from 'ngx-markdown'; export function configFactory(http: HttpClient): ConfigLoader { @@ -52,6 +53,7 @@ export function createTranslateLoader(http: HttpClient) { NbToastrModule.forRoot(), CoreModule.forRoot(), ThemeModule.forRoot(), + MarkdownModule.forRoot(), ConfigModule.forRoot({ provide: ConfigLoader, useFactory: configFactory, diff --git a/src/app/pages/data-catalogue/data-catalogue.module.ts b/src/app/pages/data-catalogue/data-catalogue.module.ts index 66c31960868a33a27aefbe2b58219c89485d2c67..57c6a00101caa22b454155da5f34470962e15874 100644 --- a/src/app/pages/data-catalogue/data-catalogue.module.ts +++ b/src/app/pages/data-catalogue/data-catalogue.module.ts @@ -9,7 +9,7 @@ import { DataCatalogueComponent } from './data-catalogue.component'; import { NbAccordionModule, NbCardModule, NbDialogModule, NbFormFieldModule, NbIconModule, NbInputModule, NbListModule, NbSpinnerModule, NbTagModule, NbToastrModule, NbTooltipModule } from '@nebular/theme'; import { NgxPaginationModule } from 'ngx-pagination'; import { DistributionComponent } from './distribution/distribution.component'; - +import { MarkdownModule } from 'ngx-markdown'; @NgModule({ declarations: [DataCatalogueComponent, SearchComponent, DatasetComponent, DistributionComponent], imports: [ @@ -26,7 +26,8 @@ import { DistributionComponent } from './distribution/distribution.component'; NbToastrModule, NbAccordionModule, NbDialogModule.forChild(), - DataCatalogueRoutingModule + DataCatalogueRoutingModule, + MarkdownModule.forChild() ] }) export class DataCatalogueModule { } diff --git a/src/app/pages/data-catalogue/dataset/dataset.component.html b/src/app/pages/data-catalogue/dataset/dataset.component.html index eee6e1bb62ab528252ab4d3e02362714442bdc20..0fd5d0ab819a19681ca9ec2c08fb86b05f237a0b 100644 --- a/src/app/pages/data-catalogue/dataset/dataset.component.html +++ b/src/app/pages/data-catalogue/dataset/dataset.component.html @@ -4,15 +4,15 @@ <h3>{{dataset.title}}</h3> </nb-card-header> <nb-card-body> - <p *ngIf="dataset.description!=''">{{dataset.description}}</p> - <nb-tag-list *ngIf="dataset.keywords.length>0 || (dataset.keywords.length==1 && dataset.keywords[0]!='')"> + <markdown *ngIf="dataset.description!=''" [data]='dataset.description'></markdown> + <nb-tag-list *ngIf="dataset.keywords!=undefined && (dataset.keywords.length>1 || (dataset.keywords.length==1 && dataset.keywords[0]!=''))"> <nb-tag size="medium" appearance="outline" status="primary" *ngFor="let k of dataset.keywords" [text]="k"> </nb-tag> </nb-tag-list> </nb-card-body> </nb-card> - <nb-card *ngIf="dataset.distributions.length>0"> + <nb-card *ngIf="dataset.distributions!=undefined && dataset.distributions.length>0"> <nb-card-header class="d-flex justify-content-between"> <h5>Resources ({{dataset.distributions.length}})</h5> <pagination-controls *ngIf="dataset.distributions.length>distributionPerPage" id="distributions" @@ -28,53 +28,225 @@ totalItems: dataset.distributions.length }"> <nb-card> <nb-card-header class="d-flex justify-content-between"> - {{distribution.title}} + {{distribution.title}} <span *ngIf="distribution.format!=undefined && distribution.format!='undefined'">({{distribution.format}})</span> <nb-icon icon="info" nbTooltip="See full details" size="large" status="primary" (click)="openDistributionDetails(distribution)"></nb-icon> </nb-card-header> - <nb-card-body class="d-flex flex-column content-truncated"> - <label *ngIf="distribution.description!=''" class="label">Description:</label> - <p *ngIf="distribution.description!=''" class="truncated">{{distribution.description}}</p> - <label *ngIf="distribution.format!=''" class="label">Format:</label> - <p *ngIf="distribution.format!=''" class="truncated">{{distribution.format}}</p> - </nb-card-body> </nb-card> </div> </nb-card-body> </nb-card> - <nb-card *ngIf="dataset.distributions.length>0"> + <nb-card> <nb-card-header> <h5>Additional Information</h5> </nb-card-header> - <nb-card-body> - <p *ngIf="dataset.landingPage!=''"><span class="label">Landing Page:</span> <a - [href]="dataset.landingPage" target="_blank">{{dataset.landingPage}}</a></p> - <p *ngIf="dataset.releaseDate!=''"><span class="label">Release Date:</span> {{dataset.releaseDate | - date}}</p> - <p *ngIf="dataset.updateDate!=''"><span class="label">Update Date:</span> {{dataset.updateDate | - date}}</p> - <p *ngIf="dataset.frequency!=''"><span class="label">Frequency:</span> {{dataset.frequency}}</p> - <p *ngIf="dataset.temporalCoverage!=undefined"><span class="label">Temporal - Coverage:</span> {{dataset.temporalCoverage.startDate | date}} - - {{dataset.temporalCoverage.endDate | date}}</p> - <p - *ngIf="dataset.language.length>0 && (dataset.language.length==1 && dataset.language[0]!='' && dataset.language[0]!=undefined )"> - <span class="label">Languages:</span> {{dataset.language.join(',')}} - </p> - <p - *ngIf="dataset.provenance.length>0 && (dataset.provenance.length==1 && dataset.provenance[0]!='' && dataset.provenance[0]!=undefined )"> - <span class="label">Provenances:</span> {{dataset.provenance.join(',')}} - </p> - <p *ngIf="dataset.accessRights!=''"><span class="label">Access - Rights:</span> {{dataset.accessRights}}</p> - <p *ngIf="dataset.identifier!=''"><span class="label">Identifier:</span> {{dataset.identifier}}</p> - <p - *ngIf="dataset.otherIdentifier.length>0 && (dataset.otherIdentifier.length==1 && dataset.otherIdentifier[0]!='' && dataset.otherIdentifier[0]!=undefined )"> - <span class="label">Other Identifiers:</span> {{dataset.otherIdentifier.join(',')}} - </p> - <p *ngIf="dataset.version!=''"><span class="label">Version:</span> {{dataset.version}}</p> - <!-- ToDo add missing --> + <nb-card-body class="content-truncated"> + + <span *ngIf="dataset.landingPage!=''" class="d-flex flex-column mb-2"> + <label class="label">Landing Page:</label> + <p class="truncated" ><a [href]="dataset.landingPage" target="_blank">{{dataset.landingPage}}</a></p> + </span> + + <span *ngIf="dataset.publisher!=undefined && dataset.publisher.name!=''" class="d-flex flex-column mb-2"> + <label class="label">Publisher Name:</label> + <p class="truncated" class="truncated">{{dataset.publisher.name}}</p> + </span> + + <span *ngIf="dataset.publisher!=undefined && dataset.publisher.mbox!=''" class="d-flex flex-column mb-2"> + <label class="label">Publisher Mail:</label> + <p class="truncated">{{dataset.publisher.mbox}}</p> + </span> + + <span *ngIf="dataset.publisher!=undefined && dataset.publisher.homepage!=''" class="d-flex flex-column mb-2"> + <label class="label">Publisher Homepage:</label> + <p class="truncated">{{dataset.publisher.homepage}}</p> + </span> + + <span *ngIf="dataset.publisher!=undefined && dataset.publisher.type!=''" class="d-flex flex-column mb-2"> + <label class="label">Publisher Type:</label> + <p class="truncated">{{dataset.publisher.type}}</p> + </span> + + <span *ngIf="licenses!=undefined && licenses.length>0" class="d-flex flex-column mb-2"> + <label class="label">Licenses:</label> + <p class="truncated" *ngFor="let l of licenses"><a [href]="l.uri">{{l.name}}</a></p> + </span> + + <span *ngIf="dataset.releaseDate!='' && showDate(dataset.releaseDate)" class="d-flex flex-column mb-2"> + <label class="label">Release Date:</label> + <p class="truncated">{{dataset.releaseDate | date}}</p> + </span> + + <span *ngIf="dataset.updateDate!='' && showDate(dataset.updateDate)" class="d-flex flex-column mb-2"> + <label class="label">Update Date:</label> + <p class="truncated">{{dataset.updateDate | date}}</p> + </span> + + <span *ngIf="dataset.frequency!=''" class="d-flex flex-column mb-2"> + <label class="label">Frequency:</label> + <p class="truncated">{{dataset.frequency}}</p> + </span> + + <span *ngIf="dataset.temporalCoverage!=undefined" class="d-flex flex-column mb-2"> + <label class="label">Temporal Coverage:</label> + <p class="truncated">{{dataset.temporalCoverage.startDate | date}} - {{dataset.temporalCoverage.endDate | date}}</p> + </span> + + <span *ngIf="dataset.language!=undefined && (dataset.language.length>1 || (dataset.language.length==1 && dataset.language[0]!='' && dataset.language[0]!=undefined ))" class="d-flex flex-column mb-2"> + <label class="label">Languages:</label> + <p class="truncated">{{dataset.language.join(',')}}</p> + </span> + + <span *ngIf="dataset.provenance!=undefined && (dataset.provenance.length>1 || (dataset.provenance.length==1 && dataset.provenance[0]!='' && dataset.provenance[0]!=undefined ))" class="d-flex flex-column mb-2"> + <label class="label">Provenances:</label> + <p class="truncated">{{dataset.provenance.join(',')}}</p> + </span> + + <span *ngIf="dataset.accessRights!=''" class="d-flex flex-column mb-2"> + <label class="label">Access Rights:</label> + <p class="truncated">{{dataset.accessRights}}</p> + </span> + + <span *ngIf="dataset.identifier!=''" class="d-flex flex-column mb-2"> + <label class="label">Identifier:</label> + <p class="truncated">{{dataset.identifier}}</p> + </span> + + + + <span *ngIf="dataset.rightsHolder!=undefined && dataset.rightsHolder.name!=''" class="d-flex flex-column mb-2"> + <label class="label">Rights Holder Name:</label> + <p class="truncated">{{dataset.rightsHolder.name}}</p> + </span> + + <span *ngIf="dataset.rightsHolder!=undefined && dataset.rightsHolder.mbox!=''" class="d-flex flex-column mb-2"> + <label class="label">Rights Holder Mail:</label> + <p class="truncated">{{dataset.rightsHolder.mbox}}</p> + </span> + + <span *ngIf="dataset.rightsHolder!=undefined && dataset.rightsHolder.homepage!=''" class="d-flex flex-column mb-2"> + <label class="label">Rights Holder Homepage:</label> + <p class="truncated">{{dataset.rightsHolder.homepage}}</p> + </span> + + <span *ngIf="dataset.rightsHolder!=undefined && dataset.rightsHolder.type!=''" class="d-flex flex-column mb-2"> + <label class="label">Rights Holder Type:</label> + <p class="truncated">{{dataset.rightsHolder.type}}</p> + </span> + + + <span *ngIf="dataset.creator!=undefined && dataset.creator.name!=''" class="d-flex flex-column mb-2"> + <label class="label">Creator Name:</label> + <p class="truncated">{{dataset.creator.name}}</p> + </span> + + <span *ngIf="dataset.creator!=undefined && dataset.creator.mbox!=''" class="d-flex flex-column mb-2"> + <label class="label">Creator Mail:</label> + <p class="truncated">{{dataset.creator.mbox}}</p> + </span> + + <span *ngIf="dataset.creator!=undefined && dataset.creator.homepage!=''" class="d-flex flex-column mb-2"> + <label class="label">Creator Homepage:</label> + <p class="truncated">{{dataset.creator.homepage}}</p> + </span> + + <span *ngIf="dataset.creator!=undefined && dataset.creator.type!=''" class="d-flex flex-column mb-2"> + <label class="label">Creator Type:</label> + <p class="truncated">{{dataset.creator.type}}</p> + </span> + + <span *ngIf="dataset.theme!=undefined && (dataset.theme.length>1 || (dataset.theme.length==1 && dataset.theme[0].prefLabel.length!=0 && dataset.theme[0].prefLabel[0].value!=''))" class="d-flex flex-column mb-2"> + <label class="label">Themes:</label> + <p class="truncated">{{printConcepts(dataset.theme)}}</p> + </span> + + <span *ngIf="dataset.subject!=undefined && (dataset.subject.length>1 || (dataset.subject.length==1 && dataset.subject[0].prefLabel.length!=0 && dataset.subject[0].prefLabel[0].value!=''))" class="d-flex flex-column mb-2"> + <label class="label">Subjects:</label> + <p class="truncated">{{printConcepts(dataset.subject)}}</p> + </span> + + <span *ngIf="dataset.source!=undefined && (dataset.source.length>1 || (dataset.source.length==1 && dataset.source[0]!='' && dataset.source[0]!=undefined ))" class="d-flex flex-column mb-2"> + <label class="label">Source:</label> + <p class="truncated">{{dataset.source.join(',')}}</p> + </span> + + <span *ngIf="dataset.documentation!=undefined && (dataset.documentation.length>1 || (dataset.documentation.length==1 && dataset.documentation[0]!='' && dataset.documentation[0]!=undefined ))" class="d-flex flex-column mb-2"> + <label class="label">Documentation:</label> + <p class="truncated">{{dataset.documentation.join(',')}}</p> + </span> + + <span *ngIf="dataset.otherIdentifier!=undefined && (dataset.otherIdentifier.length>1 || (dataset.otherIdentifier.length==1 && dataset.otherIdentifier[0]!='' && dataset.otherIdentifier[0]!=undefined ))" class="d-flex flex-column mb-2"> + <label class="label">Other Identifiers:</label> + <p class="truncated">{{dataset.otherIdentifier.join(',')}}</p> + </span> + + <span *ngIf="dataset.version!=''" class="d-flex flex-column mb-2"> + <label class="label">Version:</label> + <p class="truncated">{{dataset.version}}</p> + </span> + + <span *ngIf="dataset.versionNotes!=undefined && (dataset.versionNotes.length>1 || (dataset.versionNotes.length==1 && dataset.versionNotes[0]!='' && dataset.versionNotes[0]!=undefined ))" class="d-flex flex-column mb-2"> + <label class="label">Version Notes:</label> + <p class="truncated">{{dataset.versionNotes.join(',')}}</p> + </span> + + <span *ngIf="dataset.hasVersion!=undefined && (dataset.hasVersion.length>1 || (dataset.hasVersion.length==1 && dataset.hasVersion[0]!='' && dataset.hasVersion[0]!=undefined ))" class="d-flex flex-column mb-2"> + <label class="label">Has Version:</label> + <p class="truncated">{{dataset.hasVersion.join(',')}}</p> + </span> + + <span *ngIf="dataset.isVersionOf!=undefined && (dataset.isVersionOf.length>1 || (dataset.isVersionOf.length==1 && dataset.isVersionOf[0]!='' && dataset.isVersionOf[0]!=undefined ))" class="d-flex flex-column mb-2"> + <label class="label">Is Version Of:</label> + <p class="truncated">{{dataset.isVersionOf.join(',')}}</p> + </span> + + <span *ngIf="dataset.sample!=undefined && (dataset.sample.length>1 || (dataset.sample.length==1 && dataset.sample[0]!='' && dataset.sample[0]!=undefined ))" class="d-flex flex-column mb-2"> + <label class="label">Sample:</label> + <p class="truncated">{{dataset.sample.join(',')}}</p> + </span> + + <span *ngIf="dataset.spatialCoverage != undefined && dataset.spatialCoverage.geographicalName!=''" class="d-flex flex-column mb-2"> + <label class="label">Spatial Coverage Ggeographical Name:</label> + <p class="truncated">{{dataset.spatialCoverage.geographicalName}}</p> + </span> + + <span *ngIf="dataset.spatialCoverage != undefined && dataset.spatialCoverage.geometry!=''" class="d-flex flex-column mb-2"> + <label class="label">Spatial Coverage Geometry:</label> + <p class="truncated">{{dataset.spatialCoverage.geometry}}</p> + </span> + + <span *ngIf="dataset.conformsTo!=undefined && ( dataset.conformsTo.length>1 || ( + dataset.conformsTo.length==1 && (dataset.conformsTo[0].identifier!='' + || dataset.conformsTo[0].title!='' + || dataset.conformsTo[0].description!='')))"> + <p class="truncated"><span class="label">Conforms To:</span></p> + <nb-list> + <nb-list-item *ngFor="let tmp of dataset.conformsTo" class="d-flex flex-column"> + <span *ngIf="tmp.identifier!=''">{{tmp.identifier}}</span> + <span *ngIf="tmp.title!=''">{{tmp.title}}</span> + <span *ngIf="tmp.description!=''">{{tmp.description}}</span> + </nb-list-item> + </nb-list> + </span> + + <span *ngIf="dataset.contactPoint!=undefined && ( dataset.contactPoint.length>1 || + (dataset.contactPoint.length==1 && + (dataset.contactPoint[0].fn!='' || + dataset.contactPoint[0].hasEmail!='' + || dataset.contactPoint[0].hasURL!='' + || dataset.contactPoint[0].hasTelephoneValue!='')))"> + <p class="truncated"><span class="label">Contact Points:</span></p> + <nb-list> + <nb-list-item *ngFor="let contact of dataset.contactPoint" class="d-flex flex-column"> + <span *ngIf="contact.fn!=''"><strong>{{contact.fn}}</strong></span> + <span *ngIf="contact.hasEmail!=''">{{contact.hasEmail}}</span> + <span *ngIf="contact.hasURL!=''">{{contact.hasURL}}</span> + <span *ngIf="contact.hasTelephoneValue!=''">{{contact.hasTelephoneValue}}</span> + </nb-list-item> + </nb-list> + </span> + </nb-card-body> </nb-card> </div> \ No newline at end of file diff --git a/src/app/pages/data-catalogue/dataset/dataset.component.scss b/src/app/pages/data-catalogue/dataset/dataset.component.scss index 85bb585a1d0a8f01bacd3012cbe21c65ccb95a66..cbf043b33e4cdb41e216da172441f5b8802ed615 100644 --- a/src/app/pages/data-catalogue/dataset/dataset.component.scss +++ b/src/app/pages/data-catalogue/dataset/dataset.component.scss @@ -10,3 +10,10 @@ overflow: hidden; text-overflow: ellipsis; } + +nb-list-item { + border: none !important; + align-items: flex-start; + padding-left:0; + padding-top:0; +} \ No newline at end of file diff --git a/src/app/pages/data-catalogue/dataset/dataset.component.ts b/src/app/pages/data-catalogue/dataset/dataset.component.ts index 00dc2e678ab1c73a8161ac1836e668a51926b567..1c237cca0e0a01d0de5efe916e17a07810b1e487 100644 --- a/src/app/pages/data-catalogue/dataset/dataset.component.ts +++ b/src/app/pages/data-catalogue/dataset/dataset.component.ts @@ -3,6 +3,7 @@ import { ActivatedRoute, Router } from '@angular/router'; import { NbDialogService, NbToastrService } from '@nebular/theme'; import { DistributionComponent } from '../distribution/distribution.component'; import { DCATDataset } from '../model/dcatdataset'; +import { SKOSConcept } from '../model/skosconcept'; import { DataCataglogueAPIService } from '../services/data-cataglogue-api.service'; @Component({ @@ -15,8 +16,10 @@ export class DatasetComponent implements OnInit { dataset:DCATDataset=new DCATDataset(); loading=false; + licenses:Array<any>=[]; + distributionPage:number =1; - distributionPerPage:number =4; + distributionPerPage:number =6; constructor( private router: Router, @@ -36,6 +39,13 @@ export class DatasetComponent implements OnInit { this.restApi.getDatasetById(id).subscribe( res=>{ this.dataset=res; + let tmpLic=[] + this.dataset.distributions.forEach( x => { + if(x.license!=undefined && x.license.name!='' && tmpLic.indexOf(x.license.name)<0){ + tmpLic.push(x.license.name); + this.licenses.push({"name":x.license.name, "uri":x.license.uri}); + } + }) this.loading=false; }, err=>{ @@ -59,4 +69,15 @@ export class DatasetComponent implements OnInit { }); } + printConcepts(themes: SKOSConcept[]){ + let ar=[]; + themes.map(x=> x.prefLabel.map( y =>{ if(y.value!='') ar.push(y.value) } ) ); + return ar.join(',') + } + + showDate = function(date){ + if(date=='1970-01-01T00:00:00Z') return false; + return true; + } + } diff --git a/src/app/pages/data-catalogue/distribution/distribution.component.html b/src/app/pages/data-catalogue/distribution/distribution.component.html index fbda78b23be9c4b3d8343c8fc8e817062809b2d8..9ffce7b050fb4f49d56618b1cf957b9265e54863 100644 --- a/src/app/pages/data-catalogue/distribution/distribution.component.html +++ b/src/app/pages/data-catalogue/distribution/distribution.component.html @@ -2,39 +2,91 @@ <nb-card-header > {{distribution.title}} </nb-card-header> - <nb-card-body class="d-flex flex-column content-truncated"> - <label *ngIf="distribution.description!=''" class="label">Description:</label> - <p *ngIf="distribution.description!=''" class="truncated">{{distribution.description}}</p> + <nb-card-body class="content-truncated"> + + <span *ngIf="distribution.description!=''" class="d-flex flex-column mb-2"> + <label class="label">Description:</label> + <p class="truncated">{{distribution.description}}</p> + </span> + + <span *ngIf="distribution.format!=''" class="d-flex flex-column mb-2"> + <label class="label">Format:</label> + <p class="truncated">{{distribution.format}}</p> + </span> + + <span *ngIf="distribution.accessURL!=''" class="d-flex flex-column mb-2"> + <label class="label">Access URL:</label> + <p class="truncated"> + <a [href]="distribution.accessURL" target="_blank">{{distribution.accessURL}}</a> + </p> + </span> + + <span *ngIf="distribution.downloadURL!=''" class="d-flex flex-column mb-2"> + <label class="label">Download URL:</label> + <p class="truncated"> + <a [href]="distribution.downloadURL" target="_blank">{{distribution.downloadURL}}</a> + </p> + </span> + + <span *ngIf="distribution.mediaType!=''" class="d-flex flex-column mb-2"> + <label class="label">Media Type:</label> + <p class="truncated">{{distribution.mediaType}}</p> + </span> + + <span *ngIf="distribution.license.name!='' || distribution.license.uri!=''" class="d-flex flex-column mb-2"> + <label class="label">License:</label> + <p class="truncated"><a [href]="distribution.license.uri" target="_blank"> + {{distribution.license.name || distribution.license.uri}}</a></p> + </span> + + <span *ngIf="distribution.releaseDate!='' && showDate(distribution.releaseDate)" class="d-flex flex-column mb-2"> + <label class="label">Release Date:</label> + <p class="truncated">{{distribution.releaseDate | date}}</p> + </span> - <label *ngIf="distribution.format!=''" class="label">Format:</label> - <p *ngIf="distribution.format!=''" class="truncated">{{distribution.format}}</p> + <span *ngIf="distribution.updateDate!='' && showDate(distribution.updateDate)" class="d-flex flex-column mb-2"> + <label class="label">Update Date:</label> + <p class="truncated">{{distribution.updateDate | date}}</p> + </span> - <label *ngIf="distribution.accessURL!=''" class="label">Access URL:</label> - <p *ngIf="distribution.accessURL!=''" class="truncated"> - <a [href]="distribution.accessURL" target="_blank">{{distribution.accessURL}}</a> - </p> + <span *ngIf="distribution.language!=undefined && (distribution.language.length>1 || (distribution.language.length==1 && distribution.language[0]!='' && distribution.language[0]!=undefined ))" class="d-flex flex-column mb-2"> + <label class="label">Languages:</label> + <p class="truncated">{{distribution.language.join(',')}}</p> + </span> + + <span *ngIf="distribution.linkedSchemas!=undefined && (distribution.linkedSchemas.length>1 || (distribution.linkedSchemas.length==1 && distribution.linkedSchemas[0]!=undefined && distribution.linkedSchemas[0].title!='' ))" class="d-flex flex-column mb-2"> + <label class="label">Linked Schemas:</label> + <p class="truncated">{{printStandard(distribution.linkedSchemas)}}</p> + </span> - <label *ngIf="distribution.downloadURL!=''" class="label">Download URL:</label> - <p *ngIf="distribution.downloadURL!=''" class="truncated"> - <a [href]="distribution.downloadURL" target="_blank">{{distribution.downloadURL}}</a> - </p> - - <p *ngIf="distribution.format!=''"><span - class="label">Format:</span> {{distribution.format}}</p> - <p *ngIf="distribution.mediaType!=''"><span class="label">Media - Type:</span> {{distribution.mediaType}}</p> - <p *ngIf="distribution.license.name!='' || distribution.license.uri!=''"> <span - class="label">License:</span> <a [href]="distribution.license.uri" target="_blank"> - {{distribution.license.name || distribution.license.uri}}</a></p> - <p *ngIf="distribution.releaseDate!=''"><span class="label">Release - Date:</span> {{distribution.releaseDate | date}}</p> - <p *ngIf="distribution.updateDate!=''"><span class="label">Update - Date:</span> {{distribution.updateDate | date}}</p> - <p - *ngIf="distribution.language.length>0 && (distribution.language.length==1 && distribution.language[0]!='' && distribution.language[0]!=undefined )"> - <span class="label">Languages:</span> {{distribution.language.join(',')}} - </p> - <p *ngIf="distribution.rights!=''"><span - class="label">Rights:</span> {{distribution.rights}}</p> + <span *ngIf="distribution.rights!=''" class="d-flex flex-column mb-2"> + <label class="label">Rights:</label> + <p class="truncated">{{distribution.rights}}</p> + </span> + + <span *ngIf="distribution.status!=undefined" class="d-flex flex-column mb-2"> + <label class="label">Status:</label> + <p class="truncated">{{printConcepts(distribution.status)}}</p> + </span> + + <span *ngIf="distribution.byteSize!='' && distribution.byteSize!='0'" class="d-flex flex-column mb-2"> + <label class="label">Byte Size:</label> + <p class="truncated">{{distribution.byteSize}} B</p> + </span> + + <span *ngIf="distribution.checksum!=undefined && distribution.checksum.algorithm!=''" class="d-flex flex-column mb-2"> + <label class="label">Checksum Algorithm:</label> + <p class="truncated">{{distribution.checksum.algorithm}}</p> + </span> + + <span *ngIf="distribution.checksum!=undefined && distribution.checksum.checksumValue!=''" class="d-flex flex-column mb-2"> + <label class="label">Checksum Value:</label> + <p class="truncated">{{distribution.checksum.checksumValue}}</p> + </span> + + <span *ngIf="distribution.documentation!=undefined && (distribution.documentation.length>1 || (distribution.documentation.length==1 && distribution.documentation[0]!='' && distribution.documentation[0]!=undefined ))" class="d-flex flex-column mb-2"> + <label class="label">Documentation:</label> + <p class="truncated">{{distribution.documentation.join(',')}}</p> + </span> </nb-card-body> </nb-card> \ No newline at end of file diff --git a/src/app/pages/data-catalogue/distribution/distribution.component.ts b/src/app/pages/data-catalogue/distribution/distribution.component.ts index 38508b8e3d0c1c908295c369a11396a8519153a6..c1e62e027c6bf65991bbc14b3fca38759048480a 100644 --- a/src/app/pages/data-catalogue/distribution/distribution.component.ts +++ b/src/app/pages/data-catalogue/distribution/distribution.component.ts @@ -1,6 +1,8 @@ import { Component, Input, OnInit } from '@angular/core'; import { NbDialogRef } from '@nebular/theme'; import { DCATDistribution } from '../model/dcatdistribution'; +import { DCTStandard } from '../model/dctstandard'; +import { SKOSConcept } from '../model/skosconcept'; @Component({ selector: 'ngx-distribution', @@ -20,4 +22,18 @@ export class DistributionComponent implements OnInit { this.dialogRef.close(); } + showDate(date){ + if(date=='1970-01-01T00:00:00Z') return false; + return true; + } + + printStandard(arr:DCTStandard[]){ + return arr.filter(x=> x.title!='' && x.title!=undefined).map(x=>x.title).join(','); + } + + printConcepts(v: SKOSConcept){ + let ar=[]; + v.prefLabel.map( y =>{ if(y.value!='') ar.push(y.value) } ); + return ar.join(',') + } } diff --git a/src/app/pages/data-catalogue/model/dcatdataset.ts b/src/app/pages/data-catalogue/model/dcatdataset.ts index 180c8f70cec1856c018ff7a486a2b7e620888fa5..798cd9a881e3639a3b6cf9014b507635977e8eb3 100644 --- a/src/app/pages/data-catalogue/model/dcatdataset.ts +++ b/src/app/pages/data-catalogue/model/dcatdataset.ts @@ -47,5 +47,6 @@ export class DCATDataset { subject?: SKOSConcept[]; legacyIdentifier?: string; distributionFormats?: Array<FormatCount>=[]; + versionNotes?:string[]; constructor(){} } \ No newline at end of file diff --git a/src/app/pages/data-catalogue/model/vcard-organization.ts b/src/app/pages/data-catalogue/model/vcard-organization.ts index 6b4f163508c342f8f0c9c09402fce58c31af4af8..aeea1c796fc70e65d85899c5701e900fea9f0a3e 100644 --- a/src/app/pages/data-catalogue/model/vcard-organization.ts +++ b/src/app/pages/data-catalogue/model/vcard-organization.ts @@ -5,6 +5,7 @@ export class VCardOrganization { fn: string; nodeID: string; hasEmail?: string; + hasURL?: string; hasTelephoneValue?: string; hasTelephoneType?: string;