]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/ui/default/acq/picklist/bib_search.js
moved lineitem table out to generic template for import. this will eventually take...
[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 var liTable;
24
25 function drawForm() {
26     liTable = new AcqLiTable();
27     fieldmapper.standardRequest(
28         ['open-ils.search', 'open-ils.search.z3950.retrieve_services'], 
29         {   async: true,
30             params: [user.authtoken],
31             oncomplete: _drawForm
32         }
33     );
34 }
35
36 function _drawForm(r) {
37
38     var sources = openils.Util.readResponse(r);
39     if(!sources) return;
40
41     for(var name in sources) {
42         source = sources[name];
43         if(name == 'native-evergreen-catalog') continue;
44         bibSourceSelect.addOption({value:name, label:source.label});
45         for(var attr in source.attrs) 
46             if(!attr.match(/^#/)) // xml comment nodes
47                 searchFields.push(source.attrs[attr]);
48     }
49
50     searchFields = searchFields.sort(
51         function(a,b) {
52             if(a.label < b.label) 
53                 return -1;
54             if(a.label > b.label) 
55                 return 1;
56             return 0;
57         }
58     );
59
60     var tbody = dojo.byId('oils-acq-search-fields-tbody');
61     var tmpl = tbody.removeChild(dojo.byId('oils-acq-search-fields-template'));
62
63     for(var f in searchFields) {
64         var field = searchFields[f];
65         if(dijit.byId('text_input_'+field.name)) continue;
66         var row = tmpl.cloneNode(true);
67         tbody.insertBefore(row, dojo.byId('oils-acq-seach-fields-count-row'));
68         var labelCell = dojo.query('[name=label]', row)[0];
69         var inputCell = dojo.query('[name=input]', row)[0];
70         labelCell.appendChild(document.createTextNode(field.label));
71         input = new dijit.form.TextBox({name:field.name, label:field.label, id:'text_input_'+field.name});
72         inputCell.appendChild(input.domNode);
73     }
74 }
75
76 function clearSearchForm() {
77     for(var f in searchFields) {
78         var field = searchFields[f];
79         dijit.byId('text_input_'+field.name).setValue('');
80     }
81 }
82
83 var resultRow;
84 function doSearch(values) {
85     showDiv('oils-acq-pl-loading');
86
87     search = {
88         service : [],
89         username : [],
90         password : [],
91         search : {},
92         limit : values.limit,
93         offset : searchOffset
94     };
95     searchLimit = values.limit;
96     delete values.limit;
97
98     var selected = bibSourceSelect.getValue();
99     for(var i = 0; i < selected.length; i++) {
100         search.service.push(selected[i]);
101         search.username.push('');
102         search.password.push('');
103         sourceCount++;
104     }
105
106     for(var v in values) {
107         if(values[v]) {
108             var input = dijit.byId('text_input_'+v);
109             search.search[v] = values[v];
110         }
111     }
112
113     fieldmapper.standardRequest(
114         ['open-ils.acq', 'open-ils.acq.picklist.search.z3950'],
115         {   async: true,
116             params: [user.authtoken, search, null, {respond_li:1, flesh_attrs:1, clear_marc:1}],
117             onresponse: handleResult,
118         }
119     );
120 }
121
122
123 function setRowAttr(td, liWrapper, field) {
124     var val = liWrapper.findAttr(field, 'lineitem_marc_attr_definition') || '';
125     td.appendChild(document.createTextNode(val));
126 }
127
128 function handleResult(r) {
129     var result = openils.Util.readResponse(r);
130     liTable.showTable();
131     dojo.style(dojo.byId('oils-acq-pl-search-results'), 'display', 'block');
132     var tbody = dojo.byId('plist-tbody');
133     if(result.lineitem) 
134         liTable.addLineitem(result.lineitem);
135     if(result.complete) // hide the loading image
136         dojo.style('oils-acq-pl-loading','display', 'none');
137 }
138
139
140 function showDiv(div) {
141     var divs = [
142         'oils-acq-search-block', 
143         'oils-acq-pl-loading' ];
144     dojo.forEach(divs, function(d) {dojo.style(d,'display', 'none')});
145     liTable.hideTable();
146     dojo.style(div, 'display', 'block');
147 }
148
149 function loadPLSelect() {
150     var plList = [];
151     function handleResponse(r) {
152         plList.push(r.recv().content());
153     }
154     var method = 'open-ils.acq.picklist.user.retrieve';
155     fieldmapper.standardRequest(
156         ['open-ils.acq', method],
157         {   async: true,
158             params: [openils.User.authtoken],
159             onresponse: handleResponse,
160             oncomplete: function() {
161                 plAddExistingSelect.store = 
162                     new dojo.data.ItemFileReadStore({data:acqpl.toStoreData(plList)});
163                 plAddExistingSelect.setValue();
164             }
165         }
166     );
167 }
168
169
170 function saveResults(values) {
171     selectedLIs = resultLIs;
172
173     if(values.which == 'selected') 
174         selectedLIs = liTable.getSelected();
175
176     if(values.new_name && values.new_name != '') {
177         // save selected lineitems to a new picklist
178         if(values.which = 'selected') {
179             openils.acq.Picklist.create(
180                 {name: values.new_name}, 
181                 function(id) {
182                     updateLiList(id, selectedLIs, 0, 
183                         function(){location.href = 'view/' + id});
184                 }
185             );
186         }  else {
187             // save all == change the name of the results picklist
188             resultPicklist.name(values.new_name); 
189             openils.acq.Picklist.update(resultPicklist,
190                 function(stat) {
191                     location.href = 'view/' + resultPicklist.id(); 
192                 }
193             );
194         }
195     } else if(values.existing_pl) {
196         // update lineitems to use an existing picklist
197         updateLiList(values.existing_pl, selectedLIs, 0, 
198             function(){location.href = 'view/' + values.existing_pl});
199     }
200 }
201
202 function updateLiList(pl, list, idx, oncomplete) {
203     if(idx >= list.length)
204         return oncomplete();
205     var li = selectedLIs[idx];
206     li.picklist(pl);
207     new openils.acq.Lineitem({lineitem:li}).update(
208         function(r) {
209             updateLiList(pl, list, ++idx, oncomplete);
210         }
211     );
212 }
213
214 openils.Util.addOnLoad(drawForm);