Fix: disable inline create buttons if insufficient permissions (#7401)

This commit is contained in:
shamoon
2024-08-05 16:45:48 -07:00
committed by GitHub
parent 9cca7aaa08
commit 928580bf4f
7 changed files with 81 additions and 41 deletions

View File

@@ -32,7 +32,7 @@
</div>
</ng-template>
</ng-select>
@if (allowCreate) {
@if (allowCreate && !hideAddButton) {
<button class="btn btn-outline-secondary" type="button" (click)="createTag()" [disabled]="disabled">
<i-bs width="1.2em" height="1.2em" name="plus"></i-bs>
</button>

View File

@@ -74,6 +74,9 @@ export class TagsComponent implements OnInit, ControlValueAccessor {
@Input()
allowCreate: boolean = true
@Input()
hideAddButton: boolean = false
@Input()
showFilter: boolean = false

View File

@@ -110,12 +110,12 @@
<pngx-input-date i18n-title title="Date created" formControlName="created_date" [suggestions]="suggestions?.dates" [showFilter]="true" [horizontal]="true" (filterDocuments)="filterDocuments($event)"
[error]="error?.created_date"></pngx-input-date>
<pngx-input-select [items]="correspondents" i18n-title title="Correspondent" formControlName="correspondent" [allowNull]="true" [showFilter]="true" [horizontal]="true" (filterDocuments)="filterDocuments($event, DataType.Correspondent)"
(createNew)="createCorrespondent($event)" [suggestions]="suggestions?.correspondents" *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.Correspondent }"></pngx-input-select>
(createNew)="createCorrespondent($event)" [hideAddButton]="createDisabled(DataType.Correspondent)" [suggestions]="suggestions?.correspondents" *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.Correspondent }"></pngx-input-select>
<pngx-input-select [items]="documentTypes" i18n-title title="Document type" formControlName="document_type" [allowNull]="true" [showFilter]="true" [horizontal]="true" (filterDocuments)="filterDocuments($event, DataType.DocumentType)"
(createNew)="createDocumentType($event)" [suggestions]="suggestions?.document_types" *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.DocumentType }"></pngx-input-select>
(createNew)="createDocumentType($event)" [hideAddButton]="createDisabled(DataType.DocumentType)" [suggestions]="suggestions?.document_types" *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.DocumentType }"></pngx-input-select>
<pngx-input-select [items]="storagePaths" i18n-title title="Storage path" formControlName="storage_path" [allowNull]="true" [showFilter]="true" [horizontal]="true" (filterDocuments)="filterDocuments($event, DataType.StoragePath)"
(createNew)="createStoragePath($event)" [suggestions]="suggestions?.storage_paths" i18n-placeholder placeholder="Default" *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.StoragePath }"></pngx-input-select>
<pngx-input-tags formControlName="tags" [suggestions]="suggestions?.tags" [showFilter]="true" [horizontal]="true" (filterDocuments)="filterDocuments($event, DataType.Tag)" *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.Tag }"></pngx-input-tags>
(createNew)="createStoragePath($event)" [hideAddButton]="createDisabled(DataType.StoragePath)" [suggestions]="suggestions?.storage_paths" i18n-placeholder placeholder="Default" *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.StoragePath }"></pngx-input-select>
<pngx-input-tags formControlName="tags" [suggestions]="suggestions?.tags" [showFilter]="true" [horizontal]="true" (filterDocuments)="filterDocuments($event, DataType.Tag)" [hideAddButton]="createDisabled(DataType.Tag)" *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.Tag }"></pngx-input-tags>
@for (fieldInstance of document?.custom_fields; track fieldInstance.field; let i = $index) {
<div [formGroup]="customFieldFormFields.controls[i]">
@switch (getCustomFieldFromInstance(fieldInstance)?.data_type) {

View File

@@ -19,10 +19,6 @@
--page-border: 0;
}
::ng-deep form .ng-select-taggable {
max-width: calc(100% - 90px); // fudge factor for (2x) ng-select button width
}
.btn-group .dropdown-toggle-split {
border-top-right-radius: inherit;
border-bottom-right-radius: inherit;

View File

@@ -1244,4 +1244,20 @@ describe('DocumentDetailComponent', () => {
)
fixture.detectChanges()
}
it('createDisabled should return true if the user does not have permission to add the specified data type', () => {
currentUserCan = false
expect(component.createDisabled(DataType.Correspondent)).toBeTruthy()
expect(component.createDisabled(DataType.DocumentType)).toBeTruthy()
expect(component.createDisabled(DataType.StoragePath)).toBeTruthy()
expect(component.createDisabled(DataType.Tag)).toBeTruthy()
})
it('createDisabled should return false if the user has permission to add the specified data type', () => {
currentUserCan = true
expect(component.createDisabled(DataType.Correspondent)).toBeFalsy()
expect(component.createDisabled(DataType.DocumentType)).toBeFalsy()
expect(component.createDisabled(DataType.StoragePath)).toBeFalsy()
expect(component.createDisabled(DataType.Tag)).toBeFalsy()
})
})

View File

@@ -651,6 +651,31 @@ export class DocumentDetailComponent
})
}
createDisabled(dataType: DataType) {
switch (dataType) {
case DataType.Correspondent:
return !this.permissionsService.currentUserCan(
PermissionAction.Add,
PermissionType.Correspondent
)
case DataType.DocumentType:
return !this.permissionsService.currentUserCan(
PermissionAction.Add,
PermissionType.DocumentType
)
case DataType.StoragePath:
return !this.permissionsService.currentUserCan(
PermissionAction.Add,
PermissionType.StoragePath
)
case DataType.Tag:
return !this.permissionsService.currentUserCan(
PermissionAction.Add,
PermissionType.Tag
)
}
}
discard() {
this.documentsService
.get(this.documentId)