--- /dev/null
+[% 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('→ 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('← 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 %]
--- /dev/null
+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);