diff --git a/package-lock.json b/package-lock.json index f8974240ac0f15cf72d7d2e298cfa487ddf60a23..a9727e3e2a1058e27e37bd06980f6ccf39d02582 100644 --- a/package-lock.json +++ b/package-lock.json @@ -700,7 +700,7 @@ "@angular/compiler": "^8.1.3", "boxen": "^4.1.0", "colorette": "^1.1.0", - "flat": "git://github.com/lenchvolodymyr/flat.git#ffe77ef", + "flat": "git://github.com/lenchvolodymyr/flat.git#ffe77efe8c33bc80ffb2f7a465537610dea4f611", "gettext-parser": "^4.0.1", "glob": "^7.1.4", "mkdirp": "^0.5.1", @@ -4183,7 +4183,7 @@ "dependencies": { "is-buffer": { "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", + "resolved": "https://packages.dlcm.ch/repository/npm-group/is-buffer/-/is-buffer-2.0.3.tgz", "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", "dev": true } @@ -4358,8 +4358,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -4380,14 +4379,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -4402,20 +4399,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -4532,8 +4526,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -4545,7 +4538,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -4560,7 +4552,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -4568,14 +4559,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -4594,7 +4583,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -4675,8 +4663,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -4688,7 +4675,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -4774,8 +4760,7 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -4811,7 +4796,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -4831,7 +4815,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -4875,14 +4858,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -5175,6 +5156,11 @@ "upper-case": "^1.1.3" } }, + "highlight.js": { + "version": "9.15.10", + "resolved": "https://packages.dlcm.ch/repository/npm-group/highlight.js/-/highlight.js-9.15.10.tgz", + "integrity": "sha512-RoV7OkQm0T3os3Dd2VHLNMoaoDVx77Wygln3n9l5YV172XonWG6rgQD3XnF/BuFFZw9A0TJgmMSO8FEWQgvcXw==" + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -6950,6 +6936,14 @@ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, + "ngx-highlightjs": { + "version": "3.0.2", + "resolved": "https://packages.dlcm.ch/repository/npm-group/ngx-highlightjs/-/ngx-highlightjs-3.0.2.tgz", + "integrity": "sha512-J/Ti2Y0wY+0igaCKZFzvPgF/DLgr5xislqkpY72sRJbLTO4zSgpJmgOsgbEoYHjSAn26bivu5I0IuH7zxhUbMQ==", + "requires": { + "tslib": "^1.9.0" + } + }, "ngx-xml2json": { "version": "1.0.2", "resolved": "https://packages.dlcm.ch/repository/npm-group/ngx-xml2json/-/ngx-xml2json-1.0.2.tgz", diff --git a/package.json b/package.json index 5964b038381a5c615cb82302a56ccf18c8441386..d68720f50b71c8b9db5efb198624112b8a18a55f 100644 --- a/package.json +++ b/package.json @@ -55,9 +55,11 @@ "decimal.js": "10.2.0", "file-saver": "2.0.2", "flexboxgrid-sass": "8.0.5", + "highlight.js": "9.15.10", "http-status-codes": "1.3.2", "material-design-icons": "3.0.1", "moment": "2.24.0", + "ngx-highlightjs": "3.0.2", "ngx-xml2json": "1.0.2", "normalize.css": "8.0.1", "primeicons": "1.0.0", diff --git a/src/app/app.module.ts b/src/app/app.module.ts index c0a87a565aa28372b66a52cc3b7cd19dbe23dd3b..e9243133c005f92aaa7e0d7fbd559a5e94fc2e1d 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -59,6 +59,10 @@ import {FooterPresentational} from "./components/presentationals/footer/footer.p import {LanguageSelectorPresentational} from "./components/presentationals/language-selector/language-selector.presentational"; import {MainToolbarDesktopHorizontalPresentational} from "./components/presentationals/main-toolbar/main-toolbar-desktop/main-toolbar-desktop-horizontal-presentational.component"; import {PageNotFoundPresentational} from "./components/presentationals/page-not-found/page-not-found.presentational"; +import { + HighlightModule, +} from "ngx-highlightjs"; +import xml from "highlight.js/lib/languages/xml"; const presentationals = [ AppComponent, @@ -86,6 +90,12 @@ export function createDefaultStorage(): Storage | null { return environment.tokenInMemoryStorage ? new InMemoryStorage() : (typeof sessionStorage !== "undefined" ? sessionStorage : null); } +export function hljsLanguages(): any { + return [ + {name: "xml", func: xml} + ]; +} + @NgModule({ declarations: [ ...presentationals, @@ -129,6 +139,9 @@ export function createDefaultStorage(): Storage | null { // App AppRoutingModule, + HighlightModule.forRoot({ + languages: hljsLanguages + }) ], providers: [ { @@ -175,6 +188,7 @@ export function createDefaultStorage(): Storage | null { {provide: MAT_DATE_LOCALE, useValue: navigator.language}, {provide: DateAdapter, useClass: MomentDateAdapter, deps: [MAT_DATE_LOCALE]}, {provide: MAT_DATE_FORMATS, useValue: MAT_MOMENT_DATE_FORMATS}, + ], entryComponents: [ ...dialogs, diff --git a/src/app/features/home/components/presentationals/home-archive-form/home-archive-detail-presentational.component.html b/src/app/features/home/components/presentationals/home-archive-form/home-archive-detail-presentational.component.html index 695ed9efc0a27656a4646d0246e62b9d8d3840d5..6a210cd1a3bc6a58a25c14be005a45fb3f2f06b8 100644 --- a/src/app/features/home/components/presentationals/home-archive-form/home-archive-detail-presentational.component.html +++ b/src/app/features/home/components/presentationals/home-archive-form/home-archive-detail-presentational.component.html @@ -1,10 +1,26 @@ <dl> <ng-container *ngFor="let info of listInfo"> - <ng-template [ngIf]="!(info.value | isNullOrUndefined) && info.value !== ''"> - <dt>{{info.labelToTranslate | translate }}</dt> - <dd>{{info.value}}</dd> + <ng-template [ngIf]="!(info.value | isNullOrUndefined) && info.value !== '' && info.code !== true"> + <div class="line"> + <dt>{{info.labelToTranslate | translate }}</dt> + <dd>{{info.value}}</dd> + </div> </ng-template> + <div *ngIf="info.code" class="line"> + <dt>{{info.labelToTranslate | translate }}</dt> + <dd> + <a (click)="showCode = !showCode"> + <span *ngIf="showCode"> {{'homePage.archive.detail.hide' | translate}}</span> + <span *ngIf="!showCode"> {{'homePage.archive.detail.show' | translate}}</span> + </a> + </dd> + </div> </ng-container> + <div class="line"> + <pre class="pre" *ngIf="showCode" > + <code [highlight]="getMetadata()" class="code"></code> + </pre> + </div> </dl> <button mat-flat-button diff --git a/src/app/features/home/components/presentationals/home-archive-form/home-archive-detail-presentational.component.scss b/src/app/features/home/components/presentationals/home-archive-form/home-archive-detail-presentational.component.scss index 06bcc4adfe80e829b6952c0b2f525237a28db5c7..8a4ffa66315aee548445d88dfa6f11f38809d7f4 100644 --- a/src/app/features/home/components/presentationals/home-archive-form/home-archive-detail-presentational.component.scss +++ b/src/app/features/home/components/presentationals/home-archive-form/home-archive-detail-presentational.component.scss @@ -2,8 +2,14 @@ $padding-bottom-desktop: 20px; -dl { - margin: 0; +.line { + display: flex; + flex-direction: row; + overflow: hidden; + + @include respond-to-breakpoint('xs') { + flex-direction: column; + } } dt { @@ -16,7 +22,6 @@ dt { white-space: nowrap; @include respond-to-breakpoint-and-bigger('sm') { - float: left; padding-bottom: $padding-bottom-desktop; } } @@ -25,10 +30,26 @@ dt { dd { margin-left: 0; padding-bottom: 10px; + word-break: break-word; - @include respond-to-breakpoint-and-bigger('sm') { - margin-left: 180px; - padding-bottom: $padding-bottom-desktop; + @include respond-to-smaller-than-breakpoint('sm') { + width: 100%; } } +.pre { + font-size: 13px; + line-height: 1.42857143; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; + overflow-x: auto; +} + +.code { + font-family: monospace; + white-space: pre-line; + padding-top: 0px; +} diff --git a/src/app/features/home/components/presentationals/home-archive-form/home-archive-detail-presentational.component.ts b/src/app/features/home/components/presentationals/home-archive-form/home-archive-detail-presentational.component.ts index 938a043df297a93c69a999c10b4a769f91f0ee9d..5231c505919296844f6ed100dbeb3214cd5fee69 100644 --- a/src/app/features/home/components/presentationals/home-archive-form/home-archive-detail-presentational.component.ts +++ b/src/app/features/home/components/presentationals/home-archive-form/home-archive-detail-presentational.component.ts @@ -14,7 +14,6 @@ import { BehaviorSubject, Observable, } from "rxjs"; -import {OuterSubscriber} from "rxjs/internal-compatibility"; import { DateUtil, ObservableUtil, @@ -43,6 +42,8 @@ export class HomeArchiveDetailPresentational extends SharedAbstractPresentationa @Input() organizationalUnit: AccessOrganizationalUnit; + showCode: boolean = false; + ngOnInit(): void { const metadata = this.archiveMetadata.metadata; this.listInfo = [ @@ -94,15 +95,35 @@ export class HomeArchiveDetailPresentational extends SharedAbstractPresentationa labelToTranslate: TRANSLATE("homePage.archive.detail.acceptedDate"), value: DateUtil.convertDateToDateTimeString(MetadataUtil.getAcceptedDate(this.searchScope, metadata)), }, + { + labelToTranslate: this.getMetadataLabel(), + value: MetadataUtil.getDatacite(this.searchScope, this.archiveMetadata.metadata), + code: true, + }, ]; } download(archiveMetadata: ArchiveMetadata): void { this._downloadBS.next(archiveMetadata); } + + getMetadataLabel(): string { + if (this.searchScope === SearchScopeEnum.public) { + return TRANSLATE("homePage.archive.detail.datacite"); + } + else { + return TRANSLATE("homePage.archive.detail.dlcm"); + } + } + + getMetadata(): string { + return MetadataUtil.getDatacite(this.searchScope, this.archiveMetadata.metadata); + } + } class Info { labelToTranslate: string; value: string; + code?: boolean = false; } diff --git a/src/app/features/home/components/routables/home-detail/home-detail.routable.html b/src/app/features/home/components/routables/home-detail/home-detail.routable.html index 381c9ae87e393a655ed59602e9c1b96e0f12dd38..c050ac2e3f6440631e00802de66ca0e209c8b91f 100644 --- a/src/app/features/home/components/routables/home-detail/home-detail.routable.html +++ b/src/app/features/home/components/routables/home-detail/home-detail.routable.html @@ -1,4 +1,3 @@ -<script src="home-detail.routable.ts"></script> <div class="wrapper"> <div class="spinner-wrapper" *ngIf="((isLoadingObs | async) || (isLoadingOrgUnitObs | async)); else finishLoading" diff --git a/src/app/features/home/components/routables/home-detail/home-detail.routable.scss b/src/app/features/home/components/routables/home-detail/home-detail.routable.scss index f55972e58ed67307214b0e60bf0b16dd0c654b24..761f686b95cb0e3e40bc87192caf5a7fd3224e10 100644 --- a/src/app/features/home/components/routables/home-detail/home-detail.routable.scss +++ b/src/app/features/home/components/routables/home-detail/home-detail.routable.scss @@ -1,3 +1,7 @@ @import "../../../../../../sass/abstracts/mixins"; @include content(); + +.wrapper { + padding-bottom: 20px; +} diff --git a/src/app/features/home/home.module.ts b/src/app/features/home/home.module.ts index 015bc89b862a29580849196c11044c755146c956..8988acd5318d80471b86f4badfede815869d28de 100644 --- a/src/app/features/home/home.module.ts +++ b/src/app/features/home/home.module.ts @@ -1,3 +1,4 @@ +import {escapeXml} from "@angular/compiler/src/i18n/serializers/xml_helper"; import {NgModule} from "@angular/core"; import {HomeArchiveDetailPresentational} from "@app/features/home/components/presentationals/home-archive-form/home-archive-detail-presentational.component"; import {HomeBrowsingArchivePresentational} from "@app/features/home/components/presentationals/home-browsing-archive/home-browsing-archive.presentational"; @@ -19,6 +20,8 @@ import {HomeOrganizationalUnitState} from "@app/features/home/stores/organizatio import {SharedModule} from "@app/shared/shared.module"; import {TranslateModule} from "@ngx-translate/core"; import {NgxsModule} from "@ngxs/store"; +import {HighlightModule} from "ngx-highlightjs"; +import xml from "highlight.js/lib/languages/xml"; const routables = [ HomeSearchRoutable, @@ -38,6 +41,7 @@ const presentationals = [ HomeBrowsingArchivePresentational, ]; + @NgModule({ declarations: [ ...routables, @@ -53,6 +57,7 @@ const presentationals = [ HomeOrganizationalUnitState, HomeOrganizationalUnitArchiveState, ]), + HighlightModule ], exports: [ ...routables, diff --git a/src/app/shared/models/business/archive-metadata.model.ts b/src/app/shared/models/business/archive-metadata.model.ts index a1d49fa32c709a0813a1220253ca864f9393b7f6..a120fe30e4df6b6c2bcfcc7c37397af734038cd9 100644 --- a/src/app/shared/models/business/archive-metadata.model.ts +++ b/src/app/shared/models/business/archive-metadata.model.ts @@ -11,6 +11,7 @@ export enum MetadataEnum { aipOrganizationalUnit = "aip-organizational-unit", aipRetention = "aip-retention", aipRetentionEnd = "aip-retention-end", + aipSize = "aip-size", dataciteXml = "datacite.xml", dlcmXml = "dlcm.xml", aipContainer = "aip-container", @@ -95,17 +96,18 @@ export namespace ArchiveMetadata { [MetadataEnum.aipRetention]: string; [MetadataEnum.aipRetentionEnd]: string; [MetadataEnum.aipUnit]: string; + [MetadataEnum.aipSize]: number; [MetadataEnum.creation]: string; } export class PublicMetadata extends Metadata { [MetadataEnum.datacite]: Datacite; [MetadataEnum.dataciteXml]: string; - [MetadataEnum.dlcmXml]: string; } export class PrivateMetadata extends Metadata { [MetadataEnum.premis]: Premis; + [MetadataEnum.dlcmXml]: string; } /* PRIVATE */ diff --git a/src/app/shared/utils/metadata.util.ts b/src/app/shared/utils/metadata.util.ts index 31e1dc8a9c093892b605035b4d68fdf3e642af5e..64724ba53117c44a50f878455ea1377e97934e45 100644 --- a/src/app/shared/utils/metadata.util.ts +++ b/src/app/shared/utils/metadata.util.ts @@ -106,4 +106,12 @@ export class MetadataUtil { } return date; } + + static getDatacite(searchScope: SearchScopeEnum, metadata: Metadata): string { + if (searchScope === SearchScopeEnum.public) { + return metadata[MetadataEnum.dataciteXml]; + } else { + return metadata[MetadataEnum.dlcmXml]; + } + } } diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json index 088c0084f0a3eb46ea4c0cefcfd10aa8e7d1c238..1798f0de46c4d70235668b633ea09d26d5b7f4cc 100644 --- a/src/assets/i18n/de.json +++ b/src/assets/i18n/de.json @@ -840,7 +840,11 @@ "orgUnit": "Organizational unit", "publicationYear": "Publication year", "submittedDate": "Submitted date", - "title": "Title" + "title": "Title", + "datacite": "Datacite metadata", + "dlcm": "Dlcm metadata", + "show": "show", + "hide": "hide" } }, "browsing": { diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index c681dcf17dcb010058bd9e73da2012d99b4349ae..760a3f3aacd179db3f55d9ff3d8d0da7a4c272fa 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -840,7 +840,11 @@ "orgUnit": "Organizational unit", "publicationYear": "Publication year", "submittedDate": "Submitted date", - "title": "Title" + "title": "Title", + "datacite": "Datacite metadata", + "dlcm": "Dlcm metadata", + "show": "show", + "hide": "hide" } }, "browsing": { diff --git a/src/assets/i18n/fr.json b/src/assets/i18n/fr.json index 2242bab81b34b00a1171ad9a23c9b3970e8d3de6..ce24986c85919eaad39b139d2f577353c6de14b6 100644 --- a/src/assets/i18n/fr.json +++ b/src/assets/i18n/fr.json @@ -840,7 +840,11 @@ "orgUnit": "Unité organisationnelle", "publicationYear": "Année de publication", "submittedDate": "Date de soumission", - "title": "Titre" + "title": "Titre", + "datacite": "Datacite métadonnées", + "dlcm": "Dlcm métadonnées", + "show": "montrer", + "hide": "cacher" } }, "browsing": { diff --git a/src/sass/main.scss b/src/sass/main.scss index 47cdc67cfc94967a7ec0150b8811f35a60a6af49..40aadf6cc46e790e6612c7cde87a18f28fdd89c2 100644 --- a/src/sass/main.scss +++ b/src/sass/main.scss @@ -17,6 +17,7 @@ @import "themes/basic-theme"; @import "themes/yareta-theme"; @import "themes/dlcm-theme"; +@import '~highlight.js/styles/github.css'; a { cursor: pointer;