toggleUserPermission()

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
        }
      });
    }
  }