]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/js/ui/default/acq/picklist/brief_record.js
lp1774277 Improvements to Patron Acquisition Request
[Evergreen.git] / Open-ILS / web / js / ui / default / acq / picklist / brief_record.js
1 dojo.require('dojo.data.ItemFileReadStore');
2 dojo.require('dijit.form.Form');
3 dojo.require('dijit.form.TextBox');
4 dojo.require('dijit.form.DateTextBox');
5 dojo.require('dijit.form.Button');
6 dojo.require('dijit.form.ComboBox');
7 dojo.require('openils.User');
8 dojo.require('openils.widget.AutoFieldWidget');
9 dojo.require('openils.MarcXPathParser');
10 dojo.require('openils.acq.Picklist');
11 dojo.require('openils.CGI');
12
13 var attrDefs = {};
14 var paramPL = null;
15 var paramPO = null;
16 var paramUR = null; // User Request ID
17
18 function drawBriefRecordForm(fields) {
19
20     var tbody = dojo.byId('acq-brief-record-tbody');
21     var rowTmpl = dojo.byId('acq-brief-record-row');
22     var cgi = new openils.CGI();
23     paramPL = cgi.param('pl');
24     paramPO = cgi.param('po');
25     paramUR = cgi.param('ur');
26     prepop = JSON2js(cgi.param('prepop'));
27
28
29     if(paramPL) {
30         openils.Util.hide('acq-brief-record-po-row');
31
32         fieldmapper.standardRequest(
33             ['open-ils.acq', 'open-ils.acq.picklist.retrieve.authoritative'],
34             {   async: true,
35                 params: [openils.User.authtoken, paramPL], 
36                 oncomplete : function(r) {
37                     var pl = openils.Util.readResponse(r);
38                     plSelector.store = 
39                         new dojo.data.ItemFileReadStore({data:acqpl.toStoreData([pl])});
40                     plSelector.attr('value', pl.name());
41                     plSelector.attr('disabled', true);
42                 }
43             }
44         );
45
46     } else {
47
48         if(paramPO) {
49             openils.Util.hide('acq-brief-record-pl-row');
50             poNumber.attr('value', paramPO);
51
52         } else {
53             openils.Util.hide('acq-brief-record-po-row');
54             fieldmapper.standardRequest(
55                 ['open-ils.acq', 'open-ils.acq.picklist.user.retrieve.atomic'],
56                 {   async: true,
57                     params: [openils.User.authtoken], 
58                     oncomplete : function(r) {
59                         var list = openils.Util.readResponse(r);
60                         plSelector.store = 
61                             new dojo.data.ItemFileReadStore({data:acqpl.toStoreData(list)});
62                     }
63                 }
64             );
65         }
66     }
67
68
69     /*
70     marcEditButton.onClick = function(fields) {
71         saveBriefRecord(fields, true);
72     }
73     */
74
75     fieldmapper.standardRequest(
76         ['open-ils.acq', 'open-ils.acq.lineitem_attr_definition.retrieve.all'],
77         {   async : true,
78             params : [openils.User.authtoken],
79
80             oncomplete : function(r) {
81                 var attrs = openils.Util.readResponse(r);
82                 if(attrs && attrs.marc) {
83
84                     attrs = attrs.marc.sort(
85                         function(a, b) {
86                             if(a.description < b.description)
87                                 return 1;
88                             return -1;
89                         }
90                     );
91
92                     var xpathParser = new openils.MarcXPathParser();
93                     dojo.forEach(attrs,
94                         function(def) {
95                             attrDefs[def.code()] = xpathParser.parse(def.xpath());
96                             var row = rowTmpl.cloneNode(true);
97                             dojo.query('[name=name]', row)[0].innerHTML = def.description();
98                             var textbox = new dijit.form.TextBox(
99                                 {"name": def.code()},
100                                 dojo.query('[name=widget]', row)[0]
101                             );
102                             if (prepop && prepop[def.id()])
103                                 textbox.attr("value", prepop[def.id()]);
104                             tbody.appendChild(row);
105                         }
106                     );
107                 }
108             }
109         }
110     );
111 }
112
113 function saveBriefRecord(fields, editMarc) {
114
115     if(paramPL) {
116         fields.picklist = paramPL;
117         delete fields.po;
118         compileBriefRecord(fields, editMarc);
119         return false;
120     }
121
122     if(paramPO) {
123         fields.po = paramPO;
124         delete fields.picklist;
125         compileBriefRecord(fields, editMarc);
126         return false;
127     }
128
129     // first, deal with the selection list
130     var picklist = plSelector.attr('value');
131
132     if(!picklist) {
133         compileBriefRecord(fields, editMarc);
134         return false;
135     }
136
137     // ComboBox value is the display string.  find the actual picklist
138     // and create a new one if necessary
139     plSelector.store.fetch({
140         query : {name:picklist}, 
141
142         onComplete : function(items) {
143             if(items.length == 0) {
144                 
145                 // create a new picklist for these items
146                 openils.acq.Picklist.create(
147                     {name:picklist, org_unit: openils.User.user.ws_ou()},
148                     function(plId) { 
149                         fields.picklist = plId;
150                         compileBriefRecord(fields, editMarc);
151                     }
152                 );
153
154             } else {
155                 var id = plSelector.store.getValue(items[0], 'id');
156                 fields.picklist = id;
157                 compileBriefRecord(fields, editMarc);
158             }
159         }
160     });
161
162     return false;
163 }
164
165 function compileBriefRecord(fields, editMarc) {
166
167     var baseString = '<record xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ' +
168         'xmlns="http://www.loc.gov/MARC21/slim" ' +
169         'xmlns:marc="http://www.loc.gov/MARC21/slim" ' +
170         'xsi:schemaLocation="http://www.loc.gov/MARC21/slim http://www.loc.gov/ standards/marcxml/schema/MARC21slim.xsd">' +
171         '<leader>00000nam a22000007a 4500</leader></record>';
172
173     var doc = new DOMParser().parseFromString(baseString, 'text/xml');
174
175     for(var f in fields) {
176
177         var def = attrDefs[f];
178         if(!def) continue;
179         var value = fields[f];
180         if(!value) continue;
181
182         var dfNode = doc.createElementNS('http://www.loc.gov/MARC21/slim', 'marc:datafield');
183         var sfNode = doc.createElementNS('http://www.loc.gov/MARC21/slim', 'marc:subfield');
184         
185         // creates tags and fields in the document.  If there are more than one
186         // option for the tag or code, use the first in the list
187         dfNode.setAttribute('tag', ''+def.tags[0]);
188         dfNode.setAttribute('ind1', ' ');
189         dfNode.setAttribute('ind2', ' ');
190         sfNode.setAttribute('code', ''+def.subfields[0]);
191         tNode = doc.createTextNode(value);
192
193         sfNode.appendChild(tNode);
194         dfNode.appendChild(sfNode);
195         doc.documentElement.appendChild(dfNode);
196     }
197     
198
199     var xmlString = new XMLSerializer().serializeToString(doc);
200
201     var li = new fieldmapper.jub();
202     li.marc(xmlString);
203     li.picklist(fields.picklist);
204     if(fields.po) li.purchase_order(fields.po);
205     li.selector(openils.User.user.id());
206     li.creator(openils.User.user.id());
207     li.editor(openils.User.user.id());
208
209     fieldmapper.standardRequest(
210         ['open-ils.acq', 'open-ils.acq.lineitem.create'],
211         {   async : true,
212             params : [openils.User.authtoken, li],
213             oncomplete : function(r) {
214                 var id = openils.Util.readResponse(r);
215                 if(!id) return;
216                 if(editMarc) {
217                     // XXX load marc editor
218                 } else if (paramUR) {
219                     // update User Request with Lineitem and reload request interface
220                     var pcrud = new openils.PermaCrud({ authtoken : openils.User.authtoken });
221                     var aur_obj = pcrud.retrieve('aur',paramUR);
222                     aur_obj.lineitem( id );
223                     pcrud.update( aur_obj, {
224                         'oncomplete' : function(r, cudResults) {
225                             // Goes back to the list view
226                             if (!window.IAMBROWSER) {
227                                 location.href = oilsBasePath + '/acq/picklist/user_request';
228                             } else {
229                                 window.top.location.href = '/eg/staff/acq/requests/list';
230                             }
231                         }
232                     });
233                 } else {
234                     if(fields.picklist) 
235                         location.href = oilsBasePath + '/acq/picklist/view/' + fields.picklist;
236                     else
237                         location.href = oilsBasePath + '/acq/po/view/' + fields.po;
238                 }
239             }
240         }
241     );
242
243     return false;
244 }
245
246 openils.Util.addOnLoad(drawBriefRecordForm);