1 angular.module('egAdminPermGrpTreeApp',
2 ['ngRoute','ui.bootstrap','egCoreMod','egUiMod','treeControl'])
4 .config(function($routeProvider, $locationProvider, $compileProvider) {
5 $locationProvider.html5Mode(true);
6 $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|blob):/);
8 var resolver = {delay :
9 ['egStartup', function(egStartup) {return egStartup.go()}]}
11 $routeProvider.when('/admin/local/permission/grp_tree_display_entry', {
12 templateUrl : './admin/local/permission/t_grp_tree_display_entry',
13 controller : 'PermGrpTreeCtrl',
17 $routeProvider.otherwise({redirectTo : '/admin/local/permission/grp_tree'});
20 .factory('egPermGrpTreeSvc',
21 ['$q','egCore', function($q , egCore) {
30 // determine which user groups our user is not allowed to modify
31 service.set_edit_profiles = function() {
32 var all_app_perms = [];
33 var failed_perms = [];
35 // extract the application permissions
36 angular.forEach(service.profiles, function(grp) {
37 if (grp.application_perm())
38 all_app_perms.push(grp.application_perm());
41 // fill in service.edit_profiles by inspecting failed_perms
42 function traverse_grp_tree(grp, failed) {
44 failed_perms.indexOf(grp.application_perm()) > -1;
46 if (!failed) service.edit_profiles.push(grp);
49 service.profiles.filter( // children of grp
50 function(p) { return p.parent() == grp.id() }),
51 function(child) {traverse_grp_tree(child, failed)}
55 return egCore.perm.hasPermAt(all_app_perms, true).then(
57 angular.forEach(all_app_perms, function(p) {
58 if (perm_orgs[p].length == 0)
62 traverse_grp_tree(egCore.env.pgt.tree);
67 service.get_perm_groups = function() {
69 service.profiles = egCore.env.pgt.list;
70 return service.set_edit_profiles();
72 return egCore.pcrud.search('pgt', {parent : null},
73 {flesh : -1, flesh_fields : {pgt : ['children']}}
76 egCore.env.absorbTree(tree, 'pgt')
77 service.profiles = egCore.env.pgt.list;
78 return service.set_edit_profiles();
84 service.fetchDisplayEntries = function(ou_id) {
85 service.edit_profiles = [];
86 service.get_perm_groups();
87 return egCore.pcrud.search('pgtde',
88 {org : egCore.org.ancestors(ou_id, true)},
93 order_by: {pgtde : 'id'}
96 ).then(function(entries) {
97 service.pgtde_array = [];
98 service.disabled_entries = [];
99 angular.forEach(entries, function(entry) {
100 if (entry.disabled() == 'f') {
101 entry.disabled(false);
102 service.pgtde_array.push(entry);
104 if (entry.disabled() == 't') {
105 entry.disabled(true);
106 service.disabled_entries.push(entry);
112 service.organizeDisplayEntries = function(selectedOrg) {
113 service.display_entries = [];
115 angular.forEach(service.pgtde_array, function(pgtde) {
116 if (pgtde.org().id() == selectedOrg) {
117 if (!pgtde.child_entries) pgtde.child_entries = [];
119 angular.forEach(service.display_entries, function(entry) {
120 if (pgtde.parent() && pgtde.parent() == entry.id()) {
121 entry.child_entries.push(pgtde);
125 if (service.iterateChildEntries(pgtde, entry)) {
131 if (!pgtde.parent() || !isChild) {
132 service.display_entries.push(pgtde);
138 service.iterateChildEntries = function(pgtde, entry) {
139 if (entry.child_entries.length) {
140 return angular.forEach(entry.child_entries, function(child) {
141 if (pgtde.parent() == child.id()) {
142 child.child_entries.push(pgtde);
145 return service.iterateChildEntries(pgtde, child);
151 service.updateDisplayEntries = function(tree, ou_id) {
152 return egCore.pcrud.search('pgtde',
156 pgtde: ['grp', 'org']
158 order_by: {pgtde : 'id'}
161 ).then(function(entries) {
162 return egCore.pcrud.update(tree).then(function(res) {
168 service.removeDisplayEntries = function(entries) {
169 return egCore.pcrud.remove(entries).then(function(res) {
174 service.addDisplayEntries = function(entries) {
175 return egCore.pcrud.create(entries).then(function(res) {
180 service.findEntry = function(id, entries) {
182 angular.forEach(entries, function(entry) {
184 if (!entry.child_entries) entry.child_entries = [];
185 if (id == entry.id()) {
187 } else if (entry.child_entries.length) {
188 match = service.findEntry(id, entry.child_entries);
199 .controller('PermGrpTreeCtrl',
200 ['$scope','$q','$timeout','$location','$uibModal','egCore','egPermGrpTreeSvc', 'ngToast', 'egProgressDialog',
201 function($scope , $q , $timeout , $location , $uibModal , egCore , egPermGrpTreeSvc, ngToast, egProgressDialog) {
202 $scope.perm_tree = [{
205 name: function() {return egCore.strings.ROOT_NODE_NAME;}
211 $scope.display_entries = [];
212 $scope.new_entries = [];
213 $scope.tree_options = {nodeChildren: 'child_entries'};
214 $scope.selected_entry;
215 $scope.expanded_nodes = [];
216 $scope.orderby = ['position()','grp().name()'];
218 if (!$scope.selectedOrg)
219 $scope.selectedOrg = egCore.org.get(egCore.auth.user().ws_ou());
221 $scope.updateSelection = function(node, selected) {
222 $scope.selected_entry = node;
223 if (!selected) $scope.selected_entry = null;
226 $scope.setPosition = function(node, direction) {
227 var newPos = node.position();
230 siblings = egPermGrpTreeSvc.findEntry(node.parent(), $scope.perm_tree[0].child_entries).child_entries;
232 siblings = $scope.perm_tree[0].child_entries;
234 if (direction == 'up' && newPos < siblings.length) newPos++;
235 if (direction == 'down' && newPos > 1) newPos--;
237 angular.forEach(siblings, function(entry) {
238 if (entry.position() == newPos) entry.position(node.position());
239 angular.forEach($scope.display_entries, function(display_entry) {
240 if (display_entry.id() == entry.id()) {
241 if (display_entry.position() == newPos) {
242 display_entry.position(node.position);
248 angular.forEach($scope.display_entries, function(display_entry) {
249 if (display_entry.id() == node.id()) {
250 display_entry.position(newPos);
254 node.position(newPos);
257 $scope.addChildEntry = function(node) {
259 $scope.openAddDialog(node, $scope.disabled_entries, $scope.edit_profiles, $scope.display_entries, $scope.selectedOrg)
260 .then(function(res) {
264 var new_entry = new egCore.idl.pgtde();
265 new_entry.org($scope.selectedOrg.id());
266 new_entry.grp(res.selected_grp);
267 new_entry.position(1);
268 new_entry.child_entries = [];
270 if (res.selected_parent) {
271 new_entry.parent(res.selected_parent);
272 angular.forEach($scope.expanded_nodes, function(expanded_node) {
273 if (expanded_node == res.selected_parent) is_expanded = true;
275 if (!is_expanded) $scope.expanded_nodes.push(res.selected_parent);
277 angular.forEach($scope.expanded_nodes, function(expanded_node) {
278 if (expanded_node == $scope.perm_tree[0]) is_expanded = true;
280 if (!is_expanded) $scope.expanded_nodes.push($scope.perm_tree[0]);
283 $scope.display_entries.push(new_entry);
284 egPermGrpTreeSvc.addDisplayEntries([new_entry]).then(function(addRes) {
286 if (res.is_root || !res.selected_parent) {
287 angular.forEach($scope.perm_tree[0].child_entries, function(entry) {
288 var newPos = entry.position();
290 entry.position(newPos);
291 siblings.push(entry);
294 var parent = egPermGrpTreeSvc.findEntry(res.selected_parent.id(), $scope.perm_tree[0].child_entries);
295 angular.forEach(parent.child_entries, function(entry) {
296 var newPos = entry.position();
298 entry.position(newPos);
299 siblings.push(entry);
303 egPermGrpTreeSvc.updateDisplayEntries(siblings).then(function(updateRes) {
304 ngToast.create(egCore.strings.ADD_SUCCESS);
305 $scope.refreshTree($scope.selectedOrg, $scope.selected_entry);
308 ngToast.create(egCore.strings.ADD_FAILURE);
315 $scope.openAddDialog = function(node, disabled_entries, edit_profiles, display_entries, selected_org) {
317 return $uibModal.open({
318 templateUrl : './admin/local/permission/t_pgtde_add_dialog',
321 '$scope','$uibModalInstance',
322 function($scope , $uibModalInstance) {
323 var getIsRoot = function() {
324 if (!node || node.permanent) return true;
328 var getSelectedParent = function() {
329 if (!node || node.permanent) return $scope.perm_tree;
333 var available_profiles = [];
334 angular.forEach(edit_profiles, function(grp) {
335 grp._filter_grp = false;
336 angular.forEach(display_entries, function(entry) {
337 if (entry.org().id() == selected_org.id()) {
338 if (entry.grp().id() == grp.id()) grp._filter_grp = true;
341 if (!grp._filter_grp) available_profiles.push(grp);
345 is_root : getIsRoot(),
346 selected_parent : getSelectedParent(),
347 edit_profiles : available_profiles,
348 display_entries : display_entries,
349 selected_org : selected_org
352 $scope.context.selected_grp = $scope.context.edit_profiles[0];
354 $scope.ok = function() {
355 $uibModalInstance.close($scope.context);
358 $scope.cancel = function() {
359 $uibModalInstance.dismiss();
366 var iteratePermTree = function(arr1, arr2) {
367 angular.forEach(arr1, function(entry) {
369 if (entry.child_entries) iteratePermTree(entry.child_entries, arr2);
373 $scope.removeEntry = function(node) {
374 $scope.disabled_entries.push(node);
375 iteratePermTree(node.child_entries, $scope.disabled_entries);
379 siblings = egPermGrpTreeSvc.findEntry(node.parent(), $scope.perm_tree[0].child_entries).child_entries;
381 siblings = $scope.perm_tree[0].child_entries;
383 angular.forEach(siblings, function(sibling) {
384 var newPos = sibling.position();
385 if (node.position() < sibling.position()) {
388 sibling.position(newPos);
391 $scope.selected_entry = null;
393 egPermGrpTreeSvc.removeDisplayEntries($scope.disabled_entries).then(function(res) {
395 ngToast.create(egCore.strings.REMOVE_SUCCESS);
396 $scope.refreshTree($scope.selectedOrg);
398 ngToast.create(egCore.strings.REMOVE_FAILURE);
403 var getDisplayEntries = function() {
404 $scope.edit_profiles = egPermGrpTreeSvc.edit_profiles;
405 egPermGrpTreeSvc.organizeDisplayEntries($scope.selectedOrg.id());
406 $scope.perm_tree[0].child_entries = egPermGrpTreeSvc.display_entries;
407 $scope.display_entries = egPermGrpTreeSvc.pgtde_array;
408 $scope.new_entries = [];
409 $scope.disabled_entries = [];
410 $scope.selected_entry = $scope.perm_tree[0];
411 if (!$scope.expanded_nodes.length) iteratePermTree($scope.perm_tree, $scope.expanded_nodes);
414 $scope.saveEntries = function() {
415 egProgressDialog.open();
417 // Save Remaining Display Entries
418 egPermGrpTreeSvc.updateDisplayEntries($scope.display_entries, $scope.selectedOrg.id())
419 .then(function(res) {
421 ngToast.create(egCore.strings.UPDATE_SUCCESS);
422 $scope.refreshTree($scope.selectedOrg, $scope.selected_entry);
424 ngToast.create(egCore.strings.UPDATE_FAILURE);
426 }).finally(egProgressDialog.close);
429 $scope.org_changed = function(org) {
430 $scope.refreshTree(org.id());
433 $scope.refreshTree = function(ou_id, node) {
434 egPermGrpTreeSvc.fetchDisplayEntries(ou_id).then(function() {
436 if (node) $scope.selected_entry = node;
440 egCore.startup.go(function() {
441 $scope.refreshTree(egCore.auth.user().ws_ou());