-
Notifications
You must be signed in to change notification settings - Fork 6
/
permission-info.component.ts
224 lines (186 loc) · 7.03 KB
/
permission-info.component.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
import {
ConnectionPositionPair,
OriginConnectionPosition,
OverlayConnectionPosition,
ScrollStrategy,
ScrollStrategyOptions
} from '@angular/cdk/overlay';
import { Component, ElementRef, Input, OnInit, ViewChild } from '@angular/core';
import { PermissionUtil } from '@dasch-swiss/dsp-js';
export interface PermissionObj {
name: string;
label: string;
icon: string;
}
export interface PermissionGroup {
group: string; // e.g knora-admin:ProjectAdmin
restriction: PermissionUtil.Permissions[];
}
@Component({
selector: 'app-permission-info',
templateUrl: './permission-info.component.html',
styleUrls: ['./permission-info.component.scss']
})
export class PermissionInfoComponent implements OnInit {
// the permission info can display the `hasPermission` of a resource and `userHasPermission`together
// or only user's permission in case of restricted view
@Input() hasPermissions: string;
@Input() userHasPermission: string;
@ViewChild('infoButton', { static: false }) infoButton: ElementRef;
// info menu is open or not
isOpen = false;
// default premission values based on DSP-API permissions concept:
// https://docs.dasch.swiss/latest/DSP-API/02-knora-ontologies/knora-base/?h=unknown#permissions
defaultPermissions: PermissionObj[] = [
{
name: 'RV',
label: 'Restricted view permission (RV)',
icon: 'visibility_off' // or disabled_visible or block
},
{
name: 'V',
label: 'View permission (V)',
icon: 'visibility'
},
{
name: 'M',
label: 'Modify permission (M)',
icon: 'mode_edit'
},
{
name: 'D',
label: 'Delete permission (D)',
icon: 'delete'
},
{
name: 'CR',
label: 'Change rights permission (CR)',
icon: 'admin_panel_settings' // or key
}
];
// default user groups based on DSP-API users and groups concept:
// https://docs.dasch.swiss/latest/DSP-API/02-knora-ontologies/knora-base/?h=unknown#users-and-groups
defaultGroups: string[] = [
'knora-admin:SystemAdmin',
'knora-admin:ProjectAdmin',
'knora-admin:Creator',
'knora-admin:ProjectMember',
'knora-admin:KnownUser',
'knora-admin:UnknownUser'
];
listOfPermissions: PermissionGroup[] = [];
userRestrictions: PermissionUtil.Permissions[];
scrollStrategy: ScrollStrategy;
infoBoxPositions: ConnectionPositionPair[];
private _originPos: OriginConnectionPosition = {
originX: 'end',
originY: 'bottom'
};
private _overlayPos: OverlayConnectionPosition = {
overlayX: 'end',
overlayY: 'top'
};
constructor(
private _sso: ScrollStrategyOptions
) {
// close the info box on scrolling
this.scrollStrategy = this._sso.close();
}
ngOnInit(): void {
if (this.hasPermissions) {
// split by | to get each permission section
const sections = this.hasPermissions.split('|');
sections.forEach(section => {
// split by space
const unit = section.split(' ');
const allPermissions = PermissionUtil.allUserPermissions(
unit[0] as 'RV' | 'V' | 'M' | 'D' | 'CR'
);
// a section could look like CR knora-admin:Creator
// but also like CR knora-admin:Creator,knora-admin:ProjectAdmin --> in this case we have to split the section again
if (unit[1].indexOf(',') > -1) {
unit[1].split(',').forEach(group => {
// add to list of permissions
this.pushToListOfPermissions(group, allPermissions);
});
} else {
// add to list of permissions
this.pushToListOfPermissions(unit[1], allPermissions);
}
});
// bring the list of group permissions into correct order: from high to low user group
this.defaultGroups.forEach((group, i) => {
// current index
const currentIndex = this.listOfPermissions.findIndex(e => e.group === group);
if (currentIndex !== -1) {
// new index = i
this.arrayMove(this.listOfPermissions, currentIndex, i);
}
});
}
// display current user's permission
if (this.userHasPermission) {
this.userRestrictions = PermissionUtil.allUserPermissions(
this.userHasPermission as 'RV' | 'V' | 'M' | 'D' | 'CR'
);
}
}
/**
* open or close permission info box
*/
toggleMenu() {
this.isOpen = !this.isOpen;
const pos: ConnectionPositionPair = new ConnectionPositionPair(
this._originPos,
this._overlayPos,
0,
0
);
this.infoBoxPositions = [pos];
}
/**
* returns status of a permission value if it's set or not
* @param restriction
* @param listOfRestrictions
* @returns true if permission value is set
*/
getStatus(restriction: string, listOfRestrictions: number[]): boolean {
return (listOfRestrictions.indexOf(PermissionUtil.Permissions[restriction]) !== -1);
}
/**
* sorts the array
* @param arr
* @param fromIndex
* @param toIndex
*/
arrayMove(arr: PermissionGroup[], fromIndex: number, toIndex: number) {
const element = arr[fromIndex];
arr.splice(fromIndex, 1);
arr.splice(toIndex, 0, element);
}
/**
* pushs user group's permission to list of permissions, if this group does not exist
* otherwise it compares the permission level and replaces it, if it's higher
* @param group
* @param restriction
*/
pushToListOfPermissions(group: string, restriction: PermissionUtil.Permissions[]) {
// in API v17.5.1 (and all prev versions) the default string could look like:
// "CR knora-admin:ProjectAdmin|D knora-admin:ProjectAdmin|M knora-admin:ProjectAdmin|V knora-admin:ProjectAdmin|RV knora-admin:ProjectAdmin"
// in this case we should display this user group only once but with the highest permission only
const index = this.listOfPermissions.findIndex((object: PermissionGroup) => object.group === group);
const permission: PermissionGroup = {
'group': group,
'restriction': restriction
};
// add to list of Permissions if it does not exist yet
if (index === -1) {
this.listOfPermissions.push(permission);
} else {
// if it exists, compare the permission level and replace if it's higher
if (this.listOfPermissions[index].restriction.length < restriction.length) {
this.listOfPermissions[index] = permission;
}
}
}
}