]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/js/ui/default/staff/admin/local/rating/badge.js
LP#1689325 - require most modals have explicit 'exit' or 'cancel' action inside the...
[Evergreen.git] / Open-ILS / web / js / ui / default / staff / admin / local / rating / badge.js
1 angular.module('egAdminRating',
2     ['ngRoute','ui.bootstrap','egCoreMod','egUiMod','egGridMod'])
3
4 .controller('Badges',
5        ['$scope','$q','$timeout','$location','$window','$uibModal',
6         'egCore','egGridDataProvider','egConfirmDialog',
7 function($scope , $q , $timeout , $location , $window , $uibModal ,
8          egCore , egGridDataProvider , egConfirmDialog) {
9
10     egCore.startup.go();
11
12     function get_record_label() {
13         return egCore.idl.classes['rb'].label;
14     }
15
16     function flatten_linked_values(cls, list) {
17         var results = [];
18         var fields = egCore.idl.classes[cls].fields;
19         var id_field;
20         var selector;
21         angular.forEach(fields, function(fld) {
22             if (fld.datatype == 'id') {
23                 id_field = fld.name;
24                 selector = fld.selector ? fld.selector : id_field;
25                 return;
26             }
27         });
28         angular.forEach(list, function(item) {
29             var rec = egCore.idl.toHash(item);
30             results.push({
31                 id : rec[id_field],
32                 name : rec[selector]
33             });
34         });
35         return results;
36     }
37
38     horizon_required = {};
39     percentile_required = {};
40     function get_popularity_with_required() {
41         egCore.pcrud.retrieveAll(
42             'rp', {}, {atomic : true}
43         ).then(function(list) {
44             angular.forEach(list, function(item) {
45                 horizon_required[item.id()] = item.require_horizon();
46                 percentile_required[item.id()] = item.require_percentile();
47             });
48         });
49     }
50
51     function get_field_list(rec) {
52         var fields = egCore.idl.classes['rb'].fields;
53
54         var promises = [];
55         // flesh selectors
56         angular.forEach(fields, function(fld) {
57             if (fld.datatype == 'link') {
58                 egCore.pcrud.retrieveAll(
59                     fld.class, {}, {atomic : true}
60                 ).then(function(list) {
61                     fld.linked_values = flatten_linked_values(fld.class, list);
62                 });
63             }
64             if (fld.datatype == 'org_unit') {
65                 rec[fld.name + '_ou'] = {};
66                 rec[fld.name + '_ou']['org'] = egCore.org.get(rec[fld.name]);
67                 rec[fld.name + '_ou']['update_org'] = function(org) {
68                     rec[fld.name] = org.id();
69                 };
70             }
71             if (fld.name == 'last_calc') {
72                 fld['readonly'] = true;
73             }
74             fld.is_required = function(record) {
75                 return false;
76             };
77             if (fld.name == 'name') {
78                 fld.is_required = function(record) {
79                     return true;
80                 };
81             }
82             if (fld.name == 'horizon_age') {
83                 fld.is_required = function(record) {
84                     return horizon_required[record['popularity_parameter']] == 't';
85                 };
86             }
87             if (fld.name == 'percentile') {
88                 fld.is_required = function(record) {
89                     return percentile_required[record['popularity_parameter']] == 't';
90                 };
91             }
92         });
93         return fields;
94     }
95
96     function spawn_editor(rb, action) {
97         var deferred = $q.defer();
98         $uibModal.open({
99             templateUrl: './admin/local/rating/edit_badge',
100             backdrop: 'static',
101             controller:
102                 ['$scope', '$uibModalInstance', function($scope, $uibModalInstance) {
103                 $scope.focusMe = true;
104                 $scope.record = egCore.idl.toHash(rb);
105                 // non-integer numeric field require parseFloat
106                 $scope.record.percentile = parseFloat($scope.record.percentile);
107                 $scope.record_label = get_record_label();
108                 $scope.fields = get_field_list($scope.record);
109                 get_popularity_with_required();
110                 $scope.ok = function(args) { $uibModalInstance.close(args) }
111                 $scope.cancel = function () { $uibModalInstance.dismiss() }
112             }]
113         }).result.then(function(args) {
114             var rb = new egCore.idl.rb();
115             if (action == 'update') rb.id(args.id);
116             rb.name(args.name);
117             rb.description(args.description);
118             rb.scope(args.scope);
119             rb.weight(args.weight);
120             rb.horizon_age(args.horizon_age);
121             rb.importance_age(args.importance_age);
122             rb.importance_interval(args.importance_interval);
123             rb.importance_scale(args.importance_scale);
124             rb.recalc_interval(args.recalc_interval);
125             rb.attr_filter(args.attr_filter);
126             rb.src_filter(args.src_filter);
127             rb.circ_mod_filter(args.circ_mod_filter);
128             rb.loc_grp_filter(args.loc_grp_filter);
129             rb.popularity_parameter(args.popularity_parameter);
130             rb.fixed_rating(args.fixed_rating);
131             rb.percentile(args.percentile);
132             rb.discard(args.discard);
133             rb.last_calc(args.last_calc);
134             if (action == 'create') {
135                 egCore.pcrud.create(rb).then(function() { deferred.resolve(); });
136             } else {
137                 egCore.pcrud.update(rb).then(function() { deferred.resolve(); });
138             }
139         });
140         return deferred.promise;
141     }
142
143     $scope.create_rb = function() {
144         var rb = new egCore.idl.rb();
145
146         // make sure an OU is selected by default
147         rb.scope(egCore.auth.user().ws_ou());
148
149         spawn_editor(rb, 'create').then(function() {
150             $scope.gridControls.refresh();
151         });
152     }
153
154     $scope.update_rb = function(selected) {
155         if (!selected || !selected.length) return;
156
157         egCore.pcrud.retrieve('rb', selected[0].id).then(function(rb) {
158             spawn_editor(rb, 'update').then(function() {
159                 $scope.gridControls.refresh();
160             });
161         });
162     }
163
164     $scope.delete_rb = function(selected) {
165         if (!selected || !selected.length) return;
166
167         egCore.pcrud.retrieve('rb', selected[0].id).then(function(rb) {
168             egConfirmDialog.open(
169                 egCore.strings.CONFIRM_DELETE_BADGE_TITLE,
170                 egCore.strings.CONFIRM_DELETE_BADGE_BODY,
171                 { name : rb.name(), id : rb.id() }
172             ).result.then(function() {
173                 egCore.pcrud.remove(rb).then(function() {
174                     $scope.gridControls.refresh();
175                 });
176             });            
177         });
178     }
179
180     $scope.gridControls = {
181         activateItem : function (item) {
182             $scope.update_rb([item]);
183         },
184         setQuery : function() {
185             return {
186                 'id' : {'!=' : null}
187             }
188         }
189     }
190 }])