Merge branch 'dmp-refactoring' of code-repo.d4science.org:MaDgiK-CITE/argos into dmp-refactoring

This commit is contained in:
Efstratios Giannopoulos 2024-04-29 14:56:48 +03:00
commit 21457bd9b0
17 changed files with 302 additions and 75 deletions

View File

@ -392,6 +392,7 @@ public class DmpServiceImpl implements DmpService {
newDmp.setStatus(DmpStatus.Draft); newDmp.setStatus(DmpStatus.Draft);
newDmp.setProperties(oldDmpEntity.getProperties()); newDmp.setProperties(oldDmpEntity.getProperties());
newDmp.setBlueprintId(model.getBlueprintId()); newDmp.setBlueprintId(model.getBlueprintId());
newDmp.setAccessType(oldDmpEntity.getAccessType());
newDmp.setCreatorId(this.userScope.getUserId()); newDmp.setCreatorId(this.userScope.getUserId());
this.entityManager.persist(newDmp); this.entityManager.persist(newDmp);

File diff suppressed because one or more lines are too long

View File

@ -103,7 +103,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="row mt-2 stepper-actions justify-content-around"> <div class="row mt-3 stepper-actions justify-content-around">
<div class="col-auto mb-1"> <div class="col-auto mb-1">
<div mat-raised-button type="button" class="previous stepper-btn mr-2" [ngClass]="{'previous-disabled': this.step === 0}" (click)="previousStep()"> <div mat-raised-button type="button" class="previous stepper-btn mr-2" [ngClass]="{'previous-disabled': this.step === 0}" (click)="previousStep()">
<span class="material-icons">chevron_left</span> <span class="material-icons">chevron_left</span>
@ -131,7 +131,7 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col-12"> <div class="col-12">
<app-form-progress-indication class="col-12" *ngIf="formGroup && !viewOnly" [formGroup]="formGroup" [isDescriptionEditor]="true"></app-form-progress-indication> <app-form-progress-indication class="mt-2" *ngIf="formGroup && !viewOnly" [formGroup]="formGroup" [checkVisibility]="true"></app-form-progress-indication>
</div> </div>
</div> </div>
</div> </div>

View File

@ -628,6 +628,7 @@ export class DescriptionEditorComponent extends BaseEditor<DescriptionEditorMode
refreshData(): void { refreshData(): void {
this.getItem(this.editorModel.id, (data: Description) => this.prepareForm(data)); this.getItem(this.editorModel.id, (data: Description) => this.prepareForm(data));
this.tocValidationService.validateForm();
} }
refreshOnNavigateToData(id?: Guid): void { refreshOnNavigateToData(id?: Guid): void {
@ -648,8 +649,7 @@ export class DescriptionEditorComponent extends BaseEditor<DescriptionEditorMode
this.descriptionService.persist(formData) this.descriptionService.persist(formData)
.pipe(takeUntil(this._destroyed)).subscribe( .pipe(takeUntil(this._destroyed)).subscribe(
complete => { complete => {
onSuccess ? onSuccess(complete) : this.onCallbackSuccess(complete, this.isNew); onSuccess ? onSuccess(complete) : this.onCallbackSuccess(complete);
this.tocValidationService.validateForm();
this.descriptionIsOnceSaved = true; this.descriptionIsOnceSaved = true;
if (this.formGroup.get('status').value == DescriptionStatus.Finalized) this.isFinalized = true; if (this.formGroup.get('status').value == DescriptionStatus.Finalized) this.isFinalized = true;
}, },
@ -666,8 +666,6 @@ export class DescriptionEditorComponent extends BaseEditor<DescriptionEditorMode
formSubmit(onSuccess?: (response) => void): void { formSubmit(onSuccess?: (response) => void): void {
this.formService.removeAllBackEndErrors(this.formGroup); this.formService.removeAllBackEndErrors(this.formGroup);
this.formService.touchAllFormFields(this.formGroup);
this.tocValidationService.validateForm();
if (this.formGroup.get('label').valid && this.formGroup.get('dmpId').valid && this.formGroup.get('dmpDescriptionTemplateId').valid if (this.formGroup.get('label').valid && this.formGroup.get('dmpId').valid && this.formGroup.get('dmpDescriptionTemplateId').valid
&& this.formGroup.get('descriptionTemplateId').valid && this.formGroup.get('status').valid) { && this.formGroup.get('descriptionTemplateId').valid && this.formGroup.get('status').valid) {
this.persistEntity(onSuccess); this.persistEntity(onSuccess);
@ -680,7 +678,7 @@ export class DescriptionEditorComponent extends BaseEditor<DescriptionEditorMode
saveAndClose(){ saveAndClose(){
this.formSubmit((data) => { this.formSubmit((data) => {
this.uiNotificationService.snackBarNotification(this.isNew ? this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-CREATION') : this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success); this.uiNotificationService.snackBarNotification(this.isNew ? this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-CREATION') : this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success);
this.refreshOnNavigateToData(data ? data.id : null); this.formGroup = null;
this.backToDmp(); this.backToDmp();
}); });
} }

View File

@ -82,7 +82,7 @@
</div> </div>
</div> </div>
<div *ngSwitchCase="descriptionTemplateFieldTypeEnum.CHECK_BOX" class="col-12"> <div *ngSwitchCase="descriptionTemplateFieldTypeEnum.CHECK_BOX" class="col-12">
<mat-checkbox [formControl]="propertiesFormGroup?.get(field.id).get('textValue')"> <mat-checkbox [checked]="propertiesFormGroup?.get(field.id).get('textValue').value == 'true'" [disabled]="propertiesFormGroup?.get(field.id).get('textValue').disabled"(change)="checkBoxChanged($event)">
{{field.data.label}}</mat-checkbox> {{field.data.label}}</mat-checkbox>
<mat-error *ngIf="propertiesFormGroup?.get(field.id).get('textValue').hasError('backendError')">{{propertiesFormGroup?.get(field.id).get('textValue').getError('backendError').message}}</mat-error> <mat-error *ngIf="propertiesFormGroup?.get(field.id).get('textValue').hasError('backendError')">{{propertiesFormGroup?.get(field.id).get('textValue').getError('backendError').message}}</mat-error>
</div> </div>
@ -119,7 +119,7 @@
<mat-label>{{ (field.data.label | translate)}}</mat-label> <mat-label>{{ (field.data.label | translate)}}</mat-label>
</button> </button>
<button *ngIf="propertiesFormGroup?.get(field.id).get('textValue').value && !filesToUpload" mat-button (click)="download()" type="button" class="attach-file-btn" [disabled]="propertiesFormGroup?.get(field.id).get('textValue').disabled"> <button *ngIf="propertiesFormGroup?.get(field.id).get('textValue').value && !filesToUpload" mat-button (click)="download()" type="button" class="attach-file-btn">
<mat-icon class="mr-2">download</mat-icon> <mat-icon class="mr-2">download</mat-icon>
<mat-label>{{ "TYPES.DATASET-PROFILE-UPLOAD-TYPE.DOWNLOAD" | translate }}</mat-label> <mat-label>{{ "TYPES.DATASET-PROFILE-UPLOAD-TYPE.DOWNLOAD" | translate }}</mat-label>
</button> </button>

View File

@ -2,6 +2,7 @@
import { COMMA, ENTER } from '@angular/cdk/keycodes'; import { COMMA, ENTER } from '@angular/cdk/keycodes';
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit, SimpleChanges } from '@angular/core'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnInit, SimpleChanges } from '@angular/core';
import { UntypedFormControl, UntypedFormGroup } from '@angular/forms'; import { UntypedFormControl, UntypedFormGroup } from '@angular/forms';
import { MatCheckboxChange } from '@angular/material/checkbox';
import { MatDialog } from "@angular/material/dialog"; import { MatDialog } from "@angular/material/dialog";
import { DescriptionTemplateFieldType } from '@app/core/common/enum/description-template-field-type'; import { DescriptionTemplateFieldType } from '@app/core/common/enum/description-template-field-type';
import { DescriptionTemplateFieldValidationType } from '@app/core/common/enum/description-template-field-validation-type'; import { DescriptionTemplateFieldValidationType } from '@app/core/common/enum/description-template-field-validation-type';
@ -116,6 +117,15 @@ export class DescriptionFormFieldComponent extends BaseComponent implements OnIn
} }
} }
checkBoxChanged(event: MatCheckboxChange){
if (event.checked){
this.propertiesFormGroup?.get(this.field.id).get('textValue').setValue("true");
} else{
this.propertiesFormGroup?.get(this.field.id).get('textValue').setValue("false");
}
this.visibilityRulesService.reloadVisibility();
}
private applyFieldType(){ private applyFieldType(){
this.isRequired = this.field.validations?.includes(DescriptionTemplateFieldValidationType.Required); this.isRequired = this.field.validations?.includes(DescriptionTemplateFieldValidationType.Required);
@ -164,7 +174,8 @@ export class DescriptionFormFieldComponent extends BaseComponent implements OnIn
// } // }
break; break;
case DescriptionTemplateFieldType.CHECK_BOX: case DescriptionTemplateFieldType.CHECK_BOX:
this.propertiesFormGroup?.get(this.field.id).get('textValue').setValue(this.propertiesFormGroup?.get(this.field.id).get('textValue').value === 'true'); if (this.propertiesFormGroup?.get(this.field.id).get('textValue').value == undefined) this.propertiesFormGroup?.get(this.field.id).get('textValue').setValue("false");
this.visibilityRulesService.reloadVisibility();
break; break;
} }

View File

@ -1,5 +1,10 @@
<div class="demo-progress-bar-container"> <div class="demo-progress-bar-container">
<div *ngIf="isEditor()" class="percentage d-flex justify-content-center">{{progressSoFar}} {{'GENERAL.PREPOSITIONS.OF' | translate}} {{total}}</div> <div class="percentage d-flex justify-content-center"><span *ngIf="total>0">{{progressSoFar}} {{'GENERAL.PREPOSITIONS.OF' | translate}} {{total}}</span>&nbsp;</div>
<mat-progress-bar class="form-progress-bar" [ngClass]="{'progress-bar': isEditor()}" mode="determinate" [value]="value"></mat-progress-bar> <mat-progress-bar *ngIf="value" class="form-progress-bar" [ngClass]="{'progress-bar': true}" mode="determinate" [value]="value"></mat-progress-bar>
<div *ngIf="isEditor()" class="percentage" [ngStyle]="{'padding-left': value ? value - 10 + '%' : 0 + '%' }">{{value}}%</div> <mat-progress-bar *ngIf="!value" class="form-progress-bar" [ngClass]="{'progress-bar': true}" mode="determinate" [value]="0"></mat-progress-bar>
<div class="percentage" [ngStyle]="{'padding-left': value ? value - 10 + '%' : 0 + '%' }">
<span *ngIf="value">{{value}}%</span>
<span *ngIf="!value">0%</span>
</div> </div>
</div>

View File

@ -1,16 +1,37 @@
.percentage { // .percentage {
color: #212121; // color: #212121;
opacity: 0.7; // opacity: 0.7;
font-weight: 400; // font-weight: 400;
font-size: 0.875rem; // font-size: 0.875rem;
} // }
// .progress-bar {
// border-radius: 20px;
// height: 11px;
// }
// ::ng-deep .mat-progress-bar .mat-progress-bar-fill::after {
// border-radius: 20px !important;
// }
// Bar container
.progress-bar { .progress-bar {
--mdc-linear-progress-active-indicator-height: 11px !important;
border-radius: 20px; border-radius: 20px;
height: 11px;
} }
::ng-deep .mat-progress-bar .mat-progress-bar-fill::after { //Progress bar
::ng-deep .mdc-linear-progress__bar-inner {
--mdc-linear-progress-active-indicator-color: var(--primary-color) !important;
border-radius: 20px !important; border-radius: 20px !important;
} }
// Buffer bar
::ng-deep .mdc-linear-progress__buffer {
--mdc-linear-progress-track-height: 11px !important;
}
::ng-deep .mdc-linear-progress__buffer-bar {
--mdc-linear-progress-track-color: #e0e2ec !important;
}

View File

@ -11,13 +11,13 @@ import { takeUntil } from 'rxjs/operators';
}) })
export class FormProgressIndicationComponent extends BaseComponent implements OnInit, OnChanges { export class FormProgressIndicationComponent extends BaseComponent implements OnInit, OnChanges {
@Input() formGroup: UntypedFormGroup; @Input() formGroup: UntypedFormGroup;
@Input() isDmpEditor: boolean;
@Input() isDatasetEditor: boolean;
@Input() public progressValueAccuracy = 2; @Input() public progressValueAccuracy = 2;
@Input() checkVisibility: boolean = false;
determinateProgressValue: number; determinateProgressValue: number;
progressSoFar: number; progressSoFar: number;
total: number; total: number;
percent: number; percent: number;
fieldTypes: string[] = ['dateValue', 'externalIdentifier.identifier', 'externalIdentifier.type', 'reference', 'references', 'textListValue', 'textValue'];
constructor(private visibilityRulesService: VisibilityRulesService) { super(); } constructor(private visibilityRulesService: VisibilityRulesService) { super(); }
@ -43,20 +43,52 @@ export class FormProgressIndicationComponent extends BaseComponent implements On
} }
calculateValueForProgressbar() { calculateValueForProgressbar() {
if (this.isDmpEditor) { this.progressSoFar = this.countRequiredFields(this.formGroup.get('properties'), this.checkVisibility, true);
this.progressSoFar = this.countFormControlsValidForProgress(this.formGroup); this.total = this.countRequiredFields(this.formGroup.get('properties'), this.checkVisibility);
this.total = this.countFormControlsRequiredFieldsForTotal(this.formGroup);
} else if (this.isDatasetEditor) {
this.progressSoFar = this.countFormControlsValidForProgress(this.formGroup) + this.countFormControlsWithValueForProgress(this.formGroup);
this.total = this.countFormControlsRequiredFieldsForTotal(this.formGroup, true) + this.CountFormControlDepthLengthFotTotal(this.formGroup);
} else {
this.progressSoFar = this.countFormControlsWithValueForProgress(this.formGroup);
this.total = this.CountFormControlDepthLengthFotTotal(this.formGroup);
}
this.percent = (this.progressSoFar / this.total) * 100; this.percent = (this.progressSoFar / this.total) * 100;
this.value = Number.parseFloat(this.percent.toPrecision(this.progressValueAccuracy)); this.value = Number.parseFloat(this.percent.toPrecision(this.progressValueAccuracy));
} }
countRequiredFields(formControl: AbstractControl, checkVisibility = false, countCompletedFields = false): number {
let valueCurrent = 0;
if (formControl instanceof UntypedFormGroup) {
if(!checkVisibility || (!formControl.get('id')?.value || (this.visibilityRulesService.isVisibleMap[formControl.get('id').value] ?? true))) {
Object.keys(formControl.controls).forEach(item => {
const control = formControl.get(item);
valueCurrent = valueCurrent + this.countRequiredFields(control, checkVisibility, countCompletedFields);
});
}
} else if (formControl instanceof UntypedFormArray) {
formControl.controls.forEach(item => {
valueCurrent = valueCurrent + this.countRequiredFieldsByFieldset(item.get('ordinal').value, item.get('fields') as UntypedFormGroup, countCompletedFields);
});
}
return valueCurrent;
}
countRequiredFieldsByFieldset(ordinal: number, fieldsFormGroup: UntypedFormGroup, filterValid: boolean = false): number {
let fieldsCount: number = 0;
const fieldNames = Object.keys(fieldsFormGroup.controls);
for(let item of fieldNames) {
if (!this.checkVisibility || this.visibilityRulesService.isVisible(item, ordinal)) {
const fieldControl = fieldsFormGroup.get(item);
for (let fieldType of this.fieldTypes) {
const typedControl = fieldControl.get(fieldType);
let controlFilter: boolean = this.controlRequired(typedControl) && this.controlEnabled(typedControl);
if (filterValid) controlFilter = controlFilter && typedControl.valid;
if (controlFilter) {
fieldsCount ++;
break;
}
}
}
}
return fieldsCount;
}
//////////////////////////////////////////////////////////////////////
countFormControlsWithValueForProgress(formControl: AbstractControl): number { countFormControlsWithValueForProgress(formControl: AbstractControl): number {
let valueCurent = 0; let valueCurent = 0;
if (formControl instanceof UntypedFormGroup) { if (formControl instanceof UntypedFormGroup) {
@ -169,34 +201,15 @@ export class FormProgressIndicationComponent extends BaseComponent implements On
return valueCurrent; return valueCurrent;
} }
countFormControlsRequiredFieldsForTotal(formControl: AbstractControl, checkVisibility = false): number {
let valueCurrent = 0;
if (formControl instanceof UntypedFormControl) {
if (this.controlRequired(formControl) && this.controlEnabled(formControl)) {
valueCurrent++;
}
} else if (formControl instanceof UntypedFormGroup) {
if(!checkVisibility || (!formControl.get('id')?.value || (this.visibilityRulesService.isVisibleMap[formControl.get('id').value] ?? true))) {
Object.keys(formControl.controls).forEach(item => {
const control = formControl.get(item);
valueCurrent = valueCurrent + this.countFormControlsRequiredFieldsForTotal(control, checkVisibility);
});
}
} else if (formControl instanceof UntypedFormArray) {
formControl.controls.forEach(item => {
valueCurrent = valueCurrent + this.countFormControlsRequiredFieldsForTotal(item, checkVisibility);
});
}
return valueCurrent;
}
controlRequired(formControl: AbstractControl) { controlRequired(formControl: AbstractControl) {
if (formControl.validator) { if (formControl.validator) {
const validator = formControl.validator({} as AbstractControl); const validator = formControl.validator({} as AbstractControl);
if (validator && validator.required) { if (validator && validator.required) {
return true; return true;
} }
} else { return false } }
return false;
} }
controlEnabled(formControl: AbstractControl) { controlEnabled(formControl: AbstractControl) {
@ -204,8 +217,4 @@ export class FormProgressIndicationComponent extends BaseComponent implements On
return true; return true;
} else { return false } } else { return false }
} }
isEditor(): boolean {
return this.isDmpEditor || this.isDatasetEditor;
}
} }

View File

@ -31,9 +31,8 @@
// Buffer bar // Buffer bar
::ng-deep .mdc-linear-progress__buffer { ::ng-deep .mdc-linear-progress__buffer {
--mdc-linear-progress-track-height: 11px !important; --mdc-linear-progress-track-height: 11px !important;
--mdc-linear-progress-active-indicator-color: var(--secondary-color) !important;
} }
::ng-deep .mdc-linear-progress__buffer-bar { ::ng-deep .mdc-linear-progress__buffer-bar {
--mdc-linear-progress-track-color: var(--secondary-color) !important; --mdc-linear-progress-track-color: #e0e2ec !important;
} }

View File

@ -109,12 +109,12 @@ export abstract class BaseEditor<EditorModelType extends BaseEditorModel, Entity
onCallbackSuccess(data?: any, refresh: boolean = true): void { onCallbackSuccess(data?: any): void {
console.log("Success:", data); console.log("Success:", data);
this.uiNotificationService.snackBarNotification(this.isNew ? this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-CREATION') : this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success); this.uiNotificationService.snackBarNotification(this.isNew ? this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-CREATION') : this.language.instant('GENERAL.SNACK-BAR.SUCCESSFUL-UPDATE'), SnackBarNotificationLevel.Success);
if (refresh) this.refreshOnNavigateToData(data ? data.id : null); this.refreshOnNavigateToData(data ? data.id : null);
} }
onCallbackDeleteSuccess(data?: any): void { onCallbackDeleteSuccess(data?: any): void {

View File

@ -75,7 +75,7 @@ You can add one or more **fields** by clicking the `Add Field` button. For every
For a field you can specify: For a field you can specify:
- **Field Type**: There are three field types available. `System`, `External Reference` and `Custom`. There is more information available in the [Field Types](/docs/documentation/administration/blueprints/field-types) section. - **Field Type**: There are three field types available. `System`, `External Reference` and `Custom`. There is more information available in the [Field Types](/docs/documentation/administration/blueprints/field-types?t=blueprint) section.
- **System Field**: The specific system field we want to add. <br/>*Only applicable if we add a field of type `System`.* - **System Field**: The specific system field we want to add. <br/>*Only applicable if we add a field of type `System`.*
- **Reference Type**: The type of external reference we want to add. For more information, you can refer to the [Reference Types](/docs/documentation/administration/reference-types) section of our docs.<br/>*Only applicable if we add a field of type `External Reference`.* - **Reference Type**: The type of external reference we want to add. For more information, you can refer to the [Reference Types](/docs/documentation/administration/reference-types) section of our docs.<br/>*Only applicable if we add a field of type `External Reference`.*
- **Label**: A label for the field. - **Label**: A label for the field.

View File

@ -1 +1,44 @@
TODO: Add info about field types import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
In general, there are tree categories of fields that can be used.
- **System**: These are predefined fields that refer to system or specification information when filled by the end users. The available system fields are the following:
- **Title**: Refers to a title of an entity.
- **Description**: Refers to a description of an entity.
- **Language**: Refers to the language to be used. The languages being displayed to the end user are discussed [here](/docs/documentation/administration/languages).
- **Contact**: Refers to contact information about who should be responsible for the entity.
- **Access**: Indicates if an entity is publicly available. The end user will have to select between `Public` or `Restricted`.
- **User**: Refers to users registered to the platform.
- **External Reference**: These are fields that connect to a locally defined or an external source (an external API in most cases). There is more information available in the [Reference Types](/docs/documentation/administration/reference-types) section.
- **Custom**: These are generic fields that can be added to provide any type of information. The available data types are the following:
- **Text**
- **Rich Text**
- **Date**
- **Number**
:::info
Let's explore some specifics based on where these fields are getting setup.
<Tabs queryString="t">
<TabItem value="blueprint" label="Blueprints">
In the case of [plan blueprints](/docs/documentation/administration/blueprints/) you define the field you want by making two choices, what is the field category and then what is the system field type or the reference type or the data type respectively.
</TabItem>
<TabItem value="template" label="Description Templates">
In the case of [description templates](/docs/documentation/administration/templates/) the field type options are 'combined' in one dropdown control. The only difference here is that the options are separated inside that single dropdown based on the field category.
In the case of custom fields, you can specify the UI control that will be used in the forms. The elements that are supported are the following:
- **Text Area**: A regular text area (multiple lines)
- **Rich Text Area**: A rich text editor
- **Free Text**: A regular text box (one line)
- **File Upload**
- **Switch**
- **Radio Box**
- **Select**
- **Checkbox**
- **Date Picker**
</TabItem>
</Tabs>
:::

View File

@ -1 +1,137 @@
TODO: Add info about semantics import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
:::info
By **Semantics** we mean a relation a field can have with a part of a data archive specification. When the users try to add semantics, a list of suggestions drops down, containing semantics for `RDA` and `Zenodo`.
:::
These are the semantics suggestions.
<Tabs>
<TabItem value="rda" label="RDA" className="outer-tab">
<Tabs>
<TabItem value="plans" label="Plans">
- `rda.dmp.contact`
- `rda.dmp.contact.contact_id.identifier`
- `rda.dmp.contact.contact_id.type`
- `rda.dmp.contact.mbox`
- `rda.dmp.contact.name`
- `rda.dmp.contributor`
- `rda.dmp.contributor.contributor_id.identifier`
- `rda.dmp.contributor.contributor_id.type`
- `rda.dmp.contributor.mbox`
- `rda.dmp.contributor.name`
- `rda.dmp.contributor.role`
- `rda.dmp.cost`
- `rda.dmp.cost.currency_code`
- `rda.dmp.cost.description`
- `rda.dmp.cost.title`
- `rda.dmp.cost.value`
- `rda.dmp.created`
- `rda.dmp.description`
- `rda.dmp.dmp_id`
- `rda.dmp.dmp_id.identifier`
- `rda.dmp.dmp_id.type`
- `rda.dmp.ethical_issues_description`
- `rda.dmp.ethical_issues_exist`
- `rda.dmp.ethical_issues_report`
- `rda.dmp.language`
- `rda.dmp.modified`
- `rda.dmp.project`
- `rda.dmp.project.description`
- `rda.dmp.project.end`
- `rda.dmp.project.funding`
- `rda.dmp.project.funding.funder_id.identifier`
- `rda.dmp.project.funding.funder_id.type`
- `rda.dmp.project.funding.funding_status`
- `rda.dmp.project.funding.grant_id.identifier`
- `rda.dmp.project.funding.grant_id.type`
- `rda.dmp.project.start`
- `rda.dmp.dmp.project.title`
- `rda.dmp.title`
</TabItem>
<TabItem value="descriptions" label="Descriptions">
- `rda.dataset.data_quality_assurance`
- `rda.dataset.distribution.access_url`
- `rda.dataset.distribution.available_until`
- `rda.dataset.distribution.byte_size`
- `rda.dataset.distribution.data_access`
- `rda.dataset.distribution.description`
- `rda.dataset.distribution.download_url`
- `rda.dataset.distribution.format`
- `rda.dataset.distribution.host.availability`
- `rda.dataset.distribution.host.backup_frequency`
- `rda.dataset.distribution.host.backup_type`
- `rda.dataset.distribution.host.certified_with`
- `rda.dataset.distribution.host.description`
- `rda.dataset.distribution.host.geo_location`
- `rda.dataset.distribution.host.pid_system`
- `rda.dataset.distribution.host.storage_type`
- `rda.dataset.distribution.host.supports_versioning`
- `rda.dataset.distribution.host.title`
- `rda.dataset.distribution.host.url`
- `rda.dataset.distribution.license.license_ref`
- `rda.dataset.distribution.license.start_date`
- `rda.dataset.distribution.title`
- `rda.dataset.keyword`
- `rda.dataset.language`
- `rda.dataset.metadata.description`
- `rda.dataset.metadata.language`
- `rda.dataset.metadata.metadata_standard_id`
- `rda.dataset.metadata.metadata_standard_id.identifier`
- `rda.dataset.metadata.metadata_standard_id.type`
- `rda.dataset.personal_data`
- `rda.dataset.preservation_statement`
- `rda.dataset.security_and_privacy`
- `rda.dataset.security_and_privacy.description`
- `rda.dataset.security_and_privacy.title`
- `rda.dataset.sensitive_data`
- `rda.dataset.technical_resource.description`
- `rda.dataset.technical_resource.name`
- `rda.dataset.title`
- `rda.dataset.type`
- `rda.dataset.issued`
- `rda.dataset.dataset_id`
- `rda.dataset.dataset_id.identifier`
- `rda.dataset.dataset_id.type`
- `rda.dataset.description`
</TabItem>
</Tabs>
</TabItem>
<TabItem value="zenodo" label="Zenodo">
- `zenodo.related_identifiers.isCitedBy`
- `zenodo.related_identifiers.cites`
- `zenodo.related_identifiers.isSupplementTo`
- `zenodo.related_identifiers.isSupplementedBy`
- `zenodo.related_identifiers.isContinuedBy`
- `zenodo.related_identifiers.continues`
- `zenodo.related_identifiers.isDescribedBy`
- `zenodo.related_identifiers.describes`
- `zenodo.related_identifiers.hasMetadata`
- `zenodo.related_identifiers.isMetadataFor`
- `zenodo.related_identifiers.isNewVersionOf`
- `zenodo.related_identifiers.isPreviousVersionOf`
- `zenodo.related_identifiers.isPartOf`
- `zenodo.related_identifiers.hasPart`
- `zenodo.related_identifiers.isReferencedBy`
- `zenodo.related_identifiers.references`
- `zenodo.related_identifiers.isDocumentedBy`
- `zenodo.related_identifiers.documents`
- `zenodo.related_identifiers.isCompiledBy`
- `zenodo.related_identifiers.compiles`
- `zenodo.related_identifiers.isVariantFormOf`
- `zenodo.related_identifiers.isOriginalFormof`
- `zenodo.related_identifiers.isIdenticalTo`
- `zenodo.related_identifiers.isAlternateIdentifier`
- `zenodo.related_identifiers.isReviewedBy`
- `zenodo.related_identifiers.reviews`
- `zenodo.related_identifiers.isDerivedFrom`
- `zenodo.related_identifiers.isSourceOf`
- `zenodo.related_identifiers.requires`
- `zenodo.related_identifiers.isRequiredBy`
- `zenodo.related_identifiers.isObsoletedBy`
- `zenodo.related_identifiers.obsoletes`
</TabItem>
</Tabs>

View File

@ -3,4 +3,4 @@ sidebar_position: 11
description: Configure the tenant you are logged in with description: Configure the tenant you are logged in with
--- ---
# Tenant configuration # Tenant Configuration

View File

@ -3,8 +3,8 @@ import type { Config } from '@docusaurus/types';
import type * as Preset from '@docusaurus/preset-classic'; import type * as Preset from '@docusaurus/preset-classic';
const config: Config = { const config: Config = {
title: 'OpenDMP', title: 'OpenCDMP',
tagline: 'OpenDMP', tagline: 'OpenCDMP Docs',
favicon: 'img/favicon.ico', favicon: 'img/favicon.ico',
// Set the production url of your site here // Set the production url of your site here
@ -58,9 +58,9 @@ const config: Config = {
// Replace with your project's social card // Replace with your project's social card
image: 'img/docusaurus-social-card.jpg', image: 'img/docusaurus-social-card.jpg',
navbar: { navbar: {
title: 'OpenDMP', title: 'OpenCDMP',
logo: { logo: {
alt: 'OpenDMP Logo', alt: 'OpenCDMP Logo',
src: 'img/logo.svg', src: 'img/logo.svg',
}, },
items: [ items: [
@ -78,7 +78,7 @@ const config: Config = {
}, },
{ {
href: 'https://test4.opendmp.eu/splash/', href: 'https://test4.opendmp.eu/splash/',
label: 'Visit OpenDMP', label: 'Visit OpenCDMP',
position: 'right', position: 'right',
}, },
], ],
@ -138,7 +138,7 @@ const config: Config = {
], ],
}, },
], ],
copyright: `Copyright © ${new Date().getFullYear()} OpenDMP. Built with Docusaurus.`, copyright: `Copyright © ${new Date().getFullYear()} OpenCDMP. Built with Docusaurus.`,
}, },
prism: { prism: {
theme: prismThemes.github, theme: prismThemes.github,

View File

@ -28,3 +28,7 @@
--ifm-color-primary-lightest: #4fddbf; --ifm-color-primary-lightest: #4fddbf;
--docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3);
} }
.outer-tab {
margin-left: 1rem;
}