Skip to content

Commit dbae656

Browse files
committed
fix: update resources field permissions in roles page
1 parent 1723c6c commit dbae656

File tree

4 files changed

+46
-6
lines changed

4 files changed

+46
-6
lines changed

libs/safe/src/lib/components/role-summary/role-resources/resource-fields/resource-fields.component.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ <h2>{{ 'common.field.few' | translate }}</h2>
3838
</ng-container>
3939
<ng-container cdkColumnDef="actions" [stickyEnd]="true">
4040
<th uiCellHeader *cdkHeaderCellDef scope="col" class="w-16"></th>
41-
<td uiCell *cdkCellDef="let element">
41+
<td uiCell *cdkCellDef="let element; let index = index">
4242
<div class="flex">
4343
<ui-button
4444
[isIcon]="true"
@@ -51,7 +51,7 @@ <h2>{{ 'common.field.few' | translate }}</h2>
5151
: 'components.role.tooltip.disallowFieldAccessibility'
5252
) | translate : { field: element.name }
5353
"
54-
(click)="onEditFieldAccess(element, 'canSee')"
54+
(click)="onEditFieldAccess(index, element, 'canSee')"
5555
>
5656
</ui-button>
5757
<ui-button
@@ -65,7 +65,7 @@ <h2>{{ 'common.field.few' | translate }}</h2>
6565
: 'components.role.tooltip.disallowFieldUpdate'
6666
) | translate : { field: element.name }
6767
"
68-
(click)="onEditFieldAccess(element, 'canUpdate')"
68+
(click)="onEditFieldAccess(index, element, 'canUpdate')"
6969
>
7070
</ui-button>
7171
</div>

libs/safe/src/lib/components/role-summary/role-resources/resource-fields/resource-fields.component.ts

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
1-
import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core';
1+
import {
2+
Component,
3+
EventEmitter,
4+
Input,
5+
OnInit,
6+
Output,
7+
OnChanges,
8+
SimpleChanges,
9+
} from '@angular/core';
210
import { isEqual, sortBy } from 'lodash';
311
import { Resource } from '../../../../models/resource.model';
412
import { Role } from '../../../../models/user.model';
@@ -19,7 +27,7 @@ type ResourceField = {
1927
templateUrl: './resource-fields.component.html',
2028
styleUrls: ['./resource-fields.component.scss'],
2129
})
22-
export class ResourceFieldsComponent implements OnInit {
30+
export class ResourceFieldsComponent implements OnInit, OnChanges {
2331
@Input() resource!: Resource;
2432
@Input() role!: Role;
2533
@Input() disabled = false;
@@ -32,9 +40,12 @@ export class ResourceFieldsComponent implements OnInit {
3240

3341
public filterId = new FormControl<string | null | undefined>(undefined);
3442

35-
public fields = new Array<ResourceField[]>([]);
43+
public fields = new Array<ResourceField>();
3644
public displayedColumns: string[] = ['name', 'actions'];
3745

46+
private updatedField: { index: number; permission: 'canSee' | 'canUpdate' } =
47+
{ index: -1, permission: 'canSee' };
48+
3849
ngOnInit() {
3950
this.fields = sortBy(
4051
this.resource.fields.map((field: any) => ({
@@ -49,6 +60,18 @@ export class ResourceFieldsComponent implements OnInit {
4960
});
5061
}
5162

63+
ngOnChanges(changes: SimpleChanges): void {
64+
if (changes.resource && this.updatedField.index !== -1) {
65+
const field = this.fields[this.updatedField.index];
66+
if (this.updatedField.permission === 'canSee') {
67+
field.canSee = !field.canSee;
68+
} else {
69+
field.canUpdate = !field.canUpdate;
70+
}
71+
this.updatedField.index = -1;
72+
}
73+
}
74+
5275
/**
5376
* Filter list of fields by template id
5477
*
@@ -85,13 +108,17 @@ export class ResourceFieldsComponent implements OnInit {
85108
/**
86109
* Emits an event to toggle if field is visible / editable.
87110
*
111+
* @param index Index of the field to toggle permission for.
88112
* @param field Field to toggle permission for.
89113
* @param permission Permission type to toggle.
90114
*/
91115
public onEditFieldAccess(
116+
index: number,
92117
field: ResourceField,
93118
permission: 'canSee' | 'canUpdate'
94119
) {
120+
// Save field updated
121+
this.updatedField = { index, permission };
95122
this.onToggle.emit({
96123
field,
97124
permission,

libs/safe/src/lib/components/role-summary/role-resources/role-resources.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
cdk-table
1515
uiTableWrapper
1616
[dataSource]="resources"
17+
[trackBy]="getUniqueIdentifier"
1718
multiTemplateDataRows
1819
>
1920
<!-- Resource Name -->

libs/safe/src/lib/components/role-summary/role-resources/role-resources.component.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,18 @@ export class RoleResourcesComponent
456456
});
457457
}
458458

459+
/**
460+
* Custom TrackByFunction to compute the identity of items in an iterable, so when
461+
* updating fields the scroll don't get back to the beginning of the table.
462+
*
463+
* @param index index of the item in the table
464+
* @param item item table
465+
* @returns unique value for all unique inputs
466+
*/
467+
public getUniqueIdentifier(index: number, item: any): any {
468+
return item.resource.id;
469+
}
470+
459471
/**
460472
* Gets the correspondent icon for a given permission
461473
*

0 commit comments

Comments
 (0)