diff --git a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts index ed94398f6d..43adae7ec0 100644 --- a/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts +++ b/src/app/access-control/bulk-access/browse/bulk-access-browse.component.ts @@ -17,7 +17,56 @@ import { hasValue } from '../../../shared/empty.util'; @Component({ selector: 'ds-bulk-access-browse', - templateUrl: './bulk-access-browse.component.html', + template: ` + + + +
+ +
+
+ + +
+
+
+
+ + +
+
+
+
+ `, styleUrls: ['./bulk-access-browse.component.scss'], providers: [ { @@ -57,8 +106,7 @@ export class BulkAccessBrowseComponent implements OnInit, OnDestroy { */ private subs: Subscription[] = []; - constructor(private selectableListService: SelectableListService) { - } + constructor(private selectableListService: SelectableListService) {} /** * Subscribe to selectable list updates diff --git a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html index ac07f30f84..c53bf9c6ac 100644 --- a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html +++ b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.html @@ -1,120 +1,7 @@ -
-
-
-

{{'collection-access-control-title' | translate}}

+ +

{{'collection-access-control-title' | translate}}

+
-
-
-
-

- {{ 'access-control-item-header-toggle' | translate }} -

- - -
- -
-
- {{'access-control-mode' | translate}} -
-
-
- - -
-
- - -
-
-
- -
-
{{'access-control-access-conditions' | translate}}
- -
- {{'access-control-no-access-conditions-warning-message' | translate}} -
-
- - - - -
-
-
-

- {{ 'access-control-bitstream-header-toggle' | translate }} -

- -
- -
-
- {{'access-control-mode' | translate}} -
-
-
- - -
-
- - -
-
-
- -
-
{{'access-control-access-conditions' | translate}}
- -
- {{'access-control-no-access-conditions-warning-message' | translate}} -
-
- - - - -
-
- -
- -
- - -
-
-
-
diff --git a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts index 35ba6076f9..4192fe5a9a 100644 --- a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts +++ b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.component.ts @@ -1,64 +1,24 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import { shareReplay } from 'rxjs'; -import { - AccessControlArrayFormComponent -} from '../../../shared/access-control-array-form/access-control-array-form.component'; -import { CollectionAccessControlService } from './collection-access-control.service'; +import { Component, OnInit } from '@angular/core'; +import { Observable } from 'rxjs'; +import { RemoteData } from '../../../core/data/remote-data'; +import { Community } from '../../../core/shared/community.model'; +import { ActivatedRoute } from '@angular/router'; +import { map } from 'rxjs/operators'; +import { getFirstSucceededRemoteData } from '../../../core/shared/operators'; @Component({ selector: 'ds-collection-access-control', templateUrl: './collection-access-control.component.html', styleUrls: ['./collection-access-control.component.scss'], - providers: [CollectionAccessControlService] }) export class CollectionAccessControlComponent implements OnInit { + itemRD$: Observable>; - @ViewChild('bitstreamAccessCmp', { static: true }) bitstreamAccessCmp: AccessControlArrayFormComponent; - @ViewChild('itemAccessCmp', { static: true }) itemAccessCmp: AccessControlArrayFormComponent; - - constructor(private collectionAccessControlService: CollectionAccessControlService) {} - - state = initialState; - - dropdownData$ = this.collectionAccessControlService.dropdownData$.pipe( - shareReplay(1) - ); + constructor(private route: ActivatedRoute) {} ngOnInit(): void { - + this.itemRD$ = this.route.parent.parent.data.pipe( + map((data) => data.dso) + ).pipe(getFirstSucceededRemoteData()) as Observable>; } - - reset() { - this.bitstreamAccessCmp.reset(); - this.itemAccessCmp.reset(); - this.state = initialState; - } - - submit() { - const bitstreamAccess = this.bitstreamAccessCmp.getValue(); - const itemAccess = this.itemAccessCmp.getValue(); - - console.log('bitstreamAccess', bitstreamAccess); - console.log('itemAccess', itemAccess); - } - - handleStatusChange(type: 'item' | 'bitstream', active: boolean) { - if (type === 'bitstream') { - active ? this.bitstreamAccessCmp.enable() : this.bitstreamAccessCmp.disable(); - } else if (type === 'item') { - active ? this.itemAccessCmp.enable() : this.itemAccessCmp.disable(); - } - } - } - -const initialState = { - item: { - toggleStatus: false, - accessMode: '', - }, - bitstream: { - toggleStatus: false, - accessMode: '', - }, -}; diff --git a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.service.ts b/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.service.ts deleted file mode 100644 index 3267461fe6..0000000000 --- a/src/app/collection-page/edit-collection-page/collection-access-control/collection-access-control.service.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Injectable } from '@angular/core'; -import { AccessControlItem } from 'src/app/core/shared/bulk-access-condition-options.model'; -import { Observable, of } from 'rxjs'; - -export interface AccessControlDropdownDataResponse { - id: string; - itemAccessConditionOptions: AccessControlItem[]; - bitstreamAccessConditionOptions: AccessControlItem[]; -} - -@Injectable() -export class CollectionAccessControlService { - dropdownData$: Observable = of(accessControlDropdownData); -} - -const accessControlDropdownData: AccessControlDropdownDataResponse = { - 'id': 'default', - 'itemAccessConditionOptions': [ - { - 'name': 'openaccess' - }, - { - 'name': 'administrator' - }, - { - 'name': 'embargo', - 'hasStartDate': true, - 'maxStartDate': '2018-06-24T00:40:54.970+0000' - }, - { - 'name': 'lease', - 'hasEndDate': true, - 'maxEndDate': '2017-12-24T00:40:54.970+0000' - } - ], - 'bitstreamAccessConditionOptions': [ - { - 'name': 'openaccess' - }, - { - 'name': 'administrator' - }, - { - 'name': 'embargo', - 'hasStartDate': true, - 'maxStartDate': '2018-06-24T00:40:54.970+0000' - }, - { - 'name': 'lease', - 'hasEndDate': true, - 'maxEndDate': '2017-12-24T00:40:54.970+0000' - } - ] -}; diff --git a/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts b/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts index 5af7d3189a..9d703c0cf4 100644 --- a/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts +++ b/src/app/collection-page/edit-collection-page/edit-collection-page.module.ts @@ -18,6 +18,9 @@ import { AccessControlArrayFormModule } from '../../shared/access-control-array-form/access-control-array-form.component'; import { UiSwitchModule } from 'ngx-ui-switch'; +import { + AccessControlFormContainerModule +} from '../../shared/access-control-form-container/access-control-form-container.component'; /** * Module that contains all components related to the Edit Collection page administrator functionality @@ -33,6 +36,7 @@ import { UiSwitchModule } from 'ngx-ui-switch'; ComcolModule, AccessControlArrayFormModule, UiSwitchModule, + AccessControlFormContainerModule, ], declarations: [ EditCollectionPageComponent, diff --git a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html index 26f394620a..89999955eb 100644 --- a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html +++ b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.html @@ -1,120 +1,6 @@ -
-
-
-

{{ 'community-access-control-title' | translate }}

- -
-
-
-

- {{ 'access-control-item-header-toggle' | translate }} -

- - -
- -
-
- {{'access-control-mode' | translate}} -
-
-
- - -
-
- - -
-
-
- -
-
{{'access-control-access-conditions' | translate}}
- -
- {{'access-control-no-access-conditions-warning-message' | translate}} -
-
- - - - -
-
-
-

- {{ 'access-control-bitstream-header-toggle' | translate }} -

- -
- -
-
- {{'access-control-mode' | translate}} -
-
-
- - -
-
- - -
-
-
- -
-
{{'access-control-access-conditions' | translate}}
- -
- {{'access-control-no-access-conditions-warning-message' | translate}} -
-
- - - - -
-
- -
- -
- - -
-
-
-
+ +

{{'community-access-control-title' | translate }}

+
diff --git a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts index a25adb177c..b24069b9ac 100644 --- a/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts +++ b/src/app/community-page/edit-community-page/community-access-control/community-access-control.component.ts @@ -1,63 +1,26 @@ -import { Component, OnInit, ViewChild } from '@angular/core'; -import { CommunityAccessControlService } from './community-access-control.service'; -import { shareReplay } from 'rxjs'; -import { - AccessControlArrayFormComponent -} from '../../../shared/access-control-array-form/access-control-array-form.component'; +import { Component, OnInit } from '@angular/core'; +import { Observable } from 'rxjs'; +import { RemoteData } from '../../../core/data/remote-data'; +import { SelectableListService } from '../../../shared/object-list/selectable-list/selectable-list.service'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { ActivatedRoute } from '@angular/router'; +import { map } from 'rxjs/operators'; +import { getFirstSucceededRemoteData } from '../../../core/shared/operators'; +import { Community } from '../../../core/shared/community.model'; @Component({ selector: 'ds-community-access-control', templateUrl: './community-access-control.component.html', styleUrls: ['./community-access-control.component.scss'], - providers: [CommunityAccessControlService] }) export class CommunityAccessControlComponent implements OnInit { + itemRD$: Observable>; - @ViewChild('bitstreamAccessCmp', { static: true }) bitstreamAccessCmp: AccessControlArrayFormComponent; - @ViewChild('itemAccessCmp', { static: true }) itemAccessCmp: AccessControlArrayFormComponent; - - constructor(private communityAccessControlService: CommunityAccessControlService) {} - - state = initialState; - - dropdownData$ = this.communityAccessControlService.dropdownData$.pipe( - shareReplay(1) - ); + constructor(private route: ActivatedRoute) {} ngOnInit(): void { - - } - - reset() { - this.bitstreamAccessCmp.reset(); - this.itemAccessCmp.reset(); - this.state = initialState; - } - - submit() { - const bitstreamAccess = this.bitstreamAccessCmp.getValue(); - const itemAccess = this.itemAccessCmp.getValue(); - - console.log('bitstreamAccess', bitstreamAccess); - console.log('itemAccess', itemAccess); - } - - handleStatusChange(type: 'item' | 'bitstream', active: boolean) { - if (type === 'bitstream') { - active ? this.bitstreamAccessCmp.enable() : this.bitstreamAccessCmp.disable(); - } else if (type === 'item') { - active ? this.itemAccessCmp.enable() : this.itemAccessCmp.disable(); - } + this.itemRD$ = this.route.parent.parent.data.pipe( + map((data) => data.dso) + ).pipe(getFirstSucceededRemoteData()) as Observable>; } } - -const initialState = { - item: { - toggleStatus: false, - accessMode: '', - }, - bitstream: { - toggleStatus: false, - accessMode: '', - }, -}; diff --git a/src/app/community-page/edit-community-page/edit-community-page.module.ts b/src/app/community-page/edit-community-page/edit-community-page.module.ts index 8aa52086ee..5ed2e401c6 100644 --- a/src/app/community-page/edit-community-page/edit-community-page.module.ts +++ b/src/app/community-page/edit-community-page/edit-community-page.module.ts @@ -15,6 +15,9 @@ import { UiSwitchModule } from 'ngx-ui-switch'; import { AccessControlArrayFormModule } from '../../shared/access-control-array-form/access-control-array-form.component'; +import { + AccessControlFormContainerModule +} from '../../shared/access-control-form-container/access-control-form-container.component'; /** * Module that contains all components related to the Edit Community page administrator functionality @@ -29,6 +32,7 @@ import { ResourcePoliciesModule, UiSwitchModule, AccessControlArrayFormModule, + AccessControlFormContainerModule, ], declarations: [ EditCommunityPageComponent, diff --git a/src/app/item-page/edit-item-page/edit-item-page.module.ts b/src/app/item-page/edit-item-page/edit-item-page.module.ts index fb46697c7d..322c6c6999 100644 --- a/src/app/item-page/edit-item-page/edit-item-page.module.ts +++ b/src/app/item-page/edit-item-page/edit-item-page.module.ts @@ -1,7 +1,7 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { NgbTooltipModule, NgbModule } from '@ng-bootstrap/ng-bootstrap'; +import { NgbModule, NgbTooltipModule } from '@ng-bootstrap/ng-bootstrap'; import { SharedModule } from '../../shared/shared.module'; import { EditItemPageRoutingModule } from './edit-item-page.routing.module'; @@ -20,14 +20,22 @@ import { SearchPageModule } from '../../search-page/search-page.module'; import { ItemCollectionMapperComponent } from './item-collection-mapper/item-collection-mapper.component'; import { ItemRelationshipsComponent } from './item-relationships/item-relationships.component'; import { EditRelationshipComponent } from './item-relationships/edit-relationship/edit-relationship.component'; -import { EditRelationshipListComponent } from './item-relationships/edit-relationship-list/edit-relationship-list.component'; +import { + EditRelationshipListComponent +} from './item-relationships/edit-relationship-list/edit-relationship-list.component'; import { AbstractItemUpdateComponent } from './abstract-item-update/abstract-item-update.component'; import { ItemMoveComponent } from './item-move/item-move.component'; -import { ItemEditBitstreamBundleComponent } from './item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component'; +import { + ItemEditBitstreamBundleComponent +} from './item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component'; import { BundleDataService } from '../../core/data/bundle-data.service'; import { DragDropModule } from '@angular/cdk/drag-drop'; -import { ItemEditBitstreamDragHandleComponent } from './item-bitstreams/item-edit-bitstream-drag-handle/item-edit-bitstream-drag-handle.component'; -import { PaginatedDragAndDropBitstreamListComponent } from './item-bitstreams/item-edit-bitstream-bundle/paginated-drag-and-drop-bitstream-list/paginated-drag-and-drop-bitstream-list.component'; +import { + ItemEditBitstreamDragHandleComponent +} from './item-bitstreams/item-edit-bitstream-drag-handle/item-edit-bitstream-drag-handle.component'; +import { + PaginatedDragAndDropBitstreamListComponent +} from './item-bitstreams/item-edit-bitstream-bundle/paginated-drag-and-drop-bitstream-list/paginated-drag-and-drop-bitstream-list.component'; import { VirtualMetadataComponent } from './virtual-metadata/virtual-metadata.component'; import { ItemVersionHistoryComponent } from './item-version-history/item-version-history.component'; import { ItemAuthorizationsComponent } from './item-authorizations/item-authorizations.component'; @@ -43,10 +51,10 @@ import { AccessControlArrayFormModule } from '../../shared/access-control-array-form/access-control-array-form.component'; import { UiSwitchModule } from 'ngx-ui-switch'; -import { - ItemAccessControlSelectBitstreamsModalComponent -} from './item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component'; import { ResultsBackButtonModule } from '../../shared/results-back-button/results-back-button.module'; +import { + AccessControlFormContainerModule +} from '../../shared/access-control-form-container/access-control-form-container.component'; /** @@ -67,6 +75,7 @@ import { ResultsBackButtonModule } from '../../shared/results-back-button/result AccessControlArrayFormModule, UiSwitchModule, ResultsBackButtonModule, + AccessControlFormContainerModule, ], declarations: [ EditItemPageComponent, @@ -95,7 +104,6 @@ import { ResultsBackButtonModule } from '../../shared/results-back-button/result IdentifierDataComponent, ItemRegisterDoiComponent, ItemAccessControlComponent, - ItemAccessControlSelectBitstreamsModalComponent ], providers: [ BundleDataService, diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html index 6b65f2fe8b..7bef310717 100644 --- a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.html @@ -1,159 +1,6 @@ -
-
-
-

{{ 'item-access-control-title' | translate }}

- -
-
-
-

- {{ 'access-control-item-header-toggle' | translate }} -

- - -
- -
-
- {{ 'access-control-mode' | translate }} -
-
-
- - -
-
- - -
-
-
- -
-
{{'access-control-access-conditions' | translate}}
-
- {{'access-control-no-access-conditions-warning-message' | translate}} -
-
- - - - -
-
-
-

- {{'access-control-bitstream-header-toggle' | translate}} -

- - -
- -
-
- {{'access-control-limit-to-specific' | translate}} -
-
-
- - -
-
- - -
-
-
- -
-
- {{'access-control-mode' | translate}} -
-
-
- - -
-
- - -
-
-
- -
-
- {{'access-control-access-conditions' | translate}} -
- -
- {{'access-control-no-access-conditions-warning-message' | translate}} -
-
- - - - -
-
- -
- -
- - -
-
-
-
+ +

{{ 'item-access-control-title' | translate }}

+
diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts index 29f1d55ada..874b624494 100644 --- a/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts +++ b/src/app/item-page/edit-item-page/item-access-control/item-access-control.component.ts @@ -1,48 +1,21 @@ -import { ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { - AccessControlArrayFormComponent -} from '../../../shared/access-control-array-form/access-control-array-form.component'; -import { concatMap, Observable, shareReplay } from 'rxjs'; -import { ItemAccessControlService } from './item-access-control.service'; -import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; -import { - ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID, - ItemAccessControlSelectBitstreamsModalComponent -} from './item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component'; -import { map, take } from 'rxjs/operators'; +import { Component, OnInit } from '@angular/core'; +import { Observable } from 'rxjs'; +import { map } from 'rxjs/operators'; import { getFirstSucceededRemoteData } from '../../../core/shared/operators'; import { RemoteData } from '../../../core/data/remote-data'; import { Item } from '../../../core/shared/item.model'; import { ActivatedRoute } from '@angular/router'; -import { SelectableListService } from '../../../shared/object-list/selectable-list/selectable-list.service'; -import { ListableObject } from '../../../shared/object-collection/shared/listable-object.model'; @Component({ selector: 'ds-item-access-control', templateUrl: './item-access-control.component.html', styleUrls: [ './item-access-control.component.scss' ], - providers: [ ItemAccessControlService ] }) -export class ItemAccessControlComponent implements OnInit, OnDestroy { +export class ItemAccessControlComponent implements OnInit { itemRD$: Observable>; - @ViewChild('bitstreamAccessCmp', { static: true }) bitstreamAccessCmp: AccessControlArrayFormComponent; - @ViewChild('itemAccessCmp', { static: true }) itemAccessCmp: AccessControlArrayFormComponent; - - constructor( - private itemAccessControlService: ItemAccessControlService, - private selectableListService: SelectableListService, - protected modalService: NgbModal, - private route: ActivatedRoute, - private cdr: ChangeDetectorRef - ) {} - - state = initialState; - - dropdownData$ = this.itemAccessControlService.dropdownData$.pipe( - shareReplay(1) - ); + constructor(private route: ActivatedRoute) {} ngOnInit(): void { this.itemRD$ = this.route.parent.parent.data.pipe( @@ -50,59 +23,4 @@ export class ItemAccessControlComponent implements OnInit, OnDestroy { ).pipe(getFirstSucceededRemoteData()) as Observable>; } - reset() { - this.bitstreamAccessCmp.reset(); - this.itemAccessCmp.reset(); - this.state = initialState; - } - - submit() { - const bitstreamAccess = this.bitstreamAccessCmp.getValue(); - const itemAccess = this.itemAccessCmp.getValue(); - - this.itemAccessControlService.execute({ - bitstreamAccess, - itemAccess, - state: this.state - }); - } - - handleStatusChange(type: 'item' | 'bitstream', active: boolean) { - if (type === 'bitstream') { - active ? this.bitstreamAccessCmp.enable() : this.bitstreamAccessCmp.disable(); - } else if (type === 'item') { - active ? this.itemAccessCmp.enable() : this.itemAccessCmp.disable(); - } - } - - openSelectBitstreamsModal(item: Item) { - const ref = this.modalService.open(ItemAccessControlSelectBitstreamsModalComponent); - ref.componentInstance.selectedBitstreams = this.state.bitstream.selectedBitstreams; - ref.componentInstance.item = item; - - ref.closed.pipe( - concatMap(() => this.selectableListService.getSelectableList(ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID)), - take(1) - ).subscribe((list) => { - this.state.bitstream.selectedBitstreams = list.selection; - this.cdr.detectChanges(); - }); - } - - ngOnDestroy(): void { - this.selectableListService.deselectAll(ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID); - } } - -const initialState = { - item: { - toggleStatus: false, - accessMode: '', - }, - bitstream: { - toggleStatus: false, - accessMode: '', - changesLimit: '', // 'all' | 'selected' - selectedBitstreams: [] as ListableObject[], - }, -}; diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.html b/src/app/shared/access-control-form-container/access-control-form-container.component.html new file mode 100644 index 0000000000..71175ce588 --- /dev/null +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.html @@ -0,0 +1,160 @@ +
+
+
+ + +
+
+
+

+ {{ 'access-control-item-header-toggle' | translate }} +

+ + +
+ +
+
+ {{ 'access-control-mode' | translate }} +
+
+
+ + +
+
+ + +
+
+
+ +
+
{{'access-control-access-conditions' | translate}}
+
+ {{'access-control-no-access-conditions-warning-message' | translate}} +
+
+ + + + +
+
+
+

+ {{'access-control-bitstream-header-toggle' | translate}} +

+ + +
+ +
+
+ {{'access-control-limit-to-specific' | translate}} +
+
+
+ + +
+
+ + +
+
+
+ +
+
+ {{'access-control-mode' | translate}} +
+
+
+ + +
+
+ + +
+
+
+ +
+
+ {{'access-control-access-conditions' | translate}} +
+ +
+ {{'access-control-no-access-conditions-warning-message' | translate}} +
+
+ + + + +
+
+ +
+ +
+ + +
+
+
+
diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.scss b/src/app/shared/access-control-form-container/access-control-form-container.component.scss similarity index 100% rename from src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.scss rename to src/app/shared/access-control-form-container/access-control-form-container.component.scss diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.spec.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.spec.ts new file mode 100644 index 0000000000..871e301209 --- /dev/null +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.spec.ts @@ -0,0 +1,25 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { AccessControlFormContainerComponent } from './access-control-form-container.component'; + +describe('AccessControlFormContainerComponent', () => { + let component: AccessControlFormContainerComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + declarations: [ AccessControlFormContainerComponent ] + }) + .compileComponents(); + }); + + beforeEach(() => { + fixture = TestBed.createComponent(AccessControlFormContainerComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/access-control-form-container/access-control-form-container.component.ts b/src/app/shared/access-control-form-container/access-control-form-container.component.ts new file mode 100644 index 0000000000..a2e9cb08ab --- /dev/null +++ b/src/app/shared/access-control-form-container/access-control-form-container.component.ts @@ -0,0 +1,144 @@ +import { ChangeDetectorRef, Component, Input, NgModule, ViewChild } from '@angular/core'; +import { concatMap, shareReplay } from 'rxjs'; +import { RemoteData } from '../../core/data/remote-data'; +import { Item } from '../../core/shared/item.model'; +import { + AccessControlArrayFormComponent, + AccessControlArrayFormModule +} from '../access-control-array-form/access-control-array-form.component'; +import { BulkAccessControlService } from './bulk-access-control.service'; +import { SelectableListService } from '../object-list/selectable-list/selectable-list.service'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { take } from 'rxjs/operators'; +import { CommonModule } from '@angular/common'; +import { ListableObject } from '../object-collection/shared/listable-object.model'; +import { SharedModule } from '../shared.module'; +import { TranslateModule } from '@ngx-translate/core'; +import { UiSwitchModule } from 'ngx-ui-switch'; +import { DSpaceObject } from '../../core/shared/dspace-object.model'; +import { + ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID, + ItemAccessControlSelectBitstreamsModalComponent +} from './item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component'; + +@Component({ + selector: 'ds-access-control-form-container', + templateUrl: './access-control-form-container.component.html', + styleUrls: [ './access-control-form-container.component.scss' ], + exportAs: 'dsAccessControlForm' +}) +export class AccessControlFormContainerComponent { + + @Input() showLimitToSpecificBitstreams = false; + @Input() itemRD: RemoteData; + + @Input() hideSubmit = false; + + @ViewChild('bitstreamAccessCmp', { static: true }) bitstreamAccessCmp: AccessControlArrayFormComponent; + @ViewChild('itemAccessCmp', { static: true }) itemAccessCmp: AccessControlArrayFormComponent; + + constructor( + private bulkAccessControlService: BulkAccessControlService, + private selectableListService: SelectableListService, + protected modalService: NgbModal, + private cdr: ChangeDetectorRef + ) {} + + state = initialState; + + dropdownData$ = this.bulkAccessControlService.dropdownData$.pipe( + shareReplay(1) + ); + + getFormValue() { + return { + bitstream: this.bitstreamAccessCmp.getValue(), + item: this.itemAccessCmp.getValue(), + state: this.state + }; + } + + reset() { + this.bitstreamAccessCmp.reset(); + this.itemAccessCmp.reset(); + this.state = initialState; + } + + submit() { + const bitstreamAccess = this.bitstreamAccessCmp.getValue(); + const itemAccess = this.itemAccessCmp.getValue(); + + const { file } = this.bulkAccessControlService.createPayloadFile({ + bitstreamAccess, + itemAccess, + state: this.state + }); + + this.bulkAccessControlService.executeScript( + [ this.itemRD.payload.uuid ], + file + ).pipe(take(1)).subscribe((res) => { + console.log('success', res); + }); + } + + handleStatusChange(type: 'item' | 'bitstream', active: boolean) { + if (type === 'bitstream') { + active ? this.bitstreamAccessCmp.enable() : this.bitstreamAccessCmp.disable(); + } else if (type === 'item') { + active ? this.itemAccessCmp.enable() : this.itemAccessCmp.disable(); + } + } + + openSelectBitstreamsModal(item: Item) { + const ref = this.modalService.open(ItemAccessControlSelectBitstreamsModalComponent); + ref.componentInstance.selectedBitstreams = this.state.bitstream.selectedBitstreams; + ref.componentInstance.item = item; + + ref.closed.pipe( + concatMap(() => this.selectableListService.getSelectableList(ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID)), + take(1) + ).subscribe((list) => { + this.state.bitstream.selectedBitstreams = list.selection; + this.cdr.detectChanges(); + }); + } + + // eslint-disable-next-line @angular-eslint/use-lifecycle-interface + ngOnDestroy(): void { + this.selectableListService.deselectAll(ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID); + } +} + + +const initialState = { + item: { + toggleStatus: false, + accessMode: '', + }, + bitstream: { + toggleStatus: false, + accessMode: '', + changesLimit: '', // 'all' | 'selected' + selectedBitstreams: [] as ListableObject[], + }, +}; + + +@NgModule({ + imports: [ + CommonModule, + AccessControlArrayFormModule, + SharedModule, + TranslateModule, + UiSwitchModule + ], + declarations: [ + AccessControlFormContainerComponent, + ItemAccessControlSelectBitstreamsModalComponent + ], + exports: [ AccessControlFormContainerComponent ], +}) +export class AccessControlFormContainerModule {} + + diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control.service.ts b/src/app/shared/access-control-form-container/bulk-access-control.service.ts similarity index 64% rename from src/app/item-page/edit-item-page/item-access-control/item-access-control.service.ts rename to src/app/shared/access-control-form-container/bulk-access-control.service.ts index 57b28f81b0..85ec05cd60 100644 --- a/src/app/item-page/edit-item-page/item-access-control/item-access-control.service.ts +++ b/src/app/shared/access-control-form-container/bulk-access-control.service.ts @@ -1,6 +1,8 @@ import { Injectable } from '@angular/core'; import { Observable, of } from 'rxjs'; -import { AccessControlItem } from '../../../core/shared/bulk-access-condition-options.model'; +import { AccessControlItem } from '../../core/shared/bulk-access-condition-options.model'; +import { ScriptDataService } from '../../core/data/processes/script-data.service'; +import { ProcessParameter } from '../../process-page/processes/process-parameter.model'; export interface AccessControlDropdownDataResponse { id: string; @@ -8,12 +10,13 @@ export interface AccessControlDropdownDataResponse { bitstreamAccessConditionOptions: AccessControlItem[]; } -@Injectable() -export class ItemAccessControlService { +@Injectable({ providedIn: 'root' }) +export class BulkAccessControlService { + constructor(private scriptService: ScriptDataService) {} + dropdownData$: Observable = of(accessControlDropdownData); - - execute(payload: any) { + createPayloadFile(payload: any) { console.log('execute', payload); const blob = new Blob([JSON.stringify(payload, null, 2)], { @@ -25,7 +28,19 @@ export class ItemAccessControlService { }); const url = URL.createObjectURL(file); - window.open(url, '_blank'); + window.open(url, '_blank'); // remove this later + + return { url, file }; + } + + executeScript(uuids: string[], file: File) { + console.log('execute', { uuids, file }); + + const params: ProcessParameter[] = [ + { name: 'uuid', value: uuids.join(',') }, + ]; + + return this.scriptService.invoke('bulk-access-control', params, [file]); } } diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html b/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html similarity index 100% rename from src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html rename to src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.html diff --git a/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.scss b/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.spec.ts b/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.spec.ts similarity index 100% rename from src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.spec.ts rename to src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.spec.ts diff --git a/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts b/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts similarity index 69% rename from src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts rename to src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts index dbae803c44..171b1d59c1 100644 --- a/src/app/item-page/edit-item-page/item-access-control/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts +++ b/src/app/shared/access-control-form-container/item-access-control-select-bitstreams-modal/item-access-control-select-bitstreams-modal.component.ts @@ -1,17 +1,17 @@ import { Component, Input, OnInit } from '@angular/core'; import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap'; -import { PaginationService } from '../../../../core/pagination/pagination.service'; -import { TranslateService } from '@ngx-translate/core'; -import { BitstreamDataService } from '../../../../core/data/bitstream-data.service'; import { BehaviorSubject } from 'rxjs'; -import { Item } from '../../../../core/shared/item.model'; -import { getFirstCompletedRemoteData } from '../../../../core/shared/operators'; -import { PaginatedList } from '../../../../core/data/paginated-list.model'; -import { Bitstream } from '../../../../core/shared/bitstream.model'; -import { RemoteData } from '../../../../core/data/remote-data'; -import { PaginationComponentOptions } from '../../../../shared/pagination/pagination-component-options.model'; -import { hasValue } from '../../../../shared/empty.util'; -import { Context } from '../../../../core/shared/context.model'; +import { PaginatedList } from 'src/app/core/data/paginated-list.model'; +import { RemoteData } from 'src/app/core/data/remote-data'; +import { Bitstream } from 'src/app/core/shared/bitstream.model'; +import { Context } from 'src/app/core/shared/context.model'; +import { PaginationComponentOptions } from '../../pagination/pagination-component-options.model'; +import { Item } from '../../../core/shared/item.model'; +import { BitstreamDataService } from '../../../core/data/bitstream-data.service'; +import { PaginationService } from '../../../core/pagination/pagination.service'; +import { TranslateService } from '@ngx-translate/core'; +import { hasValue } from '../../empty.util'; +import { getFirstCompletedRemoteData } from '../../../core/shared/operators'; export const ITEM_ACCESS_CONTROL_SELECT_BITSTREAMS_LIST_ID = 'item-access-control-select-bitstreams'