+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
Información de la tesis
+
Información general
+
+
+
+
+
+
+
+
+
+
+
+
Información general
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/themes/custom/app/item-page/simple/item-types/untyped-item/untyped-item.component.scss b/src/themes/custom/app/item-page/simple/item-types/untyped-item/untyped-item.component.scss
index e69de29bb2d..4421d20a190 100644
--- a/src/themes/custom/app/item-page/simple/item-types/untyped-item/untyped-item.component.scss
+++ b/src/themes/custom/app/item-page/simple/item-types/untyped-item/untyped-item.component.scss
@@ -0,0 +1,50 @@
+.badge-title-container {
+ display: flex;
+ align-items: center;
+}
+
+.badge-title-content {
+ display: flex;
+ flex-direction: column;
+
+ h4 {
+ font-size: 1.75rem;
+ color: #999;
+ margin-bottom: 0.5rem;
+ }
+}
+
+.edit-menu {
+ margin-left: auto;
+}
+
+.subtitle-content {
+ font-style: italic;
+ color: #555;
+ margin-bottom: 0.5rem;
+}
+
+.divider {
+ border-top: 1px solid #999;
+ margin: 0.5rem 0;
+}
+
+.section-divider {
+ border-bottom: 1px solid #D8E8Eb;
+}
+
+.item-identifiers {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 0.2em;
+
+ div {
+ display: inline-block;
+ padding-right: 0.2em;
+ }
+}
+
+.reference-image {
+ max-width: 100%;
+ height: auto;
+}
\ No newline at end of file
diff --git a/src/themes/custom/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts b/src/themes/custom/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts
index 9609ad35739..f7bf1258b23 100644
--- a/src/themes/custom/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts
+++ b/src/themes/custom/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts
@@ -1,6 +1,8 @@
import {
AsyncPipe,
NgIf,
+ NgFor,
+ NgStyle,
} from '@angular/common';
import {
ChangeDetectionStrategy,
@@ -19,6 +21,7 @@ import { ThemedFileSectionComponent } from '../../../../../../../app/item-page/s
import { ItemPageAbstractFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/abstract/item-page-abstract-field.component';
import { ItemPageCcLicenseFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/cc-license/item-page-cc-license-field.component';
import { ItemPageDateFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/date/item-page-date-field.component';
+import { ItemPageAuthorFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/author/item-page-author-field.component';
import { GenericItemPageFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/generic/generic-item-page-field.component';
import { ThemedItemPageTitleFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/title/themed-item-page-field.component';
import { ItemPageUriFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/uri/item-page-uri-field.component';
@@ -35,6 +38,16 @@ import { FileSectionComponent } from '../../field-components/file-section/file-s
import { MediaViewerComponent } from '../../../media-viewer/media-viewer.component';
import { ThumbnailComponent } from 'src/themes/custom/app/thumbnail/thumbnail.component';
import { ResultsBackButtonComponent } from 'src/themes/custom/app/shared/results-back-button/results-back-button.component';
+import { SediciContextBadgeComponent } from 'src/themes/custom/app/shared/object-collection/shared/badges/sedici-context-badge/sedici-context-badge.component';
+import { LanguageSwitcherComponent } from './language-switcher.component';
+import { ApaCitationComponent } from './apa-citation.component';
+import { MetadataValue } from 'src/app/core/shared/metadata.models';
+import { BadgeMetadataValuesComponent } from '../../field-components/badge-metadata-values/badge-metadata-values.component';
+import { TruncatableComponent } from 'src/app/shared/truncatable/truncatable.component';
+import { TruncatablePartComponent } from 'src/app/shared/truncatable/truncatable-part/truncatable-part.component';
+import { TabbedContentComponent } from './tabbed-content.component';
+import { SediciDateMetadataValuesComponent } from '../../field-components/date-metadata-values/sedici-date-metadata-values.component';
+import { SediciLanguageMetadataValuesComponent } from '../../field-components/language-metadata-values/sedici-language-metadata-values.component';
/**
* Component that represents an untyped Item page
*/
@@ -49,6 +62,8 @@ import { ResultsBackButtonComponent } from 'src/themes/custom/app/shared/results
standalone: true,
imports: [
NgIf,
+ NgFor,
+ NgStyle,
ThemedResultsBackButtonComponent,
MiradorViewerComponent,
ThemedItemPageTitleFieldComponent,
@@ -73,6 +88,65 @@ import { ResultsBackButtonComponent } from 'src/themes/custom/app/shared/results
MediaViewerComponent,
ThumbnailComponent,
ResultsBackButtonComponent,
+ LanguageSwitcherComponent,
+ ItemPageAuthorFieldComponent,
+ BadgeMetadataValuesComponent,
+ TruncatableComponent,
+ TruncatablePartComponent,
+ ApaCitationComponent,
+ TabbedContentComponent,
+ SediciDateMetadataValuesComponent,
+ SediciLanguageMetadataValuesComponent,
+ SediciContextBadgeComponent,
],
})
-export class UntypedItemComponent extends BaseComponent {}
+export class UntypedItemComponent extends BaseComponent {
+ hasMultipleLanguages: boolean;
+ subtype;
+ identifierOtherMetadataName = ['dc.identifier.uri', 'sedici.identifier.other'];
+ itemIdentifiers: { mdValue: MetadataValue, label: string }[];
+
+ ngOnInit() {
+ super.ngOnInit();
+ const abstracts = this.object.metadata['dc.description.abstract'];
+ this.hasMultipleLanguages = abstracts && abstracts.length > 1;
+ this.subtype = this.object.metadata['sedici.subtype'][0]?.value;
+ this.setIdentifierOtherValues();
+ }
+
+ setIdentifierOtherValues(): void {
+ this.itemIdentifiers = [];
+ const length = this.itemIdentifiers.push({
+ mdValue: new MetadataValue(),
+ label: 'HDL'
+ });
+ this.itemIdentifiers[length - 1].mdValue.value = this.object?.handle;
+ this.object.allMetadata(this.identifierOtherMetadataName).forEach(
+ (mdValue, index) => {
+ let charIndex = -1;
+ let label = '';
+ if (mdValue.value.includes(this.object?.handle)) {
+ if (mdValue.value.includes('doi')) {
+ label = 'DOI';
+ } else {
+ return;
+ }
+ } else {
+ if (!mdValue.value.startsWith('http')) {
+ const splitChar = mdValue.value.includes(':') ? ':' : ' ';
+ charIndex = mdValue.value.indexOf(splitChar);
+ label = mdValue.value.substring(0, charIndex).toUpperCase();
+ } else {
+ label = 'URL';
+ }
+ }
+ const value = mdValue.value.substring(charIndex + 1).trim();
+ const identifierListLength = this.itemIdentifiers.push({
+ mdValue: new MetadataValue(),
+ label: label
+ });
+ this.itemIdentifiers[identifierListLength - 1].mdValue.value = value;
+ }
+ );
+ }
+}
diff --git a/src/themes/custom/app/shared/object-collection/shared/badges/sedici-context-badge/sedici-context-badge.component.html b/src/themes/custom/app/shared/object-collection/shared/badges/sedici-context-badge/sedici-context-badge.component.html
new file mode 100644
index 00000000000..f23e7b4b6a8
--- /dev/null
+++ b/src/themes/custom/app/shared/object-collection/shared/badges/sedici-context-badge/sedici-context-badge.component.html
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+ {{ getContextInfo() }}
+
+
+ {{ getYear() }}
+
+
diff --git a/src/themes/custom/app/shared/object-collection/shared/badges/sedici-context-badge/sedici-context-badge.component.scss b/src/themes/custom/app/shared/object-collection/shared/badges/sedici-context-badge/sedici-context-badge.component.scss
new file mode 100644
index 00000000000..b8cb48e7358
--- /dev/null
+++ b/src/themes/custom/app/shared/object-collection/shared/badges/sedici-context-badge/sedici-context-badge.component.scss
@@ -0,0 +1,30 @@
+.badge-title-container {
+ display: flex;
+ align-items: center;
+ margin-bottom: 10px;
+
+ .context-info,
+ .context-year {
+ font-size: 12px;
+ position: relative;
+ &:hover::after {
+ content: '';
+ position: absolute;
+ left: 1.5%;
+ right: 1.5%;
+ bottom: 0;
+ height: 2px;
+ background-color: #8d8d8d;
+ }
+ }
+
+ .context-info {
+ color: #8d8d8d;
+ margin-left: 5px;
+ }
+
+ .context-year {
+ color: #4a90e2;
+ margin-left: 5px;
+ }
+}
\ No newline at end of file
diff --git a/src/themes/custom/app/shared/object-collection/shared/badges/sedici-context-badge/sedici-context-badge.component.ts b/src/themes/custom/app/shared/object-collection/shared/badges/sedici-context-badge/sedici-context-badge.component.ts
new file mode 100644
index 00000000000..6ba11b96d53
--- /dev/null
+++ b/src/themes/custom/app/shared/object-collection/shared/badges/sedici-context-badge/sedici-context-badge.component.ts
@@ -0,0 +1,86 @@
+import { NgIf } from '@angular/common';
+import { Component } from '@angular/core';
+import { BadgesComponent as BaseComponent } from '../badges.component';
+
+import { ThemedAccessStatusBadgeComponent } from 'src/app/shared/object-collection/shared/badges/access-status-badge/themed-access-status-badge.component';
+import { ThemedMyDSpaceStatusBadgeComponent } from 'src/app/shared/object-collection/shared/badges/my-dspace-status-badge/themed-my-dspace-status-badge.component';
+import { ThemedStatusBadgeComponent } from 'src/app/shared/object-collection/shared/badges/status-badge/themed-status-badge.component';
+import { ThemedTypeBadgeComponent } from 'src/app/shared/object-collection/shared/badges/type-badge/themed-type-badge.component';
+
+@Component({
+ selector: 'ds-sedici-context-badge',
+ styleUrls: ['./sedici-context-badge.component.scss'],
+ templateUrl: './sedici-context-badge.component.html',
+ standalone: true,
+ imports: [ThemedStatusBadgeComponent, NgIf, ThemedMyDSpaceStatusBadgeComponent, ThemedTypeBadgeComponent, ThemedAccessStatusBadgeComponent],
+})
+export class SediciContextBadgeComponent extends BaseComponent {
+
+ getThesisInfo(): string {
+ const thesisDegreeName = this.object.firstMetadataValue('thesis.degree.name');
+ const thesisDegreeGrantor = this.object.firstMetadataValue('thesis.degree.grantor');
+
+ if (thesisDegreeName && thesisDegreeGrantor) {
+ return `${thesisDegreeName}; ${thesisDegreeGrantor}`;
+ } else {
+ return '';
+ }
+ }
+
+ getJournalInfo(): string {
+ const journalTitle = this.object.firstMetadataValue('sedici.relation.journalTitle');
+ const journalVolumeAndIssue = this.object.firstMetadataValue('sedici.relation.journalVolumeAndIssue');
+
+ if (journalTitle && journalVolumeAndIssue) {
+ return `${journalTitle}; ${journalVolumeAndIssue}`;
+ } else if (journalTitle) {
+ return journalTitle;
+ } else {
+ return '';
+ }
+ }
+
+ getOriginInfoPlace(): string {
+ let place = this.object.firstMetadataValue('mods.originInfo.place');
+ if (!place) {
+ return '';
+ }
+ return place;
+ }
+
+ getEventInfo(): string {
+ let event = this.object.firstMetadataValue('sedici.relation.event');
+ if (!event) {
+ return '';
+ }
+ return event;
+ }
+
+ getContextInfo(): string {
+ let thesis = this.getThesisInfo();
+ let journal = this.getJournalInfo();
+ let event = this.getEventInfo();
+ let origin = this.getOriginInfoPlace();
+ if (thesis) {
+ return thesis;
+ };
+ if (journal || event) {
+ if (journal && event) {
+ return `${journal} | ${event}`;
+ } else if (journal) {
+ return journal;
+ } else {
+ return event;
+ };
+ };
+ return origin;
+ }
+
+ getYear(): string {
+ let dateString = this.object.firstMetadataValue('dc.date.issued') || this.object.firstMetadataValue('dc.date.created');
+ if (!dateString) {
+ return '';
+ }
+ return dateString.split('-')[0];
+ }
+}