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