In-database Grace intervals
[evergreen-equinox.git] / Open-ILS / web / js / ui / default / conify / global / config / circ_matrix_matchpoint.js
1 dojo.require('dijit.layout.ContentPane');
2 dojo.require('dijit.form.Button');
3 dojo.require('openils.widget.AutoGrid');
4 dojo.require('openils.widget.AutoFieldWidget');
5 dojo.require('openils.PermaCrud');
6 dojo.require('openils.widget.ProgressDialog');
7
8 var circModEditor = null;
9 var circModGroupTables = [];
10 var circModGroupCache = {};
11 var circModEntryCache = {};
12 var matchPoint;
13
14 function load(){
15     cmGrid.overrideWidgetArgs.grp = {hrbefore : true};
16     cmGrid.overrideWidgetArgs.is_renewal = {ternary : true};
17     cmGrid.overrideWidgetArgs.ref_flag = {ternary : true};
18     cmGrid.overrideWidgetArgs.juvenile_flag = {ternary : true};
19     cmGrid.overrideWidgetArgs.circulate = {inherits : true, hrbefore : true};
20     cmGrid.overrideWidgetArgs.duration_rule = {inherits : true};
21     cmGrid.overrideWidgetArgs.recurring_fine_rule = {inherits : true};
22     cmGrid.overrideWidgetArgs.max_fine_rule = {inherits : true};
23     cmGrid.overrideWidgetArgs.available_copy_hold_ratio = {inherits : true};
24     cmGrid.overrideWidgetArgs.total_copy_hold_ratio = {inherits : true};
25     cmGrid.overrideWidgetArgs.renewals = {inherits : true};
26     cmGrid.overrideWidgetArgs.grace_period = {inherits : true};
27     cmGrid.overrideWidgetArgs.hard_due_date = {inherits : true};
28     cmGrid.loadAll({order_by:{ccmm:'circ_modifier'}});
29     cmGrid.onEditPane = buildEditPaneAdditions;
30     circModEditor = dojo.byId('circ-mod-editor').parentNode.removeChild(dojo.byId('circ-mod-editor'));
31 }
32
33 function byName(name, ctxt) {
34     return dojo.query('[name=' + name + ']', ctxt)[0];
35 }
36
37 function buildEditPaneAdditions(editPane) {
38     if(!editPane.fmObject) return; 
39     var node = circModEditor.cloneNode(true);
40     var tableTmpl = node.removeChild(byName('circ-mod-group-table', node));
41     circModGroupTables = [];
42     matchPoint = editPane.fmObject.id();
43
44     byName('add-circ-mod-group', node).onclick = function() {
45         addCircModGroup(node, tableTmpl)
46     }
47
48     if(editPane.mode == 'update') {
49         var groups = new openils.PermaCrud().search('ccmcmt', {matchpoint: editPane.fmObject.id()});
50         dojo.forEach(groups, function(g) { addCircModGroup(node, tableTmpl, g); } );
51     } 
52
53     editPane.domNode.appendChild(node);
54 }
55
56
57 function addCircModGroup(node, tableTmpl, group) {
58
59     var table = tableTmpl.cloneNode(true);
60     var circModRowTmpl = byName('circ-mod-entry-tbody', table).removeChild(byName('circ-mod-entry-row', table));
61     circModGroupTables.push(table);
62
63     var entries = [];
64     if(group) {
65         entries = new openils.PermaCrud().search('ccmcmtm', {circ_mod_test : group.id()});
66         table.setAttribute('group', group.id());
67         circModGroupCache[group.id()] = group;
68         circModEntryCache[group.id()] = entries;
69     }
70
71     function addMod(code, name) {
72         name = name || code; // XXX
73         var row = circModRowTmpl.cloneNode(true);
74         byName('circ-mod', row).innerHTML = name;
75         byName('circ-mod', row).setAttribute('code', code);
76         byName('circ-mod-entry-tbody', table).appendChild(row);
77         byName('remove-circ-mod', row).onclick = function() {
78             byName('circ-mod-entry-tbody', table).removeChild(row);
79         }
80     }
81
82     dojo.forEach(entries, function(e) { addMod(e.circ_mod()); });
83
84     byName('circ-mod-count', table).value = (group) ? group.items_out() : 0;
85
86     var selector = new openils.widget.AutoFieldWidget({
87         fmClass : 'ccmcmtm',
88         fmField : 'circ_mod',
89         parentNode : byName('circ-mod-selector', table)
90     });
91     selector.build();
92
93     byName('add-circ-mod', table).onclick = function() {
94         addMod(selector.widget.attr('value'), selector.widget.attr('displayedValue'));
95     }
96
97     node.insertBefore(table, byName('add-circ-mod-group-span', node));
98     node.insertBefore(dojo.create('hr'), byName('add-circ-mod-group-span', node));
99 }
100
101 function applyCircModChanges() {
102     var pcrud = new openils.PermaCrud();
103     progressDialog.show(true);
104
105     for(var idx in circModGroupTables) {
106         var table = circModGroupTables[idx];
107         var gp = table.getAttribute('group');
108
109         var count = byName('circ-mod-count', table).value;
110         var mods = [];
111         var entries = [];
112
113         dojo.forEach(dojo.query('[name=circ-mod]', table), function(td) { 
114             mods.push(td.getAttribute('code'));
115         });
116
117         var group = circModGroupCache[gp];
118
119         if(!group) {
120
121             group = new fieldmapper.ccmcmt();
122             group.isnew(true);
123             dojo.forEach(mods, function(mod) {
124                 var entry = new fieldmapper.ccmcmtm();
125                 entry.isnew(true);
126                 entry.circ_mod(mod);
127                 entries.push(entry);
128             });
129
130
131         } else {
132
133             var existing = circModEntryCache[group.id()];
134             dojo.forEach(mods, function(mod) {
135                 
136                 // new circ mod for this group
137                 if(!existing.filter(function(i){ return (i.circ_mod() == mod)})[0]) {
138                     var entry = new fieldmapper.ccmcmtm();
139                     entry.isnew(true);
140                     entry.circ_mod(mod);
141                     entries.push(entry);
142                     entry.circ_mod_test(group.id());
143                 }
144             });
145
146             dojo.forEach(existing, function(eMod) {
147                 if(!mods.filter(function(i){ return (i == eMod.circ_mod()) })[0]) {
148                     eMod.isdeleted(true);
149                     entries.push(eMod);
150                 }
151             });
152         }
153
154         group.items_out(count);
155         group.matchpoint(matchPoint);
156
157         if(group.isnew()) {
158
159             pcrud.create(group, {
160                 oncomplete : function(r, cudResults) {
161                     var group = cudResults[0];
162                     dojo.forEach(entries, function(e) { e.circ_mod_test(group.id()) } );
163                     pcrud.create(entries, {
164                         oncomplete : function() {
165                             progressDialog.hide();
166                         }
167                     });
168                 }
169             });
170
171         } else {
172
173             pcrud.update(group, {
174                 oncomplete : function(r, cudResults) {
175                     var newOnes = entries.filter(function(e) { return e.isnew() });
176                     var delOnes = entries.filter(function(e) { return e.isdeleted() });
177                     if(!delOnes.length && !newOnes.length) {
178                         progressDialog.hide();
179                         return;
180                     }
181                     if(newOnes.length) {
182                         pcrud.create(newOnes, {
183                             oncomplete : function() {
184                                 if(delOnes.length) {
185                                     pcrud.eliminate(delOnes, {
186                                         oncomplete : function() {
187                                             progressDialog.hide();
188                                         }
189                                     });
190                                 } else {
191                                     progressDialog.hide();
192                                 }
193                             }
194                         });
195                     } else {
196                         pcrud.eliminate(delOnes, {
197                             oncomplete : function() {
198                                 progressDialog.hide();
199                             }
200                         });
201                     }
202                 }
203             });
204         }
205     }
206 }
207
208 openils.Util.addOnLoad(load);
209