diff --git a/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html b/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html
index 9032a2e4a..8f94c0440 100644
--- a/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html
+++ b/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.html
@@ -141,6 +141,7 @@
i18n-confirmMessage
[disabled]="!userIsOwner || !userCanEdit"
(confirm)="deleteVersion(version.id)"
+ *pngxIfPermissions="{ action: PermissionAction.Delete, type: PermissionType.Document }"
>
Delete version
diff --git a/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.spec.ts b/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.spec.ts
index 23f1ad499..f0e30197f 100644
--- a/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.spec.ts
+++ b/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.spec.ts
@@ -1,10 +1,16 @@
import { DatePipe } from '@angular/common'
import { SimpleChange, signal } from '@angular/core'
import { ComponentFixture, TestBed } from '@angular/core/testing'
+import { By } from '@angular/platform-browser'
import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons'
import { Subject, of, throwError } from 'rxjs'
import { DocumentVersionInfo } from 'src/app/data/document'
+import {
+ PermissionAction,
+ PermissionsService,
+ PermissionType,
+} from 'src/app/services/permissions.service'
import { DocumentService } from 'src/app/services/rest/document.service'
import { SettingsService } from 'src/app/services/settings.service'
import { ToastService } from 'src/app/services/toast.service'
@@ -31,6 +37,9 @@ describe('DocumentVersionDropdownComponent', () => {
let finished$: Subject<{ taskId: string }>
let failed$: Subject<{ taskId: string; message?: string }>
let modalService: jest.Mocked>
+ let permissionsService: jest.Mocked<
+ Pick
+ >
beforeEach(async () => {
finished$ = new Subject<{ taskId: string }>()
@@ -47,6 +56,9 @@ describe('DocumentVersionDropdownComponent', () => {
showError: jest.fn(),
showInfo: jest.fn(),
}
+ permissionsService = {
+ currentUserCan: jest.fn().mockReturnValue(true),
+ }
await TestBed.configureTestingModule({
imports: [
@@ -73,6 +85,10 @@ describe('DocumentVersionDropdownComponent', () => {
provide: NgbModal,
useValue: modalService,
},
+ {
+ provide: PermissionsService,
+ useValue: permissionsService,
+ },
{
provide: WebsocketStatusService,
useValue: {
@@ -143,6 +159,31 @@ describe('DocumentVersionDropdownComponent', () => {
)
})
+ it('should not show version delete buttons without document delete permission', () => {
+ fixture.destroy()
+ permissionsService.currentUserCan.mockReturnValue(false)
+ fixture = TestBed.createComponent(DocumentVersionDropdownComponent)
+ component = fixture.componentInstance
+ component.documentId = 3
+ component.selectedVersionId = 3
+ component.userIsOwner = true
+ component.userCanEdit = true
+ component.versions = [
+ { id: 3, is_root: true, checksum: 'aaaa' },
+ { id: 10, is_root: false, checksum: 'bbbb' },
+ ]
+
+ fixture.detectChanges()
+
+ expect(permissionsService.currentUserCan).toHaveBeenCalledWith(
+ PermissionAction.Delete,
+ PermissionType.Document
+ )
+ expect(
+ fixture.debugElement.queryAll(By.css('pngx-confirm-button'))
+ ).toHaveLength(0)
+ })
+
it('beginEditingVersion should set active row and draft label', () => {
component.userCanEdit = true
component.userIsOwner = true
diff --git a/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.ts b/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.ts
index f9711fd76..a341cfa16 100644
--- a/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.ts
+++ b/src-ui/src/app/components/document-detail/document-version-dropdown/document-version-dropdown.component.ts
@@ -25,6 +25,7 @@ import {
tap,
} from 'rxjs/operators'
import { DocumentVersionInfo } from 'src/app/data/document'
+import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive'
import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe'
import { DocumentService } from 'src/app/services/rest/document.service'
import { ToastService } from 'src/app/services/toast.service'
@@ -33,6 +34,7 @@ import {
WebsocketStatusService,
} from 'src/app/services/websocket-status.service'
import { ConfirmButtonComponent } from '../../common/confirm-button/confirm-button.component'
+import { ComponentWithPermissions } from '../../with-permissions/with-permissions.component'
import { AddExistingDocumentVersionDialogComponent } from './add-existing-document-version-dialog/add-existing-document-version-dialog.component'
@Component({
@@ -44,11 +46,15 @@ import { AddExistingDocumentVersionDialogComponent } from './add-existing-docume
NgbDropdownModule,
NgxBootstrapIconsModule,
ConfirmButtonComponent,
+ IfPermissionsDirective,
SlicePipe,
CustomDatePipe,
],
})
-export class DocumentVersionDropdownComponent implements OnChanges, OnDestroy {
+export class DocumentVersionDropdownComponent
+ extends ComponentWithPermissions
+ implements OnChanges, OnDestroy
+{
UploadState = UploadState
@Input() documentId: number