diff --git a/src/app/item-page/simple/field-components/specific-field/license/item-page-license-field.component.html b/src/app/item-page/simple/field-components/specific-field/license/item-page-license-field.component.html new file mode 100644 index 00000000000..65002103e44 --- /dev/null +++ b/src/app/item-page/simple/field-components/specific-field/license/item-page-license-field.component.html @@ -0,0 +1,31 @@ +@if (licenses.length > 0 || uris.length > 0) { +
+ @if ((hasCcLicenseName$ | async) && (hasCcLicenseUri$ | async)) { + + } @else { + + @if (licenses.length === uris.length) { + @for (license of licenses; track license; let last=$last; let i=$index) { + {{ license }} + @if (!last) { + + } + } + } @else { + @for (license of licenses; track license; let last=$last) { + {{ license }} + @if (!last || uris.length > 0) { + + } + } + @for (uri of uris; track uri; let last=$last) { + {{ uri }} + @if (!last) { + + } + } + } + + } +
+} diff --git a/src/app/item-page/simple/field-components/specific-field/license/item-page-license-field.component.spec.ts b/src/app/item-page/simple/field-components/specific-field/license/item-page-license-field.component.spec.ts new file mode 100644 index 00000000000..7e34aa7255d --- /dev/null +++ b/src/app/item-page/simple/field-components/specific-field/license/item-page-license-field.component.spec.ts @@ -0,0 +1,299 @@ +import { + ChangeDetectionStrategy, + NO_ERRORS_SCHEMA, +} from '@angular/core'; +import { + ComponentFixture, + TestBed, + waitForAsync, +} from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { APP_CONFIG } from '@dspace/config/app-config.interface'; +import { ConfigurationDataService } from '@dspace/core/data/configuration-data.service'; +import { ConfigurationProperty } from '@dspace/core/shared/configuration-property.model'; +import { Item } from '@dspace/core/shared/item.model'; +import { + MetadataMap, + MetadataValue, +} from '@dspace/core/shared/metadata.models'; +import { ConfigurationDataServiceStub } from '@dspace/core/testing/configuration-data.service.stub'; +import { TranslateLoaderMock } from '@dspace/core/testing/translate-loader.mock'; +import { createPaginatedList } from '@dspace/core/testing/utils.test'; +import { createSuccessfulRemoteDataObject$ } from '@dspace/core/utilities/remote-data.utils'; +import { + TranslateLoader, + TranslateModule, +} from '@ngx-translate/core'; + +import { environment } from '../../../../../../environments/environment'; +import { ItemPageLicenseFieldComponent } from './item-page-license-field.component'; + + +interface TestInstance { + metadata: any; +} + + +interface TestCase { + testInstance: TestInstance; + expected: { + render: boolean, + textElements: string[], + linkElements: string[], + }; +} + + +const licenseNameMock = 'LICENSE NAME'; +const exampleUriMock = 'http://example.com'; +const ccUriMock = 'https://creativecommons.org/licenses/by/4.0'; + + +const testCases: TestCase[] = [ + { + testInstance: { + metadata: { 'dc.rights': undefined, 'dc.rights.uri': undefined }, + }, + expected: { + render: false, + textElements: [], + linkElements: [], + }, + }, + { + testInstance: { + metadata: { 'dc.rights': [ undefined, undefined ], 'dc.rights.uri': undefined }, + }, + expected: { + render: false, + textElements: [], + linkElements: [], + }, + }, + { + testInstance: { + metadata: { 'dc.rights.license': undefined, 'dc.rights.uri': undefined }, + }, + expected: { + render: false, + textElements: [], + linkElements: [], + }, + }, + { + testInstance: { + metadata: { 'dc.rights': undefined, 'dc.rights.license': undefined, 'dc.rights.uri': [ undefined, undefined ] }, + }, + expected: { + render: false, + textElements: [], + linkElements: [], + }, + }, + { + testInstance: { + metadata: { 'dc.rights': null, 'dc.rights.license': null, 'dc.rights.uri': null }, + }, + expected: { + render: false, + textElements: [], + linkElements: [], + }, + }, + { + testInstance: { + metadata: { 'dc.rights': null, 'dc.rights.license': null, 'dc.rights.uri': [ null, null ] }, + }, + expected: { + render: false, + textElements: [], + linkElements: [], + }, + }, + { + testInstance: { + metadata: { 'dc.rights.uri': exampleUriMock }, + }, + expected: { + render: true, + textElements: [exampleUriMock], + linkElements: [exampleUriMock], + }, + }, + { + testInstance: { + metadata: { 'dc.rights': null, 'dc.rights.license': null, 'dc.rights.uri': exampleUriMock }, + }, + expected: { + render: true, + textElements: [exampleUriMock], + linkElements: [exampleUriMock], + }, + }, + { + testInstance: { + metadata: { 'dc.rights.uri': ccUriMock }, + }, + expected: { + render: true, + textElements: [ccUriMock], + linkElements: [ccUriMock], + }, + }, + { + testInstance: { + metadata: { 'dc.rights': null, 'dc.rights.license': licenseNameMock, 'dc.rights.uri': null }, + }, + expected: { + render: true, + textElements: [licenseNameMock], + linkElements: [], + }, + }, + { + testInstance: { + metadata: { 'dc.rights': licenseNameMock, 'dc.rights.uri': ccUriMock }, + }, + expected: { + render: true, + // This test case is delegated to ItemPageCcLicenseFieldComponent + textElements: [], + linkElements: [], + }, + }, + { + testInstance: { + metadata: { 'dc.rights': licenseNameMock, 'dc.rights.license': licenseNameMock, 'dc.rights.uri': ccUriMock }, + }, + expected: { + render: true, + // This test case meets the CC criteria too (since it has 'dc.rights', and 'dc.rights.uri' + // points to a CC license). Thus, it is delegated to ItemPageCcLicenseFieldComponent. + textElements: [], + linkElements: [], + }, + }, + { + testInstance: { + metadata: { 'dc.rights': licenseNameMock, 'dc.rights.license': licenseNameMock, 'dc.rights.uri': exampleUriMock }, + }, + expected: { + render: true, + textElements: [licenseNameMock, licenseNameMock, exampleUriMock], + linkElements: [exampleUriMock], + }, + }, +]; + + +// Updates the component fixture with parameters from the test instance +function configureFixture( + fixture: ComponentFixture, + testInstance: TestInstance, +) { + const item = Object.assign(new Item(), { + bundles: createSuccessfulRemoteDataObject$(createPaginatedList([])), + metadata: new MetadataMap(), + }); + + for (const [key, values] of Object.entries(testInstance.metadata)) { + for (const value of values instanceof Array ? values : [values]) { + item.metadata[key] = [ + { + language: 'en_US', + value: value, + }, + ] as MetadataValue[]; + } + } + + let component: ItemPageLicenseFieldComponent = fixture.componentInstance; + component.item = item; + + fixture.detectChanges(); +} + + +describe('ItemPageLicenseFieldComponent', () => { + let fixture: ComponentFixture; + let configurationDataService = new ConfigurationDataServiceStub(); + + beforeEach(waitForAsync(() => { + configurationDataService.findByPropertyName = jasmine.createSpy() + .withArgs('cc.license.name').and.returnValue(createSuccessfulRemoteDataObject$({ + ... new ConfigurationProperty(), + name: 'cc.license.name', + values: [ 'dc.rights' ], + }, + )) + .withArgs('cc.license.uri').and.returnValue(createSuccessfulRemoteDataObject$({ + ... new ConfigurationProperty(), + name: 'cc.license.uri', + values: [ 'dc.rights.uri' ], + }, + )); + void TestBed.configureTestingModule({ + imports: [ + TranslateModule.forRoot({ + loader: { + provide: TranslateLoader, + useClass: TranslateLoaderMock, + }, + }), + ItemPageLicenseFieldComponent, + ], + providers: [ + { provide: APP_CONFIG, useValue: environment }, + { provide: ConfigurationDataService, useValue: configurationDataService }, + ], + schemas: [NO_ERRORS_SCHEMA], + }) + .overrideComponent(ItemPageLicenseFieldComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default }, + }) + .compileComponents(); + })); + + beforeEach(waitForAsync(() => { + fixture = TestBed.createComponent(ItemPageLicenseFieldComponent); + })); + + testCases.forEach((testCase) => { + describe('', () => { + beforeEach(async () => { + configureFixture(fixture, testCase.testInstance); + }); + + it('should render or not the component', + () => { + const componentEl = fixture.debugElement.query(By.css('.item-page-field')); + expect(Boolean(componentEl)).toBe(testCase.expected.render); + }, + ); + + it('should show/hide license as plain text', + () => { + const textEl = fixture.debugElement.queryAll(By.css('.license-text')); + expect(textEl.length).toBe(testCase.expected.textElements.length); + if (textEl && testCase.expected.textElements.length > 0) { + textEl.forEach((elt, idx) => + expect(elt.nativeElement.innerHTML).toContain(testCase.expected.textElements[idx]), + ); + } + }, + ); + + it('should show/hide the license as link', + () => { + const linkEl = fixture.debugElement.queryAll(By.css('.license-link')); + expect(linkEl.length).toBe(testCase.expected.linkElements.length); + if (linkEl && testCase.expected.linkElements.length > 0) { + linkEl.forEach((elt, idx) => + expect(elt.query(By.css('.license-text')).nativeElement.innerHTML).toContain(testCase.expected.linkElements[idx]), + ); + } + }, + ); + }); + }); +}); diff --git a/src/app/item-page/simple/field-components/specific-field/license/item-page-license-field.component.ts b/src/app/item-page/simple/field-components/specific-field/license/item-page-license-field.component.ts new file mode 100644 index 00000000000..2d88ed080f9 --- /dev/null +++ b/src/app/item-page/simple/field-components/specific-field/license/item-page-license-field.component.ts @@ -0,0 +1,101 @@ +import { + AsyncPipe, + NgClass, + NgStyle, +} from '@angular/common'; +import { + Component, + Input, + OnInit, + ViewContainerRef, +} from '@angular/core'; +import { hasValue } from '@dspace/shared/utils/empty.util'; +import { isCcLicense } from '@dspace/shared/utils/license.utils'; +import { TranslateModule } from '@ngx-translate/core'; +import { + map, + Observable, +} from 'rxjs'; +import { ConfigurationDataService } from 'src/app/core/data/configuration-data.service'; +import { ConfigurationProperty } from 'src/app/core/shared/configuration-property.model'; +import { Item } from 'src/app/core/shared/item.model'; +import { Metadata } from 'src/app/core/shared/metadata.utils'; +import { + getFirstCompletedRemoteData, + getRemoteDataPayload, +} from 'src/app/core/shared/operators'; +import { ItemPageCcLicenseFieldComponent } from 'src/app/item-page/simple/field-components/specific-field/cc-license/item-page-cc-license-field.component'; +import { MetadataFieldWrapperComponent } from 'src/app/shared/metadata-field-wrapper/metadata-field-wrapper.component'; + +@Component({ + selector: 'ds-item-page-license-field', + templateUrl: './item-page-license-field.component.html', + imports: [ + AsyncPipe, + ItemPageCcLicenseFieldComponent, + MetadataFieldWrapperComponent, + NgClass, + NgStyle, + TranslateModule, + ], +}) +/** + * Displays the item's licenses + * + * If the number of 'dc.rights*' values (excepting 'dc.rights.uri') and the number of 'dc.rights.uri' + * match, they will be printed as a list of links, where the text of the link will be the 'dc.rights*' + * value and the link the corresponding 'dc.rights.uri'. The match will be done in the order they + * appear. In any other case, all the 'dc.rights*' fields will be shown as a list (where the URIs + * will be rendered as links). + */ +export class ItemPageLicenseFieldComponent implements OnInit { + /** + * The item to display the license for + */ + @Input() item: Item; + + /** + * String to use as a separator if multiple rights entries are specified + */ + @Input() separator = '
'; + + hasCcLicenseName$: Observable; + hasCcLicenseUri$: Observable; + + licenses: string[]; + uris: string[]; + + constructor( + protected viewRef: ViewContainerRef, + protected configService: ConfigurationDataService, + ) {} + + ngOnInit() { + // First, retrieve from the back-end the configuration regarding CC fields... + this.hasCcLicenseName$ = this.configService.findByPropertyName('cc.license.name').pipe( + getFirstCompletedRemoteData(), + getRemoteDataPayload(), + map((configurationProperty: ConfigurationProperty) => configurationProperty?.values?.[0]), + map((metadataField: string) => hasValue(metadataField) ? metadataField : 'dc.rights'), + map((metadataField: string) => this.item.firstMetadataValue(metadataField)), + map((metadataValue: string) => hasValue(metadataValue)), + ); + + this.hasCcLicenseUri$ = this.configService.findByPropertyName('cc.license.uri').pipe( + getFirstCompletedRemoteData(), + getRemoteDataPayload(), + map((configurationProperty: ConfigurationProperty) => configurationProperty?.values?.[0]), + map((metadataField: string) => hasValue(metadataField) ? metadataField : 'dc.rights'), + map((metadataField: string) => this.item.firstMetadataValue(metadataField)), + map((metadataValue: string) => isCcLicense(metadataValue)), + ); + + // Now, get the data for this component, in case we need to render the license data as a generic license... + // Get all non-empty 'dc.rights*' values, excepting the URIs... + this.licenses = Metadata + .all(this.item.metadata, Object.keys(this.item.metadata).filter(key => key !== 'dc.rights.uri' && (key.startsWith('dc.rights') || key.startsWith('dc.rights.')))) + .map(mdValue => mdValue.value).filter(value => value); + // and get the URIs + this.uris = this.item.allMetadataValues('dc.rights.uri').filter(value => value); + } +} diff --git a/src/app/item-page/simple/item-types/publication/publication.component.html b/src/app/item-page/simple/item-types/publication/publication.component.html index a294cc025bc..f2c7fd73540 100644 --- a/src/app/item-page/simple/item-types/publication/publication.component.html +++ b/src/app/item-page/simple/item-types/publication/publication.component.html @@ -106,6 +106,8 @@ [fields]="['datacite.relation.isReferencedBy']" [label]="'item.page.referenced'"> + + @if (geospatialItemPageFieldsEnabled) { { { provide: SearchService, useValue: {} }, { provide: RouteService, useValue: mockRouteService }, { provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }, + { provide: ConfigurationDataService, useValue: new ConfigurationDataServiceStub() }, { provide: APP_CONFIG, useValue: environment }, { provide: APP_DATA_SERVICES_MAP, useValue: {} }, ], diff --git a/src/app/item-page/simple/item-types/publication/publication.component.ts b/src/app/item-page/simple/item-types/publication/publication.component.ts index 83578272f0d..8d76dbf99ae 100644 --- a/src/app/item-page/simple/item-types/publication/publication.component.ts +++ b/src/app/item-page/simple/item-types/publication/publication.component.ts @@ -20,6 +20,7 @@ import { ItemPageAbstractFieldComponent } from '../../field-components/specific- import { ItemPageDateFieldComponent } from '../../field-components/specific-field/date/item-page-date-field.component'; import { GenericItemPageFieldComponent } from '../../field-components/specific-field/generic/generic-item-page-field.component'; import { GeospatialItemPageFieldComponent } from '../../field-components/specific-field/geospatial/geospatial-item-page-field.component'; +import { ItemPageLicenseFieldComponent } from '../../field-components/specific-field/license/item-page-license-field.component'; import { ThemedItemPageTitleFieldComponent } from '../../field-components/specific-field/title/themed-item-page-field.component'; import { ItemPageUriFieldComponent } from '../../field-components/specific-field/uri/item-page-uri-field.component'; import { ThemedMetadataRepresentationListComponent } from '../../metadata-representation-list/themed-metadata-representation-list.component'; @@ -44,6 +45,7 @@ import { ItemComponent } from '../shared/item.component'; GeospatialItemPageFieldComponent, ItemPageAbstractFieldComponent, ItemPageDateFieldComponent, + ItemPageLicenseFieldComponent, ItemPageUriFieldComponent, MetadataFieldWrapperComponent, MiradorViewerComponent, diff --git a/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.html b/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.html index 52ae5556dce..06c9f79450b 100644 --- a/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.html +++ b/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.html @@ -101,8 +101,8 @@ [fields]="['datacite.relation.isReferencedBy']" [label]="'item.page.referenced'"> - - + +
{{"item.page.link.full" | translate}} diff --git a/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts b/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts index 3864cbbaa14..aae36a442ed 100644 --- a/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts +++ b/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.spec.ts @@ -133,6 +133,7 @@ describe('UntypedItemComponent', () => { { provide: ItemVersionsSharedService, useValue: {} }, { provide: RouteService, useValue: mockRouteService }, { provide: BrowseDefinitionDataService, useValue: BrowseDefinitionDataServiceStub }, + { provide: ConfigurationDataService, useValue: new ConfigurationDataServiceStub() }, { provide: ConfigurationDataService, useValue: configurationDataService }, { provide: APP_CONFIG, useValue: environment }, ], diff --git a/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts b/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts index 3e2da51dd47..201fb5178f5 100644 --- a/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts +++ b/src/app/item-page/simple/item-types/untyped-item/untyped-item.component.ts @@ -18,10 +18,10 @@ import { ThemedMediaViewerComponent } from '../../../media-viewer/themed-media-v import { MiradorViewerComponent } from '../../../mirador-viewer/mirador-viewer.component'; import { ThemedFileSectionComponent } from '../../field-components/file-section/themed-file-section.component'; import { ItemPageAbstractFieldComponent } from '../../field-components/specific-field/abstract/item-page-abstract-field.component'; -import { ItemPageCcLicenseFieldComponent } from '../../field-components/specific-field/cc-license/item-page-cc-license-field.component'; import { ItemPageDateFieldComponent } from '../../field-components/specific-field/date/item-page-date-field.component'; import { GenericItemPageFieldComponent } from '../../field-components/specific-field/generic/generic-item-page-field.component'; import { GeospatialItemPageFieldComponent } from '../../field-components/specific-field/geospatial/geospatial-item-page-field.component'; +import { ItemPageLicenseFieldComponent } from '../../field-components/specific-field/license/item-page-license-field.component'; import { ThemedItemPageTitleFieldComponent } from '../../field-components/specific-field/title/themed-item-page-field.component'; import { ItemPageUriFieldComponent } from '../../field-components/specific-field/uri/item-page-uri-field.component'; import { ThemedMetadataRepresentationListComponent } from '../../metadata-representation-list/themed-metadata-representation-list.component'; @@ -44,8 +44,8 @@ import { ItemComponent } from '../shared/item.component'; GenericItemPageFieldComponent, GeospatialItemPageFieldComponent, ItemPageAbstractFieldComponent, - ItemPageCcLicenseFieldComponent, ItemPageDateFieldComponent, + ItemPageLicenseFieldComponent, ItemPageUriFieldComponent, MetadataFieldWrapperComponent, MiradorViewerComponent, diff --git a/src/app/utils/license.utils.ts b/src/app/utils/license.utils.ts index 266b9468bd0..b4de4fd1e1c 100644 --- a/src/app/utils/license.utils.ts +++ b/src/app/utils/license.utils.ts @@ -1,10 +1,21 @@ +import { hasValue } from '@dspace/shared/utils/empty.util'; + /** - * Parse a URI an return its CC code. URIs pointing to non-CC licenses will return null. - * @param uri - * @returns the CC code or null if uri is not a valid CC URI - */ + * Parse a URI an return its CC code. URIs pointing to non-CC licenses will return null. + * @param uri + * @returns the CC code or null if uri is not a valid CC URI + */ export function parseCcCode(uri: string): string { const regex = /.*creativecommons.org\/(licenses|publicdomain)\/([^/]+)/gm; const matches = regex.exec(uri ?? '') ?? []; return matches.length > 2 ? matches[2] : null; } + +/** + * Returns whether a URI denotes a valid URI for CC licenses. + * @param uri + * @returns true if the URI corresponds to a reconigzable CC license URI or false otherwise + */ +export function isCcLicense(uri: string): boolean { + return hasValue(parseCcCode(uri)); +} diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 0fc94d16210..a8617c2be45 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -7158,6 +7158,8 @@ "form.date-picker.placeholder.day": "Day", + "item.page.license.title": "Rights and licensing", + "item.page.cc.license.title": "Creative Commons license", "item.page.cc.license.disclaimer": "Except where otherwised noted, this item's license is described as", diff --git a/src/themes/custom/app/item-page/simple/item-types/publication/publication.component.ts b/src/themes/custom/app/item-page/simple/item-types/publication/publication.component.ts index 97d7d18e463..9e6b50a6a37 100644 --- a/src/themes/custom/app/item-page/simple/item-types/publication/publication.component.ts +++ b/src/themes/custom/app/item-page/simple/item-types/publication/publication.component.ts @@ -7,6 +7,7 @@ import { RouterLink } from '@angular/router'; import { Context } from '@dspace/core/shared/context.model'; import { ViewMode } from '@dspace/core/shared/view-mode.model'; import { TranslateModule } from '@ngx-translate/core'; +import { ItemPageLicenseFieldComponent } from 'src/app/item-page/simple/field-components/specific-field/license/item-page-license-field.component'; import { CollectionsComponent } from '../../../../../../../app/item-page/field-components/collections/collections.component'; import { ThemedMediaViewerComponent } from '../../../../../../../app/item-page/media-viewer/themed-media-viewer.component'; @@ -43,6 +44,7 @@ import { ThemedThumbnailComponent } from '../../../../../../../app/thumbnail/the GeospatialItemPageFieldComponent, ItemPageAbstractFieldComponent, ItemPageDateFieldComponent, + ItemPageLicenseFieldComponent, ItemPageUriFieldComponent, MetadataFieldWrapperComponent, MiradorViewerComponent, 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 ff4f8d530a9..d1940ba3912 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 @@ -14,10 +14,10 @@ import { ThemedMediaViewerComponent } from '../../../../../../../app/item-page/m import { MiradorViewerComponent } from '../../../../../../../app/item-page/mirador-viewer/mirador-viewer.component'; import { ThemedFileSectionComponent } from '../../../../../../../app/item-page/simple/field-components/file-section/themed-file-section.component'; 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 { GenericItemPageFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/generic/generic-item-page-field.component'; import { GeospatialItemPageFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/geospatial/geospatial-item-page-field.component'; +import { ItemPageLicenseFieldComponent } from '../../../../../../../app/item-page/simple/field-components/specific-field/license/item-page-license-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'; import { UntypedItemComponent as BaseComponent } from '../../../../../../../app/item-page/simple/item-types/untyped-item/untyped-item.component'; @@ -45,8 +45,8 @@ import { ThemedThumbnailComponent } from '../../../../../../../app/thumbnail/the GenericItemPageFieldComponent, GeospatialItemPageFieldComponent, ItemPageAbstractFieldComponent, - ItemPageCcLicenseFieldComponent, ItemPageDateFieldComponent, + ItemPageLicenseFieldComponent, ItemPageUriFieldComponent, MetadataFieldWrapperComponent, MiradorViewerComponent,