in source/console/src/views/PermissionSetting.tsx [370:499]
toggleUserPermission(type: AVAPermissionTypes, id: string, permissionEnabled: boolean, siteData: ISiteData) {
const userPermissions = this.state.userPermissions;
if (userPermissions) {
switch (type) {
case AVAPermissionTypes.Site:
if (permissionEnabled) {
userPermissions.areas.push(...siteData.areas);
userPermissions.processes.push(...siteData.processes);
userPermissions.stations.push(...siteData.stations);
userPermissions.devices.push(...siteData.devices);
userPermissions.sites.push({ id, name: siteData.siteName });
} else {
siteData.areas.forEach(x => userPermissions.areas = userPermissions.areas.filter(y => y.id !== x.id));
siteData.processes.forEach(x => userPermissions.processes = userPermissions.processes.filter(y => y.id !== x.id));
siteData.stations.forEach(x => userPermissions.stations = userPermissions.stations.filter(y => y.id !== x.id));
siteData.devices.forEach(x => userPermissions.devices = userPermissions.devices.filter(y => y.id !== x.id));
userPermissions.sites = userPermissions.sites.filter(y => y.id !== id);
}
break;
case AVAPermissionTypes.Area:
const area = siteData.areas.find(a => a.id === id)!;
if (permissionEnabled) {
userPermissions.sites.push({ id: area.parentId!, name: siteData.siteName });
userPermissions.areas.push(area);
userPermissions.processes.push(...siteData.processes.filter(p => p.parentId === id));
siteData.stations
.filter(s => s.parentId === id)
.forEach(s => {
userPermissions.stations.push(s);
userPermissions.devices.push(...siteData.devices.filter(d => d.parentId === s.id));
});
} else {
userPermissions.areas = userPermissions.areas.filter(a => a.id !== id);
userPermissions.processes = userPermissions.processes.filter(p => p.parentId !== id);
userPermissions.stations = userPermissions.stations.filter(s => s.parentId !== id);
// Filter out any device that belongs to a station under the area that was unchecked
userPermissions.devices = userPermissions.devices.filter(d => {
const stationWithDevice = siteData.stations.find(s => s.id === d.parentId);
if (stationWithDevice) {
return stationWithDevice.parentId !== id;
}
return true;
});
}
break;
case AVAPermissionTypes.Process:
const process = siteData.processes.find(p => p.id === id)!;
const processArea = siteData.areas.find(a => a.id === process.parentId)!;
if (permissionEnabled) {
userPermissions.processes.push(process);
userPermissions.areas.push(processArea);
userPermissions.sites.push({ id: processArea.parentId!, name: siteData.siteName });
} else {
userPermissions.processes = userPermissions.processes.filter(p => p.id !== id);
}
break;
case AVAPermissionTypes.Station:
const station = siteData.stations.find(s => s.id === id)!;
const stationArea = siteData.areas.find(a => a.id === station.parentId)!;
if (permissionEnabled) {
userPermissions.stations.push(station);
userPermissions.areas.push(stationArea);
userPermissions.sites.push({ id: stationArea.parentId!, name: siteData.siteName });
userPermissions.devices.push(...siteData.devices.filter(d => d.parentId === id));
} else {
userPermissions.devices = userPermissions.devices.filter(d => d.parentId !== id);
userPermissions.stations = userPermissions.stations.filter(s => s.id !== id);
}
break;
case AVAPermissionTypes.Device:
const device = siteData.devices.find(d => d.id === id)!;
const deviceStation = siteData.stations.find(s => s.id === device.parentId)!;
const deviceArea = siteData.areas.find(a => a.id === deviceStation.parentId)!;
if (permissionEnabled) {
userPermissions.devices.push(device);
userPermissions.stations.push(deviceStation);
userPermissions.areas.push(deviceArea);
userPermissions.sites.push({ id: deviceArea.parentId!, name: siteData.siteName });
} else {
userPermissions.devices = userPermissions.devices.filter(d => d.id !== id);
}
break;
}
// Remove a station permission if there are no devices enabled
const stationsIdsToRemove = userPermissions.stations.filter(s => {
return !userPermissions.devices.some(d => d.parentId === s.id);
}).map(s => s.id);
stationsIdsToRemove.forEach(stationId => {
userPermissions.stations = userPermissions.stations.filter(s => s.id !== stationId);
});
// Remove an area permission if there are no stations or processes enabled
const areaIdsToRemove = userPermissions.areas.filter(a => {
return ![...userPermissions.stations, ...userPermissions.processes].some(x => x.parentId === a.id);
}).map(a => a.id);
areaIdsToRemove.forEach(areaId => {
userPermissions.areas = userPermissions.areas.filter(a => a.id !== areaId);
});
// Remove a site permission if there are no areas enabled
const siteIdsToRemove = userPermissions.sites.filter(s => {
return !userPermissions.areas.some(a => a.parentId === s.id);
}).map(s => s.id);
siteIdsToRemove.forEach(siteId => {
userPermissions.sites = userPermissions.sites.filter(s => s.id !== siteId);
});
this.setState({
userPermissions: {
id: userPermissions.id,
username: userPermissions.username,
sites: this.getUniqueArray(userPermissions.sites),
areas: this.getUniqueArray(userPermissions.areas),
processes: this.getUniqueArray(userPermissions.processes),
stations: this.getUniqueArray(userPermissions.stations),
devices: this.getUniqueArray(userPermissions.devices),
version: userPermissions.version
}
});
}
}