]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/js/ui/default/staff/admin/local/rating/badge.js
LP#1549505: add admin interface to manage badges
[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','$modal',
6         'egCore','egGridDataProvider','egConfirmDialog',
7 function($scope , $q , $timeout , $location , $window , $modal ,
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         $modal.open({
99             templateUrl: './admin/local/rating/edit_badge',
100             controller:
101                 ['$scope', '$modalInstance', function($scope, $modalInstance) {
102                 $scope.focusMe = true;
103                 $scope.record = egCore.idl.toHash(rb);
104                 // non-integer numeric field require parseFloat
105                 $scope.record.percentile = parseFloat($scope.record.percentile);
106                 $scope.record_label = get_record_label();
107                 $scope.fields = get_field_list($scope.record);
108                 get_popularity_with_required();
109                 $scope.ok = function(args) { $modalInstance.close(args) }
110                 $scope.cancel = function () { $modalInstance.dismiss() }
111             }]
112         }).result.then(function(args) {
113             var rb = new egCore.idl.rb();
114             if (action == 'update') rb.id(args.id);
115             rb.name(args.name);
116             rb.description(args.description);
117             rb.scope(args.scope);
118             rb.weight(args.weight);
119             rb.horizon_age(args.horizon_age);
120             rb.importance_age(args.importance_age);
121             rb.importance_interval(args.importance_interval);
122             rb.importance_scale(args.importance_scale);
123             rb.recalc_interval(args.recalc_interval);
124             rb.attr_filter(args.attr_filter);
125             rb.src_filter(args.src_filter);
126             rb.circ_mod_filter(args.circ_mod_filter);
127             rb.loc_grp_filter(args.loc_grp_filter);
128             rb.popularity_parameter(args.popularity_parameter);
129             rb.fixed_rating(args.fixed_rating);
130             rb.percentile(args.percentile);
131             rb.discard(args.discard);
132             rb.last_calc(args.last_calc);
133             if (action == 'create') {
134                 egCore.pcrud.create(rb).then(function() { deferred.resolve(); });
135             } else {
136                 egCore.pcrud.update(rb).then(function() { deferred.resolve(); });
137             }
138         });
139         return deferred.promise;
140     }
141
142     $scope.create_rb = function() {
143         var rb = new egCore.idl.rb();
144
145         // make sure an OU is selected by default
146         rb.scope(egCore.auth.user().ws_ou());
147
148         spawn_editor(rb, 'create').then(function() {
149             $scope.gridControls.refresh();
150         });
151     }
152
153     $scope.update_rb = function(selected) {
154         if (!selected || !selected.length) return;
155
156         egCore.pcrud.retrieve('rb', selected[0].id).then(function(rb) {
157             spawn_editor(rb, 'update').then(function() {
158                 $scope.gridControls.refresh();
159             });
160         });
161     }
162
163     $scope.delete_rb = function(selected) {
164         if (!selected || !selected.length) return;
165
166         egCore.pcrud.retrieve('rb', selected[0].id).then(function(rb) {
167             egConfirmDialog.open(
168                 egCore.strings.CONFIRM_DELETE_BADGE_TITLE,
169                 egCore.strings.CONFIRM_DELETE_BADGE_BODY,
170                 { name : rb.name(), id : rb.id() }
171             ).result.then(function() {
172                 egCore.pcrud.remove(rb).then(function() {
173                     $scope.gridControls.refresh();
174                 });
175             });            
176         });
177     }
178
179     $scope.gridControls = {
180         activateItem : function (item) {
181             $scope.update_rb([item]);
182         },
183         setQuery : function() {
184             return {
185                 'id' : {'!=' : null}
186             }
187         }
188     }
189 }])