Initial dev repository
[kcls-web.git] / js / ui / default / conify / global / asset / copy_location_order.js
diff --git a/js/ui/default/conify/global/asset/copy_location_order.js b/js/ui/default/conify/global/asset/copy_location_order.js
new file mode 100644 (file)
index 0000000..5032b34
--- /dev/null
@@ -0,0 +1,124 @@
+dojo.require('dijit.layout.ContentPane');
+dojo.require("dojo.dnd.Container");
+dojo.require("dojo.dnd.Source");
+dojo.require('openils.widget.OrgUnitFilteringSelect');
+dojo.require('fieldmapper.OrgUtils');
+dojo.require('openils.User');
+dojo.require('openils.Util');
+dojo.require('openils.widget.AutoGrid');
+dojo.require('openils.PermaCrud');
+dojo.require('openils.widget.ProgressDialog');
+
+var user;
+var orders;
+var locations;
+var source;
+
+function init() {
+
+     user = new openils.User();
+     source = new dojo.dnd.Source('acl-ol');
+
+     user.buildPermOrgSelector(
+        'ADMIN_COPY_LOCATION_ORDER', 
+        contextOrgSelector, 
+        null, 
+        function() {
+              dojo.connect(contextOrgSelector, 'onChange', filterGrid);
+        }
+    );
+
+    filterGrid(user.user.ws_ou());
+}
+
+function filterGrid(org) {
+
+    // fetch the locations and order entries
+    if(!orders) {
+        var pcrud = new openils.PermaCrud({authtoken : user.authtoken});
+        orders = pcrud.search('acplo', {org : org}, {order_by : {acplo : 'position'}});
+        locations = pcrud.search('acpl', 
+            {owning_lib : fieldmapper.aou.orgNodeTrail(fieldmapper.aou.findOrgUnit(org), true)}, 
+            {order_by : {acpl : 'name'}}
+        ); 
+    }
+
+    // init the DnD environment
+    source.selectAll();
+    source.deleteSelectedNodes();
+    source.clearItems();
+
+    var locs = [];
+
+    // sort and append by existing order settings
+    dojo.forEach(orders, 
+        function(order) {
+            locs.push( 
+                locations.filter(function(l) {return l.id() == order.location()})[0] 
+            );
+        }
+    );
+
+    // append any non-sorted locations
+    dojo.forEach(locations, 
+        function(l) {
+            if(!locs.filter(function(ll) { return ll.id() == l.id() })[0])
+                locs.push(l);
+        }
+    );
+
+    // shove them into the DnD environment
+    dojo.forEach(locs,
+        function(loc) {
+            if(!loc) return;
+            var node = source.insertNodes(false, [ 
+                { 
+                    data : loc.name() + ' (' + fieldmapper.aou.findOrgUnit(loc.owning_lib()).shortname()+')',
+                    type : [loc.id()+''] // use the type field to store the ID
+                }
+            ]);
+        }
+    );
+}
+
+function applyChanges() {
+    progressDialog.show();
+
+    var newOrders = [];
+    var contextOrg = contextOrgSelector.attr('value');
+
+    // pull the locations out of the DnD environment and create order entries for them
+    dojo.forEach(
+        source.getAllNodes(),
+        function(node) {
+            var item = source.getItem(node.id);
+            var o = new fieldmapper.acplo();
+            o.position(newOrders.length + 1);
+            o.location(item.type[0]); // location.id() is stored in DnD item type
+            o.org(contextOrg);
+            newOrders.push(o);
+        }
+    );
+
+    fieldmapper.standardRequest(
+        ['open-ils.circ', 'open-ils.circ.copy_location_order.update'],
+        {
+            async : true,
+            params : [openils.User.authtoken, newOrders],
+            onresponse : function(r) {
+                if(r = openils.Util.readResponse(r)) {
+                    if(r.orders) {
+                        orders = r.order;
+                        progressDialog.hide();
+                        filterGrid(contextOrg);
+                        return;
+                    } 
+                    progressDialog.update(r);
+                }
+            },
+        }
+    );
+}
+
+openils.Util.addOnLoad(init);
+