copy loc groups: admin UI
authorBill Erickson <berick@esilibrary.com>
Fri, 17 Feb 2012 22:25:15 +0000 (17:25 -0500)
committerBill Erickson <berick@esilibrary.com>
Fri, 17 Feb 2012 22:25:15 +0000 (17:25 -0500)
Signed-off-by: Bill Erickson <berick@esilibrary.com>
Open-ILS/src/templates/conify/global/asset/copy_location_group.tt2
Open-ILS/web/js/ui/default/conify/global/asset/copy_location_group.js

index 875c81a..d28bb8f 100644 (file)
         <div>
             <table width='100%'><tr>
                 <td align='left'>[% l('Group Entries') %]</td>
-                <td align='right'><button>[% l('&rarr; Remove') %]</button></td>
+                <td align='right'><button onclick='editLocations("eliminate")'>[% l('Remove &rarr;') %]</button></td>
             </tr></table>
         </div>
         <div style='height:400px; overflow-y:scroll'>
             <table>
                 <tbody id='acplg-loc-map-tbody' class='acplg-list-tbody'>
                     <tr id='acplg-loc-map-row'>
-                        <td><input type='checkbox' name='selected'/></td>
+                        <td><input type='checkbox' name='selector'/></td>
                         <td><span name='owning_lib'></span></td>
                         <td><span name='name'></span></td>
                     </td>
@@ -90,7 +90,7 @@
     <div class='acpl-content acpl-content-2'>
         <div>
             <table width='100%'><tr>
-                <td align='left'><button>[% l('&larr; Add') %]</button></td>
+                <td align='left'><button onclick='editLocations("create")'>[% l('&larr; Add') %]</button></td>
                 <td align='right'>[% l('Copy Locations') %]</td>
             </tr></table>
         </div>
@@ -98,7 +98,7 @@
             <table>
                 <tbody id='acplg-loc-tbody' class='acplg-list-tbody'>
                     <tr id='acplg-loc-row'>
-                        <td><input type='checkbox' name='selected'/></td>
+                        <td><input type='checkbox' name='selector'/></td>
                         <td><span name='owning_lib'></span></td>
                         <td><span name='name'></span></td>
                     </td>
index 8578fa6..58d05b3 100644 (file)
@@ -12,9 +12,15 @@ dojo.require('openils.widget.OrgUnitFilteringSelect');
 
 var user;
 var groups;
-var groupMaps;
 var locations;
 var source;
+var locTbody;
+var locRowTemplate;
+var locMapTbody;
+var locMapRowTemplate;
+var currentGroupId;
+var currentGroupMaps;
+var currentOrg;
 
 function init() {
 
@@ -26,7 +32,7 @@ function init() {
         contextOrgSelector, 
         null, 
         function() {
-              dojo.connect(contextOrgSelector, 'onChange', filterPage);
+              dojo.connect(contextOrgSelector, 'onChange', drawPage);
         }
     );
 
@@ -36,40 +42,14 @@ function init() {
             order_by : {aou : 'shortname'},
             oncomplete : function(r) {
                 locations = openils.Util.readResponse(r);
-                filterPage(user.user.ws_ou());
+                drawPage(user.user.ws_ou());
             }
         }
     );
 }
 
-var locTbody;
-var locRowTemplate;
-function drawLocations(org) {
-
-    if (!locTbody) {
-        locTbody = dojo.byId('acplg-loc-tbody');
-        locRowTemplate = locTbody.removeChild(dojo.byId('acplg-loc-row'));
-    } else {
-        // clear out the previous table
-        while (node = locTbody.childNodes[0])
-            locTbody.removeChild(node);
-    }
-
-    var allMyOrgs = fieldmapper.aou.fullPath(org, true);
-
-    dojo.forEach(locations,
-        function(loc) {
-            if (allMyOrgs.indexOf(loc.owning_lib()) == -1) return;
-            var row = locRowTemplate.cloneNode(true);
-            row.setAttribute('location', loc.id());
-            dojo.query('[name=name]', row)[0].innerHTML = loc.name();
-            dojo.query('[name=owning_lib]', row)[0].innerHTML = fieldmapper.aou.findOrgUnit(loc.owning_lib()).shortname();
-            locTbody.appendChild(row);
-        }
-    );
-}
 
-function filterPage(org) {
+function drawPage(org) {
     drawLocations(org);
 
     var pcrud = new openils.PermaCrud({authtoken : user.authtoken});
@@ -96,18 +76,52 @@ function filterPage(org) {
     editGroupEntries(groups[0].id());
 }
 
+function drawLocations(org) {
+    currentOrg = org;
+
+    if (!locTbody) {
+        locTbody = dojo.byId('acplg-loc-tbody');
+        locRowTemplate = locTbody.removeChild(dojo.byId('acplg-loc-row'));
+    } else {
+        // clear out the previous table
+        while (node = locTbody.childNodes[0])
+            locTbody.removeChild(node);
+    }
+
+    var allMyOrgs = fieldmapper.aou.fullPath(org, true);
+
+    dojo.forEach(locations,
+        function(loc) {
+            if (allMyOrgs.indexOf(loc.owning_lib()) == -1) return;
+
+            // don't show locations contained in the current group
+            if (currentGroupMaps) {
+                var existing = currentGroupMaps.filter(
+                    function(map) { return (map.location() == loc.id()) });
+                if (existing.length > 0) return;
+            }
+
+            var row = locRowTemplate.cloneNode(true);
+            row.setAttribute('location', loc.id());
+            dojo.query('[name=name]', row)[0].innerHTML = loc.name();
+            dojo.query('[name=owning_lib]', row)[0].innerHTML = fieldmapper.aou.findOrgUnit(loc.owning_lib()).shortname();
+            locTbody.appendChild(row);
+        }
+    );
+}
+
 function editGroup(grpId) {
     // show EditDialog
 }
+
 function deleteGroup(grpId) {
     // confirm and delete
 }
 
-var locMapTbody;
-var locMapRowTemplate;
 function editGroupEntries(grpId) {
+    currentGroupId = grpId;
     var pcrud = new openils.PermaCrud({authtoken : user.authtoken});
-    groupMaps = pcrud.search('acplgm', {lgroup : grpId});
+    currentGroupMaps = pcrud.search('acplgm', {lgroup : grpId});
 
     dojo.query('[group]').forEach(
         function(node) {
@@ -128,7 +142,7 @@ function editGroupEntries(grpId) {
             locMapTbody.removeChild(node);
     }
 
-    dojo.forEach(groupMaps,
+    dojo.forEach(currentGroupMaps,
         function(map) {
             var row = locMapRowTemplate.cloneNode(true);
             row.setAttribute('map', map.id());
@@ -138,12 +152,61 @@ function editGroupEntries(grpId) {
             dojo.query('[name=owning_lib]', row)[0].innerHTML = 
                 fieldmapper.aou.findOrgUnit(loc.owning_lib()).shortname();
             locMapTbody.appendChild(row);
+
+            // if the location is in the group, remove it from the location selection list
+            removeLocationRow(loc.id());
+        }
+    );
+}
+
+function editLocations(action) {
+    var maps = [];
+    var tbody = (action == 'create') ? locTbody : locMapTbody;
+    dojo.forEach(tbody.getElementsByTagName('tr'),
+        function(row) {
+            var selector = dojo.query('[name=selector]', row)[0];
+            if (selector.checked) {
+                var map = new fieldmapper.acplgm();
+                map.lgroup(currentGroupId);
+                if (action == 'create') {
+                    map.location(row.getAttribute('location'));
+                } else {
+                    map.id(row.getAttribute('map'));
+                }
+                maps.push(map);
+            }
         }
     );
+
+    if (maps.length == 0) return;
+
+    // check for dupes
+    var pcrud = new openils.PermaCrud({authtoken : user.authtoken});
+    pcrud[action](maps, {
+        oncomplete : function() { 
+            editGroupEntries(currentGroupId) 
+            if (action != 'create') {
+                drawLocations(currentOrg);
+            }
+        }
+    });
+}
+
+function deSelectAll(node) {
+    dojo.query('[name=selector]', node).forEach(
+        function(selector) {
+            selector.checked = false;
+        }
+    );
+}
+
+function removeLocationRow(locId) {
+    var row = dojo.query('[location=' + locId + ']', locTbody)[0];
+    if (row) locTbody.removeChild(row);
 }
 
 /*
-function filterPage(org) {
+function drawPage(org) {
 
     // fetch the groups and groupMaps
     if(!orders) {
@@ -222,7 +285,7 @@ function applyChanges() {
                     if(r.orders) {
                         orders = r.order;
                         progressDialog.hide();
-                        filterPage(contextOrg);
+                        drawPage(contextOrg);
                         return;
                     } 
                     progressDialog.update(r);