1 dojo.require("dijit.form.Form");
2 dojo.require("dijit.form.Button");
3 dojo.require("dijit.form.RadioButton");
4 dojo.require("dijit.form.TextBox");
5 dojo.require("dijit.form.FilteringSelect");
6 dojo.require("dojo.data.ItemFileReadStore");
7 dojo.require("openils.User");
8 dojo.require("openils.Util");
9 dojo.require("openils.PermaCrud");
10 dojo.require("openils.XUL");
11 dojo.require("openils.widget.AutoFieldWidget");
13 var combinedAttrValueArray = [];
14 var scalarAttrSearchManager;
17 function prepareStateStore(pcrud) {
18 stateSelector.store = new dojo.data.ItemFileReadStore({
20 "label": "description",
23 /* XXX i18n; Also, this list shouldn't be hardcoded here. */
24 {"code": "new", "description": "New"},
25 {"code": "on-order", "description": "On Order"},
26 {"code": "pending-order", "description": "Pending Order"}
32 function prepareScalarSearchStore(pcrud) {
35 function prepareArraySearchStore(pcrud) {
36 attrArrayDefSelector.store = new dojo.data.ItemFileReadStore({
37 "data": acqliad.toStoreData(
38 pcrud.search("acqliad", {"code": li_exportable_attrs})
43 function prepareAgencySelector() {
44 new openils.widget.AutoFieldWidget({
46 "fmField": "ordering_agency",
47 "parentNode": dojo.byId("agency_selector"),
48 "orgLimitPerms": ["VIEW_PURCHASE_ORDER"],
49 "dijitArgs": {"name": "agency", "required": false}
53 function toggleAttrSearchType(which, checked) {
54 /* This would be cooler with a slick dispatch table instead of branchy
55 * logic, but whatever... */
57 if (which == "scalar") {
58 if (scalarAttrSearchManager.index < 1)
59 scalarAttrSearchManager.add();
60 openils.Util.show("oils-acq-li-search-attr-scalar", "inline-block");
61 openils.Util.hide("oils-acq-li-search-attr-array");
62 } else if (which == "array") {
63 openils.Util.hide("oils-acq-li-search-attr-scalar");
64 openils.Util.show("oils-acq-li-search-attr-array", "inline");
66 openils.Util.hide("oils-acq-li-search-attr-scalar");
67 openils.Util.hide("oils-acq-li-search-attr-array");
72 var buildAttrSearchClause = {
73 "array": function(v) {
75 throw new Error(localeStrings.SELECT_AN_LI_ATTRIBUTE);
79 [[Number(v.array_def), combinedAttrValueArray]] /* [[sic]] */
82 "scalar": function(v) {
83 var r = scalarAttrSearchManager.buildSearchClause();
84 if (r.attr_value_pairs.length < 1) {
85 throw new Error(localeStrings.SELECT_AN_LI_ATTRIBUTE);
95 function naivelyParse(data) {
96 return data.split(/[\n, ]/).filter(function(o) {return o.length > 0; });
99 function clearTerms() {
100 combinedAttrValueArray = [];
101 dojo.byId("records-up").innerHTML = 0;
104 function loadTermsFromFile() {
108 /* FIXME 128k is completely arbitrary; needs researched for
109 * a sane limit and should also be made configurable. */
110 rawdata = openils.XUL.contentFromFileOpenDialog(
111 localeStrings.LI_ATTR_SEARCH_CHOOSE_FILE, 1024 * 128
119 combinedAttrValueArray =
120 combinedAttrValueArray.concat(naivelyParse(rawdata));
121 dojo.byId("records-up").innerHTML = combinedAttrValueArray.length;
128 function buildSearchClause(values) {
130 if (values.state) o.li_states = [values.state];
131 if (values.agency) o.po_agencies = [Number(values.agency)];
135 function doSearch(values) {
136 var results_this_time = 0;
139 fieldmapper.standardRequest(
140 ["open-ils.acq", "open-ils.acq.lineitem.search.by_attributes"], {
142 openils.User.authtoken,
144 buildAttrSearchClause[values.attr_search_type](values),
145 buildSearchClause(values)
148 "clear_marc": true, "flesh_attrs": true,
153 "onresponse": function(r) {
154 var li = openils.Util.readResponse(r);
157 liTable.addLineitem(li);
158 liTable.show("list");
161 "oncomplete": function() {
162 if (results_this_time < 1) {
163 alert(localeStrings.NO_RESULTS);
173 function myScalarAttrSearchManager(template_id, pcrud) {
174 this.template = dojo.byId(template_id);
175 this.store = new dojo.data.ItemFileReadStore({
176 "data": acqliad.toStoreData(
177 pcrud.search("acqliad", {"id": {"!=": null}})
183 myScalarAttrSearchManager.prototype.remove = function(n) {
184 dojo.destroy("scalar_attr_holder_" + n);
187 myScalarAttrSearchManager.prototype.add = function() {
190 var clone = dojo.clone(this.template);
191 var def = dojo.query('input[name="def"]', clone)[0];
192 var value = dojo.query('input[name="value"]', clone)[0];
193 var a = dojo.query('a', clone)[0];
195 clone.id = "scalar_attr_holder_" + n;
196 a.onclick = function() { self.remove(n); };
199 new dijit.form.FilteringSelect({
200 "id": "scalar_def_" + n,
201 "name": "scalar_def_" + n,
203 "labelAttr": "description",
204 "searchAttr": "description"
206 new dijit.form.TextBox({
207 "id": "scalar_value_" + n,
208 "name": "scalar_value_" + n
214 dojo.place(clone, "oils-acq-li-search-scalar-adder", "before");
215 openils.Util.show(clone);
217 myScalarAttrSearchManager.prototype.buildSearchClause = function() {
219 for (var k in this.rows) {
220 var def = this.rows[k][0].attr("value");
221 var val = this.rows[k][1].attr("value");
222 if (def != "" && val != "")
223 list.push([Number(def), val]);
225 return {"attr_value_pairs": list};
227 myScalarAttrSearchManager.prototype.simplifiedPairs = function() {
229 for (var k in this.rows) {
230 result[this.rows[k][0].attr("value")] = this.rows[k][1].attr("value");
234 myScalarAttrSearchManager.prototype.newBrief = function() {
235 location.href = oilsBasePath + "/acq/picklist/brief_record?prepop=" +
236 encodeURIComponent(js2JSON(this.simplifiedPairs()));
241 var pcrud = new openils.PermaCrud();
243 prepareStateStore(pcrud);
244 prepareArraySearchStore(pcrud);
246 prepareAgencySelector();
248 liTable = new AcqLiTable();
249 scalarAttrSearchManager = new myScalarAttrSearchManager(
250 "oils-acq-li-search-scalar-template", pcrud
253 openils.Util.show("oils-acq-li-search-form-holder");
256 openils.Util.addOnLoad(load);