Skip to content

Commit cbc4db0

Browse files
author
Joran De Braekeleer
committed
140086: Add config support to disable bitstream replacement
1 parent adc73d6 commit cbc4db0

11 files changed

Lines changed: 89 additions & 20 deletions

src/app/bitstream-page/bitstream-page-routes.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { bitstreamPageAuthorizationsGuard } from './bitstream-page-authorization
1515
import { ThemedEditBitstreamPageComponent } from './edit-bitstream-page/themed-edit-bitstream-page.component';
1616
import { legacyBitstreamURLRedirectGuard } from './legacy-bitstream-url-redirect.guard';
1717
import { ReplaceBitstreamPageComponent } from './replace-bitstream-page/replace-bitstream-page.component';
18+
import { replaceBitstreamPageGuard } from './replace-bitstream-page/replace-bitstream-page.guard';
1819

1920
const EDIT_BITSTREAM_PATH = ':id/edit';
2021
const EDIT_BITSTREAM_AUTHORIZATIONS_PATH = ':id/authorizations';
@@ -61,7 +62,7 @@ export const ROUTES: Route[] = [
6162
bitstream: bitstreamPageResolver,
6263
breadcrumb: i18nBreadcrumbResolver,
6364
},
64-
canActivate: [authenticatedGuard],
65+
canActivate: [authenticatedGuard, replaceBitstreamPageGuard],
6566
data: {
6667
title: 'bitstream.replace.page.title',
6768
breadcrumbKey: 'bitstream.replace.page',

src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.html

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,15 @@ <h1 class="h2 dont-break-out">{{dsoNameService.getName(bitstreamRD?.payload)}} <
2525
<div additional class="container py-3">
2626
<p>
2727
<a
28-
[routerLink]="['/bitstreams', bitstreamRD?.payload?.id, 'authorizations']">{{'bitstream.edit.authorizations.link' | translate}}</a>
28+
[routerLink]="['/bitstreams', bitstreamRD?.payload?.id, 'authorizations']">{{ 'bitstream.edit.authorizations.link' | translate }}</a>
2929
</p>
30-
<p>
31-
<a
32-
[routerLink]="['/bitstreams', bitstreamRD?.payload?.id, 'replace']">{{'bitstream.edit.replace.link' | translate}}</a>
33-
</p> </div>
30+
@if (showReplaceButton$ | async) {
31+
<p>
32+
<a
33+
[routerLink]="['/bitstreams', bitstreamRD?.payload?.id, 'replace']">{{ 'bitstream.edit.replace.link' | translate }}</a>
34+
</p>
35+
}
36+
</div>
3437
</ds-form>
3538
}
3639
</div>

src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.spec.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { RouterTestingModule } from '@angular/router/testing';
1919
import { DSONameService } from '@dspace/core/breadcrumbs/dso-name.service';
2020
import { BitstreamDataService } from '@dspace/core/data/bitstream-data.service';
2121
import { BitstreamFormatDataService } from '@dspace/core/data/bitstream-format-data.service';
22+
import { ConfigurationDataService } from '@dspace/core/data/configuration-data.service';
2223
import { PrimaryBitstreamService } from '@dspace/core/data/primary-bitstream.service';
2324
import {
2425
INotification,
@@ -31,6 +32,7 @@ import { BitstreamFormat } from '@dspace/core/shared/bitstream-format.model';
3132
import { BitstreamFormatSupportLevel } from '@dspace/core/shared/bitstream-format-support-level';
3233
import { Item } from '@dspace/core/shared/item.model';
3334
import { MetadataValueFilter } from '@dspace/core/shared/metadata.models';
35+
import { ConfigurationDataServiceStub } from '@dspace/core/testing/configuration-data.service.stub';
3436
import { createPaginatedList } from '@dspace/core/testing/utils.test';
3537
import {
3638
createSuccessfulRemoteDataObject,
@@ -231,6 +233,7 @@ describe('EditBitstreamPageComponent', () => {
231233
{ provide: BitstreamFormatDataService, useValue: bitstreamFormatService },
232234
{ provide: PrimaryBitstreamService, useValue: primaryBitstreamService },
233235
ChangeDetectorRef,
236+
{ provide: ConfigurationDataService, useValue: new ConfigurationDataServiceStub() },
234237
],
235238
schemas: [NO_ERRORS_SCHEMA],
236239
}).compileComponents();
@@ -526,6 +529,7 @@ describe('EditBitstreamPageComponent', () => {
526529
{ provide: BitstreamFormatDataService, useValue: bitstreamFormatService },
527530
{ provide: PrimaryBitstreamService, useValue: primaryBitstreamService },
528531
ChangeDetectorRef,
532+
{ provide: ConfigurationDataService, useValue: new ConfigurationDataServiceStub() },
529533
],
530534
schemas: [NO_ERRORS_SCHEMA],
531535
}).compileComponents();
@@ -649,6 +653,7 @@ describe('EditBitstreamPageComponent', () => {
649653
{ provide: BitstreamFormatDataService, useValue: bitstreamFormatService },
650654
{ provide: PrimaryBitstreamService, useValue: primaryBitstreamService },
651655
ChangeDetectorRef,
656+
{ provide: ConfigurationDataService, useValue: new ConfigurationDataServiceStub() },
652657
],
653658
schemas: [NO_ERRORS_SCHEMA],
654659
}).compileComponents();

src/app/bitstream-page/edit-bitstream-page/edit-bitstream-page.component.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { DSONameService } from '@dspace/core/breadcrumbs/dso-name.service';
1616
import { FindAllDataImpl } from '@dspace/core/data/base/find-all-data';
1717
import { BitstreamDataService } from '@dspace/core/data/bitstream-data.service';
1818
import { BitstreamFormatDataService } from '@dspace/core/data/bitstream-format-data.service';
19+
import { ConfigurationDataService } from '@dspace/core/data/configuration-data.service';
1920
import { PrimaryBitstreamService } from '@dspace/core/data/primary-bitstream.service';
2021
import { RemoteData } from '@dspace/core/data/remote-data';
2122
import { NotificationsService } from '@dspace/core/notification-system/notifications.service';
@@ -428,6 +429,11 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy {
428429
*/
429430
isIIIF = false;
430431

432+
/**
433+
* Whether bitstream replacement is enabled in the backend
434+
*/
435+
showReplaceButton$: Observable<boolean>;
436+
431437
/**
432438
* Array to track all subscriptions and unsubscribe them onDestroy
433439
* @type {Array}
@@ -455,6 +461,7 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy {
455461
private notificationsService: NotificationsService,
456462
private bitstreamFormatService: BitstreamFormatDataService,
457463
private primaryBitstreamService: PrimaryBitstreamService,
464+
private configurationService: ConfigurationDataService,
458465
) {
459466
}
460467

@@ -469,6 +476,10 @@ export class EditBitstreamPageComponent implements OnInit, OnDestroy {
469476
this.itemId = this.route.snapshot.queryParams.itemId;
470477
this.entityType = this.route.snapshot.queryParams.entityType;
471478
this.bitstreamRD$ = this.route.data.pipe(map((data: any) => data.bitstream));
479+
this.showReplaceButton$ = this.configurationService.findByPropertyName('replace-bitstream.enabled').pipe(
480+
getFirstSucceededRemoteDataPayload(),
481+
map(payload => payload?.values.length > 0 && payload?.values[0] === 'true'),
482+
);
472483

473484
const bitstream$ = this.bitstreamRD$.pipe(
474485
getFirstSucceededRemoteData(),
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import { inject } from '@angular/core';
2+
import {
3+
ActivatedRouteSnapshot,
4+
CanActivateFn,
5+
RouterStateSnapshot,
6+
UrlTree,
7+
} from '@angular/router';
8+
import { ConfigurationDataService } from '@dspace/core/data/configuration-data.service';
9+
import { getFirstSucceededRemoteDataPayload } from '@dspace/core/shared/operators';
10+
import { Observable } from 'rxjs';
11+
import { map } from 'rxjs/operators';
12+
13+
export const replaceBitstreamPageGuard: CanActivateFn = (
14+
route: ActivatedRouteSnapshot,
15+
state: RouterStateSnapshot,
16+
configurationService: ConfigurationDataService = inject(ConfigurationDataService),
17+
): Observable<UrlTree | boolean> => {
18+
return configurationService.findByPropertyName('replace-bitstream.enabled').pipe(
19+
getFirstSucceededRemoteDataPayload(),
20+
map(payload => payload?.values.length > 0 && payload?.values[0] === 'true'),
21+
);
22+
};

src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component.html

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,12 @@
109109
title="{{'item.edit.bitstreams.edit.buttons.edit' | translate}}">
110110
<i class="fas fa-edit fa-fw"></i>
111111
</button>
112-
<button [routerLink]="['/bitstreams/', entry.id, 'replace']" class="btn btn-outline-primary btn-sm"
113-
title="{{'item.edit.bitstreams.edit.buttons.replace' | translate}}">
114-
<i class="fas fa-retweet fa-fw"></i>
115-
</button>
112+
@if (showReplaceButton$ | async) {
113+
<button [routerLink]="['/bitstreams/', entry.id, 'replace']" class="btn btn-outline-primary btn-sm"
114+
title="{{'item.edit.bitstreams.edit.buttons.replace' | translate}}">
115+
<i class="fas fa-retweet fa-fw"></i>
116+
</button>
117+
}
116118
<button [dsBtnDisabled]="!canRemove(update)" (click)="remove(entry.bitstream)"
117119
[attr.aria-label]=" 'item. edit bitstreams.edit.buttons.remove' | translate"
118120
class="btn btn-outline-danger btn-sm"

src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component.spec.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@ import {
99
waitForAsync,
1010
} from '@angular/core/testing';
1111
import { BundleDataService } from '@dspace/core/data/bundle-data.service';
12+
import { ConfigurationDataService } from '@dspace/core/data/configuration-data.service';
1213
import { FieldChangeType } from '@dspace/core/data/object-updates/field-change-type.model';
1314
import { FieldUpdate } from '@dspace/core/data/object-updates/field-update.model';
1415
import { ObjectUpdatesService } from '@dspace/core/data/object-updates/object-updates.service';
1516
import { RequestService } from '@dspace/core/data/request.service';
1617
import { PaginationService } from '@dspace/core/pagination/pagination.service';
1718
import { Bundle } from '@dspace/core/shared/bundle.model';
1819
import { Item } from '@dspace/core/shared/item.model';
20+
import { ConfigurationDataServiceStub } from '@dspace/core/testing/configuration-data.service.stub';
1921
import { PaginationServiceStub } from '@dspace/core/testing/pagination-service.stub';
2022
import { getMockRequestService } from '@dspace/core/testing/request.service.mock';
2123
import { createPaginatedList } from '@dspace/core/testing/utils.test';
@@ -88,6 +90,7 @@ describe('ItemEditBitstreamBundleComponent', () => {
8890
{ provide: PaginationService, useValue: new PaginationServiceStub() },
8991
{ provide: RequestService, useValue: getMockRequestService() },
9092
{ provide: ItemBitstreamsService, useValue: itemBitstreamsService },
93+
{ provide: ConfigurationDataService, useValue: new ConfigurationDataServiceStub() },
9194
],
9295
schemas: [
9396
NO_ERRORS_SCHEMA,

src/app/item-page/edit-item-page/item-bitstreams/item-edit-bitstream-bundle/item-edit-bitstream-bundle.component.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
import { RouterLink } from '@angular/router';
1616
import { DSONameService } from '@dspace/core/breadcrumbs/dso-name.service';
1717
import { BundleDataService } from '@dspace/core/data/bundle-data.service';
18+
import { ConfigurationDataService } from '@dspace/core/data/configuration-data.service';
1819
import { FieldChangeType } from '@dspace/core/data/object-updates/field-change-type.model';
1920
import { FieldUpdate } from '@dspace/core/data/object-updates/field-update.model';
2021
import { FieldUpdates } from '@dspace/core/data/object-updates/field-updates.model';
@@ -31,6 +32,7 @@ import { followLink } from '@dspace/core/shared/follow-link-config.model';
3132
import { Item } from '@dspace/core/shared/item.model';
3233
import {
3334
getAllSucceededRemoteData,
35+
getFirstSucceededRemoteDataPayload,
3436
paginatedListToArray,
3537
} from '@dspace/core/shared/operators';
3638
import { PaginatedSearchOptions } from '@dspace/core/shared/search/models/paginated-search-options.model';
@@ -186,6 +188,11 @@ export class ItemEditBitstreamBundleComponent implements OnInit, OnDestroy {
186188
*/
187189
updates$: BehaviorSubject<FieldUpdates> = new BehaviorSubject(null);
188190

191+
/**
192+
* Whether bitstream replacement is enabled in the backend
193+
*/
194+
showReplaceButton$: Observable<boolean>;
195+
189196
/**
190197
* Array containing all subscriptions created by this component
191198
*/
@@ -200,6 +207,7 @@ export class ItemEditBitstreamBundleComponent implements OnInit, OnDestroy {
200207
protected paginationService: PaginationService,
201208
protected requestService: RequestService,
202209
protected itemBitstreamsService: ItemBitstreamsService,
210+
protected configurationService: ConfigurationDataService,
203211
) {
204212
}
205213

@@ -209,6 +217,10 @@ export class ItemEditBitstreamBundleComponent implements OnInit, OnDestroy {
209217
this.itemPageRoute = getItemPageRoute(this.item);
210218
this.bundleName = this.dsoNameService.getName(this.bundle);
211219
this.bundleUrl = this.bundle.self;
220+
this.showReplaceButton$ = this.configurationService.findByPropertyName('replace-bitstream.enabled').pipe(
221+
getFirstSucceededRemoteDataPayload(),
222+
map(payload => payload?.values.length > 0 && payload?.values[0] === 'true'),
223+
);
212224

213225
this.initializePagination();
214226
this.initializeBitstreams();

src/app/submission/sections/upload/file/section-upload-file.component.html

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,8 @@
3636
(click)="$event.preventDefault();editBitstreamData();">
3737
<i class="fa fa-edit fa-2x text-normal"></i>
3838
</button>
39-
@if (shouldShowReplaceButton$ | async) {
40-
<button
41-
class="btn btn-link-focus"
39+
@if (showReplaceButton$ | async) {
40+
<button class="btn btn-link-focus"
4241
[attr.aria-label]="'bitstream.edit.replace.link' | translate"
4342
title="{{ 'bitstream.edit.replace.link' | translate }}"
4443
(click)="$event.preventDefault();replaceBitstream();">

src/app/submission/sections/upload/file/section-upload-file.component.spec.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@ import {
1414
} from '@angular/core/testing';
1515
import { By } from '@angular/platform-browser';
1616
import { LinkService } from '@dspace/core/cache/builders/link.service';
17+
import { ConfigurationDataService } from '@dspace/core/data/configuration-data.service';
1718
import { JsonPatchOperationPathCombiner } from '@dspace/core/json-patch/builder/json-patch-operation-path-combiner';
1819
import { JsonPatchOperationsBuilder } from '@dspace/core/json-patch/builder/json-patch-operations-builder';
1920
import { HALEndpointService } from '@dspace/core/shared/hal-endpoint.service';
2021
import { SubmissionJsonPatchOperationsService } from '@dspace/core/submission/submission-json-patch-operations.service';
22+
import { ConfigurationDataServiceStub } from '@dspace/core/testing/configuration-data.service.stub';
2123
import { HALEndpointServiceStub } from '@dspace/core/testing/hal-endpoint-service.stub';
2224
import { getMockLinkService } from '@dspace/core/testing/link-service.mock';
2325
import { getMockSectionUploadService } from '@dspace/core/testing/section-upload.service.mock';
@@ -118,6 +120,7 @@ describe('SubmissionSectionUploadFileComponent', () => {
118120
SubmissionSectionUploadFileComponent,
119121
SubmissionSectionUploadFileEditComponent,
120122
FormBuilderService,
123+
{ provide: ConfigurationDataService, useValue: new ConfigurationDataServiceStub() },
121124
],
122125
})
123126
.overrideComponent(SubmissionSectionUploadFileComponent, {

0 commit comments

Comments
 (0)