diff --git a/package.json b/package.json index 52b089be37..387e094a67 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,7 @@ "http-proxy-middleware": "^1.0.5", "js-cookie": "2.2.1", "js-yaml": "^4.1.0", - "json5": "^2.1.3", + "json5": "^2.2.2", "jsonschema": "1.4.0", "jwt-decode": "^3.1.2", "klaro": "^0.7.18", diff --git a/src/app/app.reducer.ts b/src/app/app.reducer.ts index f84db92445..4b49cb4825 100644 --- a/src/app/app.reducer.ts +++ b/src/app/app.reducer.ts @@ -42,10 +42,6 @@ import { filterReducer, SearchFiltersState } from './shared/search/search-filters/search-filter/search-filter.reducer'; -import { - sidebarFilterReducer, - SidebarFiltersState -} from './shared/sidebar/filter/sidebar-filter.reducer'; import { sidebarReducer, SidebarState } from './shared/sidebar/sidebar.reducer'; import { truncatableReducer, TruncatablesState } from './shared/truncatable/truncatable.reducer'; import { ThemeState, themeReducer } from './shared/theme-support/theme.reducer'; @@ -59,7 +55,6 @@ export interface AppState { metadataRegistry: MetadataRegistryState; notifications: NotificationsState; sidebar: SidebarState; - sidebarFilter: SidebarFiltersState; searchFilter: SearchFiltersState; truncatable: TruncatablesState; cssVariables: CSSVariablesState; @@ -81,7 +76,6 @@ export const appReducers: ActionReducerMap = { metadataRegistry: metadataRegistryReducer, notifications: notificationsReducer, sidebar: sidebarReducer, - sidebarFilter: sidebarFilterReducer, searchFilter: filterReducer, truncatable: truncatableReducer, cssVariables: cssVariablesReducer, diff --git a/src/app/shared/bitstream-download-page/bitstream-download-page.component.html b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.html similarity index 100% rename from src/app/shared/bitstream-download-page/bitstream-download-page.component.html rename to src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.html diff --git a/src/app/shared/bitstream-download-page/bitstream-download-page.component.spec.ts b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.spec.ts similarity index 98% rename from src/app/shared/bitstream-download-page/bitstream-download-page.component.spec.ts rename to src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.spec.ts index 4100653e0f..e84b254eae 100644 --- a/src/app/shared/bitstream-download-page/bitstream-download-page.component.spec.ts +++ b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.spec.ts @@ -6,7 +6,7 @@ import { Bitstream } from '../../core/shared/bitstream.model'; import { BitstreamDownloadPageComponent } from './bitstream-download-page.component'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; import { HardRedirectService } from '../../core/services/hard-redirect.service'; -import { createSuccessfulRemoteDataObject } from '../remote-data.utils'; +import { createSuccessfulRemoteDataObject } from '../../shared/remote-data.utils'; import { ActivatedRoute, Router } from '@angular/router'; import { getForbiddenRoute } from '../../app-routing-paths'; import { TranslateModule } from '@ngx-translate/core'; diff --git a/src/app/shared/bitstream-download-page/bitstream-download-page.component.ts b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts similarity index 98% rename from src/app/shared/bitstream-download-page/bitstream-download-page.component.ts rename to src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts index 9dd8c7c723..51ec762ec3 100644 --- a/src/app/shared/bitstream-download-page/bitstream-download-page.component.ts +++ b/src/app/bitstream-page/bitstream-download-page/bitstream-download-page.component.ts @@ -1,7 +1,7 @@ import { Component, OnInit } from '@angular/core'; import { filter, map, switchMap, take } from 'rxjs/operators'; import { ActivatedRoute, Router } from '@angular/router'; -import { hasValue, isNotEmpty } from '../empty.util'; +import { hasValue, isNotEmpty } from '../../shared/empty.util'; import { getRemoteDataPayload} from '../../core/shared/operators'; import { Bitstream } from '../../core/shared/bitstream.model'; import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; diff --git a/src/app/bitstream-page/bitstream-page-routing.module.ts b/src/app/bitstream-page/bitstream-page-routing.module.ts index 0bdda29ddf..c2abe511a4 100644 --- a/src/app/bitstream-page/bitstream-page-routing.module.ts +++ b/src/app/bitstream-page/bitstream-page-routing.module.ts @@ -3,7 +3,7 @@ import { RouterModule } from '@angular/router'; import { EditBitstreamPageComponent } from './edit-bitstream-page/edit-bitstream-page.component'; import { AuthenticatedGuard } from '../core/auth/authenticated.guard'; import { BitstreamPageResolver } from './bitstream-page.resolver'; -import { BitstreamDownloadPageComponent } from '../shared/bitstream-download-page/bitstream-download-page.component'; +import { BitstreamDownloadPageComponent } from './bitstream-download-page/bitstream-download-page.component'; import { ResourcePolicyTargetResolver } from '../shared/resource-policies/resolvers/resource-policy-target.resolver'; import { ResourcePolicyCreateComponent } from '../shared/resource-policies/create/resource-policy-create.component'; import { ResourcePolicyResolver } from '../shared/resource-policies/resolvers/resource-policy.resolver'; diff --git a/src/app/bitstream-page/bitstream-page.module.ts b/src/app/bitstream-page/bitstream-page.module.ts index d168a06db2..992f714bf9 100644 --- a/src/app/bitstream-page/bitstream-page.module.ts +++ b/src/app/bitstream-page/bitstream-page.module.ts @@ -6,6 +6,7 @@ import { BitstreamPageRoutingModule } from './bitstream-page-routing.module'; import { BitstreamAuthorizationsComponent } from './bitstream-authorizations/bitstream-authorizations.component'; import { FormModule } from '../shared/form/form.module'; import { ResourcePoliciesModule } from '../shared/resource-policies/resource-policies.module'; +import { BitstreamDownloadPageComponent } from './bitstream-download-page/bitstream-download-page.component'; /** * This module handles all components that are necessary for Bitstream related pages @@ -20,7 +21,8 @@ import { ResourcePoliciesModule } from '../shared/resource-policies/resource-pol ], declarations: [ BitstreamAuthorizationsComponent, - EditBitstreamPageComponent + EditBitstreamPageComponent, + BitstreamDownloadPageComponent, ] }) export class BitstreamPageModule { diff --git a/src/app/breadcrumbs/breadcrumbs.component.scss b/src/app/breadcrumbs/breadcrumbs.component.scss index 412dca87db..a4d83b82ea 100644 --- a/src/app/breadcrumbs/breadcrumbs.component.scss +++ b/src/app/breadcrumbs/breadcrumbs.component.scss @@ -23,11 +23,14 @@ li.breadcrumb-item { } } -li.breadcrumb-item > a { - color: var(--ds-breadcrumb-link-color) !important; +li.breadcrumb-item { + a { + color: var(--ds-breadcrumb-link-color); + } } + li.breadcrumb-item.active { - color: var(--ds-breadcrumb-link-active-color) !important; + color: var(--ds-breadcrumb-link-active-color); } .breadcrumb-item+ .breadcrumb-item::before { diff --git a/src/app/community-list-page/community-list-page.module.ts b/src/app/community-list-page/community-list-page.module.ts index 18c28068be..15946b2e89 100644 --- a/src/app/community-list-page/community-list-page.module.ts +++ b/src/app/community-list-page/community-list-page.module.ts @@ -6,6 +6,7 @@ import { CommunityListPageRoutingModule } from './community-list-page.routing.mo import { CommunityListComponent } from './community-list/community-list.component'; import { ThemedCommunityListPageComponent } from './themed-community-list-page.component'; import { ThemedCommunityListComponent } from './community-list/themed-community-list.component'; +import { CdkTreeModule } from '@angular/cdk/tree'; const DECLARATIONS = [ @@ -21,13 +22,15 @@ const DECLARATIONS = [ imports: [ CommonModule, SharedModule, - CommunityListPageRoutingModule + CommunityListPageRoutingModule, + CdkTreeModule, ], declarations: [ ...DECLARATIONS ], exports: [ ...DECLARATIONS, + CdkTreeModule, ], }) export class CommunityListPageModule { diff --git a/src/app/core/breadcrumbs/dso-name.service.ts b/src/app/core/breadcrumbs/dso-name.service.ts index d56f4a00eb..64f37baa65 100644 --- a/src/app/core/breadcrumbs/dso-name.service.ts +++ b/src/app/core/breadcrumbs/dso-name.service.ts @@ -2,6 +2,7 @@ import { Injectable } from '@angular/core'; import { hasValue, isEmpty } from '../../shared/empty.util'; import { DSpaceObject } from '../shared/dspace-object.model'; import { TranslateService } from '@ngx-translate/core'; +import { Metadata } from '../shared/metadata.utils'; /** * Returns a name for a {@link DSpaceObject} based @@ -67,4 +68,45 @@ export class DSONameService { return name; } + /** + * Gets the Hit highlight + * + * @param object + * @param dso + * + * @returns {string} html embedded hit highlight. + */ + getHitHighlights(object: any, dso: DSpaceObject): string { + const types = dso.getRenderTypes(); + const entityType = types + .filter((type) => typeof type === 'string') + .find((type: string) => (['Person', 'OrgUnit']).includes(type)) as string; + if (entityType === 'Person') { + const familyName = this.firstMetadataValue(object, dso, 'person.familyName'); + const givenName = this.firstMetadataValue(object, dso, 'person.givenName'); + if (isEmpty(familyName) && isEmpty(givenName)) { + return this.firstMetadataValue(object, dso, 'dc.title') || dso.name; + } else if (isEmpty(familyName) || isEmpty(givenName)) { + return familyName || givenName; + } + return `${familyName}, ${givenName}`; + } else if (entityType === 'OrgUnit') { + return this.firstMetadataValue(object, dso, 'organization.legalName'); + } + return this.firstMetadataValue(object, dso, 'dc.title') || dso.name || this.translateService.instant('dso.name.untitled'); + } + + /** + * Gets the first matching metadata string value from hitHighlights or dso metadata, preferring hitHighlights. + * + * @param object + * @param dso + * @param {string|string[]} keyOrKeys The metadata key(s) in scope. Wildcards are supported; see [[Metadata]]. + * + * @returns {string} the first matching string value, or `undefined`. + */ + firstMetadataValue(object: any, dso: DSpaceObject, keyOrKeys: string | string[]): string { + return Metadata.firstValue([object.hitHighlights, dso.metadata], keyOrKeys); + } + } diff --git a/src/app/core/shared/media-viewer-item.model.ts b/src/app/core/shared/media-viewer-item.model.ts index cd3a31bd0b..1cf4948408 100644 --- a/src/app/core/shared/media-viewer-item.model.ts +++ b/src/app/core/shared/media-viewer-item.model.ts @@ -14,6 +14,11 @@ export class MediaViewerItem { */ format: string; + /** + * Incoming Bitsream format mime type + */ + mimetype: string; + /** * Incoming Bitsream thumbnail */ diff --git a/src/app/entity-groups/research-entities/submission/item-list-elements/org-unit/org-unit-search-result-list-submission-element.component.ts b/src/app/entity-groups/research-entities/submission/item-list-elements/org-unit/org-unit-search-result-list-submission-element.component.ts index 7a38a02cf4..954f7bc591 100644 --- a/src/app/entity-groups/research-entities/submission/item-list-elements/org-unit/org-unit-search-result-list-submission-element.component.ts +++ b/src/app/entity-groups/research-entities/submission/item-list-elements/org-unit/org-unit-search-result-list-submission-element.component.ts @@ -61,7 +61,7 @@ export class OrgUnitSearchResultListSubmissionElementComponent extends SearchRes this.useNameVariants = this.context === Context.EntitySearchModalWithNameVariants; if (this.useNameVariants) { - const defaultValue = this.dsoTitle; + const defaultValue = this.dso ? this.dsoNameService.getName(this.dso) : undefined; const alternatives = this.allMetadataValues(this.alternativeField); this.allSuggestions = [defaultValue, ...alternatives]; diff --git a/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.ts b/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.ts index 7d761c42dd..305407f8d2 100644 --- a/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.ts +++ b/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.ts @@ -55,7 +55,7 @@ export class PersonSearchResultListSubmissionElementComponent extends SearchResu ngOnInit() { super.ngOnInit(); - const defaultValue = this.dsoTitle; + const defaultValue = this.dso ? this.dsoNameService.getName(this.dso) : undefined; const alternatives = this.allMetadataValues(this.alternativeField); this.allSuggestions = [defaultValue, ...alternatives]; diff --git a/src/app/shared/item/item-alerts/item-alerts.component.html b/src/app/item-page/alerts/item-alerts.component.html similarity index 100% rename from src/app/shared/item/item-alerts/item-alerts.component.html rename to src/app/item-page/alerts/item-alerts.component.html diff --git a/src/app/shared/item/item-alerts/item-alerts.component.scss b/src/app/item-page/alerts/item-alerts.component.scss similarity index 100% rename from src/app/shared/item/item-alerts/item-alerts.component.scss rename to src/app/item-page/alerts/item-alerts.component.scss diff --git a/src/app/shared/item/item-alerts/item-alerts.component.spec.ts b/src/app/item-page/alerts/item-alerts.component.spec.ts similarity index 97% rename from src/app/shared/item/item-alerts/item-alerts.component.spec.ts rename to src/app/item-page/alerts/item-alerts.component.spec.ts index fed81199fd..a933eb6a58 100644 --- a/src/app/shared/item/item-alerts/item-alerts.component.spec.ts +++ b/src/app/item-page/alerts/item-alerts.component.spec.ts @@ -2,7 +2,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ItemAlertsComponent } from './item-alerts.component'; import { TranslateModule } from '@ngx-translate/core'; import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { Item } from '../../../core/shared/item.model'; +import { Item } from '../../core/shared/item.model'; import { By } from '@angular/platform-browser'; describe('ItemAlertsComponent', () => { diff --git a/src/app/shared/item/item-alerts/item-alerts.component.ts b/src/app/item-page/alerts/item-alerts.component.ts similarity index 80% rename from src/app/shared/item/item-alerts/item-alerts.component.ts rename to src/app/item-page/alerts/item-alerts.component.ts index 4c2d60d24c..d7a84db015 100644 --- a/src/app/shared/item/item-alerts/item-alerts.component.ts +++ b/src/app/item-page/alerts/item-alerts.component.ts @@ -1,6 +1,6 @@ import { Component, Input } from '@angular/core'; -import { Item } from '../../../core/shared/item.model'; -import { AlertType } from '../../alert/aletr-type'; +import { Item } from '../../core/shared/item.model'; +import { AlertType } from '../../shared/alert/aletr-type'; @Component({ selector: 'ds-item-alerts', diff --git a/src/app/shared/bitstream-request-a-copy-page/bitstream-request-a-copy-page.component.html b/src/app/item-page/bitstreams/request-a-copy/bitstream-request-a-copy-page.component.html similarity index 100% rename from src/app/shared/bitstream-request-a-copy-page/bitstream-request-a-copy-page.component.html rename to src/app/item-page/bitstreams/request-a-copy/bitstream-request-a-copy-page.component.html diff --git a/src/app/shared/bitstream-request-a-copy-page/bitstream-request-a-copy-page.component.spec.ts b/src/app/item-page/bitstreams/request-a-copy/bitstream-request-a-copy-page.component.spec.ts similarity index 90% rename from src/app/shared/bitstream-request-a-copy-page/bitstream-request-a-copy-page.component.spec.ts rename to src/app/item-page/bitstreams/request-a-copy/bitstream-request-a-copy-page.component.spec.ts index cc44ef8587..cbfbdf361f 100644 --- a/src/app/shared/bitstream-request-a-copy-page/bitstream-request-a-copy-page.component.spec.ts +++ b/src/app/item-page/bitstreams/request-a-copy/bitstream-request-a-copy-page.component.spec.ts @@ -1,30 +1,30 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { AuthService } from '../../core/auth/auth.service'; +import { AuthService } from '../../../core/auth/auth.service'; import { of as observableOf } from 'rxjs'; -import { Bitstream } from '../../core/shared/bitstream.model'; -import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; +import { Bitstream } from '../../../core/shared/bitstream.model'; +import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; import { createFailedRemoteDataObject$, createSuccessfulRemoteDataObject, createSuccessfulRemoteDataObject$ -} from '../remote-data.utils'; +} from '../../../shared/remote-data.utils'; import { ActivatedRoute, Router } from '@angular/router'; import { TranslateModule } from '@ngx-translate/core'; import { CommonModule } from '@angular/common'; import { BitstreamRequestACopyPageComponent } from './bitstream-request-a-copy-page.component'; import { By } from '@angular/platform-browser'; -import { RouterStub } from '../testing/router.stub'; +import { RouterStub } from '../../../shared/testing/router.stub'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { NotificationsServiceStub } from '../testing/notifications-service.stub'; -import { ItemRequestDataService } from '../../core/data/item-request-data.service'; -import { NotificationsService } from '../notifications/notifications.service'; -import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; -import { DSONameServiceMock } from '../mocks/dso-name.service.mock'; -import { Item } from '../../core/shared/item.model'; -import { EPerson } from '../../core/eperson/models/eperson.model'; -import { ItemRequest } from '../../core/shared/item-request.model'; +import { NotificationsServiceStub } from '../../../shared/testing/notifications-service.stub'; +import { ItemRequestDataService } from '../../../core/data/item-request-data.service'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; +import { DSONameServiceMock } from '../../../shared/mocks/dso-name.service.mock'; +import { Item } from '../../../core/shared/item.model'; +import { EPerson } from '../../../core/eperson/models/eperson.model'; +import { ItemRequest } from '../../../core/shared/item-request.model'; import { Location } from '@angular/common'; -import { BitstreamDataService } from '../../core/data/bitstream-data.service'; +import { BitstreamDataService } from '../../../core/data/bitstream-data.service'; describe('BitstreamRequestACopyPageComponent', () => { diff --git a/src/app/shared/bitstream-request-a-copy-page/bitstream-request-a-copy-page.component.ts b/src/app/item-page/bitstreams/request-a-copy/bitstream-request-a-copy-page.component.ts similarity index 85% rename from src/app/shared/bitstream-request-a-copy-page/bitstream-request-a-copy-page.component.ts rename to src/app/item-page/bitstreams/request-a-copy/bitstream-request-a-copy-page.component.ts index 511079a701..59819a4a66 100644 --- a/src/app/shared/bitstream-request-a-copy-page/bitstream-request-a-copy-page.component.ts +++ b/src/app/item-page/bitstreams/request-a-copy/bitstream-request-a-copy-page.component.ts @@ -1,25 +1,25 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { filter, map, switchMap, take } from 'rxjs/operators'; import { ActivatedRoute, Router } from '@angular/router'; -import { hasValue, isNotEmpty } from '../empty.util'; -import { getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload } from '../../core/shared/operators'; -import { Bitstream } from '../../core/shared/bitstream.model'; -import { AuthorizationDataService } from '../../core/data/feature-authorization/authorization-data.service'; -import { FeatureID } from '../../core/data/feature-authorization/feature-id'; -import { AuthService } from '../../core/auth/auth.service'; +import { hasValue, isNotEmpty } from '../../../shared/empty.util'; +import { getFirstCompletedRemoteData, getFirstSucceededRemoteDataPayload } from '../../../core/shared/operators'; +import { Bitstream } from '../../../core/shared/bitstream.model'; +import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service'; +import { FeatureID } from '../../../core/data/feature-authorization/feature-id'; +import { AuthService } from '../../../core/auth/auth.service'; import { combineLatest as observableCombineLatest, Observable, of as observableOf, Subscription } from 'rxjs'; -import { getBitstreamDownloadRoute, getForbiddenRoute } from '../../app-routing-paths'; +import { getBitstreamDownloadRoute, getForbiddenRoute } from '../../../app-routing-paths'; import { TranslateService } from '@ngx-translate/core'; -import { EPerson } from '../../core/eperson/models/eperson.model'; +import { EPerson } from '../../../core/eperson/models/eperson.model'; import { FormBuilder, FormControl, FormGroup, Validators } from '@angular/forms'; -import { ItemRequestDataService } from '../../core/data/item-request-data.service'; -import { ItemRequest } from '../../core/shared/item-request.model'; -import { Item } from '../../core/shared/item.model'; -import { NotificationsService } from '../notifications/notifications.service'; -import { DSONameService } from '../../core/breadcrumbs/dso-name.service'; +import { ItemRequestDataService } from '../../../core/data/item-request-data.service'; +import { ItemRequest } from '../../../core/shared/item-request.model'; +import { Item } from '../../../core/shared/item.model'; +import { NotificationsService } from '../../../shared/notifications/notifications.service'; +import { DSONameService } from '../../../core/breadcrumbs/dso-name.service'; import { Location } from '@angular/common'; -import { BitstreamDataService } from '../../core/data/bitstream-data.service'; -import { getItemPageRoute } from '../../item-page/item-page-routing-paths'; +import { BitstreamDataService } from '../../../core/data/bitstream-data.service'; +import { getItemPageRoute } from '../../item-page-routing-paths'; @Component({ selector: 'ds-bitstream-request-a-copy-page', diff --git a/src/app/item-page/edit-item-page/edit-item-page.module.ts b/src/app/item-page/edit-item-page/edit-item-page.module.ts index 3ed741bc1a..fafbae0bd4 100644 --- a/src/app/item-page/edit-item-page/edit-item-page.module.ts +++ b/src/app/item-page/edit-item-page/edit-item-page.module.ts @@ -36,6 +36,7 @@ import { ItemVersionHistoryComponent } from './item-version-history/item-version import { ItemAuthorizationsComponent } from './item-authorizations/item-authorizations.component'; import { ObjectValuesPipe } from '../../shared/utils/object-values-pipe'; import { ResourcePoliciesModule } from '../../shared/resource-policies/resource-policies.module'; +import { ItemVersionsModule } from '../versions/item-versions.module'; /** @@ -50,7 +51,8 @@ import { ResourcePoliciesModule } from '../../shared/resource-policies/resource- SearchPageModule, DragDropModule, ResourcePoliciesModule, - NgbModule + NgbModule, + ItemVersionsModule, ], declarations: [ EditItemPageComponent, diff --git a/src/app/item-page/full/field-components/file-section/full-file-section.component.spec.ts b/src/app/item-page/full/field-components/file-section/full-file-section.component.spec.ts index 6f0e97513f..f8a8a83f29 100644 --- a/src/app/item-page/full/field-components/file-section/full-file-section.component.spec.ts +++ b/src/app/item-page/full/field-components/file-section/full-file-section.component.spec.ts @@ -7,7 +7,7 @@ import { TranslateLoaderMock } from '../../../../shared/mocks/translate-loader.m import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { VarDirective } from '../../../../shared/utils/var.directive'; import { FileSizePipe } from '../../../../shared/utils/file-size-pipe'; -import { MetadataFieldWrapperComponent } from '../../../field-components/metadata-field-wrapper/metadata-field-wrapper.component'; +import { MetadataFieldWrapperComponent } from '../../../../shared/metadata-field-wrapper/metadata-field-wrapper.component'; import { BitstreamDataService } from '../../../../core/data/bitstream-data.service'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { Bitstream } from '../../../../core/shared/bitstream.model'; diff --git a/src/app/item-page/item-page-routing.module.ts b/src/app/item-page/item-page-routing.module.ts index ac14ca8402..b713b8ed78 100644 --- a/src/app/item-page/item-page-routing.module.ts +++ b/src/app/item-page/item-page-routing.module.ts @@ -14,9 +14,7 @@ import { ThemedItemPageComponent } from './simple/themed-item-page.component'; import { ThemedFullItemPageComponent } from './full/themed-full-item-page.component'; import { MenuItemType } from '../shared/menu/menu-item-type.model'; import { VersionPageComponent } from './version-page/version-page/version-page.component'; -import { - BitstreamRequestACopyPageComponent -} from '../shared/bitstream-request-a-copy-page/bitstream-request-a-copy-page.component'; +import { BitstreamRequestACopyPageComponent } from './bitstreams/request-a-copy/bitstream-request-a-copy-page.component'; import { REQUEST_COPY_MODULE_PATH } from '../app-routing-paths'; import { OrcidPageComponent } from './orcid-page/orcid-page.component'; import { OrcidPageGuard } from './orcid-page/orcid-page.guard'; diff --git a/src/app/item-page/item-page.module.ts b/src/app/item-page/item-page.module.ts index de9f2f60c5..39c2580921 100644 --- a/src/app/item-page/item-page.module.ts +++ b/src/app/item-page/item-page.module.ts @@ -47,6 +47,11 @@ import { NgbAccordionModule } from '@ng-bootstrap/ng-bootstrap'; import { OrcidSyncSettingsComponent } from './orcid-page/orcid-sync-settings/orcid-sync-settings.component'; import { OrcidQueueComponent } from './orcid-page/orcid-queue/orcid-queue.component'; import { UploadModule } from '../shared/upload/upload.module'; +import { ItemAlertsComponent } from './alerts/item-alerts.component'; +import { ItemVersionsModule } from './versions/item-versions.module'; +import { BitstreamRequestACopyPageComponent } from './bitstreams/request-a-copy/bitstream-request-a-copy-page.component'; +import { FileSectionComponent } from './simple/field-components/file-section/file-section.component'; +import { ItemSharedModule } from './item-shared.module'; const ENTRY_COMPONENTS = [ @@ -56,6 +61,7 @@ const ENTRY_COMPONENTS = [ ]; const DECLARATIONS = [ + FileSectionComponent, ThemedFileSectionComponent, ItemPageComponent, ThemedItemPageComponent, @@ -82,7 +88,10 @@ const DECLARATIONS = [ OrcidPageComponent, OrcidAuthComponent, OrcidSyncSettingsComponent, - OrcidQueueComponent + OrcidQueueComponent, + ItemAlertsComponent, + VersionedItemComponent, + BitstreamRequestACopyPageComponent, ]; @NgModule({ @@ -91,6 +100,8 @@ const DECLARATIONS = [ SharedModule.withEntryComponents(), ItemPageRoutingModule, EditItemPageModule, + ItemVersionsModule, + ItemSharedModule, StatisticsModule.forRoot(), JournalEntitiesModule.withEntryComponents(), ResearchEntitiesModule.withEntryComponents(), @@ -100,10 +111,10 @@ const DECLARATIONS = [ ], declarations: [ ...DECLARATIONS, - VersionedItemComponent + ], exports: [ - ...DECLARATIONS + ...DECLARATIONS, ] }) export class ItemPageModule { diff --git a/src/app/item-page/item-shared.module.ts b/src/app/item-page/item-shared.module.ts index b191b6c4b3..c558b11692 100644 --- a/src/app/item-page/item-shared.module.ts +++ b/src/app/item-page/item-shared.module.ts @@ -7,10 +7,32 @@ import { TranslateModule } from '@ngx-translate/core'; import { DYNAMIC_FORM_CONTROL_MAP_FN } from '@ng-dynamic-forms/core'; import { dsDynamicFormControlMapFn } from '../shared/form/builder/ds-dynamic-form-ui/ds-dynamic-form-control-container.component'; import { TabbedRelatedEntitiesSearchComponent } from './simple/related-entities/tabbed-related-entities-search/tabbed-related-entities-search.component'; +import { ItemVersionsDeleteModalComponent } from './versions/item-versions-delete-modal/item-versions-delete-modal.component'; +import { ItemVersionsSummaryModalComponent } from './versions/item-versions-summary-modal/item-versions-summary-modal.component'; +import { MetadataValuesComponent } from './field-components/metadata-values/metadata-values.component'; +import { DsoPageVersionButtonComponent } from '../shared/dso-page/dso-page-version-button/dso-page-version-button.component'; +import { PersonPageClaimButtonComponent } from '../shared/dso-page/person-page-claim-button/person-page-claim-button.component'; +import { GenericItemPageFieldComponent } from './simple/field-components/specific-field/generic/generic-item-page-field.component'; +import { MetadataRepresentationListComponent } from './simple/metadata-representation-list/metadata-representation-list.component'; +import { RelatedItemsComponent } from './simple/related-items/related-items-component'; +import { DsoPageOrcidButtonComponent } from '../shared/dso-page/dso-page-orcid-button/dso-page-orcid-button.component'; + +const ENTRY_COMPONENTS = [ + ItemVersionsDeleteModalComponent, + ItemVersionsSummaryModalComponent, +]; const COMPONENTS = [ + ...ENTRY_COMPONENTS, RelatedEntitiesSearchComponent, - TabbedRelatedEntitiesSearchComponent + TabbedRelatedEntitiesSearchComponent, + MetadataValuesComponent, + DsoPageVersionButtonComponent, + PersonPageClaimButtonComponent, + GenericItemPageFieldComponent, + MetadataRepresentationListComponent, + RelatedItemsComponent, + DsoPageOrcidButtonComponent ]; @NgModule({ @@ -30,7 +52,8 @@ const COMPONENTS = [ { provide: DYNAMIC_FORM_CONTROL_MAP_FN, useValue: dsDynamicFormControlMapFn - } + }, + ...ENTRY_COMPONENTS, ] }) export class ItemSharedModule { } diff --git a/src/app/item-page/media-viewer/media-viewer-video/caption-info.ts b/src/app/item-page/media-viewer/media-viewer-video/caption-info.ts new file mode 100644 index 0000000000..43996d096d --- /dev/null +++ b/src/app/item-page/media-viewer/media-viewer-video/caption-info.ts @@ -0,0 +1,11 @@ +/* + The class is designed to host information related to Video Captioning support + and used in HTML 5 video track + src: source vtt file + srclang: two letter language code + langLabel: language label + */ +export class CaptionInfo { + constructor(public src: string, public srclang: string, public langLabel: string ) { + } +} diff --git a/src/app/item-page/media-viewer/media-viewer-video/language-helper.ts b/src/app/item-page/media-viewer/media-viewer-video/language-helper.ts new file mode 100644 index 0000000000..b27ab9983f --- /dev/null +++ b/src/app/item-page/media-viewer/media-viewer-video/language-helper.ts @@ -0,0 +1,190 @@ +export const languageHelper = { + ab: 'Abkhazian', + aa: 'Afar', + af: 'Afrikaans', + ak: 'Akan', + sq: 'Albanian', + am: 'Amharic', + ar: 'Arabic', + an: 'Aragonese', + hy: 'Armenian', + as: 'Assamese', + av: 'Avaric', + ae: 'Avestan', + ay: 'Aymara', + az: 'Azerbaijani', + bm: 'Bambara', + ba: 'Bashkir', + eu: 'Basque', + be: 'Belarusian', + bn: 'Bengali (Bangla)', + bh: 'Bihari', + bi: 'Bislama', + bs: 'Bosnian', + br: 'Breton', + bg: 'Bulgarian', + my: 'Burmese', + ca: 'Catalan', + ch: 'Chamorro', + ce: 'Chechen', + ny: 'Chichewa, Chewa, Nyanja', + zh: 'Chinese', + cv: 'Chuvash', + kw: 'Cornish', + co: 'Corsican', + cr: 'Cree', + hr: 'Croatian', + cs: 'Czech', + da: 'Danish', + dv: 'Divehi, Dhivehi, Maldivian', + nl: 'Dutch', + dz: 'Dzongkha', + en: 'English', + eo: 'Esperanto', + et: 'Estonian', + ee: 'Ewe', + fo: 'Faroese', + fj: 'Fijian', + fi: 'Finnish', + fr: 'French', + ff: 'Fula, Fulah, Pulaar, Pular', + gl: 'Galician', + gd: 'Gaelic (Scottish)', + gv: 'Gaelic (Manx)', + ka: 'Georgian', + de: 'German', + el: 'Greek', + gn: 'Guarani', + gu: 'Gujarati', + ht: 'Haitian Creole', + ha: 'Hausa', + he: 'Hebrew', + hz: 'Herero', + hi: 'Hindi', + ho: 'Hiri Motu', + hu: 'Hungarian', + is: 'Icelandic', + io: 'Ido', + ig: 'Igbo', + in: 'Indonesian', + ia: 'Interlingua', + ie: 'Interlingue', + iu: 'Inuktitut', + ik: 'Inupiak', + ga: 'Irish', + it: 'Italian', + ja: 'Japanese', + jv: 'Javanese', + kl: 'Kalaallisut, Greenlandic', + kn: 'Kannada', + kr: 'Kanuri', + ks: 'Kashmiri', + kk: 'Kazakh', + km: 'Khmer', + ki: 'Kikuyu', + rw: 'Kinyarwanda (Rwanda)', + rn: 'Kirundi', + ky: 'Kyrgyz', + kv: 'Komi', + kg: 'Kongo', + ko: 'Korean', + ku: 'Kurdish', + kj: 'Kwanyama', + lo: 'Lao', + la: 'Latin', + lv: 'Latvian (Lettish)', + li: 'Limburgish ( Limburger)', + ln: 'Lingala', + lt: 'Lithuanian', + lu: 'Luga-Katanga', + lg: 'Luganda, Ganda', + lb: 'Luxembourgish', + mk: 'Macedonian', + mg: 'Malagasy', + ms: 'Malay', + ml: 'Malayalam', + mt: 'Maltese', + mi: 'Maori', + mr: 'Marathi', + mh: 'Marshallese', + mo: 'Moldavian', + mn: 'Mongolian', + na: 'Nauru', + nv: 'Navajo', + ng: 'Ndonga', + nd: 'Northern Ndebele', + ne: 'Nepali', + no: 'Norwegian', + nb: 'Norwegian bokmål', + nn: 'Norwegian nynorsk', + oc: 'Occitan', + oj: 'Ojibwe', + cu: 'Old Church Slavonic, Old Bulgarian', + or: 'Oriya', + om: 'Oromo (Afaan Oromo)', + os: 'Ossetian', + pi: 'Pāli', + ps: 'Pashto, Pushto', + fa: 'Persian (Farsi)', + pl: 'Polish', + pt: 'Portuguese', + pa: 'Punjabi (Eastern)', + qu: 'Quechua', + rm: 'Romansh', + ro: 'Romanian', + ru: 'Russian', + se: 'Sami', + sm: 'Samoan', + sg: 'Sango', + sa: 'Sanskrit', + sr: 'Serbian', + sh: 'Serbo-Croatian', + st: 'Sesotho', + tn: 'Setswana', + sn: 'Shona', + ii: 'Sichuan Yi, Nuosu', + sd: 'Sindhi', + si: 'Sinhalese', + ss: 'Siswati (Swati)', + sk: 'Slovak', + sl: 'Slovenian', + so: 'Somali', + nr: 'Southern Ndebele', + es: 'Spanish', + su: 'Sundanese', + sw: 'Swahili (Kiswahili)', + sv: 'Swedish', + tl: 'Tagalog', + ty: 'Tahitian', + tg: 'Tajik', + ta: 'Tamil', + tt: 'Tatar', + te: 'Telugu', + th: 'Thai', + bo: 'Tibetan', + ti: 'Tigrinya', + to: 'Tonga', + ts: 'Tsonga', + tr: 'Turkish', + tk: 'Turkmen', + tw: 'Twi', + ug: 'Uyghur', + uk: 'Ukrainian', + ur: 'Urdu', + uz: 'Uzbek', + ve: 'Venda', + vi: 'Vietnamese', + vo: 'Volapük', + wa: 'Wallon', + cy: 'Welsh', + wo: 'Wolof', + fy: 'Western Frisian', + xh: 'Xhosa', + yi: 'Yiddish', + yo: 'Yoruba', + za: 'Zhuang, Chuang', + zu: 'Zulu' +}; + + + diff --git a/src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.html b/src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.html index a4493e36fc..0cc854b272 100644 --- a/src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.html +++ b/src/app/item-page/media-viewer/media-viewer-video/media-viewer-video.component.html @@ -1,4 +1,5 @@ +> + + + + + + +