Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • dlcm/ui/dlcm-portal
1 result
Select Git revision
Show changes
Commits on Source (3)
Showing
with 95 additions and 15 deletions
......@@ -140,7 +140,7 @@
"normalize.css": "8.0.1",
"quill": "2.0.2",
"rxjs": "7.8.1",
"solidify-frontend": "5.5.4",
"solidify-frontend": "5.5.5",
"sync-pom-version-to-package": "1.6.1",
"tiff.js": "1.0.0",
"tslib": "2.7.0",
......
......@@ -206,8 +206,8 @@ importers:
specifier: 7.8.1
version: 7.8.1
solidify-frontend:
specifier: 5.5.4
version: 5.5.4(gwnhmdw6jae4d67bc2zjtwx26i)
specifier: 5.5.5
version: 5.5.5(gwnhmdw6jae4d67bc2zjtwx26i)
sync-pom-version-to-package:
specifier: 1.6.1
version: 1.6.1
......@@ -6916,8 +6916,8 @@ packages:
resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==}
engines: {node: '>= 10.0.0', npm: '>= 3.0.0'}
 
solidify-frontend@5.5.4:
resolution: {integrity: sha512-0g1LwVoASjusbJDp1harX6kL2yF4iMz9r5zqglIMMgyfobcqHTFWQeE5fJif0BOVytNRP/g0y0eIk+Oh1mOefQ==}
solidify-frontend@5.5.5:
resolution: {integrity: sha512-3OFS/OXd6dYXQrrfV/Wh1aaKCxhAGiWxOGtUuwQSVaGapBm/2C2jX6L7XgMEKLJHAvYAw91QqpRyYCIzpfwk7A==}
engines: {node: v20.18.0}
peerDependencies:
'@angular-devkit/core': ^18.2.7
......@@ -15116,7 +15116,7 @@ snapshots:
ip-address: 9.0.5
smart-buffer: 4.2.0
 
solidify-frontend@5.5.4(gwnhmdw6jae4d67bc2zjtwx26i):
solidify-frontend@5.5.5(gwnhmdw6jae4d67bc2zjtwx26i):
dependencies:
'@angular-devkit/core': 18.2.11(chokidar@3.6.0)
'@angular/animations': 18.2.7(@angular/core@18.2.7(rxjs@7.8.1)(zone.js@0.14.10))
......
......@@ -32,6 +32,12 @@
solidifyTooltipOnEllipsis
></mat-error>
</mat-form-field>
<div *ngIf="isAnotherDisseminationPolicyWithSameParams"
class="error"
>
{{labelTranslateEnum.thereIsAnotherDisseminationPolicyDefinedWithTheSameParameters | translate}}
</div>
</div>
</solidify-base-action-dialog>
<div mat-dialog-actions>
......@@ -42,7 +48,7 @@
</button>
<button (click)="validate()"
(onEnter)="validate()"
[disabled]="formGroup.invalid || formControlDisseminationPolicy.invalid"
[disabled]="formGroup.invalid || formControlDisseminationPolicy.invalid || isAnotherDisseminationPolicyWithSameParams"
color="primary"
mat-flat-button
solidifyShortCuts
......
......@@ -5,5 +5,10 @@
> * {
width: 100%;
}
.error {
text-align: center;
color: $error;
}
}
}
\ No newline at end of file
......@@ -32,6 +32,7 @@ import {
FormBuilder,
FormControl,
FormGroup,
ValidatorFn,
Validators,
} from "@angular/forms";
import {
......@@ -43,6 +44,7 @@ import {
DisseminationPolicy,
OrganizationalUnitDisseminationPolicyContainer,
} from "@models";
import {TranslateService} from "@ngx-translate/core";
import {
Actions,
Store,
......@@ -60,9 +62,13 @@ import {
isNotNullNorUndefined,
isNotNullNorUndefinedNorWhiteString,
isNullOrUndefined,
isNullOrUndefinedOrWhiteString,
LABEL_TRANSLATE,
LabelTranslateInterface,
MappingObject,
MappingObjectUtil,
PropertyName,
SolidifyForbiddenValuesValidator,
SolidifyValidator,
StoreUtil,
StringUtil,
......@@ -99,14 +105,24 @@ export class SharedOrganizationalUnitDisseminationPolicyParametersDialog extends
return FormValidationHelper;
}
listOtherOrgUnitDisseminationPolicies: OrganizationalUnitDisseminationPolicyContainer[] = [];
listOtherOrgUnitDisseminationPoliciesParametersInJson: string[] = [];
isAnotherDisseminationPolicyWithSameParams: boolean = false;
uniqueNameValidator: ValidatorFn;
constructor(protected readonly _dialogRef: MatDialogRef<SharedOrganizationalUnitDisseminationPolicyParametersDialog>,
@Inject(MAT_DIALOG_DATA) public readonly data: SharedOrganizationalUnitDisseminationPolicyParametersDialogData,
private readonly _fb: FormBuilder,
private readonly _actions$: Actions,
private readonly _store: Store,
private readonly _changeDetector: ChangeDetectorRef) {
private readonly _changeDetector: ChangeDetectorRef,
protected readonly _translateService: TranslateService,
@Inject(LABEL_TRANSLATE) protected readonly _labelTranslate: LabelTranslateInterface) {
super(_dialogRef, data);
this._computeListOtherOrgUnitDisseminationPolicies();
this._computeListOtherOrgUnitDisseminationPoliciesParametersInJson();
this.formControlDisseminationPolicy = new FormControl(this.data.organizationalUnitDisseminationPolicyContainer?.resId ?? "", [Validators.required, SolidifyValidator]);
if (this.isEditMode) {
this.formControlDisseminationPolicy.disable();
......@@ -145,7 +161,7 @@ export class SharedOrganizationalUnitDisseminationPolicyParametersDialog extends
distinctUntilChanged(),
tap(id => {
const disseminationPolicy = this.disseminationPolicies.find(policy => policy.resId === id);
this.selectDisseminationPolicy(disseminationPolicy);
this._selectDisseminationPolicy(disseminationPolicy);
}),
));
}
......@@ -155,8 +171,19 @@ export class SharedOrganizationalUnitDisseminationPolicyParametersDialog extends
this.formGroup = this._fb.group({});
// Add new controls that correspond to the parameters
MappingObjectUtil.keys(parameters).forEach(key => {
this.formGroup.addControl(key, this._fb.control(parameters[key] ?? "", [Validators.required, SolidifyValidator]));
const validators = [Validators.required, SolidifyValidator];
if (key === this.formDefinition.name) {
validators.push(this.uniqueNameValidator);
}
this.formGroup.addControl(key, this._fb.control(parameters[key] ?? "", validators));
});
this.subscribe(this.formGroup.valueChanges.pipe(
tap(form => {
this._computeIsParametersValid();
this._changeDetector.detectChanges();
}),
));
}
validate(): void {
......@@ -171,20 +198,55 @@ export class SharedOrganizationalUnitDisseminationPolicyParametersDialog extends
currentDisseminationPolicy: DisseminationPolicy;
selectDisseminationPolicy(disseminationPolicy: DisseminationPolicy): void {
private _selectDisseminationPolicy(disseminationPolicy: DisseminationPolicy): void {
if (this.data.organizationalUnitDisseminationPolicyContainer?.resId === disseminationPolicy?.resId) {
return;
}
this.currentDisseminationPolicy = disseminationPolicy;
const parameters: MappingObject<string, string> = isNotNullNorUndefinedNorWhiteString(disseminationPolicy.parameters) ? JSON.parse(disseminationPolicy.parameters) : {};
this._bindParametersToForm(parameters);
this._computeListOtherOrgUnitDisseminationPoliciesParametersInJson();
this._computeIsParametersValid();
}
private _computeListOtherOrgUnitDisseminationPolicies(): void {
const currentCompositionKey = this.data.organizationalUnitDisseminationPolicyContainer?.joinResource?.compositeKey;
this.listOtherOrgUnitDisseminationPolicies = this.data.listOrganizationalUnitDisseminationPolicyContainer
.filter(o => isNullOrUndefinedOrWhiteString(currentCompositionKey) ||
o.joinResource.compositeKey !== currentCompositionKey);
const listForbiddenNames = this.listOtherOrgUnitDisseminationPolicies
.map(o => o.joinResource.parameters)
.map(o => JSON.parse(o)?.[this.formDefinition.name])
.filter(o => isNotNullNorUndefinedNorWhiteString(o));
this.uniqueNameValidator = SolidifyForbiddenValuesValidator(this._translateService, listForbiddenNames, this._labelTranslate.applicationAlreadyUsed, true);
}
private _computeListOtherOrgUnitDisseminationPoliciesParametersInJson(): void {
this.listOtherOrgUnitDisseminationPoliciesParametersInJson = this.listOtherOrgUnitDisseminationPolicies
.filter(o => isNullOrUndefined(this.currentDisseminationPolicy) || o.joinResource?.disseminationPolicy?.resId === this.currentDisseminationPolicy?.resId)
.map(o => {
const parameters = JSON.parse(o.joinResource.parameters);
MappingObjectUtil.delete(parameters, this.formDefinition.name);
return JSON.stringify(parameters) as string;
});
}
private _computeIsParametersValid(): void {
const formValue = this.formGroup.value;
// Ignore name in comparison
delete formValue[this.formDefinition.name];
const formParam = JSON.stringify(formValue);
this.isAnotherDisseminationPolicyWithSameParams = this.listOtherOrgUnitDisseminationPoliciesParametersInJson.findIndex(o => o === formParam) >= 0;
}
}
export interface SharedOrganizationalUnitDisseminationPolicyParametersDialogData {
organizationalUnitDisseminationPolicyContainer?: OrganizationalUnitDisseminationPolicyContainer;
listOrganizationalUnitDisseminationPolicyContainer?: OrganizationalUnitDisseminationPolicyContainer[];
}
class FormComponentFormDefinition extends BaseFormDefinition {
@PropertyName() resId: string;
@PropertyName() name: string;
}
......@@ -151,6 +151,7 @@ export class SharedOrganizationalUnitDisseminationPolicyParametersPresentational
const model = this.listOrganizationalUnitDisseminationPolicyContainer[index];
this.subscribe(DialogUtil.open(this._dialog, SharedOrganizationalUnitDisseminationPolicyParametersDialog, {
organizationalUnitDisseminationPolicyContainer: model,
listOrganizationalUnitDisseminationPolicyContainer: this.listOrganizationalUnitDisseminationPolicyContainer,
} as SharedOrganizationalUnitDisseminationPolicyParametersDialogData, {
minWidth: "500px",
}, result => {
......@@ -167,7 +168,9 @@ export class SharedOrganizationalUnitDisseminationPolicyParametersPresentational
}
createDisseminationPoliciesParameters(): void {
this.subscribe(DialogUtil.open(this._dialog, SharedOrganizationalUnitDisseminationPolicyParametersDialog, {} as SharedOrganizationalUnitDisseminationPolicyParametersDialogData, {
this.subscribe(DialogUtil.open(this._dialog, SharedOrganizationalUnitDisseminationPolicyParametersDialog, {
listOrganizationalUnitDisseminationPolicyContainer: this.listOrganizationalUnitDisseminationPolicyContainer,
} as SharedOrganizationalUnitDisseminationPolicyParametersDialogData, {
minWidth: "500px",
}, result => {
this.listOrganizationalUnitDisseminationPolicyContainer.push(result);
......
......@@ -553,6 +553,7 @@ export class LabelTranslateEnum {
static thereIsA: string = MARK_AS_TRANSLATABLE("general.label.thereIsA");
static newerVersion: string = MARK_AS_TRANSLATABLE("general.label.newerVersion");
static ofTheArchiveAvailable: string = MARK_AS_TRANSLATABLE("general.label.ofTheArchiveAvailable");
static thereIsAnotherDisseminationPolicyDefinedWithTheSameParameters: string = MARK_AS_TRANSLATABLE("general.label.thereIsAnotherDisseminationPolicyDefinedWithTheSameParameters");
static tooltipContentStructurePublic: string = MARK_AS_TRANSLATABLE("general.tooltip.contentStructurePublic");
......
......@@ -1661,6 +1661,7 @@
"themes": "Theme",
"thereAreNoCurrentOrderForArchives": "Es gibt keine aktuelle Anfrage nach Archiven",
"thereIsA": "general.label.thereIsA",
"thereIsAnotherDisseminationPolicyDefinedWithTheSameParameters": "general.label.thereIsAnotherDisseminationPolicyDefinedWithTheSameParameters",
"thisArchiveIsSubjectToAContractOnDataUse": "general.label.thisArchiveIsSubjectToAContractOnDataUse",
"thisArchiveIsSubjectToAContractOnDataUseExternal": "general.label.thisArchiveIsSubjectToAContractOnDataUseExternal",
"tilesView": "Kachel-Ansicht",
......
......@@ -778,7 +778,7 @@
},
"doiInactive": {
"notRegistered": "DOI is not yet registered on DOI.org, please wait",
"notSubmitted": "DOI is not functional because the repository must be submitted and approved",
"notSubmitted": "DOI is not functional because the deposit must be submitted and approved",
"whyDisabled": "The DOI will be automatically assigned upon submitting the deposit. Alternatively, you can click on the 'Reserve DOI' button after creating the deposit to reserve one in advance."
},
"isIdenticalTo": "Indicates that this archive is identical to another DOI",
......@@ -1661,6 +1661,7 @@
"themes": "Themes",
"thereAreNoCurrentOrderForArchives": "There currently aren't any archives in the download order",
"thereIsA": "There is a",
"thereIsAnotherDisseminationPolicyDefinedWithTheSameParameters": "There is another dissemination policy defined with the same parameters in this organizational unit",
"thisArchiveIsSubjectToAContractOnDataUse": "This archive is subject to the following contract on data use.\n\nPlease, read it carefully, sign it and upload the signed copy to request access to the archive.",
"thisArchiveIsSubjectToAContractOnDataUseExternal": "This archive is subject to a contract on data use external of our system.\n\nPlease contact the manager of the organizational unit to know how to provide it.",
"tilesView": "Tile view",
......@@ -2516,4 +2517,4 @@
"title": "User guide",
"tooltipClose": "Close user guide"
}
}
}
\ No newline at end of file
......@@ -1661,6 +1661,7 @@
"themes": "Thèmes",
"thereAreNoCurrentOrderForArchives": "Il n'y a aucune demande de téléchargement en cours",
"thereIsA": "Il y a une",
"thereIsAnotherDisseminationPolicyDefinedWithTheSameParameters": "ll y a une autre politique de diffusion définie avec les mêmes paramètres dans cette unité organisationnelle",
"thisArchiveIsSubjectToAContractOnDataUse": "Cette archive est soumise au contrat suivant sur l'utilisation des données.\n\nVeuillez le lire attentivement, le signer et télécharger la copie signée pour demander l'accès à l'archive.",
"thisArchiveIsSubjectToAContractOnDataUseExternal": "Cette archive fait l'objet d'un contrat d'utilisation des données externes à notre système.\n\nVeuillez contacter le responsable de l'unité organisationnelle pour savoir comment le fournir.",
"tilesView": "Vue tuiles",
......@@ -2516,4 +2517,4 @@
"title": "Guide d'utilisation",
"tooltipClose": "Fermer le guide d'utilisation"
}
}
}
\ No newline at end of file