copy loc groups: admin UI
authorBill Erickson <berick@esilibrary.com>
Fri, 17 Feb 2012 21:14:16 +0000 (16:14 -0500)
committerBill Erickson <berick@esilibrary.com>
Fri, 17 Feb 2012 21:14:16 +0000 (16:14 -0500)
Signed-off-by: Bill Erickson <berick@esilibrary.com>
Open-ILS/src/templates/conify/global/asset/copy_location_group.tt2 [new file with mode: 0644]
Open-ILS/web/js/ui/default/conify/global/asset/copy_location_group.js [new file with mode: 0644]

diff --git a/Open-ILS/src/templates/conify/global/asset/copy_location_group.tt2 b/Open-ILS/src/templates/conify/global/asset/copy_location_group.tt2
new file mode 100644 (file)
index 0000000..875c81a
--- /dev/null
@@ -0,0 +1,131 @@
+[% WRAPPER base.tt2 %]
+[% ctx.page_title = l('Copy Location Group') %]
+<script type="text/javascript" src='[% ctx.media_prefix %]/js/ui/default/conify/global/asset/copy_location_group.js'> </script>
+<link rel='stylesheet' type='text/css' href='[% ctx.media_prefix %]/js/dojo/dojo/resources/dnd.css'/>
+<style>
+    .acpl-content {
+        padding: 10px; 
+        padding-top: 20px;
+        min-width: 20%;
+        height: 100%;
+    }
+    .acpl-content div:first-child {
+        font-weight: bold;
+        font-size: 110%;
+        border-bottom: 1px solid #888;
+    }
+    .acpl-content-2 {
+        border-left: 2px solid #888;
+        float:left;
+    }
+    .acplg-drag-handle { 
+        background-image: url([% ctx.media_prefix %]/images/dimple.png);
+        background-repeat: no-repeat;
+        background-position: center;
+        padding: 5px;
+        margin-left:5px;
+    }
+    .acplg-list-tbody td {
+        padding: 2px;
+    }
+    #acplg-list li {
+        padding: 5px;
+    }
+    #acplg-header {
+        margin-top: 20px;
+        border-bottom: 2px solid #888;
+        padding-bottom: 10px;
+    }
+    #acplg-header span {
+        font-size:110%;
+        font-weight: bold;
+        padding-right: 20px;
+    }
+    #acplg-header span:first-child {
+        font-size: 130%;
+    }
+    .acplg-group-selected {
+        background-color:#E7A555;
+        border: 1px solid #4A4747;
+    }
+</style>
+
+<div id='acplg-header'>
+    <span>[% l('Copy Location Groups') %]</span>
+    <span>[% l('Context Org Unit') %]</span>
+    <select dojoType="openils.widget.OrgUnitFilteringSelect"
+            jsId='contextOrgSelector'
+            searchAttr='shortname'
+            labelAttr='shortname'>
+    </select>
+    <!--
+    <button dojoType='dijit.form.Button' onClick='applyChanges()'>[% l('Apply Changes') %]</button>
+    -->
+</div>
+
+<div dojoType="dijit.layout.ContentPane" layoutAlign="client" style="width:100%">
+    <div class='acpl-content' style="float: left">
+        <div>[% l('Location Groups') %]</div>
+        <ol id='acplg-list'></ol>
+    </div>
+    <div class='acpl-content acpl-content-2'>
+        <div>
+            <table width='100%'><tr>
+                <td align='left'>[% l('Group Entries') %]</td>
+                <td align='right'><button>[% l('&rarr; Remove') %]</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><span name='owning_lib'></span></td>
+                        <td><span name='name'></span></td>
+                    </td>
+                </tbody>
+            </table>
+        </div>
+    </div>
+    <div class='acpl-content acpl-content-2'>
+        <div>
+            <table width='100%'><tr>
+                <td align='left'><button>[% l('&larr; Add') %]</button></td>
+                <td align='right'>[% l('Copy Locations') %]</td>
+            </tr></table>
+        </div>
+        <div style='height:400px; overflow-y:scroll'>
+            <table>
+                <tbody id='acplg-loc-tbody' class='acplg-list-tbody'>
+                    <tr id='acplg-loc-row'>
+                        <td><input type='checkbox' name='selected'/></td>
+                        <td><span name='owning_lib'></span></td>
+                        <td><span name='name'></span></td>
+                    </td>
+                </tbody>
+            </table>
+        </div>
+    </div>
+</div>
+
+<div class='hidden'>
+    <div dojoType='openils.widget.ProgressDialog' jsId='progressDialog'></div>
+    <div id='dnd-drag-actions'>
+        <span>
+            <span style='padding:5px;' group="GRPID">
+                <span><a href="#" onclick="editGroupEntries(GRPID)">GRPNAME</a></span>
+                [
+                <span><a href="#" onclick="editGroup(GRPID)">[% l('Edit') %]</a></span>
+                <span><a href="#" onclick="deleteGroup(GRPID)">[% l('Delete') %]</a></span>
+                ]
+            </span>
+            <span></span>
+            <span class='acplg-drag-handle'></span>
+            <span class='acplg-drag-handle'></span>
+            <span class='acplg-drag-handle'></span>
+        </span>
+    </div>
+</div>
+
+
+[% END %]
diff --git a/Open-ILS/web/js/ui/default/conify/global/asset/copy_location_group.js b/Open-ILS/web/js/ui/default/conify/global/asset/copy_location_group.js
new file mode 100644 (file)
index 0000000..8578fa6
--- /dev/null
@@ -0,0 +1,236 @@
+dojo.require('dijit.layout.ContentPane');
+dojo.require('dijit.layout.BorderContainer');
+dojo.require("dojo.dnd.Container");
+dojo.require("dojo.dnd.Source");
+dojo.require('fieldmapper.OrgUtils');
+dojo.require('openils.User');
+dojo.require('openils.Util');
+dojo.require('openils.PermaCrud');
+dojo.require('openils.widget.AutoGrid');
+dojo.require('openils.widget.ProgressDialog');
+dojo.require('openils.widget.OrgUnitFilteringSelect');
+
+var user;
+var groups;
+var groupMaps;
+var locations;
+var source;
+
+function init() {
+
+     user = new openils.User();
+     source = new dojo.dnd.Source('acplg-list');
+
+     user.buildPermOrgSelector(
+        'ADMIN_COPY_LOCATION_GROUP', 
+        contextOrgSelector, 
+        null, 
+        function() {
+              dojo.connect(contextOrgSelector, 'onChange', filterPage);
+        }
+    );
+
+    var pcrud = new openils.PermaCrud({authtoken : user.authtoken});
+    pcrud.retrieveAll('acpl', // this can take some time...
+        {   async : true,
+            order_by : {aou : 'shortname'},
+            oncomplete : function(r) {
+                locations = openils.Util.readResponse(r);
+                filterPage(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) {
+    drawLocations(org);
+
+    var pcrud = new openils.PermaCrud({authtoken : user.authtoken});
+    groups = pcrud.search('acplg', {owner : org}, {order_by : {acplg : 'pos'}});
+
+    source.selectAll();
+    source.deleteSelectedNodes();
+    source.clearItems();
+    var drag = dojo.byId('dnd-drag-actions').cloneNode(true);
+    drag.id = '';
+
+    dojo.forEach(groups,
+        function(group) {
+            if(!group) return;
+            var node = source.insertNodes(false, [ 
+                { 
+                    data : drag.innerHTML.replace(/GRPID/g, group.id()).replace(/GRPNAME/g, group.name()),
+                    type : [group.id()+''] // use the type field to store the ID
+                }
+            ]);
+        }
+    );
+
+    editGroupEntries(groups[0].id());
+}
+
+function editGroup(grpId) {
+    // show EditDialog
+}
+function deleteGroup(grpId) {
+    // confirm and delete
+}
+
+var locMapTbody;
+var locMapRowTemplate;
+function editGroupEntries(grpId) {
+    var pcrud = new openils.PermaCrud({authtoken : user.authtoken});
+    groupMaps = pcrud.search('acplgm', {lgroup : grpId});
+
+    dojo.query('[group]').forEach(
+        function(node) {
+            if (node.getAttribute('group') == grpId) {
+                openils.Util.addCSSClass(node, 'acplg-group-selected');
+            } else {
+                openils.Util.removeCSSClass(node, 'acplg-group-selected');
+            }
+        }
+    );
+
+    if (!locMapTbody) {
+        locMapTbody = dojo.byId('acplg-loc-map-tbody');
+        locMapRowTemplate = locMapTbody.removeChild(dojo.byId('acplg-loc-map-row'));
+    } else {
+        // clear out the previous table
+        while (node = locMapTbody.childNodes[0])
+            locMapTbody.removeChild(node);
+    }
+
+    dojo.forEach(groupMaps,
+        function(map) {
+            var row = locMapRowTemplate.cloneNode(true);
+            row.setAttribute('map', map.id());
+            var loc = locations.filter(
+                function(loc) { return (loc.id() == map.location()) })[0];
+            dojo.query('[name=name]', row)[0].innerHTML = loc.name();
+            dojo.query('[name=owning_lib]', row)[0].innerHTML = 
+                fieldmapper.aou.findOrgUnit(loc.owning_lib()).shortname();
+            locMapTbody.appendChild(row);
+        }
+    );
+}
+
+/*
+function filterPage(org) {
+
+    // fetch the groups and groupMaps
+    if(!orders) {
+        dojo.forEach
+        for (var grp 
+        groupMaps = pcrud.search('acplgm', 
+            {lgroupowning_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();
+                        filterPage(contextOrg);
+                        return;
+                    } 
+                    progressDialog.update(r);
+                }
+            },
+        }
+    );
+}
+*/
+
+openils.Util.addOnLoad(init);