[CST-9636] Refactor access control array form to accept dropdown options

This commit is contained in:
Enea Jahollari
2023-05-10 16:02:01 +02:00
parent 5455c79563
commit 4bf10c880a
4 changed files with 28 additions and 53 deletions

View File

@@ -7,7 +7,7 @@
<div> <div>
<select id="accesscontroloption" formControlName="itemName" class="form-control"> <select id="accesscontroloption" formControlName="itemName" class="form-control">
<option value=""></option> <option value=""></option>
<option *ngFor="let option of (dropdownData$ | async)" [value]="option.name"> <option *ngFor="let option of dropdownOptions" [value]="option.name">
{{ option.name }} {{ option.name }}
</option> </option>
</select> </select>
@@ -20,7 +20,7 @@
placeholder="yyyy-mm-dd" placeholder="yyyy-mm-dd"
name="dp" name="dp"
formControlName="startDate" formControlName="startDate"
[minDate]="control | maxStartDate: (dropdownData$ | async)" [minDate]="control | maxStartDate: dropdownOptions"
ngbDatepicker ngbDatepicker
#d="ngbDatepicker" #d="ngbDatepicker"
/> />
@@ -40,7 +40,7 @@
placeholder="yyyy-mm-dd" placeholder="yyyy-mm-dd"
name="dp" name="dp"
formControlName="endDate" formControlName="endDate"
[maxDate]="control | maxEndDate: (dropdownData$ | async)" [maxDate]="control | maxEndDate: dropdownOptions"
ngbDatepicker ngbDatepicker
#d1="ngbDatepicker" #d1="ngbDatepicker"
/> />

View File

@@ -1,4 +1,4 @@
import { Component, NgModule, OnDestroy, OnInit } from '@angular/core'; import { Component, Input, NgModule, OnDestroy, OnInit } from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { FormArray, FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms'; import { FormArray, FormBuilder, FormControl, ReactiveFormsModule } from '@angular/forms';
import { SharedBrowseByModule } from '../browse-by/shared-browse-by.module'; import { SharedBrowseByModule } from '../browse-by/shared-browse-by.module';
@@ -7,21 +7,11 @@ import { NgbDatepickerModule } from '@ng-bootstrap/ng-bootstrap';
import { ControlMaxStartDatePipe } from './control-max-start-date.pipe'; import { ControlMaxStartDatePipe } from './control-max-start-date.pipe';
import { ControlMaxEndDatePipe } from './control-max-end-date.pipe'; import { ControlMaxEndDatePipe } from './control-max-end-date.pipe';
import { distinctUntilChanged, map, shareReplay, takeUntil, tap } from 'rxjs/operators'; import { distinctUntilChanged, takeUntil } from 'rxjs/operators';
import { Subject } from 'rxjs'; import { Subject } from 'rxjs';
import { getFirstCompletedRemoteData } from '../../core/shared/operators'; import { AccessesConditionOption } from '../../core/config/models/config-accesses-conditions-options.model';
import { RemoteData } from '../../core/data/remote-data';
import { BulkAccessConditionOptions } from '../../core/config/models/bulk-access-condition-options.model';
import { BulkAccessConfigDataService } from '../../core/config/bulk-access-config-data.service';
// will be used on the form value
export interface AccessControlItemValue {
itemName: string | null; // item name
startDate?: string;
endDate?: string;
}
@Component({ @Component({
selector: 'ds-access-control-array-form', selector: 'ds-access-control-array-form',
templateUrl: './access-control-array-form.component.html', templateUrl: './access-control-array-form.component.html',
@@ -29,6 +19,7 @@ export interface AccessControlItemValue {
exportAs: 'accessControlArrayForm' exportAs: 'accessControlArrayForm'
}) })
export class AccessControlArrayFormComponent implements OnInit, OnDestroy { export class AccessControlArrayFormComponent implements OnInit, OnDestroy {
@Input() dropdownOptions: AccessesConditionOption[] = [];
private destroy$ = new Subject<void>(); private destroy$ = new Subject<void>();
@@ -36,27 +27,9 @@ export class AccessControlArrayFormComponent implements OnInit, OnDestroy {
accessControl: this.fb.array([]) accessControl: this.fb.array([])
}); });
constructor(private bulkAccessConfigService: BulkAccessConfigDataService, constructor(private fb: FormBuilder) {}
private fb: FormBuilder) {
}
dropdownData$ = this.bulkAccessConfigService.findByPropertyName('default').pipe(
getFirstCompletedRemoteData(),
map((configRD: RemoteData<BulkAccessConditionOptions>) => configRD.hasSucceeded ? configRD.payload : null),
shareReplay(1),
tap(console.log)
);
ngOnInit(): void { ngOnInit(): void {
// console.log(this.dropdownOptions);
/* if (this.accessControlItems.length === 0) {
this.addAccessControlItem();
} else {
for (const item of this.accessControlItems) {
this.addAccessControlItem(item.itemName);
}
}*/
this.addAccessControlItem(); this.addAccessControlItem();
this.accessControl.valueChanges this.accessControl.valueChanges

View File

@@ -48,7 +48,10 @@
</div> </div>
</div> </div>
<ds-access-control-array-form #itemAccessCmp></ds-access-control-array-form> <ds-access-control-array-form
#itemAccessCmp
[dropdownOptions]="(dropdownData$ | async)?.itemAccessConditionOptions || []">
</ds-access-control-array-form>
</div> </div>
<div class="col-12 col-md-6"> <div class="col-12 col-md-6">
@@ -125,23 +128,24 @@
</div> </div>
<div class="mt-3"> <div class="mt-3">
<h5> <h5>{{'access-control-access-conditions' | translate}}</h5>
{{'access-control-access-conditions' | translate}}
</h5>
<div class="alert alert-warning"> <div class="alert alert-warning">
{{'access-control-no-access-conditions-warning-message' | translate}} {{'access-control-no-access-conditions-warning-message' | translate}}
</div> </div>
</div> </div>
<ds-access-control-array-form #bitstreamAccessCmp></ds-access-control-array-form> <ds-access-control-array-form
#bitstreamAccessCmp
[dropdownOptions]="(dropdownData$ | async)?.bitstreamAccessConditionOptions || []">
</ds-access-control-array-form>
</div> </div>
</div> </div>
<hr *ngIf="!hideSubmit"> <hr *ngIf="showSubmit">
<div *ngIf="!hideSubmit" class="d-flex justify-content-end"> <div *ngIf="showSubmit" class="d-flex justify-content-end">
<button class="btn btn-lg btn-outline-primary mr-3" (click)="reset()"> <button class="btn btn-lg btn-outline-primary mr-3" (click)="reset()">
{{ 'access-control-reset' | translate }} {{ 'access-control-reset' | translate }}
</button> </button>

View File

@@ -1,5 +1,5 @@
import { ChangeDetectorRef, Component, Input, NgModule, ViewChild } from '@angular/core'; import { ChangeDetectorRef, Component, Input, NgModule, ViewChild } from '@angular/core';
import { concatMap } from 'rxjs'; import { concatMap, Observable, shareReplay } from 'rxjs';
import { RemoteData } from '../../core/data/remote-data'; import { RemoteData } from '../../core/data/remote-data';
import { Item } from '../../core/shared/item.model'; import { Item } from '../../core/shared/item.model';
import { import {
@@ -9,7 +9,7 @@ import {
import { BulkAccessControlService } from './bulk-access-control.service'; import { BulkAccessControlService } from './bulk-access-control.service';
import { SelectableListService } from '../object-list/selectable-list/selectable-list.service'; import { SelectableListService } from '../object-list/selectable-list/selectable-list.service';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
import { take } from 'rxjs/operators'; import { map, take, tap } from 'rxjs/operators';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { ListableObject } from '../object-collection/shared/listable-object.model'; import { ListableObject } from '../object-collection/shared/listable-object.model';
import { SharedModule } from '../shared.module'; import { SharedModule } from '../shared.module';
@@ -21,6 +21,8 @@ import {
ItemAccessControlSelectBitstreamsModalComponent ItemAccessControlSelectBitstreamsModalComponent
} from './item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component'; } from './item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component';
import { BulkAccessConfigDataService } from '../../core/config/bulk-access-config-data.service'; import { BulkAccessConfigDataService } from '../../core/config/bulk-access-config-data.service';
import { getFirstCompletedRemoteData } from '../../core/shared/operators';
import { BulkAccessConditionOptions } from '../../core/config/models/bulk-access-condition-options.model';
@Component({ @Component({
selector: 'ds-access-control-form-container', selector: 'ds-access-control-form-container',
@@ -28,12 +30,12 @@ import { BulkAccessConfigDataService } from '../../core/config/bulk-access-confi
styleUrls: [ './access-control-form-container.component.scss' ], styleUrls: [ './access-control-form-container.component.scss' ],
exportAs: 'dsAccessControlForm' exportAs: 'dsAccessControlForm'
}) })
export class AccessControlFormContainerComponent<T extends DSpaceObject> implements OnInit { export class AccessControlFormContainerComponent<T extends DSpaceObject> {
@Input() showLimitToSpecificBitstreams = false; @Input() showLimitToSpecificBitstreams = false;
@Input() itemRD: RemoteData<T>; @Input() itemRD: RemoteData<T>;
@Input() hideSubmit = false; @Input() showSubmit = true;
@ViewChild('bitstreamAccessCmp', { static: true }) bitstreamAccessCmp: AccessControlArrayFormComponent; @ViewChild('bitstreamAccessCmp', { static: true }) bitstreamAccessCmp: AccessControlArrayFormComponent;
@ViewChild('itemAccessCmp', { static: true }) itemAccessCmp: AccessControlArrayFormComponent; @ViewChild('itemAccessCmp', { static: true }) itemAccessCmp: AccessControlArrayFormComponent;
@@ -48,16 +50,12 @@ export class AccessControlFormContainerComponent<T extends DSpaceObject> impleme
state = initialState; state = initialState;
/* dropdownData$ = this.bulkAccessConfigService.findByPropertyName('default').pipe( dropdownData$: Observable<BulkAccessConditionOptions> = this.bulkAccessConfigService.findByPropertyName('default').pipe(
getFirstCompletedRemoteData(), getFirstCompletedRemoteData(),
map((configRD: RemoteData<BulkAccessConditionOptions>) => configRD.hasSucceeded ? configRD.payload : null), map((configRD: RemoteData<BulkAccessConditionOptions>) => configRD.hasSucceeded ? configRD.payload : null),
shareReplay(1), shareReplay(1),
tap(console.log) tap(x => console.log('options', x))
);*/ );
/* dropdownData$ = this.bulkAccessControlService.dropdownData$.pipe(
shareReplay(1)
);*/
getFormValue() { getFormValue() {
return { return {