Fix: frontend better reflect global perms for bulk edit

This commit is contained in:
shamoon 2024-12-11 00:25:58 -08:00
parent beb8ed8313
commit 4f9fb97618
No known key found for this signature in database
5 changed files with 175 additions and 198 deletions

File diff suppressed because it is too large Load Diff

View File

@ -45,7 +45,7 @@
<div class="d-none d-sm-inline">&nbsp;<ng-container i18n>Actions</ng-container></div> <div class="d-none d-sm-inline">&nbsp;<ng-container i18n>Actions</ng-container></div>
</button> </button>
<div ngbDropdownMenu aria-labelledby="actionsDropdown" class="shadow"> <div ngbDropdownMenu aria-labelledby="actionsDropdown" class="shadow">
<button ngbDropdownItem (click)="reprocess()" [disabled]="!userCanEdit"> <button ngbDropdownItem (click)="reprocess()" [disabled]="!userCanEdit || !userIsOwner">
<i-bs width="1em" height="1em" name="arrow-counterclockwise"></i-bs>&nbsp;<span i18n>Reprocess</span> <i-bs width="1em" height="1em" name="arrow-counterclockwise"></i-bs>&nbsp;<span i18n>Reprocess</span>
</button> </button>
@ -53,15 +53,15 @@
<i-bs width="1em" height="1em" name="diagram-3"></i-bs>&nbsp;<span i18n>More like this</span> <i-bs width="1em" height="1em" name="diagram-3"></i-bs>&nbsp;<span i18n>More like this</span>
</button> </button>
<button ngbDropdownItem (click)="splitDocument()" [disabled]="originalContentRenderType !== ContentRenderType.PDF || previewNumPages === 1"> <button ngbDropdownItem (click)="splitDocument()" [disabled]="!userCanAdd || originalContentRenderType !== ContentRenderType.PDF || previewNumPages === 1">
<i-bs width="1em" height="1em" name="scissors"></i-bs>&nbsp;<span i18n>Split</span> <i-bs width="1em" height="1em" name="scissors"></i-bs>&nbsp;<span i18n>Split</span>
</button> </button>
<button ngbDropdownItem (click)="rotateDocument()" [disabled]="!userIsOwner || originalContentRenderType !== ContentRenderType.PDF"> <button ngbDropdownItem (click)="rotateDocument()" [disabled]="!userIsOwner || !userCanEdit || originalContentRenderType !== ContentRenderType.PDF">
<i-bs name="arrow-clockwise"></i-bs>&nbsp;<ng-container i18n>Rotate</ng-container> <i-bs name="arrow-clockwise"></i-bs>&nbsp;<ng-container i18n>Rotate</ng-container>
</button> </button>
<button ngbDropdownItem (click)="deletePages()" [disabled]="!userIsOwner || originalContentRenderType !== ContentRenderType.PDF || previewNumPages === 1"> <button ngbDropdownItem (click)="deletePages()" [disabled]="!userIsOwner || !userCanEdit || originalContentRenderType !== ContentRenderType.PDF || previewNumPages === 1">
<i-bs name="file-earmark-minus"></i-bs>&nbsp;<ng-container i18n>Delete page(s)</ng-container> <i-bs name="file-earmark-minus"></i-bs>&nbsp;<ng-container i18n>Delete page(s)</ng-container>
</button> </button>
</div> </div>
@ -70,7 +70,7 @@
<pngx-custom-fields-dropdown <pngx-custom-fields-dropdown
*pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.CustomField }" *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.CustomField }"
[documentId]="documentId" [documentId]="documentId"
[disabled]="!userIsOwner" [disabled]="!userIsOwner || !userCanEdit"
[existingFields]="document?.custom_fields" [existingFields]="document?.custom_fields"
(created)="refreshCustomFields()" (created)="refreshCustomFields()"
(added)="addField($event)"> (added)="addField($event)">
@ -122,7 +122,7 @@
@case (CustomFieldDataType.String) { @case (CustomFieldDataType.String) {
<pngx-input-text formControlName="value" <pngx-input-text formControlName="value"
[title]="getCustomFieldFromInstance(fieldInstance)?.name" [title]="getCustomFieldFromInstance(fieldInstance)?.name"
[removable]="userIsOwner" [removable]="userIsOwner && userCanEdit"
(removed)="removeField(fieldInstance)" (removed)="removeField(fieldInstance)"
[horizontal]="true" [horizontal]="true"
[error]="getCustomFieldError(i)"></pngx-input-text> [error]="getCustomFieldError(i)"></pngx-input-text>
@ -130,7 +130,7 @@
@case (CustomFieldDataType.Date) { @case (CustomFieldDataType.Date) {
<pngx-input-date formControlName="value" <pngx-input-date formControlName="value"
[title]="getCustomFieldFromInstance(fieldInstance)?.name" [title]="getCustomFieldFromInstance(fieldInstance)?.name"
[removable]="userIsOwner" [removable]="userIsOwner && userCanEdit"
(removed)="removeField(fieldInstance)" (removed)="removeField(fieldInstance)"
[horizontal]="true" [horizontal]="true"
[error]="getCustomFieldError(i)"></pngx-input-date> [error]="getCustomFieldError(i)"></pngx-input-date>
@ -138,7 +138,7 @@
@case (CustomFieldDataType.Integer) { @case (CustomFieldDataType.Integer) {
<pngx-input-number formControlName="value" <pngx-input-number formControlName="value"
[title]="getCustomFieldFromInstance(fieldInstance)?.name" [title]="getCustomFieldFromInstance(fieldInstance)?.name"
[removable]="userIsOwner" [removable]="userIsOwner && userCanEdit"
(removed)="removeField(fieldInstance)" (removed)="removeField(fieldInstance)"
[horizontal]="true" [horizontal]="true"
[showAdd]="false" [showAdd]="false"
@ -147,7 +147,7 @@
@case (CustomFieldDataType.Float) { @case (CustomFieldDataType.Float) {
<pngx-input-number formControlName="value" <pngx-input-number formControlName="value"
[title]="getCustomFieldFromInstance(fieldInstance)?.name" [title]="getCustomFieldFromInstance(fieldInstance)?.name"
[removable]="userIsOwner" [removable]="userIsOwner && userCanEdit"
(removed)="removeField(fieldInstance)" (removed)="removeField(fieldInstance)"
[horizontal]="true" [horizontal]="true"
[showAdd]="false" [showAdd]="false"
@ -158,7 +158,7 @@
<pngx-input-monetary formControlName="value" <pngx-input-monetary formControlName="value"
[title]="getCustomFieldFromInstance(fieldInstance)?.name" [title]="getCustomFieldFromInstance(fieldInstance)?.name"
[defaultCurrency]="getCustomFieldFromInstance(fieldInstance)?.extra_data?.default_currency" [defaultCurrency]="getCustomFieldFromInstance(fieldInstance)?.extra_data?.default_currency"
[removable]="userIsOwner" [removable]="userIsOwner && userCanEdit"
(removed)="removeField(fieldInstance)" (removed)="removeField(fieldInstance)"
[horizontal]="true" [horizontal]="true"
[error]="getCustomFieldError(i)"></pngx-input-monetary> [error]="getCustomFieldError(i)"></pngx-input-monetary>
@ -166,14 +166,14 @@
@case (CustomFieldDataType.Boolean) { @case (CustomFieldDataType.Boolean) {
<pngx-input-check formControlName="value" <pngx-input-check formControlName="value"
[title]="getCustomFieldFromInstance(fieldInstance)?.name" [title]="getCustomFieldFromInstance(fieldInstance)?.name"
[removable]="userIsOwner" [removable]="userIsOwner && userCanEdit"
(removed)="removeField(fieldInstance)" (removed)="removeField(fieldInstance)"
[horizontal]="true"></pngx-input-check> [horizontal]="true"></pngx-input-check>
} }
@case (CustomFieldDataType.Url) { @case (CustomFieldDataType.Url) {
<pngx-input-url formControlName="value" <pngx-input-url formControlName="value"
[title]="getCustomFieldFromInstance(fieldInstance)?.name" [title]="getCustomFieldFromInstance(fieldInstance)?.name"
[removable]="userIsOwner" [removable]="userIsOwner && userCanEdit"
(removed)="removeField(fieldInstance)" (removed)="removeField(fieldInstance)"
[horizontal]="true" [horizontal]="true"
[error]="getCustomFieldError(i)"></pngx-input-url> [error]="getCustomFieldError(i)"></pngx-input-url>
@ -182,7 +182,7 @@
<pngx-input-document-link formControlName="value" <pngx-input-document-link formControlName="value"
[title]="getCustomFieldFromInstance(fieldInstance)?.name" [title]="getCustomFieldFromInstance(fieldInstance)?.name"
[parentDocumentID]="documentId" [parentDocumentID]="documentId"
[removable]="userIsOwner" [removable]="userIsOwner && userCanEdit"
(removed)="removeField(fieldInstance)" (removed)="removeField(fieldInstance)"
[horizontal]="true" [horizontal]="true"
[error]="getCustomFieldError(i)"></pngx-input-document-link> [error]="getCustomFieldError(i)"></pngx-input-document-link>
@ -194,7 +194,7 @@
bindLabel="label" bindLabel="label"
[allowNull]="true" [allowNull]="true"
[horizontal]="true" [horizontal]="true"
[removable]="userIsOwner" [removable]="userIsOwner && userCanEdit"
(removed)="removeField(fieldInstance)" (removed)="removeField(fieldInstance)"
[error]="getCustomFieldError(i)"></pngx-input-select> [error]="getCustomFieldError(i)"></pngx-input-select>
} }

View File

@ -577,6 +577,10 @@ export class DocumentDetailComponent
this.permissionsService.currentUserHasObjectPermissions( this.permissionsService.currentUserHasObjectPermissions(
PermissionAction.Change, PermissionAction.Change,
doc doc
) &&
this.permissionsService.currentUserCan(
PermissionAction.Change,
PermissionType.Document
) )
) { ) {
this.documentsService this.documentsService
@ -1066,6 +1070,13 @@ export class DocumentDetailComponent
) )
} }
get userCanAdd(): boolean {
return this.permissionsService.currentUserCan(
PermissionAction.Add,
PermissionType.Document
)
}
filterDocuments(items: ObjectWithId[] | NgbDateStruct[], type?: DataType) { filterDocuments(items: ObjectWithId[] | NgbDateStruct[], type?: DataType) {
const filterRules: FilterRule[] = items.flatMap((i) => { const filterRules: FilterRule[] = items.flatMap((i) => {
if (i.hasOwnProperty('year')) { if (i.hasOwnProperty('year')) {

View File

@ -105,18 +105,18 @@
</button> </button>
<div ngbDropdown> <div ngbDropdown>
<button class="btn btn-sm btn-outline-primary" id="dropdownSelect" ngbDropdownToggle> <button class="btn btn-sm btn-outline-primary" id="dropdownSelect" [disabled]="!userCanEdit && !userCanAdd" ngbDropdownToggle>
<i-bs name="three-dots"></i-bs> <i-bs name="three-dots"></i-bs>
<div class="d-none d-sm-inline">&nbsp;<ng-container i18n>Actions</ng-container></div> <div class="d-none d-sm-inline">&nbsp;<ng-container i18n>Actions</ng-container></div>
</button> </button>
<div ngbDropdownMenu aria-labelledby="dropdownSelect" class="shadow"> <div ngbDropdownMenu aria-labelledby="dropdownSelect" class="shadow">
<button ngbDropdownItem (click)="reprocessSelected()" [disabled]="!userCanEditAll"> <button ngbDropdownItem (click)="reprocessSelected()" [disabled]="!userCanEditAll && !userCanEditAll">
<i-bs name="body-text"></i-bs>&nbsp;<ng-container i18n>Reprocess</ng-container> <i-bs name="body-text"></i-bs>&nbsp;<ng-container i18n>Reprocess</ng-container>
</button> </button>
<button ngbDropdownItem (click)="rotateSelected()" [disabled]="!userOwnsAll"> <button ngbDropdownItem (click)="rotateSelected()" [disabled]="!userOwnsAll && !userCanEditAll">
<i-bs name="arrow-clockwise"></i-bs>&nbsp;<ng-container i18n>Rotate</ng-container> <i-bs name="arrow-clockwise"></i-bs>&nbsp;<ng-container i18n>Rotate</ng-container>
</button> </button>
<button ngbDropdownItem (click)="mergeSelected()" [disabled]="!userCanEditAll || list.selected.size < 2"> <button ngbDropdownItem (click)="mergeSelected()" [disabled]="!userCanAdd || list.selected.size < 2">
<i-bs name="journals"></i-bs>&nbsp;<ng-container i18n>Merge</ng-container> <i-bs name="journals"></i-bs>&nbsp;<ng-container i18n>Merge</ng-container>
</button> </button>
</div> </div>

View File

@ -132,6 +132,20 @@ export class BulkEditorComponent
return ownsAll return ownsAll
} }
get userCanEdit(): boolean {
return this.permissionService.currentUserCan(
PermissionAction.Change,
PermissionType.Document
)
}
get userCanAdd(): boolean {
return this.permissionService.currentUserCan(
PermissionAction.Add,
PermissionType.Document
)
}
ngOnInit() { ngOnInit() {
if ( if (
this.permissionService.currentUserCan( this.permissionService.currentUserCan(