]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/ui/default/conify/global/config/circ_matrix_matchpoint.js
LP#2063496 Patron Search Profile Dropdown Partially Obscured
[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 limitSetEditor = null;
9 var limitSetEntryCache = [];
10 var limitSetCache = {};
11
12 function load(){
13     cmGrid.overrideWidgetArgs.grp = {hrbefore : true};
14     cmGrid.overrideWidgetArgs.is_renewal = {ternary : true};
15     cmGrid.overrideWidgetArgs.ref_flag = {ternary : true};
16     cmGrid.overrideWidgetArgs.juvenile_flag = {ternary : true};
17     cmGrid.overrideWidgetArgs.circulate = {inherits : true, hrbefore : true};
18     cmGrid.overrideWidgetArgs.duration_rule = {inherits : true};
19     cmGrid.overrideWidgetArgs.recurring_fine_rule = {inherits : true};
20     cmGrid.overrideWidgetArgs.max_fine_rule = {inherits : true};
21     cmGrid.overrideWidgetArgs.available_copy_hold_ratio = {inherits : true};
22     cmGrid.overrideWidgetArgs.total_copy_hold_ratio = {inherits : true};
23     cmGrid.overrideWidgetArgs.renewals = {inherits : true};
24     cmGrid.overrideWidgetArgs.grace_period = {inherits : true};
25     cmGrid.overrideWidgetArgs.hard_due_date = {inherits : true};
26     cmGrid.loadAll({order_by:{ccmm:'circ_modifier'}});
27     cmGrid.onEditPane = buildEditPaneAdditions;
28     cmGrid.onPostUpdate = updateLinked;
29     cmGrid.onPostCreate = updateLinked;
30     limitSetEditor = dojo.byId('limit-set-editor').parentNode.removeChild(dojo.byId('limit-set-editor'));
31
32     // Cache limit set info for later display
33     var pcrud = new openils.PermaCrud();
34     var temp = pcrud.retrieveAll('ccls');
35     dojo.forEach(temp, function(g) { limitSetCache[g.id()] = g; } );
36 }
37
38 function byName(name, ctxt) {
39     return dojo.query('[name=' + name + ']', ctxt)[0];
40 }
41
42 function buildEditPaneAdditions(editPane) {
43     limitSetEntryCache = [];
44     var tr = document.createElement('tr');
45     var td = document.createElement('td');
46     td.setAttribute('colspan','2');
47     // Explanation....
48     // editPane.domNode.lastChild = Table
49     // .lastChild = Table Body
50     // .lastChild = Table Row containing Action Buttons
51     editPane.domNode.lastChild.lastChild.insertBefore(tr, editPane.domNode.lastChild.lastChild.lastChild);
52     tr.appendChild(td);
53     curLimitSetEditor = limitSetEditor.cloneNode(true);
54     td.appendChild(curLimitSetEditor);
55     var limitSetTmpl = byName('limit-set-entry-tbody', curLimitSetEditor).removeChild(byName('limit-set-entry-row', curLimitSetEditor));
56
57     var selector = new openils.widget.AutoFieldWidget({
58         fmClass : 'ccmlsm',
59         fmField : 'limit_set',
60         parentNode : byName('limit-set-selector', curLimitSetEditor)
61     });
62     selector.build();
63
64     function addSet(lset) {
65         var row = limitSetTmpl.cloneNode(true);
66         row.setAttribute('limit_set', lset);
67         byName('limit-set', row).innerHTML = limitSetCache[lset].name();
68         byName('remove-limit-set', row).onclick = function() {
69             byName('limit-set-entry-tbody', cmGrid.editPane.domNode).removeChild(row);
70         }
71         byName('limit-set-active', row).setAttribute('checked', 'true');
72         byName('limit-set-entry-tbody', editPane.domNode).appendChild(row);
73     }
74
75     byName('add-limit-set', editPane.domNode).onclick = function() {
76         addSet(selector.widget.attr('value'));
77     }
78
79     // On edit we need to load existing entries.
80     // On create, not so much.
81     if(!editPane.fmObject) return; 
82     var matchpoint = editPane.fmObject.id();
83
84     if(editPane.mode == 'update') {
85         var pcrud = new openils.PermaCrud();
86         limitSetEntryCache = pcrud.search('ccmlsm', {matchpoint: editPane.fmObject.id()});
87         dojo.forEach(limitSetEntryCache, function(g) { addLimitSet(limitSetTmpl, g); } );
88     } 
89 }
90
91 function addLimitSet(tmpl, limit_set_entry) {
92     var row = tmpl.cloneNode(true);
93     var lset = limit_set_entry.limit_set();
94     row.setAttribute('limit_set', lset);
95     byName('limit-set', row).innerHTML = limitSetCache[lset].name();
96     if(limit_set_entry.active() == 't') {
97         byName('limit-set-active', row).setAttribute('checked', 'true');
98     }
99     if(limit_set_entry.fallthrough() == 't') {
100         byName('limit-set-fallthrough', row).setAttribute('checked', 'true');
101     }
102     byName('remove-limit-set', row).onclick = function() {
103         byName('limit-set-entry-tbody', cmGrid.editPane.domNode).removeChild(row);
104     }
105     byName('limit-set-entry-tbody', cmGrid.editPane.domNode).appendChild(row);
106 }
107
108 function format_hard_due_date(name, id) {
109     var item=this.grid.getItem(id);
110     if(!item) return name;
111     switch (this.grid.store.getValue(this.grid.getItem(id), 'hard_due_date')) {
112         case null :
113         case undefined :
114         case 'unset' :
115             return name;
116         default:
117             return "<a href='" + oilsBasePath +
118                 "/conify/global/config/hard_due_date?name=" +
119                 encodeURIComponent(name) + "'>" + name + "</a>";
120     }
121 }
122
123 function updateLinked(fmObject, rowindex) {
124     var id = null;
125     if(rowindex != undefined && this.editPane && this.editPane.fmObject) {
126         // Edit, grab existing ID
127         id = this.editPane.fmObject.id();
128     } else if(fmObject.id) {
129         // Create, grab new ID
130         id = fmObject.id();
131     }
132     // If we don't have an ID, drop out.
133     if(id == null) return;
134     var pcrud = new openils.PermaCrud();
135     progressDialog.show(true);
136
137     var add = [];
138     var remove = [];
139     var update = [];
140
141     var limit_sets = [];
142     dojo.query('[name=limit-set-entry-row]', this.editPane.domNode).forEach(
143         function(row) {
144             var lset = row.getAttribute('limit_set');
145             limit_sets.push(lset);
146             var cached = limitSetEntryCache.filter(function(i) { return (i.limit_set() == lset); })[0];
147             if(!cached) {
148                 var entry = new fieldmapper.ccmlsm();
149                 entry.isnew(true);
150                 entry.matchpoint(id);
151                 entry.limit_set(lset);
152                 entry.active(byName('limit-set-active', row).checked ? 't' : 'f');
153                 entry.fallthrough(byName('limit-set-fallthrough', row).checked ? 't' : 'f');
154                 add.push(entry);
155             } else {
156                 var active = byName('limit-set-active', row).checked;
157                 var fallthrough = byName('limit-set-fallthrough', row).checked;
158                 if((active != (cached.active() == 't')) || (fallthrough != (cached.fallthrough() == 't'))) {
159                     cached.active(active ? 't' : 'f');
160                     cached.fallthrough(fallthrough ? 't' : 'f');
161                     cached.ischanged(true);
162                     update.push(cached);
163                 }
164             }
165         }
166     );
167     dojo.forEach(limitSetEntryCache, function(eSet) {
168             if(!limit_sets.filter(function(i) { return (i == eSet.limit_set()); })[0]) {
169                 eSet.isdeleted(true);
170                 remove.push(eSet);
171             }
172         }
173     );
174
175     function updateEntries() {
176         pcrud.update(update, {
177             oncomplete : function () {
178                 progressDialog.hide();
179             }
180         });
181     }
182
183     function removeEntries() {
184         pcrud.eliminate(remove, {
185             oncomplete : function () {
186                 if(update.length) {
187                     updateEntries();
188                 } else {
189                     progressDialog.hide();
190                 }
191             }
192         });
193     }
194
195     function addEntries() {
196         pcrud.create(add, {
197             oncomplete : function () {
198                 if(remove.length) {
199                     removeEntries();
200                 } else if (update.length) {
201                     updateEntries();
202                 } else {
203                     progressDialog.hide();
204                 }
205             }
206         });
207     }
208
209     if(add.length)
210         addEntries();
211     else if (remove.length)
212         removeEntries();
213     else if (update.length)
214         updateEntries();
215     else
216         progressDialog.hide();
217 }
218
219 openils.Util.addOnLoad(load);
220