1window.angular && (function(angular) {
2  'use strict';
3
4  angular.module('app.common.directives').directive('ldapUserRoles', [
5    'APIUtils',
6    function(APIUtils) {
7      return {
8        restrict: 'E',
9        template: require('./ldap-user-roles.html'),
10        scope: {roleGroups: '=', enabled: '=', roleGroupType: '='},
11        controller: [
12          '$scope', 'APIUtils', 'toastService', '$q',
13          function($scope, APIUtils, toastService, $q) {
14            $scope.privileges = [];
15            $scope.loading = true;
16            $scope.newGroup = {};
17            $scope.selectedGroupIndex = '';
18            $scope.editGroup = false;
19            $scope.removeGroup = false;
20            $scope.removeMultipleGroups = false;
21            $scope.all = false;
22            $scope.sortPropertyName = 'id';
23            $scope.reverse = false;
24            $scope.addGroup = false;
25            $scope.hasSelectedGroup = false;
26
27            APIUtils.getAccountServiceRoles()
28                .then(
29                    (data) => {
30                      $scope.privileges = data;
31                    },
32                    (error) => {
33                      console.log(JSON.stringify(error));
34                    })
35                .finally(() => {
36                  $scope.loading = false;
37                });
38
39            $scope.addGroupFn = () => {
40              $scope.addGroup = true;
41            };
42
43            $scope.addRoleGroup = () => {
44              const newGroup = {};
45              newGroup.RemoteGroup = $scope.newGroup.RemoteGroup;
46              newGroup.LocalRole = $scope.newGroup.LocalRole;
47
48              $scope.loading = true;
49              const data = {};
50
51              if ($scope.roleGroupType == 'ldap') {
52                data.LDAP = {};
53                data.LDAP.RemoteRoleMapping = $scope.roleGroups;
54                data.LDAP.RemoteRoleMapping.push(newGroup);
55              } else {
56                data.ActiveDirectory = {};
57                data.ActiveDirectory.RemoteRoleMapping = $scope.roleGroups;
58                data.ActiveDirectory.RemoteRoleMapping.push(newGroup);
59              }
60
61              APIUtils.saveLdapProperties(data)
62                  .then(
63                      (response) => {
64                        toastService.success(
65                            'Group has been created successfully.');
66                      },
67                      (error) => {
68                        toastService.error('Failed to create new group.');
69                      })
70                  .finally(() => {
71                    $scope.loading = false;
72                  });
73            };
74
75            $scope.editGroupFn = (group, role, index) => {
76              $scope.editGroup = true;
77              $scope.selectedGroupIndex = index;
78              $scope.newGroup.RemoteGroup = group;
79              $scope.newGroup.LocalRole = role;
80            };
81
82            $scope.editRoleGroup = () => {
83              $scope.loading = true;
84              const data = {};
85
86              if ($scope.roleGroupType == 'ldap') {
87                data.LDAP = {};
88                data.LDAP.RemoteRoleMapping = $scope.roleGroups;
89                data.LDAP.RemoteRoleMapping[$scope.selectedGroupIndex]
90                    .LocalRole = $scope.newGroup.LocalRole;
91              } else {
92                data.ActiveDirectory = {};
93                data.ActiveDirectory.RemoteRoleMapping = $scope.roleGroups;
94                data.ActiveDirectory
95                    .RemoteRoleMapping[$scope.selectedGroupIndex]
96                    .LocalRole = $scope.newGroup.LocalRole;
97              }
98
99              APIUtils.saveLdapProperties(data)
100                  .then(
101                      (response) => {
102                        toastService.success(
103                            'Group has been edited successfully.');
104                      },
105                      (error) => {
106                        toastService.error('Failed to edit group.');
107                      })
108                  .finally(() => {
109                    $scope.loading = false;
110                  });
111              $scope.editGroup = false;
112            };
113
114            $scope.removeGroupFn = (index) => {
115              $scope.removeGroup = true;
116              $scope.selectedGroupIndex = index;
117            };
118
119            $scope.removeRoleGroup = () => {
120              $scope.loading = true;
121              const data = {};
122
123              if ($scope.roleGroupType == 'ldap') {
124                data.LDAP = {};
125                data.LDAP.RemoteRoleMapping = $scope.roleGroups;
126                data.LDAP.RemoteRoleMapping[$scope.selectedGroupIndex] =
127                    $scope.newGroup;
128              } else {
129                data.ActiveDirectory = {};
130                data.ActiveDirectory.RemoteRoleMapping = $scope.roleGroups;
131                data.ActiveDirectory
132                    .RemoteRoleMapping[$scope.selectedGroupIndex] =
133                    $scope.newGroup;
134              }
135
136              $scope.roleGroups[$scope.selectedGroupIndex] = null;
137
138              APIUtils.saveLdapProperties(data)
139                  .then(
140                      (response) => {
141                        toastService.success(
142                            'Group has been removed successfully.');
143                      },
144                      (error) => {
145                        toastService.error('Failed to remove group.');
146                      })
147                  .finally(() => {
148                    $scope.loading = false;
149                    $scope.$parent.loadLdap();
150                  });
151              $scope.removeGroup = false;
152            };
153
154            $scope.removeMultipleRoleGroupsFn = () => {
155              $scope.removeMultipleGroups = true;
156            };
157
158            $scope.roleGroupIsSelectedChanged = () => {
159              let groupSelected = false;
160              $scope.roleGroups.forEach(group => {
161                if (group['isSelected']) {
162                  groupSelected = true;
163                }
164              });
165              $scope.hasSelectedGroup = groupSelected;
166            };
167
168            $scope.removeMultipleRoleGroups = () => {
169              $scope.loading = true;
170              const data = {};
171
172              if ($scope.roleGroupType == 'ldap') {
173                data.LDAP = {};
174                data.LDAP.RemoteRoleMapping = $scope.roleGroups.map((group) => {
175                  if (group['isSelected']) {
176                    return null;
177                  } else {
178                    return group;
179                  }
180                });
181              } else {
182                data.ActiveDirectory = {};
183                data.ActiveDirectory.RemoteRoleMapping =
184                    $scope.roleGroups.map((group) => {
185                      if (group['isSelected']) {
186                        return null;
187                      } else {
188                        return group;
189                      }
190                    });
191              }
192
193              APIUtils.saveLdapProperties(data)
194                  .then(
195                      (response) => {
196                        toastService.success(
197                            'Groups have been removed successfully.');
198                      },
199                      (error) => {
200                        toastService.error('Failed to remove groups.');
201                      })
202                  .finally(() => {
203                    $scope.loading = false;
204                    $scope.$parent.loadLdap();
205                  });
206              $scope.removeMultipleGroups = false;
207            };
208
209            $scope.toggleAll = () => {
210              let toggleStatus = !$scope.all;
211              $scope.roleGroups.forEach((group) => {
212                group.isSelected = toggleStatus;
213              });
214            };
215
216            $scope.optionToggled = () => {
217              $scope.all = $scope.roleGroups.every((group) => {
218                return group.isSelected;
219              });
220            };
221
222            $scope.sortBy = (propertyName, isReverse) => {
223              $scope.reverse = isReverse;
224              $scope.sortPropertyName = propertyName;
225            };
226          }
227        ]
228      };
229    }
230  ]);
231})(window.angular);
232