--- /dev/null
+dojo.require("dijit.form.Form");
+dojo.require("dijit.form.Button");
+dojo.require("dijit.form.RadioButton");
+dojo.require("dijit.form.TextBox");
+dojo.require("dijit.form.FilteringSelect");
+dojo.require("dojo.data.ItemFileReadStore");
+dojo.require("openils.User");
+dojo.require("openils.Util");
+dojo.require("openils.PermaCrud");
+dojo.require("openils.XUL");
+dojo.require("openils.widget.AutoFieldWidget");
+
+var combinedAttrValueArray = [];
+var scalarAttrSearchManager;
+var liTable;
+
+function prepareStateStore(pcrud) {
+ stateSelector.store = new dojo.data.ItemFileReadStore({
+ "data": {
+ "label": "description",
+ "identifier": "code",
+ "items": [
+ /* XXX i18n; Also, this list shouldn't be hardcoded here. */
+ {"code": "new", "description": "New"},
+ {"code": "on-order", "description": "On Order"},
+ {"code": "pending-order", "description": "Pending Order"}
+ ]
+ }
+ });
+}
+
+function prepareScalarSearchStore(pcrud) {
+}
+
+function prepareArraySearchStore(pcrud) {
+ attrArrayDefSelector.store = new dojo.data.ItemFileReadStore({
+ "data": acqliad.toStoreData(
+ pcrud.search("acqliad", {"code": li_exportable_attrs})
+ )
+ });
+}
+
+function prepareAgencySelector() {
+ new openils.widget.AutoFieldWidget({
+ "fmClass": "acqpo",
+ "fmField": "ordering_agency",
+ "parentNode": dojo.byId("agency_selector"),
+ "orgLimitPerms": ["VIEW_PURCHASE_ORDER"],
+ "dijitArgs": {"name": "agency", "required": false}
+ }).build();
+}
+
+function toggleAttrSearchType(which, checked) {
+ /* This would be cooler with a slick dispatch table instead of branchy
+ * logic, but whatever... */
+ if (checked) {
+ if (which == "scalar") {
+ if (scalarAttrSearchManager.index < 1)
+ scalarAttrSearchManager.add();
+ openils.Util.show("oils-acq-li-search-attr-scalar", "inline-block");
+ openils.Util.hide("oils-acq-li-search-attr-array");
+ } else if (which == "array") {
+ openils.Util.hide("oils-acq-li-search-attr-scalar");
+ openils.Util.show("oils-acq-li-search-attr-array", "inline");
+ } else {
+ openils.Util.hide("oils-acq-li-search-attr-scalar");
+ openils.Util.hide("oils-acq-li-search-attr-array");
+ }
+ }
+}
+
+var buildAttrSearchClause = {
+ "array": function(v) {
+ if (!v.array_def) {
+ throw new Error(localeStrings.SELECT_AN_LI_ATTRIBUTE);
+ }
+ return {
+ "attr_value_pairs":
+ [[Number(v.array_def), combinedAttrValueArray]] /* [[sic]] */
+ };
+ },
+ "scalar": function(v) {
+ var r = scalarAttrSearchManager.buildSearchClause();
+ if (r.attr_value_pairs.length < 1) {
+ throw new Error(localeStrings.SELECT_AN_LI_ATTRIBUTE);
+ } else {
+ return r;
+ }
+ },
+ "none": function(v) {
+ return {};
+ }
+};
+
+function naivelyParse(data) {
+ return data.split(/[\n, ]/).filter(function(o) {return o.length > 0; });
+}
+
+function clearTerms() {
+ combinedAttrValueArray = [];
+ dojo.byId("records-up").innerHTML = 0;
+}
+
+function loadTermsFromFile() {
+ var rawdata;
+
+ try {
+ /* FIXME 128k is completely arbitrary; needs researched for
+ * a sane limit and should also be made configurable. */
+ rawdata = openils.XUL.contentFromFileOpenDialog(
+ localeStrings.LI_ATTR_SEARCH_CHOOSE_FILE, 1024 * 128
+ );
+ } catch (E) {
+ alert(E);
+ }
+
+ if (rawdata) {
+ try {
+ combinedAttrValueArray =
+ combinedAttrValueArray.concat(naivelyParse(rawdata));
+ dojo.byId("records-up").innerHTML = combinedAttrValueArray.length;
+ } catch (E) {
+ alert(E);
+ }
+ }
+}
+
+function buildSearchClause(values) {
+ var o = {};
+ if (values.state) o.li_states = [values.state];
+ if (values.agency) o.po_agencies = [Number(values.agency)];
+ return o;
+}
+
+function doSearch(values) {
+ var results_this_time = 0;
+ liTable.reset();
+ try {
+ fieldmapper.standardRequest(
+ ["open-ils.acq", "open-ils.acq.lineitem.search.by_attributes"], {
+ "params": [
+ openils.User.authtoken,
+ dojo.mixin(
+ buildAttrSearchClause[values.attr_search_type](values),
+ buildSearchClause(values)
+ ),
+ {
+ "clear_marc": true, "flesh_attrs": true,
+ "flesh_notes": true
+ }
+ ],
+ "async": true,
+ "onresponse": function(r) {
+ var li = openils.Util.readResponse(r);
+ if (li) {
+ results_this_time++;
+ liTable.addLineitem(li);
+ liTable.show("list");
+ }
+ },
+ "oncomplete": function() {
+ if (results_this_time < 1) {
+ alert(localeStrings.NO_RESULTS);
+ }
+ }
+ }
+ );
+ } catch (E) {
+ alert(E); // XXX
+ }
+}
+
+function myScalarAttrSearchManager(template_id, pcrud) {
+ this.template = dojo.byId(template_id);
+ this.store = new dojo.data.ItemFileReadStore({
+ "data": acqliad.toStoreData(
+ pcrud.search("acqliad", {"id": {"!=": null}})
+ )
+ });
+ this.rows = {};
+ this.index = 0;
+};
+myScalarAttrSearchManager.prototype.remove = function(n) {
+ dojo.destroy("scalar_attr_holder_" + n);
+ delete this.rows[n];
+};
+myScalarAttrSearchManager.prototype.add = function() {
+ var self = this;
+ var n = this.index;
+ var clone = dojo.clone(this.template);
+ var def = dojo.query('input[name="def"]', clone)[0];
+ var value = dojo.query('input[name="value"]', clone)[0];
+ var a = dojo.query('a', clone)[0];
+
+ clone.id = "scalar_attr_holder_" + n;
+ a.onclick = function() { self.remove(n); };
+
+ this.rows[n] = [
+ new dijit.form.FilteringSelect({
+ "id": "scalar_def_" + n,
+ "name": "scalar_def_" + n,
+ "store": this.store,
+ "labelAttr": "description",
+ "searchAttr": "description"
+ }, def),
+ new dijit.form.TextBox({
+ "id": "scalar_value_" + n,
+ "name": "scalar_value_" + n
+ }, value)
+ ];
+
+ this.index++;
+
+ dojo.place(clone, "oils-acq-li-search-scalar-adder", "before");
+ openils.Util.show(clone);
+};
+myScalarAttrSearchManager.prototype.buildSearchClause = function() {
+ var list = [];
+ for (var k in this.rows) {
+ var def = this.rows[k][0].attr("value");
+ var val = this.rows[k][1].attr("value");
+ if (def != "" && val != "")
+ list.push([Number(def), val]);
+ }
+ return {"attr_value_pairs": list};
+};
+myScalarAttrSearchManager.prototype.simplifiedPairs = function() {
+ var result = {};
+ for (var k in this.rows) {
+ result[this.rows[k][0].attr("value")] = this.rows[k][1].attr("value");
+ }
+ return result;
+};
+myScalarAttrSearchManager.prototype.newBrief = function() {
+ location.href = oilsBasePath + "/acq/picklist/brief_record?prepop=" +
+ encodeURIComponent(js2JSON(this.simplifiedPairs()));
+};
+
+
+function load() {
+ var pcrud = new openils.PermaCrud();
+
+ prepareStateStore(pcrud);
+ prepareArraySearchStore(pcrud);
+
+ prepareAgencySelector();
+
+ liTable = new AcqLiTable();
+ scalarAttrSearchManager = new myScalarAttrSearchManager(
+ "oils-acq-li-search-scalar-template", pcrud
+ );
+
+ openils.Util.show("oils-acq-li-search-form-holder");
+}
+
+openils.Util.addOnLoad(load);