Merge remote-tracking branch 'dspace/main' into accessibility-settings-main

# Conflicts:
#	src/app/footer/footer.component.html
#	src/app/profile-page/profile-page.component.html
This commit is contained in:
Andreas Awouters
2025-03-21 13:03:30 +01:00
945 changed files with 24856 additions and 18623 deletions

View File

@@ -1,7 +1,9 @@
<ds-form *ngIf="!!formModel" #formRef="formComponent"
[formId]="formId"
[formModel]="formModel"
[displaySubmit]="false"
[displayCancel]="false"
(dfChange)="onChange($event)"
(removeArrayItem)="onRemove($event)"></ds-form>
@if (!!formModel) {
<ds-form #formRef="formComponent"
[formId]="formId"
[formModel]="formModel"
[displaySubmit]="false"
[displayCancel]="false"
(dfChange)="onChange($event)"
(removeArrayItem)="onRemove($event)"></ds-form>
}

View File

@@ -1,4 +1,4 @@
import { NgIf } from '@angular/common';
import {
Component,
Inject,
@@ -79,7 +79,6 @@ import { SectionAccessesService } from './section-accesses.service';
styleUrls: ['./section-accesses.component.scss'],
imports: [
FormComponent,
NgIf,
],
standalone: true,
})

View File

@@ -2,22 +2,22 @@
<div class="mb-4 ccLicense-select">
<div ngbDropdown>
<input id="cc-license-dropdown"
class="form-control"
[(ngModel)]="selectedCcLicense.name"
placeholder="{{ !storedCcLicenseLink ? ('submission.sections.ccLicense.select' | translate) : ('submission.sections.ccLicense.change' | translate)}}"
[ngModelOptions]="{standalone: true}"
ngbDropdownToggle
role="combobox"
#script="ngModel">
class="form-control"
[(ngModel)]="selectedCcLicense.name"
placeholder="{{ !storedCcLicenseLink ? ('submission.sections.ccLicense.select' | translate) : ('submission.sections.ccLicense.change' | translate)}}"
[ngModelOptions]="{standalone: true}"
ngbDropdownToggle
role="combobox"
#script="ngModel">
<div ngbDropdownMenu aria-labelledby="cc-license-dropdown" class="w-100 scrollable-menu"
role="menu"
infiniteScroll
(scroll)="onScroll($event)"
[infiniteScrollDistance]="5"
[infiniteScrollThrottle]="300"
[infiniteScrollUpDistance]="1.5"
[fromRoot]="true"
[scrollWindow]="false">
role="menu"
infiniteScroll
(scroll)="onScroll($event)"
[infiniteScrollDistance]="5"
[infiniteScrollThrottle]="300"
[infiniteScrollUpDistance]="1.5"
[fromRoot]="true"
[scrollWindow]="false">
@if(submissionCcLicenses?.length === 0) {
<button class="dropdown-item disabled">
@@ -31,115 +31,121 @@
}
}
</div>
</div>
</div>
</div>
}
<ng-container *ngIf="getSelectedCcLicense()">
<div *ngFor="let field of getSelectedCcLicense().fields"
class="mb-4">
<div class="d-flex flex-row">
<div class="fw-bold {{ field.id }}">
{{ field.label }}
</div>
<button
class="btn btn-outline-info btn-sm ms-2"
(click)="openInfoModal(infoModal)">
<i class="fas fa-question"></i>
</button>
</div>
<ng-template #infoModal>
<div>
<div class="modal-header mb-4 ">
<div>
<h4>
{{ field.label }}
</h4>
<div [innerHTML]="field.description"></div>
</div>
<button type="button" class="btn-close"
(click)="closeInfoModal()" aria-label="Close">
</button>
@if (getSelectedCcLicense()) {
@for (field of getSelectedCcLicense().fields; track field) {
<div
class="mb-4">
<div class="d-flex flex-row">
<div class="fw-bold {{ field.id }}">
{{ field.label }}
</div>
<div class="modal-body">
<div *ngFor="let value of field.enums"
class="mb-4">
<h5>
{{ value.label }}
</h5>
<div [innerHTML]="value.description" class="fw-light"></div>
<button
class="btn btn-outline-info btn-sm ms-2"
(click)="openInfoModal(infoModal)">
<i class="fas fa-question"></i>
</button>
</div>
<ng-template #infoModal>
<div>
<div class="modal-header mb-4 ">
<div>
<h4>
{{ field.label }}
</h4>
<div [innerHTML]="field.description"></div>
</div>
<button type="button" class="btn-close"
(click)="closeInfoModal()" aria-label="Close">
</button>
</div>
<div class="modal-body">
@for (value of field.enums; track value) {
<div
class="mb-4">
<h5>
{{ value.label }}
</h5>
<div [innerHTML]="value.description" class="fw-light"></div>
</div>
}
</div>
</div>
</div>
</ng-template>
<ds-select *ngIf="field.enums?.length > 5" [disabled]="field.id === 'jurisdiction' && defaultJurisdiction !== undefined && defaultJurisdiction !== 'none'">
<ng-container class="selection" *ngVar="getSelectedOption(getSelectedCcLicense(), field) as option">
<span *ngIf="option">
{{ option.label }}
</span>
<span *ngIf="!option">
{{ 'submission.sections.ccLicense.option.select' | translate }}
</span>
</ng-container>
<ng-container class="menu">
<div class="options-select-menu overflow-auto">
<button *ngFor="let option of field.enums"
</ng-template>
@if (field.enums?.length > 5) {
<ds-select [disabled]="field.id === 'jurisdiction' && defaultJurisdiction !== undefined && defaultJurisdiction !== 'none'">
<ng-container class="selection" *ngVar="getSelectedOption(getSelectedCcLicense(), field) as option">
@if (option) {
<span>
{{ option.label }}
</span>
}
@if (!option) {
<span>
{{ 'submission.sections.ccLicense.option.select' | translate }}
</span>
}
</ng-container>
<ng-container class="menu">
<div class="options-select-menu overflow-auto">
@for (option of field.enums; track option) {
<button
class="dropdown-item"
(click)="selectOption(getSelectedCcLicense(), field, option)">
{{ option.label }}
</button>
</div>
</ng-container>
</ds-select>
{{ option.label }}
</button>
}
</div>
</ng-container>
</ds-select>
}
@if (field.enums?.length <= 5) {
@for (option of field.enums; track option) {
<div
class="d-flex flex-row m-1">
<div (click)="selectOption(getSelectedCcLicense(), field, option)">
<input type="radio"
title="{{ option.label }}"
class="me-1"
[checked]="isSelectedOption(getSelectedCcLicense(), field, option)">
<span>{{ option.label }}</span>
</div>
</div>
}
}
</div>
}
}
<ng-container *ngIf="field.enums?.length <= 5">
<div *ngFor="let option of field.enums"
class="d-flex flex-row m-1">
<div (click)="selectOption(getSelectedCcLicense(), field, option)">
<input type="radio"
title="{{ option.label }}"
class="me-1"
[checked]="isSelectedOption(getSelectedCcLicense(), field, option)">
<span>{{ option.label }}</span>
</div>
</div>
</ng-container>
</div>
</ng-container>
<ng-container *ngIf="getCcLicenseLink$()">
@if (getCcLicenseLink$()) {
<ng-container *ngVar="getCcLicenseLink$() | async as licenseLink">
<div *ngIf="!licenseLink">
<ds-loading></ds-loading>
</div>
<div *ngIf="licenseLink"
class="mt-2 p-4 bg-light text-dark">
@if (!licenseLink) {
<div>
{{ 'submission.sections.ccLicense.link' | translate }}
<ds-loading></ds-loading>
</div>
<a class="license-link" href="{{ licenseLink }}" target="_blank" rel="noopener noreferrer">
{{ licenseLink }}
</a>
<div class="m-2">
<div (click)="setAccepted(!accepted)">
<input type="checkbox"
class="me-2"
title="accepted"
[checked]="accepted">
<span> {{ 'submission.sections.ccLicense.confirmation' | translate }}</span>
}
@if (licenseLink) {
<div
class="mt-2 p-4 bg-light text-dark">
<div>
{{ 'submission.sections.ccLicense.link' | translate }}
</div>
<a class="license-link" href="{{ licenseLink }}" target="_blank" rel="noopener noreferrer">
{{ licenseLink }}
</a>
<div class="m-2">
<div (click)="setAccepted(!accepted)">
<input type="checkbox"
class="me-2"
title="accepted"
[checked]="accepted">
<span> {{ 'submission.sections.ccLicense.confirmation' | translate }}</span>
</div>
</div>
</div>
</div>
}
</ng-container>
</ng-container>
}

View File

@@ -1,8 +1,4 @@
import {
AsyncPipe,
NgForOf,
NgIf,
} from '@angular/common';
import { AsyncPipe } from '@angular/common';
import {
ChangeDetectorRef,
Component,
@@ -65,11 +61,9 @@ import { SectionsType } from '../sections-type';
styleUrls: ['./submission-section-cc-licenses.component.scss'],
imports: [
TranslateModule,
NgIf,
ThemedLoadingComponent,
AsyncPipe,
VarDirective,
NgForOf,
DsSelectComponent,
NgbDropdownModule,
FormsModule,

View File

@@ -2,44 +2,60 @@
class="mb-2"
[ngClass]="{ 'section-focus' : sectionRef.isSectionActive() }" [mandatory]="sectionData.mandatory"
[submissionId]="submissionId" [sectionType]="sectionData.sectionType" [sectionId]="sectionData.id">
<ngb-accordion #acc="ngbAccordion" *ngIf="(sectionRef.isEnabled() | async)"
(panelChange)="sectionRef.sectionChange($event)" activeIds="{{ sectionData.id }}" [destroyOnHide]="false">
<ngb-panel id="{{ sectionData.id }}" [type]="sectionRef.isInfo() ? 'info' : ''">
<ng-template ngbPanelTitle class="d-flex">
<span [ngClass]="{ 'text-white' : sectionRef.isInfo()}" class="flex-grow-1 section-title" tabindex="0">{{
'submission.sections.'+sectionData.header | translate
@if ((sectionRef.isEnabled() | async)) {
<ngb-accordion #acc="ngbAccordion"
(panelChange)="sectionRef.sectionChange($event)" activeIds="{{ sectionData.id }}" [destroyOnHide]="false">
<ngb-panel id="{{ sectionData.id }}" [type]="sectionRef.isInfo() ? 'info' : ''">
<ng-template ngbPanelTitle class="d-flex">
<span [ngClass]="{ 'text-white' : sectionRef.isInfo()}" class="flex-grow-1 section-title" tabindex="0">{{
'submission.sections.'+sectionData.header | translate
}}</span>
<div class="d-inline-block">
<i *ngIf="(sectionRef.isValid() | async) !== true && !(sectionRef.hasErrors()) && !(sectionRef.isInfo())"
class="fas fa-exclamation-circle text-warning me-3"
title="{{'submission.sections.status.warnings.title' | translate}}" role="img"
[attr.aria-label]="'submission.sections.status.warnings.aria' | translate"></i>
<i *ngIf="(sectionRef.hasErrors()) && !(sectionRef.isInfo())"
class="fas fa-exclamation-circle text-danger me-3"
title="{{'submission.sections.status.errors.title' | translate}}" role="img"
[attr.aria-label]="'submission.sections.status.errors.aria' | translate"></i>
<i *ngIf="(sectionRef.isValid() | async) && !(sectionRef.hasErrors()) && !(sectionRef.isInfo())"
class="fas fa-check-circle text-success me-3"
title="{{'submission.sections.status.valid.title' | translate}}" role="img"
[attr.aria-label]="'submission.sections.status.valid.aria' | translate"></i>
<i *ngIf="sectionRef.isInfo()" class="fas fa-info-circle me-3 text-white"
title="{{'submission.sections.status.info.title' | translate}}" role="img"
[attr.aria-label]="'submission.sections.status.info.aria' | translate"></i>
<a href="javascript:void(0);" class="me-3" *ngIf="!sectionRef.isMandatory()"
(click)="removeSection($event)">
<i class="fas fa-trash-o" aria-hidden="true" tabindex="0"></i>
</a>
</div>
</ng-template>
<ng-template ngbPanelContent>
<div id="sectionGenericError_{{sectionData.id}}" *ngIf="sectionRef.hasGenericErrors()">
<ds-alert *ngFor="let error of sectionRef.getErrors(); let i = index" [content]="error" [dismissible]="true"
[type]="AlertTypeEnum.Error" (close)="sectionRef.removeError(i)"></ds-alert>
</div>
<div id="sectionContent_{{sectionData.id}}" (click)="sectionRef.setFocus($event)">
<ng-container *ngComponentOutlet="getSectionContent(); injector: objectInjector;"></ng-container>
</div>
</ng-template>
</ngb-panel>
</ngb-accordion>
<div class="d-inline-block">
@if ((sectionRef.isValid() | async) !== true && !(sectionRef.hasErrors()) && !(sectionRef.isInfo())) {
<i
class="fas fa-exclamation-circle text-warning me-3"
title="{{'submission.sections.status.warnings.title' | translate}}" role="img"
[attr.aria-label]="'submission.sections.status.warnings.aria' | translate"></i>
}
@if ((sectionRef.hasErrors()) && !(sectionRef.isInfo())) {
<i
class="fas fa-exclamation-circle text-danger me-3"
title="{{'submission.sections.status.errors.title' | translate}}" role="img"
[attr.aria-label]="'submission.sections.status.errors.aria' | translate"></i>
}
@if ((sectionRef.isValid() | async) && !(sectionRef.hasErrors()) && !(sectionRef.isInfo())) {
<i
class="fas fa-check-circle text-success me-3"
title="{{'submission.sections.status.valid.title' | translate}}" role="img"
[attr.aria-label]="'submission.sections.status.valid.aria' | translate"></i>
}
@if (sectionRef.isInfo()) {
<i class="fas fa-info-circle me-3 text-white"
title="{{'submission.sections.status.info.title' | translate}}" role="img"
[attr.aria-label]="'submission.sections.status.info.aria' | translate"></i>
}
@if (!sectionRef.isMandatory()) {
<a href="javascript:void(0);" class="me-3"
(click)="removeSection($event)">
<i class="fas fa-trash-o" aria-hidden="true" tabindex="0"></i>
</a>
}
</div>
</ng-template>
<ng-template ngbPanelContent>
@if (sectionRef.hasGenericErrors()) {
<div id="sectionGenericError_{{sectionData.id}}">
@for (error of sectionRef.getErrors(); track error; let i = $index) {
<ds-alert [content]="error" [dismissible]="true"
[type]="AlertTypeEnum.Error" (close)="sectionRef.removeError(i)"></ds-alert>
}
</div>
}
<div id="sectionContent_{{sectionData.id}}" (click)="sectionRef.setFocus($event)">
<ng-container *ngComponentOutlet="getSectionContent(); injector: objectInjector;"></ng-container>
</div>
</ng-template>
</ngb-panel>
</ngb-accordion>
}
</div>

View File

@@ -2,8 +2,6 @@ import {
AsyncPipe,
NgClass,
NgComponentOutlet,
NgForOf,
NgIf,
} from '@angular/common';
import {
Component,
@@ -30,12 +28,10 @@ import { rendersSectionType } from '../sections-decorator';
styleUrls: ['./section-container.component.scss'],
imports: [
AlertComponent,
NgForOf,
NgbAccordionModule,
NgComponentOutlet,
TranslateModule,
NgClass,
NgIf,
AsyncPipe,
SectionsDirective,
],

View File

@@ -3,18 +3,26 @@ Template for the detect duplicates submission section component
@author Kim Shepherd
-->
<div class="text-sm-left" *ngVar="(this.getDuplicateData() | async) as data">
<ng-container *ngIf="data?.potentialDuplicates.length === 0">
@if (data?.potentialDuplicates.length === 0) {
<div class="alert alert-success w-100">{{ 'submission.sections.duplicates.none' | translate }}</div>
</ng-container>
<ng-container *ngIf="data?.potentialDuplicates.length > 0">
<div class="alert alert-warning w-100">{{ 'submission.sections.duplicates.detected' | translate }}</div>
<div *ngFor="let dupe of data?.potentialDuplicates" class="ds-duplicate">
}
@if (data?.potentialDuplicates.length > 0) {
<div class="alert alert-warning w-100">{{ 'submission.sections.duplicates.detected' | translate }}</div>
@for (dupe of data?.potentialDuplicates; track dupe) {
<div class="ds-duplicate">
<a target="_blank" [href]="getItemLink(dupe.uuid)">{{dupe.title}}</a>
<div *ngFor="let metadatum of Metadata.toViewModelList(dupe.metadata)">
{{('item.preview.' + metadatum.key) | translate}} {{metadatum.value}}
</div>
<p *ngIf="dupe.workspaceItemId">{{ 'submission.sections.duplicates.in-workspace' | translate }}</p>
<p *ngIf="dupe.workflowItemId">{{ 'submission.sections.duplicates.in-workflow' | translate }}</p>
@for (metadatum of Metadata.toViewModelList(dupe.metadata); track metadatum) {
<div>
{{('item.preview.' + metadatum.key) | translate}} {{metadatum.value}}
</div>
}
@if (dupe.workspaceItemId) {
<p>{{ 'submission.sections.duplicates.in-workspace' | translate }}</p>
}
@if (dupe.workflowItemId) {
<p>{{ 'submission.sections.duplicates.in-workflow' | translate }}</p>
}
</div>
</ng-container>
}
}
</div>

View File

@@ -6,7 +6,9 @@ import {
} from '@angular/core';
import {
ComponentFixture,
fakeAsync,
TestBed,
tick,
waitForAsync,
} from '@angular/core/testing';
import {
@@ -210,6 +212,11 @@ describe('SubmissionSectionDuplicatesComponent test suite', () => {
formOperationsService = TestBed.inject(SectionFormOperationsService);
collectionDataService = TestBed.inject(CollectionDataService);
compAsAny.pathCombiner = new JsonPatchOperationPathCombiner('sections', sectionObject.id);
spyOn(comp, 'getDuplicateData').and.returnValue(observableOf({ potentialDuplicates: duplicates }));
collectionDataService.findById.and.returnValue(createSuccessfulRemoteDataObject$(mockCollection));
sectionsServiceStub.getSectionErrors.and.returnValue(observableOf([]));
sectionsServiceStub.isSectionReadOnly.and.returnValue(observableOf(false));
compAsAny.submissionService.getSubmissionScope.and.returnValue(SubmissionScopeType.WorkspaceItem);
});
afterEach(() => {
@@ -219,18 +226,13 @@ describe('SubmissionSectionDuplicatesComponent test suite', () => {
});
// Test initialisation of the submission section
it('Should init section properly', () => {
collectionDataService.findById.and.returnValue(createSuccessfulRemoteDataObject$(mockCollection));
sectionsServiceStub.getSectionErrors.and.returnValue(observableOf([]));
sectionsServiceStub.isSectionReadOnly.and.returnValue(observableOf(false));
compAsAny.submissionService.getSubmissionScope.and.returnValue(SubmissionScopeType.WorkspaceItem);
it('Should init section properly', fakeAsync(() => {
spyOn(comp, 'getSectionStatus').and.returnValue(observableOf(true));
spyOn(comp, 'getDuplicateData').and.returnValue(observableOf({ potentialDuplicates: duplicates }));
expect(comp.isLoading).toBeTruthy();
comp.onSectionInit();
fixture.detectChanges();
tick(100);
expect(comp.isLoading).toBeFalsy();
});
}));
// The following tests look for proper logic in the getSectionStatus() implementation
// These are very simple as we don't really have a 'false' state unless we're still loading
@@ -241,7 +243,7 @@ describe('SubmissionSectionDuplicatesComponent test suite', () => {
}));
});
it('Should return FALSE', () => {
compAsAny.isLoadin = true;
compAsAny.isLoading = true;
expect(compAsAny.getSectionStatus()).toBeObservable(cold('(a|)', {
a: false,
}));
@@ -255,11 +257,7 @@ describe('SubmissionSectionDuplicatesComponent test suite', () => {
selector: 'ds-test-cmp',
template: ``,
standalone: true,
imports: [BrowserModule,
CommonModule,
FormsModule,
ReactiveFormsModule,
NgxPaginationModule],
imports: [BrowserModule, FormsModule, ReactiveFormsModule, NgxPaginationModule],
})
class TestComponent {

View File

@@ -1,8 +1,4 @@
import {
AsyncPipe,
NgForOf,
NgIf,
} from '@angular/common';
import { AsyncPipe } from '@angular/common';
import {
ChangeDetectionStrategy,
Component,
@@ -41,10 +37,8 @@ import { SectionsService } from '../sections.service';
changeDetection: ChangeDetectionStrategy.Default,
imports: [
VarDirective,
NgIf,
AsyncPipe,
TranslateModule,
NgForOf,
],
standalone: true,
})

View File

@@ -1,11 +1,15 @@
<ds-loading *ngIf="isLoading" message="Loading..."></ds-loading>
<ds-form *ngIf="!isLoading && formModel" #formRef="formComponent"
[formId]="formId"
[formModel]="formModel"
[displaySubmit]="false"
[displayCancel]="false"
(dfChange)="onChange($event)"
(dfFocus)="onFocus($event)"
(remove)="onRemove($event)"
(ngbEvent)="onCustomEvent($event)"
(removeArrayItem)="onRemove($event)"></ds-form>
@if (isLoading) {
<ds-loading message="Loading..."></ds-loading>
}
@if (!isLoading && formModel) {
<ds-form #formRef="formComponent"
[formId]="formId"
[formModel]="formModel"
[displaySubmit]="false"
[displayCancel]="false"
(dfChange)="onChange($event)"
(dfFocus)="onFocus($event)"
(remove)="onRemove($event)"
(ngbEvent)="onCustomEvent($event)"
(removeArrayItem)="onRemove($event)"></ds-form>
}

View File

@@ -659,6 +659,6 @@ describe('SubmissionSectionFormComponent test suite', () => {
selector: 'ds-test-cmp',
template: ``,
standalone: true,
imports: [CommonModule, FormsModule, ReactiveFormsModule],
imports: [FormsModule, ReactiveFormsModule],
})
class TestComponent {}

View File

@@ -1,4 +1,4 @@
import { NgIf } from '@angular/common';
import {
ChangeDetectorRef,
Component,
@@ -78,7 +78,6 @@ import { SectionFormOperationsService } from './section-form-operations.service'
imports: [
FormComponent,
ThemedLoadingComponent,
NgIf,
],
standalone: true,
})

View File

@@ -4,17 +4,17 @@ Template for the identifiers submission section component
-->
<!-- Main identifier data -->
<ng-container *ngVar="(getIdentifierData() | async) as identifierData">
<ng-container *ngIf="identifierData && identifierData.identifiers">
<div>
<span>{{'submission.sections.identifiers.info' | translate}}</span>
<ul>
<ng-container *ngFor="let identifier of identifierData.identifiers">
<ng-container *ngIf="identifierData.displayTypes.includes(identifier.identifierType) && identifier.value">
<li>{{'submission.sections.identifiers.' + identifier.identifierType + '_label' | translate}}
{{identifier.value}}</li>
</ng-container>
</ng-container>
</ul>
</div>
</ng-container>
@if (identifierData && identifierData.identifiers) {
<div>
<span>{{'submission.sections.identifiers.info' | translate}}</span>
<ul>
@for (identifier of identifierData.identifiers; track identifier) {
@if (identifierData.displayTypes.includes(identifier.identifierType) && identifier.value) {
<li>{{'submission.sections.identifiers.' + identifier.identifierType + '_label' | translate}}
{{identifier.value}}</li>
}
}
</ul>
</div>
}
</ng-container>

View File

@@ -276,10 +276,10 @@ describe('SubmissionSectionIdentifiersComponent test suite', () => {
template: ``,
standalone: true,
imports: [
CommonModule,
FormsModule,
ReactiveFormsModule,
NgxPaginationModule],
NgxPaginationModule,
],
})
class TestComponent {

View File

@@ -1,8 +1,4 @@
import {
AsyncPipe,
NgForOf,
NgIf,
} from '@angular/common';
import { AsyncPipe } from '@angular/common';
import {
ChangeDetectionStrategy,
Component,
@@ -40,8 +36,6 @@ import { SectionsService } from '../sections.service';
changeDetection: ChangeDetectionStrategy.Default,
imports: [
TranslateModule,
NgForOf,
NgIf,
AsyncPipe,
VarDirective,
],

View File

@@ -1,9 +1,11 @@
<span class="mb-5 preserve-line-breaks" [innerHTML]="licenseText$ | async"></span>
<br> <br>
<ds-form *ngIf="formModel" #formRef="formComponent"
[formId]="formId"
[formModel]="formModel"
[formLayout]="formLayout"
[displaySubmit]="displaySubmit"
[displayCancel]="false"
(dfChange)="onChange($event)"></ds-form>
@if (formModel) {
<ds-form #formRef="formComponent"
[formId]="formId"
[formModel]="formModel"
[formLayout]="formLayout"
[displaySubmit]="displaySubmit"
[displayCancel]="false"
(dfChange)="onChange($event)"></ds-form>
}

View File

@@ -377,7 +377,6 @@ describe('SubmissionSectionLicenseComponent test suite', () => {
standalone: true,
imports: [
SubmissionSectionLicenseComponent,
CommonModule,
FormsModule,
FormComponent,
ReactiveFormsModule,

View File

@@ -1,7 +1,4 @@
import {
AsyncPipe,
NgIf,
} from '@angular/common';
import { AsyncPipe } from '@angular/common';
import {
AfterViewChecked,
ChangeDetectorRef,
@@ -67,7 +64,6 @@ import {
providers: [],
imports: [
FormComponent,
NgIf,
AsyncPipe,
],
standalone: true,

View File

@@ -1,149 +1,168 @@
<div class="container-fluid">
<ng-container *ngIf="patterns?.length > 0 ">
<div *ngFor="let ldnPattern of patterns; let i = index" class="col">
<div *ngIf="(filterServices(ldnPattern.pattern ) | async)?.length > 0">
<label class="row col-form-label">
{{'submission.section.section-coar-notify.control.' + ldnPattern.pattern + '.label' | translate }}
</label
>
<div *ngIf="ldnServiceByPattern[ldnPattern.pattern]?.services.length">
<div
*ngFor="
let service of ldnServiceByPattern[ldnPattern.pattern].services;
let serviceIndex = index
"
>
<div class="row">
<div ngbDropdown #myDropdown="ngbDropdown" [class.mt-2]="serviceIndex > 0" class="flex-grow-1">
<div class="position-relative right-addon"
[attr.aria-label]="ldnPattern.pattern + '.dropdown'">
<i ngbDropdownToggle class="position-absolute scrollable-dropdown-toggle"
aria-hidden="true"></i>
<input
[attr.aria-label]="ldnPattern.pattern+'.dropdownanchor'"
type="text"
[readonly]="true"
[ngClass]="{'border-danger': (getShownSectionErrors$(ldnPattern.pattern, serviceIndex) | async)?.length > 0}"
class="form-control w-100 scrollable-dropdown-input"
[value]="ldnServiceByPattern[ldnPattern.pattern].services[serviceIndex]?.name"
(click)="myDropdown.open()"
/>
</div>
<div
ngbDropdownMenu
class="dropdown-menu scrollable-dropdown-menu w-100"
aria-haspopup="true"
aria-expanded="false"
>
<div
class="scrollable-menu"
role="listbox"
infiniteScroll
[infiniteScrollDistance]="2"
[infiniteScrollThrottle]="50"
[scrollWindow]="false"
>
<button
*ngIf="(filterServices(ldnPattern.pattern) | async)?.length === 0"
class="dropdown-item collection-item text-truncate w-100"
>
{{'submission.section.section-coar-notify.dropdown.no-data' | translate}}
</button>
<button
*ngIf="(filterServices(ldnPattern.pattern ) | async)?.length > 0"
class="dropdown-item collection-item text-truncate w-100"
(click)="onChange(ldnPattern.pattern, serviceIndex, null)"
>
{{'submission.section.section-coar-notify.dropdown.select-none' | translate}}
</button>
<button
*ngFor="let serviceOption of filterServices(ldnPattern.pattern ) | async"
[ngClass]="{'bg-light': ldnServiceByPattern[ldnPattern.pattern ].services[serviceIndex]?.id === serviceOption.id}"
class="dropdown-item collection-item text-truncate w-100"
(click)="onChange(ldnPattern.pattern, serviceIndex, serviceOption)"
>
<b>
{{ serviceOption.name }}
</b>
<br />
{{ serviceOption.description }}
</button>
</div>
</div>
</div>
<button *ngIf="ldnServiceByPattern[ldnPattern.pattern].services.length > 1"
type="button" [class.mt-2]="serviceIndex > 0"
class="btn btn-secondary ms-2"
role="button"
title="{{'form.remove' | translate}}"
[attr.aria-label]="'form.remove' | translate"
(click)="removeService(ldnPattern, serviceIndex)"
@if (patterns?.length > 0 ) {
@for (ldnPattern of patterns; track ldnPattern; let i = $index) {
<div class="col">
@if ((filterServices(ldnPattern.pattern ) | async)?.length > 0) {
<div>
<label class="row col-form-label">
{{'submission.section.section-coar-notify.control.' + ldnPattern.pattern + '.label' | translate }}
</label
>
<span><i class="fas fa-trash" aria-hidden="true"></i></span>
</button>
</div>
<small
class="row text-muted"
*ngIf="!ldnServiceByPattern[ldnPattern.pattern].services[serviceIndex] &&
serviceIndex === ldnServiceByPattern[ldnPattern.pattern].services.length -1"
>
{{'submission.section.section-coar-notify.small.notification' | translate : {pattern : ldnPattern.pattern} }}
</small>
<ng-container *ngIf="(getShownSectionErrors$(ldnPattern.pattern , serviceIndex) | async)?.length > 0">
<small class="row text-danger" *ngFor="let error of (getShownSectionErrors$(ldnPattern.pattern , serviceIndex) | async)">
{{ error.message | translate}}
</small>
</ng-container>
<div
class="row mt-1"
*ngIf="ldnServiceByPattern[ldnPattern.pattern].services[serviceIndex]"
>
<div
class="alert alert-info w-100 d-flex align-items-center flex-row"
>
<i class="fa-solid fa-circle-info fa-xl ms-2"></i>
<div class="ms-4">
<div>{{ 'submission.section.section-coar-notify.selection.description' | translate }}</div>
<div *ngIf="ldnServiceByPattern[ldnPattern.pattern].services[serviceIndex]?.description; else noDesc">
{{ ldnServiceByPattern[ldnPattern.pattern].services[serviceIndex].description }}
</div>
<ng-template #noDesc>
<span class="text-muted">
{{ 'submission.section.section-coar-notify.selection.no-description' | translate }}
</span>
</ng-template>
@if (ldnServiceByPattern[ldnPattern.pattern]?.services.length) {
<div>
@for (
service of ldnServiceByPattern[ldnPattern.pattern].services; track
service; let serviceIndex = $index) {
<div
>
<div class="row">
<div ngbDropdown #myDropdown="ngbDropdown" [class.mt-2]="serviceIndex > 0" class="flex-grow-1">
<div class="position-relative right-addon"
[attr.aria-label]="ldnPattern.pattern + '.dropdown'">
<i ngbDropdownToggle class="position-absolute scrollable-dropdown-toggle"
aria-hidden="true"></i>
<input
[attr.aria-label]="ldnPattern.pattern+'.dropdownanchor'"
type="text"
[readonly]="true"
[ngClass]="{'border-danger': (getShownSectionErrors$(ldnPattern.pattern, serviceIndex) | async)?.length > 0}"
class="form-control w-100 scrollable-dropdown-input"
[value]="ldnServiceByPattern[ldnPattern.pattern].services[serviceIndex]?.name"
(click)="myDropdown.open()"
/>
</div>
<div
ngbDropdownMenu
class="dropdown-menu scrollable-dropdown-menu w-100"
aria-haspopup="true"
aria-expanded="false"
>
<div
class="scrollable-menu"
role="listbox"
infiniteScroll
[infiniteScrollDistance]="2"
[infiniteScrollThrottle]="50"
[scrollWindow]="false"
>
@if ((filterServices(ldnPattern.pattern) | async)?.length === 0) {
<button
class="dropdown-item collection-item text-truncate w-100"
>
{{'submission.section.section-coar-notify.dropdown.no-data' | translate}}
</button>
}
@if ((filterServices(ldnPattern.pattern ) | async)?.length > 0) {
<button
class="dropdown-item collection-item text-truncate w-100"
(click)="onChange(ldnPattern.pattern, serviceIndex, null)"
>
{{'submission.section.section-coar-notify.dropdown.select-none' | translate}}
</button>
}
@for (serviceOption of filterServices(ldnPattern.pattern ) | async; track serviceOption) {
<button
[ngClass]="{'bg-light': ldnServiceByPattern[ldnPattern.pattern ].services[serviceIndex]?.id === serviceOption.id}"
class="dropdown-item collection-item text-truncate w-100"
(click)="onChange(ldnPattern.pattern, serviceIndex, serviceOption)"
>
<b>
{{ serviceOption.name }}
</b>
<br />
{{ serviceOption.description }}
</button>
}
</div>
</div>
</div>
@if (ldnServiceByPattern[ldnPattern.pattern].services.length > 1) {
<button
type="button" [class.mt-2]="serviceIndex > 0"
class="btn btn-secondary ms-2"
role="button"
title="{{'form.remove' | translate}}"
[attr.aria-label]="'form.remove' | translate"
(click)="removeService(ldnPattern, serviceIndex)"
>
<span><i class="fas fa-trash" aria-hidden="true"></i></span>
</button>
}
</div>
@if (!ldnServiceByPattern[ldnPattern.pattern].services[serviceIndex] &&
serviceIndex === ldnServiceByPattern[ldnPattern.pattern].services.length -1) {
<small
class="row text-muted"
>
{{'submission.section.section-coar-notify.small.notification' | translate : {pattern : ldnPattern.pattern} }}
</small>
}
@if ((getShownSectionErrors$(ldnPattern.pattern , serviceIndex) | async)?.length > 0) {
@for (error of (getShownSectionErrors$(ldnPattern.pattern , serviceIndex) | async); track error) {
<small class="row text-danger">
{{ error.message | translate}}
</small>
}
}
@if (ldnServiceByPattern[ldnPattern.pattern].services[serviceIndex]) {
<div
class="row mt-1"
>
<div
class="alert alert-info w-100 d-flex align-items-center flex-row"
>
<i class="fa-solid fa-circle-info fa-xl ms-2"></i>
<div class="ms-4">
<div>{{ 'submission.section.section-coar-notify.selection.description' | translate }}</div>
@if (ldnServiceByPattern[ldnPattern.pattern].services[serviceIndex]?.description) {
<div>
{{ ldnServiceByPattern[ldnPattern.pattern].services[serviceIndex].description }}
</div>
} @else {
<span class="text-muted">
{{ 'submission.section.section-coar-notify.selection.no-description' | translate }}
</span>
}
</div>
</div>
</div>
}
@if ((getShownSectionErrors$(ldnPattern.pattern, serviceIndex) | async)?.length > 0) {
<div class="row">
<div
class="alert alert-danger w-100 d-flex align-items-center flex-row"
>
<div class="ms-4">
<span>
{{ 'submission.section.section-coar-notify.notification.error' | translate }}
</span>
</div>
</div>
</div>
}
<div class="row">
@if (ldnPattern.multipleRequest && (serviceIndex === ldnServiceByPattern[ldnPattern.pattern].services.length - 1)) {
<div
(click)="addNewService(ldnPattern)"
class="btn btn-link mt-2 ps-0"
>
<i class="fas fa-plus"></i>
{{ 'submission.sections.general.add-more' | translate }}
</div>
}
</div>
</div>
}
</div>
</div>
}
</div>
<div class="row" *ngIf="(getShownSectionErrors$(ldnPattern.pattern, serviceIndex) | async)?.length > 0">
<div
class="alert alert-danger w-100 d-flex align-items-center flex-row"
>
<div class="ms-4">
<span>
{{ 'submission.section.section-coar-notify.notification.error' | translate }}
</span>
</div>
</div>
</div>
<div class="row">
<div *ngIf="ldnPattern.multipleRequest && (serviceIndex === ldnServiceByPattern[ldnPattern.pattern].services.length - 1)"
(click)="addNewService(ldnPattern)"
class="btn btn-link mt-2 ps-0"
>
<i class="fas fa-plus"></i>
{{ 'submission.sections.general.add-more' | translate }}
</div>
</div>
</div>
}
</div>
</div>
</div>
</ng-container>
<ng-container *ngIf="!hasSectionData">
<p>
{{ 'submission.section.section-coar-notify.info.no-pattern' | translate }}
</p>
</ng-container>
</div>
}
}
@if (!hasSectionData) {
<p>
{{ 'submission.section.section-coar-notify.info.no-pattern' | translate }}
</p>
}
</div>

View File

@@ -1,8 +1,6 @@
import {
AsyncPipe,
NgClass,
NgForOf,
NgIf,
} from '@angular/common';
import {
ChangeDetectorRef,
@@ -59,8 +57,6 @@ import { LdnPattern } from './submission-coar-notify.config';
styleUrls: ['./section-coar-notify.component.scss'],
standalone: true,
imports: [
NgIf,
NgForOf,
AsyncPipe,
TranslateModule,
NgbDropdownModule,

View File

@@ -1,90 +1,119 @@
<div class="mb-3 border-bottom" data-test="collapse">
<div class="w-100 d-flex justify-content-between collapse-toggle" (click)="collapse.toggle()">
<div class="d-flex">
<button type="button" class="btn btn-link p-0 me-4" (click)="$event.preventDefault()"
[attr.aria-expanded]="!collapse.collapsed" aria-controls="collapseExample">
{{version.articleVersion | titlecase}} {{ 'submission.sections.sherpa.publisher.policy.version' |
translate
}}
</button>
<div>
<span *ngIf="!!version?.embargo && !!version?.embargo.amount;else noEmbargoTitle"> <i
class="fas fa-hourglass-half"></i> {{version.embargo.amount}}
{{version.embargo?.units[0]}}</span>
<ng-template #noEmbargoTitle>
<span><i class="fas fa-hourglass-half"></i> {{
'submission.sections.sherpa.publisher.policy.noembargo' | translate }}</span>
</ng-template>
<div class="w-100 d-flex justify-content-between collapse-toggle" (click)="collapse.toggle()">
<div class="d-flex">
<button type="button" class="btn btn-link p-0 me-4" (click)="$event.preventDefault()"
[attr.aria-expanded]="!collapse.collapsed" aria-controls="collapseExample">
{{version.articleVersion | titlecase}} {{ 'submission.sections.sherpa.publisher.policy.version' |
translate
}}
</button>
<div>
@if (!!version?.embargo && !!version?.embargo.amount) {
<span> <i
class="fas fa-hourglass-half"></i> {{version.embargo.amount}}
{{version.embargo?.units[0]}}</span>
} @else {
<span><i class="fas fa-hourglass-half"></i> {{
'submission.sections.sherpa.publisher.policy.noembargo' | translate }}</span>
}
<span class="m-1 ms-4">
<i class="far fa-folder-open"></i>
<span *ngIf="!!version?.locations && version.locations.length > 0; else noLocations">
{{version.locations[0]}} <span
*ngIf="version.locations.length > 1">+{{version.locations.length-1}}</span>
</span>
<ng-template #noLocations>
<span>{{
'submission.sections.sherpa.publisher.policy.nolocation' | translate }}</span>
</ng-template>
</span>
</div>
</div>
<div class="d-inline-block">
<span *ngIf="collapse.collapsed" class="fas fa-chevron-down"></span>
<span *ngIf="!collapse.collapsed" class="fas fa-chevron-up"></span>
</div>
</div>
<div #collapse="ngbCollapse" [ngbCollapse]="isCollapsed">
<div *ngIf="!!version" class="ms-4">
<div class="row" *ngIf="!!version?.embargo && !!version?.embargo.amount">
<div class="col-4">
<p class="m-1"><i class="fas fa-hourglass-half"></i> {{
'submission.sections.sherpa.publisher.policy.embargo' | translate }}</p>
</div>
<div class="col-6">
<p class="m-1" *ngIf="!!version.embargo;else noEmbargo">{{version.embargo.amount}}
{{version.embargo.units}}</p>
<ng-template #noEmbargo>
<p class="m-1">{{ 'submission.sections.sherpa.publisher.policy.noembargo' | translate }}</p>
</ng-template>
</div>
</div>
<div class="row" *ngIf="!!version?.licenses && version.licenses.length > 0">
<div class="col-4">
<p class="m-1"><i class="fas fa-certificate"></i> {{
'submission.sections.sherpa.publisher.policy.license' | translate }}</p>
</div>
<div class="col-6">
<p class="m-1" *ngFor="let license of version.licenses">{{license}}</p>
</div>
</div>
<div class="row" *ngIf="!!version?.prerequisites && version.prerequisites.length > 0">
<div class="col-4">
<p class="m-1"><i class="fas fa-exclamation-circle"></i> {{
'submission.sections.sherpa.publisher.policy.prerequisites' | translate }}</p>
</div>
<div class="col-6">
<p class="m-1" *ngFor="let prerequisite of version.prerequisites">{{prerequisite}}</p>
</div>
</div>
<div class="row" *ngIf="!!version?.locations && version.locations.length > 0">
<div class="col-4">
<p class="m-1"><i class="far fa-folder-open"></i> {{
'submission.sections.sherpa.publisher.policy.location' | translate }}</p>
</div>
<div class="col-6">
<p class="m-1" *ngFor="let location of version.locations">{{location}}</p>
</div>
</div>
<div class="row" *ngIf="!!version?.conditions && version.conditions.length > 0">
<div class="col-4">
<p class="m-1"><i class="fas fa-tasks"></i> {{
'submission.sections.sherpa.publisher.policy.conditions' | translate }}</p>
</div>
<div class="col-6">
<p class="m-1" *ngFor="let condition of version.conditions">{{condition}}</p>
</div>
</div>
</div>
</div>
<span class="m-1 ms-4">
<i class="far fa-folder-open"></i>
@if (!!version?.locations && version.locations.length > 0) {
<span>
{{version.locations[0]}} @if (version.locations.length > 1) {
<span
>+{{version.locations.length-1}}</span>
}
</span>
} @else {
<span>{{
'submission.sections.sherpa.publisher.policy.nolocation' | translate }}</span>
}
</span>
</div>
</div>
<div class="d-inline-block">
@if (collapse.collapsed) {
<span class="fas fa-chevron-down"></span>
}
@if (!collapse.collapsed) {
<span class="fas fa-chevron-up"></span>
}
</div>
</div>
<div #collapse="ngbCollapse" [ngbCollapse]="isCollapsed">
@if (!!version) {
<div class="ms-4">
@if (!!version?.embargo && !!version?.embargo.amount) {
<div class="row">
<div class="col-4">
<p class="m-1"><i class="fas fa-hourglass-half"></i> {{
'submission.sections.sherpa.publisher.policy.embargo' | translate }}</p>
</div>
<div class="col-6">
@if (!!version.embargo) {
<p class="m-1">{{version.embargo.amount}}
{{version.embargo.units}}</p>
} @else {
<p class="m-1">{{ 'submission.sections.sherpa.publisher.policy.noembargo' | translate }}</p>
}
</div>
</div>
}
@if (!!version?.licenses && version.licenses.length > 0) {
<div class="row">
<div class="col-4">
<p class="m-1"><i class="fas fa-certificate"></i> {{
'submission.sections.sherpa.publisher.policy.license' | translate }}</p>
</div>
<div class="col-6">
@for (license of version.licenses; track license) {
<p class="m-1">{{license}}</p>
}
</div>
</div>
}
@if (!!version?.prerequisites && version.prerequisites.length > 0) {
<div class="row">
<div class="col-4">
<p class="m-1"><i class="fas fa-exclamation-circle"></i> {{
'submission.sections.sherpa.publisher.policy.prerequisites' | translate }}</p>
</div>
<div class="col-6">
@for (prerequisite of version.prerequisites; track prerequisite) {
<p class="m-1">{{prerequisite}}</p>
}
</div>
</div>
}
@if (!!version?.locations && version.locations.length > 0) {
<div class="row">
<div class="col-4">
<p class="m-1"><i class="far fa-folder-open"></i> {{
'submission.sections.sherpa.publisher.policy.location' | translate }}</p>
</div>
<div class="col-6">
@for (location of version.locations; track location) {
<p class="m-1">{{location}}</p>
}
</div>
</div>
}
@if (!!version?.conditions && version.conditions.length > 0) {
<div class="row">
<div class="col-4">
<p class="m-1"><i class="fas fa-tasks"></i> {{
'submission.sections.sherpa.publisher.policy.conditions' | translate }}</p>
</div>
<div class="col-6">
@for (condition of version.conditions; track condition) {
<p class="m-1">{{condition}}</p>
}
</div>
</div>
}
</div>
}
</div>
</div>

View File

@@ -1,8 +1,4 @@
import {
NgForOf,
NgIf,
TitleCasePipe,
} from '@angular/common';
import { TitleCasePipe } from '@angular/common';
import {
Component,
Input,
@@ -20,9 +16,7 @@ import { PermittedVersions } from '../../../../core/submission/models/sherpa-pol
templateUrl: './content-accordion.component.html',
styleUrls: ['./content-accordion.component.scss'],
imports: [
NgForOf,
TranslateModule,
NgIf,
NgbCollapseModule,
TitleCasePipe,
],

View File

@@ -1,39 +1,47 @@
<div class="ms-4">
<div class="row" *ngIf="!!metadata?.id">
<div class="col-4">
<p class="m-1">{{ 'submission.sections.sherpa.record.information.id' | translate }}</p>
</div>
<div class="col-8">
<p class="m-1">{{metadata.id}}
</p>
</div>
@if (!!metadata?.id) {
<div class="row">
<div class="col-4">
<p class="m-1">{{ 'submission.sections.sherpa.record.information.id' | translate }}</p>
</div>
<div class="col-8">
<p class="m-1">{{metadata.id}}
</p>
</div>
</div>
<div class="row" *ngIf="!!metadata?.dateCreated">
<div class="col-4">
<p class="m-1">{{ 'submission.sections.sherpa.record.information.date.created' | translate }}</p>
</div>
<div class="col-8">
<p class="m-1">{{metadata.dateCreated | date: 'd MMMM Y H:mm:ss zzzz' }}
</p>
</div>
}
@if (!!metadata?.dateCreated) {
<div class="row">
<div class="col-4">
<p class="m-1">{{ 'submission.sections.sherpa.record.information.date.created' | translate }}</p>
</div>
<div class="col-8">
<p class="m-1">{{metadata.dateCreated | date: 'd MMMM Y H:mm:ss zzzz' }}
</p>
</div>
</div>
<div class="row" *ngIf="!!metadata?.dateModified">
<div class="col-4">
<p class="m-1">{{ 'submission.sections.sherpa.record.information.date.modified' | translate }}</p>
</div>
<div class="col-8">
<p class="m-1">{{metadata.dateModified| date: 'd MMMM Y H:mm:ss zzzz' }}
</p>
</div>
}
@if (!!metadata?.dateModified) {
<div class="row">
<div class="col-4">
<p class="m-1">{{ 'submission.sections.sherpa.record.information.date.modified' | translate }}</p>
</div>
<div class="col-8">
<p class="m-1">{{metadata.dateModified| date: 'd MMMM Y H:mm:ss zzzz' }}
</p>
</div>
</div>
<div class="row" *ngIf="!!metadata?.uri">
<div class="col-4">
<p class="m-1">{{ 'submission.sections.sherpa.record.information.uri' | translate }}</p>
</div>
<div class="col-8">
<p class="m-1">
<a [href]="metadata.uri" target="_blank">{{metadata.uri}}</a>
</p>
</div>
}
@if (!!metadata?.uri) {
<div class="row">
<div class="col-4">
<p class="m-1">{{ 'submission.sections.sherpa.record.information.uri' | translate }}</p>
</div>
<div class="col-8">
<p class="m-1">
<a [href]="metadata.uri" target="_blank">{{metadata.uri}}</a>
</p>
</div>
</div>
}
</div>

View File

@@ -1,7 +1,4 @@
import {
DatePipe,
NgIf,
} from '@angular/common';
import { DatePipe } from '@angular/common';
import {
Component,
Input,
@@ -18,7 +15,6 @@ import { Metadata } from '../../../../core/submission/models/sherpa-policies-det
templateUrl: './metadata-information.component.html',
styleUrls: ['./metadata-information.component.scss'],
imports: [
NgIf,
TranslateModule,
DatePipe,
],

View File

@@ -1,64 +1,82 @@
<div class="ms-4">
<div class="row" *ngIf="!!journal?.titles && journal.titles.length > 0">
<div class="col-4">
<p class="m-1">{{'submission.sections.sherpa.publication.information.title' | translate}}</p>
</div>
<div class="col-4">
<p class="m-1" *ngFor="let title of journal.titles">{{title}}
</p>
</div>
@if (!!journal?.titles && journal.titles.length > 0) {
<div class="row">
<div class="col-4">
<p class="m-1">{{'submission.sections.sherpa.publication.information.title' | translate}}</p>
</div>
<div class="col-4">
@for (title of journal.titles; track title) {
<p class="m-1">{{title}}
</p>
}
</div>
</div>
<div class="row" *ngIf="!!journal?.issns && journal.issns.length > 0">
<div class="col-4">
<p class="m-1">{{'submission.sections.sherpa.publication.information.issns' | translate}}</p>
</div>
<div class="col-4">
<p class="m-1" *ngFor="let issn of journal.issns">{{issn}}
</p>
</div>
}
@if (!!journal?.issns && journal.issns.length > 0) {
<div class="row">
<div class="col-4">
<p class="m-1">{{'submission.sections.sherpa.publication.information.issns' | translate}}</p>
</div>
<div class="col-4">
@for (issn of journal.issns; track issn) {
<p class="m-1">{{issn}}
</p>
}
</div>
</div>
<div class="row" *ngIf="!!journal?.url">
<div class="col-4">
<p class="m-1">{{'submission.sections.sherpa.publication.information.url' | translate}}</p>
</div>
<div class="col-4">
<p class="m-1">
<a href="{{journal.url}}" target="_blank" rel="noopener noreferrer">
{{journal.url}}
</a>
</p>
</div>
}
@if (!!journal?.url) {
<div class="row">
<div class="col-4">
<p class="m-1">{{'submission.sections.sherpa.publication.information.url' | translate}}</p>
</div>
<div class="col-4">
<p class="m-1">
<a href="{{journal.url}}" target="_blank" rel="noopener noreferrer">
{{journal.url}}
</a>
</p>
</div>
</div>
<div class="row" *ngIf="!!journal?.publishers && journal.publishers.length > 0">
}
@if (!!journal?.publishers && journal.publishers.length > 0) {
<div class="row">
<div class="col-4">
<p class="m-1">{{'submission.sections.sherpa.publication.information.publishers' | translate}}</p>
</div>
@for (publisher of journal.publishers; track publisher) {
<div class="col-4">
<p class="m-1">{{'submission.sections.sherpa.publication.information.publishers' | translate}}</p>
</div>
<div class="col-4" *ngFor="let publisher of journal.publishers">
<p class="m-1">
<a href="{{publisher.uri}}" target="_blank" rel="noopener noreferrer">
{{publisher.name}}
</a>
</p>
<p class="m-1">
<a href="{{publisher.uri}}" target="_blank" rel="noopener noreferrer">
{{publisher.name}}
</a>
</p>
</div>
}
</div>
<div class="row" *ngIf="!!journal?.romeoPub">
<div class="col-4">
<p class="m-1">{{'submission.sections.sherpa.publication.information.romeoPub' | translate}}</p>
</div>
<div class="col-4">
<p class="m-1">
{{journal.romeoPub}}
</p>
</div>
}
@if (!!journal?.romeoPub) {
<div class="row">
<div class="col-4">
<p class="m-1">{{'submission.sections.sherpa.publication.information.romeoPub' | translate}}</p>
</div>
<div class="col-4">
<p class="m-1">
{{journal.romeoPub}}
</p>
</div>
</div>
<div class="row" *ngIf="!!journal?.zetoPub">
<div class="col-4">
<p class="m-1">{{'submission.sections.sherpa.publication.information.zetoPub' | translate}}</p>
</div>
<div class="col-4">
<p class="m-1">
{{journal.zetoPub}}
</p>
</div>
}
@if (!!journal?.zetoPub) {
<div class="row">
<div class="col-4">
<p class="m-1">{{'submission.sections.sherpa.publication.information.zetoPub' | translate}}</p>
</div>
<div class="col-4">
<p class="m-1">
{{journal.zetoPub}}
</p>
</div>
</div>
}
</div>

View File

@@ -1,7 +1,4 @@
import {
NgForOf,
NgIf,
} from '@angular/common';
import {
Component,
Input,
@@ -18,9 +15,7 @@ import { Journal } from '../../../../core/submission/models/sherpa-policies-deta
templateUrl: './publication-information.component.html',
styleUrls: ['./publication-information.component.scss'],
imports: [
NgIf,
TranslateModule,
NgForOf,
],
standalone: true,
})

View File

@@ -1,16 +1,22 @@
<div class="ms-4">
<ds-content-accordion *ngFor="let permittedVersions of policy.permittedVersions" [version]="permittedVersions">
@for (permittedVersions of policy.permittedVersions; track permittedVersions) {
<ds-content-accordion [version]="permittedVersions">
</ds-content-accordion>
<div class="row" *ngIf="!!policy?.urls">
<div class="col-12">
<p class="m-1">
{{'submission.sections.sherpa.publisher.policy.more.information' | translate}}
</p>
<ul>
<li *ngFor="let url of policy.urls | keyvalue">
<a href="{{url.key}}" target="_blank" rel="noopener noreferrer">{{url.value}}</a>
</li>
</ul>
</div>
}
@if (!!policy?.urls) {
<div class="row">
<div class="col-12">
<p class="m-1">
{{'submission.sections.sherpa.publisher.policy.more.information' | translate}}
</p>
<ul>
@for (url of policy.urls | keyvalue; track url) {
<li>
<a href="{{url.key}}" target="_blank" rel="noopener noreferrer">{{url.value}}</a>
</li>
}
</ul>
</div>
</div>
}
</div>

View File

@@ -1,8 +1,4 @@
import {
KeyValuePipe,
NgForOf,
NgIf,
} from '@angular/common';
import { KeyValuePipe } from '@angular/common';
import {
Component,
Input,
@@ -24,8 +20,6 @@ import { ContentAccordionComponent } from '../content-accordion/content-accordio
ContentAccordionComponent,
TranslateModule,
KeyValuePipe,
NgForOf,
NgIf,
],
standalone: true,
})

View File

@@ -1,72 +1,89 @@
<ds-alert [type]="'alert-info'" *ngIf="hasNoData()" [content]="'submission.sections.sherpa-policy.title-empty'">
</ds-alert>
<div *ngIf="!hasNoData()" class="d-flex flex-column flex-nowrap mt-2 mb-4">
<ds-alert [type]="'alert-info'" >
{{'submission.sections.sherpa.publisher.policy.description' | translate}}
@if (hasNoData()) {
<ds-alert [type]="'alert-info'" [content]="'submission.sections.sherpa-policy.title-empty'">
</ds-alert>
<div>
<button type="button" class="btn btn-secondary float-end" (click)="refresh()" data-test="refresh-btn">
<span><i class="fas fa-sync"></i> {{'submission.sections.sherpa.publisher.policy.refresh' | translate}} </span>
</button>
}
@if (!hasNoData()) {
<div class="d-flex flex-column flex-nowrap mt-2 mb-4">
<ds-alert [type]="'alert-info'" >
{{'submission.sections.sherpa.publisher.policy.description' | translate}}
</ds-alert>
<div>
<button type="button" class="btn btn-secondary float-end" (click)="refresh()" data-test="refresh-btn">
<span><i class="fas fa-sync"></i> {{'submission.sections.sherpa.publisher.policy.refresh' | translate}} </span>
</button>
</div>
</div>
</div>
}
<ng-container *ngVar="(sherpaPoliciesData$ | async)?.sherpaResponse as sherpaData">
<ng-container *ngIf="!hasNoData() && (!!sherpaData && !sherpaData.error)">
<ng-container *ngFor="let journal of sherpaData.journals;let j=index;">
<div class="mb-3 border-bottom" data-test="collapse">
<div class="w-100 d-flex justify-content-between collapse-toggle mb-3" (click)="collapse.toggle()">
<button type="button" class="btn btn-link p-0" (click)="$event.preventDefault()"
[attr.aria-expanded]="!collapse.collapsed" aria-controls="collapseExample">
{{'submission.sections.sherpa.publication.information' | translate}}
</button>
<div class="d-inline-block">
<span *ngIf="collapse.collapsed" class="fas fa-chevron-down"></span>
<span *ngIf="!collapse.collapsed" class="fas fa-chevron-up"></span>
</div>
</div>
<div #collapse="ngbCollapse" [ngbCollapse]="isCollapsed">
<ds-publication-information [journal]="journal"></ds-publication-information>
</div>
</div>
<div *ngFor="let policy of journal.policies; let p=index;" class="mb-3 border-bottom" data-test="collapse">
<div class="w-100 d-flex justify-content-between collapse-toggle mb-3" (click)="collapse.toggle()">
<button type="button" class="btn btn-link p-0" (click)="$event.preventDefault()"
[attr.aria-expanded]="!collapse.collapsed" aria-controls="collapseExample">
{{'submission.sections.sherpa.publisher.policy' | translate}}
</button>
<div class="d-inline-block">
<span *ngIf="collapse.collapsed" class="fas fa-chevron-down"></span>
<span *ngIf="!collapse.collapsed" class="fas fa-chevron-up"></span>
</div>
</div>
<div #collapse="ngbCollapse" [ngbCollapse]="isCollapsed">
<ds-publisher-policy [policy]="policy"></ds-publisher-policy>
</div>
</div>
</ng-container>
<div class="mb-3 border-bottom" data-test="collapse">
<div class="w-100 d-flex justify-content-between collapse-toggle mb-3" (click)="collapse.toggle()">
<button type="button" class="btn btn-link p-0" (click)="$event.preventDefault()"
[attr.aria-expanded]="!collapse.collapsed" aria-controls="collapseExample">
{{'submission.sections.sherpa.record.information' | translate}}
</button>
<div class="d-inline-block">
<span *ngIf="collapse.collapsed" class="fas fa-chevron-down"></span>
<span *ngIf="!collapse.collapsed" class="fas fa-chevron-up"></span>
</div>
</div>
<div #collapse="ngbCollapse" [ngbCollapse]="isCollapsed">
<ds-metadata-information [metadata]="sherpaData.metadata"></ds-metadata-information>
</div>
@if (!hasNoData() && (!!sherpaData && !sherpaData.error)) {
@for (journal of sherpaData.journals; track journal; let j = $index) {
<div class="mb-3 border-bottom" data-test="collapse">
<div class="w-100 d-flex justify-content-between collapse-toggle mb-3" (click)="collapse.toggle()">
<button type="button" class="btn btn-link p-0" (click)="$event.preventDefault()"
[attr.aria-expanded]="!collapse.collapsed" aria-controls="collapseExample">
{{'submission.sections.sherpa.publication.information' | translate}}
</button>
<div class="d-inline-block">
@if (collapse.collapsed) {
<span class="fas fa-chevron-down"></span>
}
@if (!collapse.collapsed) {
<span class="fas fa-chevron-up"></span>
}
</div>
</div>
</ng-container>
<div #collapse="ngbCollapse" [ngbCollapse]="isCollapsed">
<ds-publication-information [journal]="journal"></ds-publication-information>
</div>
</div>
@for (policy of journal.policies; track policy; let p = $index) {
<div class="mb-3 border-bottom" data-test="collapse">
<div class="w-100 d-flex justify-content-between collapse-toggle mb-3" (click)="collapse.toggle()">
<button type="button" class="btn btn-link p-0" (click)="$event.preventDefault()"
[attr.aria-expanded]="!collapse.collapsed" aria-controls="collapseExample">
{{'submission.sections.sherpa.publisher.policy' | translate}}
</button>
<div class="d-inline-block">
@if (collapse.collapsed) {
<span class="fas fa-chevron-down"></span>
}
@if (!collapse.collapsed) {
<span class="fas fa-chevron-up"></span>
}
</div>
</div>
<div #collapse="ngbCollapse" [ngbCollapse]="isCollapsed">
<ds-publisher-policy [policy]="policy"></ds-publisher-policy>
</div>
</div>
}
}
<div class="mb-3 border-bottom" data-test="collapse">
<div class="w-100 d-flex justify-content-between collapse-toggle mb-3" (click)="collapse.toggle()">
<button type="button" class="btn btn-link p-0" (click)="$event.preventDefault()"
[attr.aria-expanded]="!collapse.collapsed" aria-controls="collapseExample">
{{'submission.sections.sherpa.record.information' | translate}}
</button>
<div class="d-inline-block">
@if (collapse.collapsed) {
<span class="fas fa-chevron-down"></span>
}
@if (!collapse.collapsed) {
<span class="fas fa-chevron-up"></span>
}
</div>
</div>
<div #collapse="ngbCollapse" [ngbCollapse]="isCollapsed">
<ds-metadata-information [metadata]="sherpaData.metadata"></ds-metadata-information>
</div>
</div>
}
<ng-container *ngIf="!!sherpaData && sherpaData.error">
<ds-alert [type]="AlertTypeEnum.Error"
[content]="!!sherpaData.message ? sherpaData.message : 'submission.sections.sherpa.error.message'| translate">
</ds-alert>
</ng-container>
@if (!!sherpaData && sherpaData.error) {
<ds-alert [type]="AlertTypeEnum.Error"
[content]="!!sherpaData.message ? sherpaData.message : 'submission.sections.sherpa.error.message'| translate">
</ds-alert>
}
</ng-container>

View File

@@ -1,8 +1,4 @@
import {
AsyncPipe,
NgForOf,
NgIf,
} from '@angular/common';
import { AsyncPipe } from '@angular/common';
import {
Component,
Inject,
@@ -47,11 +43,9 @@ import { PublisherPolicyComponent } from './publisher-policy/publisher-policy.co
AlertComponent,
TranslateModule,
PublisherPolicyComponent,
NgIf,
PublicationInformationComponent,
AsyncPipe,
VarDirective,
NgForOf,
],
standalone: true,
})

View File

@@ -1,8 +1,14 @@
<ng-container *ngFor="let accessCondition of accessConditionsList">
<span *ngIf="accessCondition.action === 'DEFAULT_BITSTREAM_READ'" class="badge bg-primary mt-3 me-2">
{{accessCondition.name}} {{accessCondition.startDate}} {{accessCondition.endDate}}
</span>
<span *ngIf="accessCondition.name === 'lease'" class="badge bg-primary mt-3 me-2">{{accessCondition.name}} from {{accessCondition.endDate}}</span>
<span *ngIf="accessCondition.name === 'embargo'" class="badge bg-dark mt-3 me-2">{{accessCondition.name}} until {{accessCondition.startDate}}</span>
@for (accessCondition of accessConditionsList; track accessCondition) {
@if (accessCondition.action === 'DEFAULT_BITSTREAM_READ') {
<span class="badge bg-primary mt-3 me-2">
{{accessCondition.name}} {{accessCondition.startDate}} {{accessCondition.endDate}}
</span>
}
@if (accessCondition.name === 'lease') {
<span class="badge bg-primary mt-3 me-2">{{accessCondition.name}} from {{accessCondition.endDate}}</span>
}
@if (accessCondition.name === 'embargo') {
<span class="badge bg-dark mt-3 me-2">{{accessCondition.name}} until {{accessCondition.startDate}}</span>
}
<br>
</ng-container>
}

View File

@@ -1,7 +1,4 @@
import {
NgForOf,
NgIf,
} from '@angular/common';
import {
Component,
Input,
@@ -22,10 +19,7 @@ import { isEmpty } from '../../../../shared/empty.util';
@Component({
selector: 'ds-submission-section-upload-access-conditions',
templateUrl: './submission-section-upload-access-conditions.component.html',
imports: [
NgForOf,
NgIf,
],
imports: [],
standalone: true,
})
export class SubmissionSectionUploadAccessConditionsComponent implements OnInit {

View File

@@ -5,15 +5,17 @@
</button>
</div>
<div class="modal-body">
<ds-form *ngIf="formModel"
#formRef="formComponent"
[formId]="formId"
[formModel]="formModel"
[displaySubmit]="!isSaving"
[displayCancel]="!isSaving"
(submitForm)="onSubmit()"
(cancel)="onModalClose()"
(dfChange)="onChange($event)"></ds-form>
@if (formModel) {
<ds-form
#formRef="formComponent"
[formId]="formId"
[formModel]="formModel"
[displaySubmit]="!isSaving"
[displayCancel]="!isSaving"
(submitForm)="onSubmit()"
(cancel)="onModalClose()"
(dfChange)="onChange($event)"></ds-form>
}
</div>
</div>

View File

@@ -403,7 +403,6 @@ describe('SubmissionSectionUploadFileEditComponent test suite', () => {
standalone: true,
imports: [
SubmissionSectionUploadFileEditComponent,
CommonModule,
FormsModule,
FormComponent,
ReactiveFormsModule,

View File

@@ -1,4 +1,4 @@
import { NgIf } from '@angular/common';
import {
ChangeDetectorRef,
Component,
@@ -79,7 +79,6 @@ import {
templateUrl: './section-upload-file-edit.component.html',
imports: [
FormComponent,
NgIf,
TranslateModule,
BtnDisabledDirective,
],

View File

@@ -1,18 +1,22 @@
<ng-container *ngIf="fileData">
@if (fileData) {
<div class="row">
<!-- Default switch -->
<div class="col-md-2 d-flex justify-content-center align-items-center" >
<div class="custom-control custom-switch">
<input
type="checkbox"
class="custom-control-input"
id="primaryBitstream{{fileIndex}}"
[disabled]="processingSaveStatus$ | async"
[checked]="isPrimary"
(change)="togglePrimaryBitstream($event)">
type="checkbox"
class="custom-control-input"
id="primaryBitstream{{fileIndex}}"
[disabled]="processingSaveStatus$ | async"
[checked]="isPrimary"
(change)="togglePrimaryBitstream($event)">
<label class="custom-control-label" for="primaryBitstream{{fileIndex}}">
<span class="sr-only" *ngIf="!isPrimary">{{'submission.sections.upload.primary.make' | translate:{ fileName: fileName } }}</span>
<span class="sr-only" *ngIf="isPrimary">{{'submission.sections.upload.primary.remove' | translate:{ fileName: fileName } }}</span>
@if (!isPrimary) {
<span class="sr-only">{{'submission.sections.upload.primary.make' | translate:{ fileName: fileName } }}</span>
}
@if (isPrimary) {
<span class="sr-only">{{'submission.sections.upload.primary.remove' | translate:{ fileName: fileName } }}</span>
}
</label>
</div>
</div>
@@ -23,29 +27,33 @@
<div class="float-end w-15">
<ng-container>
<ds-file-download-link [cssClasses]="'btn btn-link-focus'" [isBlank]="true"
[bitstream]="getBitstream()" [enableRequestACopy]="false">
[bitstream]="getBitstream()" [enableRequestACopy]="false">
<i class="fa fa-download fa-2x text-normal" aria-hidden="true"></i>
</ds-file-download-link>
<button class="btn btn-link-focus"
[attr.aria-label]="'submission.sections.upload.edit.title' | translate"
title="{{ 'submission.sections.upload.edit.title' | translate }}"
(click)="$event.preventDefault();editBitstreamData();">
[attr.aria-label]="'submission.sections.upload.edit.title' | translate"
title="{{ 'submission.sections.upload.edit.title' | translate }}"
(click)="$event.preventDefault();editBitstreamData();">
<i class="fa fa-edit fa-2x text-normal"></i>
</button>
<button class="btn btn-link-focus"
[attr.aria-label]="'submission.sections.upload.delete.confirm.title' | translate"
title="{{ 'submission.sections.upload.delete.confirm.title' | translate }}"
[dsBtnDisabled]="(processingDelete$ | async)"
(click)="$event.preventDefault();confirmDelete(content);">
<i *ngIf="(processingDelete$ | async)" class="fas fa-circle-notch fa-spin fa-2x link-danger"></i>
<i *ngIf="(processingDelete$ | async) !== true" class="fa fa-trash fa-2x link-danger"></i>
[attr.aria-label]="'submission.sections.upload.delete.confirm.title' | translate"
title="{{ 'submission.sections.upload.delete.confirm.title' | translate }}"
[dsBtnDisabled]="(processingDelete$ | async)"
(click)="$event.preventDefault();confirmDelete(content);">
@if ((processingDelete$ | async)) {
<i class="fas fa-circle-notch fa-spin fa-2x link-danger"></i>
}
@if ((processingDelete$ | async) !== true) {
<i class="fa fa-trash fa-2x link-danger"></i>
}
</button>
</ng-container>
</div>
<div class="clearfix"></div>
</div>
</div>
</ng-container>
}
<ng-template #content let-c="close" let-d="dismiss">
<div class="modal-header">
@@ -58,8 +66,8 @@
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary"
(click)="c('cancel')">{{ 'submission.sections.upload.delete.confirm.cancel' | translate }}</button>
(click)="c('cancel')">{{ 'submission.sections.upload.delete.confirm.cancel' | translate }}</button>
<button type="button" class="btn btn-danger"
(click)="c('ok')">{{ 'submission.sections.upload.delete.confirm.submit' | translate }}</button>
(click)="c('ok')">{{ 'submission.sections.upload.delete.confirm.submit' | translate }}</button>
</div>
</ng-template>

View File

@@ -286,9 +286,9 @@ describe('SubmissionSectionUploadFileComponent test suite', () => {
standalone: true,
imports: [
ThemedSubmissionSectionUploadFileComponent,
CommonModule,
AsyncPipe,
NgbModule],
NgbModule,
],
})
class TestComponent {

View File

@@ -1,7 +1,4 @@
import {
AsyncPipe,
NgIf,
} from '@angular/common';
import { AsyncPipe } from '@angular/common';
import {
Component,
Input,
@@ -51,7 +48,6 @@ import { SubmissionSectionUploadFileViewComponent } from './view/section-upload-
imports: [
TranslateModule,
SubmissionSectionUploadFileViewComponent,
NgIf,
AsyncPipe,
ThemedFileDownloadLinkComponent,
FileSizePipe,

View File

@@ -1,38 +1,46 @@
<div>
<ng-container *ngIf="metadata">
<ng-container *ngFor="let entry of getAllMetadataValue(fileTitleKey)">
<ng-container *ngIf="entry.value !== ''">
@if (metadata) {
@for (entry of getAllMetadataValue(fileTitleKey); track entry) {
@if (entry.value !== '') {
<h3>
{{entry.value}}
<span class="text-muted">({{fileData?.sizeBytes | dsFileSize}})</span>
</h3>
</ng-container>
<ng-container *ngIf="entry.value === ''">
<h5 *ngIf="metadata[fileTitleKey].indexOf(entry) === 0">
<span class="text-muted">{{'submission.sections.upload.no-entry' | translate}} {{fileTitleKey}}</span>
</h5>
</ng-container>
}
@if (entry.value === '') {
@if (metadata[fileTitleKey].indexOf(entry) === 0) {
<h5>
<span class="text-muted">{{'submission.sections.upload.no-entry' | translate}} {{fileTitleKey}}</span>
</h5>
}
}
<span class="clearfix"></span>
</ng-container>
<ng-container *ngFor="let entry of getAllMetadataValue(fileDescrKey)">
<ng-container *ngIf="entry.value !== ''">
}
@for (entry of getAllMetadataValue(fileDescrKey); track entry) {
@if (entry.value !== '') {
{{entry.value | dsTruncate:['150']}}
</ng-container>
<ng-container *ngIf="entry.value === ''">
<span *ngIf="metadata[fileDescrKey].indexOf(entry) === 0"
class="text-muted">{{'submission.sections.upload.no-entry' | translate}} {{fileDescrKey}}</span>
</ng-container>
}
@if (entry.value === '') {
@if (metadata[fileDescrKey].indexOf(entry) === 0) {
<span
class="text-muted">{{'submission.sections.upload.no-entry' | translate}} {{fileDescrKey}}</span>
}
}
<span class="clearfix"></span>
</ng-container>
</ng-container>
}
}
<div class="mt-1" *ngIf="fileFormat">
{{'admin.registries.bitstream-formats.edit.head' | translate:{format: fileFormat} }}
</div>
<div class="mt-1" *ngIf="fileCheckSum">
Checksum {{fileCheckSum.checkSumAlgorithm}}: {{fileCheckSum.value}}
</div>
@if (fileFormat) {
<div class="mt-1">
{{'admin.registries.bitstream-formats.edit.head' | translate:{format: fileFormat} }}
</div>
}
@if (fileCheckSum) {
<div class="mt-1">
Checksum {{fileCheckSum.checkSumAlgorithm}}: {{fileCheckSum.value}}
</div>
}
<span class="clearfix"></span>
<ds-submission-section-upload-access-conditions [accessConditions]="fileData.accessConditions"></ds-submission-section-upload-access-conditions>
</div>

View File

@@ -1,7 +1,4 @@
import {
NgForOf,
NgIf,
} from '@angular/common';
import {
Component,
Input,
@@ -30,8 +27,6 @@ import { SubmissionSectionUploadAccessConditionsComponent } from '../../accessCo
SubmissionSectionUploadAccessConditionsComponent,
TranslateModule,
TruncatePipe,
NgIf,
NgForOf,
FileSizePipe,
],
standalone: true,

View File

@@ -1,23 +1,24 @@
<ds-alert [content]="'submission.sections.upload.info'"
[dismissible]="true"
[type]="AlertTypeEnum.Info"></ds-alert>
[dismissible]="true"
[type]="AlertTypeEnum.Info"></ds-alert>
<ng-container *ngIf="fileList.length > 0; else noFileUploaded">
<div *ngIf="collectionDefaultAccessConditions.length > 0" class="row">
<div class="col-sm-12" >
<ds-alert [type]="AlertTypeEnum.Warning">
<ng-container *ngIf="collectionPolicyType === 1">
{{ 'submission.sections.upload.header.policy.default.nolist' | translate:{ "collectionName": collectionName } }}
</ng-container>
<ng-container *ngIf="collectionPolicyType === 2">
{{ 'submission.sections.upload.header.policy.default.withlist' | translate:{ "collectionName": collectionName } }}
</ng-container>
<span class="clearfix"></span>
<ds-submission-section-upload-access-conditions [accessConditions]="collectionDefaultAccessConditions"></ds-submission-section-upload-access-conditions>
</ds-alert>
@if (fileList.length > 0) {
@if (collectionDefaultAccessConditions.length > 0) {
<div class="row">
<div class="col-sm-12" >
<ds-alert [type]="AlertTypeEnum.Warning">
@if (collectionPolicyType === 1) {
{{ 'submission.sections.upload.header.policy.default.nolist' | translate:{ "collectionName": collectionName } }}
}
@if (collectionPolicyType === 2) {
{{ 'submission.sections.upload.header.policy.default.withlist' | translate:{ "collectionName": collectionName } }}
}
<span class="clearfix"></span>
<ds-submission-section-upload-access-conditions [accessConditions]="collectionDefaultAccessConditions"></ds-submission-section-upload-access-conditions>
</ds-alert>
</div>
</div>
</div>
}
<div class="row">
<div class="col-md-2">
<span class="text-left font-weight-bold">{{ 'bitstream.edit.form.primaryBitstream.label' | translate }}</span>
@@ -28,30 +29,29 @@
<hr/>
</div>
</div>
<ng-container *ngFor="let fileEntry of fileList; let i = index;">
@for (fileEntry of fileList; track fileEntry; let i = $index) {
<ds-submission-upload-section-file
[isPrimary]="primaryBitstreamUUID ? primaryBitstreamUUID === fileEntry.uuid : null"
[availableAccessConditionOptions]="availableAccessConditionOptions"
[collectionId]="collectionId"
[collectionPolicyType]="collectionPolicyType"
[configMetadataForm]="(configMetadataForm$ | async)"
[fileId]="fileEntry.uuid"
[fileIndex]="i"
[fileName]="fileNames[i]"
[sectionId]="sectionData.id"
[submissionId]="submissionId"></ds-submission-upload-section-file>
[isPrimary]="primaryBitstreamUUID ? primaryBitstreamUUID === fileEntry.uuid : null"
[availableAccessConditionOptions]="availableAccessConditionOptions"
[collectionId]="collectionId"
[collectionPolicyType]="collectionPolicyType"
[configMetadataForm]="(configMetadataForm$ | async)"
[fileId]="fileEntry.uuid"
[fileIndex]="i"
[fileName]="fileNames[i]"
[sectionId]="sectionData.id"
[submissionId]="submissionId"></ds-submission-upload-section-file>
<div class="row">
<div class="col-md-12">
<hr/>
</div>
</div>
</ng-container>
</ng-container>
<ng-template #noFileUploaded>
}
} @else {
<div class="row">
<div class="col-md-12">
<div class="text-center h3"><span class="text-muted">{{'submission.sections.upload.no-file-uploaded' | translate}}</span></div>
</div>
</div>
</ng-template>
}

View File

@@ -382,8 +382,7 @@ describe('SubmissionSectionUploadComponent test suite', () => {
selector: 'ds-test-cmp',
template: ``,
standalone: true,
imports: [
CommonModule],
imports: [],
})
class TestComponent {

View File

@@ -1,8 +1,4 @@
import {
AsyncPipe,
NgForOf,
NgIf,
} from '@angular/common';
import { AsyncPipe } from '@angular/common';
import {
ChangeDetectorRef,
Component,
@@ -74,10 +70,8 @@ export interface AccessConditionGroupsMapEntry {
imports: [
ThemedSubmissionSectionUploadFileComponent,
SubmissionSectionUploadAccessConditionsComponent,
NgIf,
AlertComponent,
TranslateModule,
NgForOf,
AsyncPipe,
],
standalone: true,