Skip to content

Commit 6819677

Browse files
committed
[DSC-1504] Check 'audit.enabled' in CRIS context menu
Refs: DURACOM-317, DSC-1504
1 parent fdeceaf commit 6819677

3 files changed

Lines changed: 44 additions & 9 deletions

File tree

src/app/shared/context-menu/audit-item/audit-item-menu.component.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
@if ((isAuthorized$ | async)) {
1+
@if (showMenuItem$ | async) {
22
<button class="dropdown-item"
33
[innerHTML]="'context-menu.actions.audit-item.btn' | translate"
44
[routerLink]="link">

src/app/shared/context-menu/audit-item/audit-item-menu.component.spec.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,14 @@ import { getTestScheduler } from 'jasmine-marbles';
1313
import { of } from 'rxjs';
1414
import { TestScheduler } from 'rxjs/testing';
1515

16+
import { ConfigurationDataService } from '../../../core/data/configuration-data.service';
1617
import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service';
18+
import { ConfigurationProperty } from '../../../core/shared/configuration-property.model';
1719
import { DSpaceObject } from '../../../core/shared/dspace-object.model';
1820
import { DSpaceObjectType } from '../../../core/shared/dspace-object-type.model';
1921
import { Item } from '../../../core/shared/item.model';
2022
import { TranslateLoaderMock } from '../../mocks/translate-loader.mock';
23+
import { createSuccessfulRemoteDataObject$ } from '../../remote-data.utils';
2124
import { AuditItemMenuComponent } from './audit-item-menu.component';
2225

2326
describe('AuditItemMenuComponent', () => {
@@ -31,6 +34,15 @@ describe('AuditItemMenuComponent', () => {
3134
isAuthorized: jasmine.createSpy('isAuthorized'),
3235
});
3336

37+
const configurationDataService = jasmine.createSpyObj('configurationDataService', {
38+
findByPropertyName: createSuccessfulRemoteDataObject$(Object.assign(new ConfigurationProperty(), {
39+
name: 'audit.enabled',
40+
values: [
41+
'true',
42+
],
43+
})),
44+
});
45+
3446
beforeEach(waitForAsync(() => {
3547
dso = Object.assign(new Item(), {
3648
id: 'test-item',
@@ -54,6 +66,7 @@ describe('AuditItemMenuComponent', () => {
5466
{ provide: 'contextMenuObjectProvider', useValue: dso },
5567
{ provide: 'contextMenuObjectTypeProvider', useValue: DSpaceObjectType.ITEM },
5668
{ provide: AuthorizationDataService, useValue: authorizationDataServiceStub },
69+
{ provide: ConfigurationDataService, useValue: configurationDataService },
5770
],
5871
}).compileComponents();
5972
}));

src/app/shared/context-menu/audit-item/audit-item-menu.component.ts

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,23 @@ import {
77
import { RouterLink } from '@angular/router';
88
import { TranslateModule } from '@ngx-translate/core';
99
import {
10-
BehaviorSubject,
1110
combineLatest,
11+
Observable,
1212
} from 'rxjs';
13-
import { take } from 'rxjs/operators';
13+
import {
14+
map,
15+
startWith,
16+
} from 'rxjs/operators';
1417

1518
import { getDSORoute } from '../../../app-routing-paths';
19+
import { ConfigurationDataService } from '../../../core/data/configuration-data.service';
1620
import { AuthorizationDataService } from '../../../core/data/feature-authorization/authorization-data.service';
1721
import { FeatureID } from '../../../core/data/feature-authorization/feature-id';
22+
import { RemoteData } from '../../../core/data/remote-data';
23+
import { ConfigurationProperty } from '../../../core/shared/configuration-property.model';
1824
import { DSpaceObject } from '../../../core/shared/dspace-object.model';
1925
import { DSpaceObjectType } from '../../../core/shared/dspace-object-type.model';
26+
import { getFirstCompletedRemoteData } from '../../../core/shared/operators';
2027
import { URLCombiner } from '../../../core/url-combiner/url-combiner';
2128
import { ContextMenuEntryComponent } from '../context-menu-entry.component';
2229
import { ContextMenuEntryType } from '../context-menu-entry-type';
@@ -35,31 +42,46 @@ import { ContextMenuEntryType } from '../context-menu-entry-type';
3542
})
3643
export class AuditItemMenuComponent extends ContextMenuEntryComponent implements OnInit {
3744

38-
public isAuthorized$: BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);
45+
public showMenuItem$: Observable<boolean>;
3946

4047
constructor(
4148
@Inject('contextMenuObjectProvider') protected injectedContextMenuObject: DSpaceObject,
4249
@Inject('contextMenuObjectTypeProvider') protected injectedContextMenuObjectType: DSpaceObjectType,
4350
private authorizationService: AuthorizationDataService,
51+
private configurationDataService: ConfigurationDataService,
4452
) {
4553
super(injectedContextMenuObject, injectedContextMenuObjectType, ContextMenuEntryType.Audit);
4654
}
4755

4856
ngOnInit(): void {
49-
combineLatest(
57+
58+
const isEnabled$ = this.configurationDataService.findByPropertyName('audit.enabled').pipe(
59+
getFirstCompletedRemoteData(),
60+
map((response: RemoteData<ConfigurationProperty>) => this.isPropertyEnabled(response)),
61+
);
62+
63+
const isAuthorized$ = combineLatest(
5064
[
5165
this.authorizationService.isAuthorized(FeatureID.AdministratorOf),
5266
this.authorizationService.isAuthorized(FeatureID.IsCollectionAdmin),
5367
this.authorizationService.isAuthorized(FeatureID.IsCommunityAdmin),
5468
],
5569
).pipe(
56-
take(1),
57-
).subscribe(([isAdmin, isCollectionAdmin, isCommunityAdmin]) => {
58-
this.isAuthorized$.next(isAdmin || isCommunityAdmin || isCollectionAdmin);
59-
});
70+
map(([isAdmin, isCollectionAdmin, isCommunityAdmin]) => isAdmin || isCollectionAdmin || isCommunityAdmin),
71+
);
72+
73+
this.showMenuItem$ = combineLatest([isEnabled$, isAuthorized$]).pipe(
74+
map(([isEnabled, isAuthorized]) => isAuthorized && isEnabled),
75+
startWith(false),
76+
);
6077
}
6178

6279
get link() {
6380
return new URLCombiner(getDSORoute(this.contextMenuObject), 'auditlogs').toString();
6481
}
82+
83+
private isPropertyEnabled(property: RemoteData<ConfigurationProperty>): boolean {
84+
return property.hasSucceeded ? (property.payload.values.length > 0 && property.payload.values[0] === 'true') : false;
85+
}
86+
6587
}

0 commit comments

Comments
 (0)