]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/ui/default/acq/picklist/bib_search.js
more cleanup, plugged in get-selected operation, so back to original functionality
[working/Evergreen.git] / Open-ILS / web / js / ui / default / acq / picklist / bib_search.js
1 dojo.require('dijit.form.FilteringSelect');
2 dojo.require('dijit.Dialog');
3 dojo.require('dojox.form.CheckedMultiSelect');
4 dojo.require('fieldmapper.Fieldmapper');
5 dojo.require('dijit.form.Form');
6 dojo.require('dijit.form.TextBox');
7 dojo.require('dijit.form.NumberSpinner');
8 dojo.require('openils.Event');
9 dojo.require('openils.acq.Picklist');
10 dojo.require('openils.acq.Lineitem');
11 dojo.require('openils.User');
12 dojo.require('openils.Util');
13
14 var searchFields = [];
15 var resultPicklist;
16 var resultLIs;
17 var selectedLIs;
18 var recvCount = 0;
19 var sourceCount = 0; // how many sources are we searching
20 var user = new openils.User();
21 var searchLimit = 10;
22 var liCache = {};
23
24 function drawForm() {
25     fieldmapper.standardRequest(
26         ['open-ils.search', 'open-ils.search.z3950.retrieve_services'], 
27         {   async: true,
28             params: [user.authtoken],
29             oncomplete: _drawForm
30         }
31     );
32 }
33
34 function _drawForm(r) {
35
36     var sources = openils.Util.readResponse(r);
37     if(!sources) return;
38
39     for(var name in sources) {
40         source = sources[name];
41         if(name == 'native-evergreen-catalog') continue;
42         bibSourceSelect.addOption({value:name, label:source.label});
43         for(var attr in source.attrs) 
44             if(!attr.match(/^#/)) // xml comment nodes
45                 searchFields.push(source.attrs[attr]);
46     }
47
48     searchFields = searchFields.sort(
49         function(a,b) {
50             if(a.label < b.label) 
51                 return -1;
52             if(a.label > b.label) 
53                 return 1;
54             return 0;
55         }
56     );
57
58     var tbody = dojo.byId('oils-acq-search-fields-tbody');
59     var tmpl = tbody.removeChild(dojo.byId('oils-acq-search-fields-template'));
60
61     for(var f in searchFields) {
62         var field = searchFields[f];
63         if(dijit.byId('text_input_'+field.name)) continue;
64         var row = tmpl.cloneNode(true);
65         tbody.insertBefore(row, dojo.byId('oils-acq-seach-fields-count-row'));
66         var labelCell = dojo.query('[name=label]', row)[0];
67         var inputCell = dojo.query('[name=input]', row)[0];
68         labelCell.appendChild(document.createTextNode(field.label));
69         input = new dijit.form.TextBox({name:field.name, label:field.label, id:'text_input_'+field.name});
70         inputCell.appendChild(input.domNode);
71     }
72 }
73
74 function clearSearchForm() {
75     for(var f in searchFields) {
76         var field = searchFields[f];
77         dijit.byId('text_input_'+field.name).setValue('');
78     }
79 }
80
81 var resultRow;
82 function doSearch(values) {
83     showDiv('oils-acq-pl-loading');
84
85     var tbody = dojo.byId('plist-tbody');
86     if(!resultRow) 
87         resultRow = tbody.removeChild(dojo.byId('plist-row')); 
88     while(tbody.childNodes[0]) tbody.removeChild(tbody.childNodes[0]);
89
90     search = {
91         service : [],
92         username : [],
93         password : [],
94         search : {},
95         limit : values.limit,
96         offset : searchOffset
97     };
98     searchLimit = values.limit;
99     delete values.limit;
100
101     var selected = bibSourceSelect.getValue();
102     for(var i = 0; i < selected.length; i++) {
103         search.service.push(selected[i]);
104         search.username.push('');
105         search.password.push('');
106         sourceCount++;
107     }
108
109     for(var v in values) {
110         if(values[v]) {
111             var input = dijit.byId('text_input_'+v);
112             search.search[v] = values[v];
113         }
114     }
115
116     fieldmapper.standardRequest(
117         ['open-ils.acq', 'open-ils.acq.picklist.search.z3950'],
118         {   async: true,
119             params: [user.authtoken, search, null, {respond_li:1, flesh_attrs:1, clear_marc:1}],
120             onresponse: handleResult,
121         }
122     );
123 }
124
125 var selectState = false;
126 function toggleSelect() {
127     var inputs = dojo.query('[name=selectbox]', dojo.byId('plist-tbody'));
128     if(selectState)
129         dojo.forEach(inputs, function(i){i.checked = false});
130     else
131         dojo.forEach(inputs, function(i){i.checked = true});
132     selectState = !selectState;
133 }
134
135 function getSelected() {
136     var inputs = dojo.query('[name=selectbox]', dojo.byId('plist-tbody'));
137     var selected = [];
138     dojo.forEach(inputs, function(i) { 
139         if(i.checked) 
140             selected.push(liCache[i.parentNode.parentNode.getAttribute('li')]);
141     });
142     return selected;
143 }
144
145 function setRowAttr(td, liWrapper, field) {
146     var val = liWrapper.findAttr(field, 'lineitem_marc_attr_definition') || '';
147     td.appendChild(document.createTextNode(val));
148 }
149
150 function handleResult(r) {
151     var result = openils.Util.readResponse(r);
152     dojo.style('oils-acq-pl-search-results', 'display', 'block');
153     var tbody = dojo.byId('plist-tbody');
154
155     if(result.lineitem) {
156         var li = result.lineitem;
157         liCache[li.id()] = li;
158         var liWrapper = new openils.acq.Lineitem({lineitem:li});
159         var row = resultRow.cloneNode(true);
160         row.setAttribute('li', li.id());
161         var tds = dojo.query('[attr]', row);
162         dojo.forEach(tds, function(td) {setRowAttr(td, liWrapper, td.getAttribute('attr'));});
163         dojo.query('[name=source_label]', row)[0].appendChild(document.createTextNode(li.source_label()));
164         tbody.appendChild(row);
165     }
166
167     if(result.complete) // hide the loading image
168         showDiv('oils-acq-pl-search-results');
169 }
170
171
172 function showDiv(div) {
173     var divs = [
174         'oils-acq-pl-search-results',
175         'oils-acq-search-block', 
176         'oils-acq-pl-loading' ];
177     dojo.forEach(divs, function(d) {dojo.style(d,'display', 'none')});
178     dojo.style(div, 'display', 'block');
179 }
180
181 function loadPLSelect() {
182     var plList = [];
183     function handleResponse(r) {
184         plList.push(r.recv().content());
185     }
186     var method = 'open-ils.acq.picklist.user.retrieve';
187     fieldmapper.standardRequest(
188         ['open-ils.acq', method],
189         {   async: true,
190             params: [openils.User.authtoken],
191             onresponse: handleResponse,
192             oncomplete: function() {
193                 plAddExistingSelect.store = 
194                     new dojo.data.ItemFileReadStore({data:acqpl.toStoreData(plList)});
195                 plAddExistingSelect.setValue();
196             }
197         }
198     );
199 }
200
201
202 function saveResults(values) {
203     selectedLIs = resultLIs;
204
205     if(values.which == 'selected') 
206         selectedLIs = getSelected();
207         
208     if(values.new_name && values.new_name != '') {
209         // save selected lineitems to a new picklist
210         if(values.which = 'selected') {
211             openils.acq.Picklist.create(
212                 {name: values.new_name}, 
213                 function(id) {
214                     updateLiList(id, selectedLIs, 0, 
215                         function(){location.href = 'view/' + id});
216                 }
217             );
218         }  else {
219             // save all == change the name of the results picklist
220             resultPicklist.name(values.new_name); 
221             openils.acq.Picklist.update(resultPicklist,
222                 function(stat) {
223                     location.href = 'view/' + resultPicklist.id(); 
224                 }
225             );
226         }
227     } else if(values.existing_pl) {
228         // update lineitems to use an existing picklist
229         updateLiList(values.existing_pl, selectedLIs, 0, 
230             function(){location.href = 'view/' + values.existing_pl});
231     }
232 }
233
234 function updateLiList(pl, list, idx, oncomplete) {
235     if(idx >= list.length)
236         return oncomplete();
237     var li = selectedLIs[idx];
238     li.picklist(pl);
239     new openils.acq.Lineitem({lineitem:li}).update(
240         function(r) {
241             updateLiList(pl, list, ++idx, oncomplete);
242         }
243     );
244 }
245
246 openils.Util.addOnLoad(drawForm);