1 dojo.require('dijit.layout.ContentPane');
2 dojo.require('dijit.layout.BorderContainer');
3 dojo.require("dojo.dnd.Container");
4 dojo.require("dojo.dnd.Source");
5 dojo.require('fieldmapper.OrgUtils');
6 dojo.require('openils.User');
7 dojo.require('openils.Util');
8 dojo.require('openils.Event');
9 dojo.require('openils.PermaCrud');
10 dojo.require('openils.widget.AutoGrid');
11 dojo.require('openils.widget.ProgressDialog');
12 dojo.require('openils.widget.OrgUnitFilteringSelect');
13 dojo.require('openils.widget.EditDialog');
22 var locMapRowTemplate;
29 user = new openils.User();
31 // init the DnD environment
32 source = new dojo.dnd.Source('acplg-list');
33 dojo.connect(source, 'onDndDrop', updateGroupOrder);
35 // context org selector
36 user.buildPermOrgSelector(
37 'ADMIN_COPY_LOCATION_GROUP',
41 dojo.connect(contextOrgSelector, 'onChange', drawPage);
48 function fetchCopyLocations() {
49 // the full set of copy locations can be very large.
50 // Only retrieve the set of locations owned by orgs this user
51 // can use for building location groups.
53 ['ADMIN_COPY_LOCATION_GROUP'],
56 var ownerOrgList = [];
59 // include parent orgs
60 ownerOrgList = ownerOrgList.concat(org).concat(
61 fieldmapper.aou.orgNodeTrail(fieldmapper.aou.findOrgUnit(org), true));
65 var pcrud = new openils.PermaCrud({authtoken : user.authtoken});
66 pcrud.search('acpl', // this can take some time...
67 {owning_lib : ownerOrgList},
71 oncomplete : function(r) {
72 locations = openils.Util.readResponse(r);
74 drawPage(user.user.ws_ou());
84 // sort the list of copy locations according the shape of
85 // the org unit tree. apply a secondary sort on name.
86 function sortCopyLocations() {
89 function addNode(node) {
90 // find locs for this org
91 var locs = locations.filter(function(loc) { return loc.owning_lib() == node.id() });
92 // sort on name and append to the new list
93 newlist = newlist.concat(locs.sort(function(a, b) { return a.name() < b.name() ? -1 : 1 }));
94 // repeat for org child nodes
95 dojo.forEach(node.children(), addNode);
98 addNode(fieldmapper.aou.globalOrgTree);
103 function drawPage(org) {
105 currentGroupId = null;
106 currentGroupMaps = [];
111 function drawGroupList(selectedGrp) {
112 var pcrud = new openils.PermaCrud({authtoken : user.authtoken});
113 groups = pcrud.search('acplg', {owner : currentOrg}, {order_by : {acplg : 'pos'}});
117 source.deleteSelectedNodes();
124 var drag = dojo.byId('dnd-drag-actions').cloneNode(true);
126 var vis = openils.Util.isTrue(group.opac_visible());
127 openils.Util.hide(dojo.query('[name=' + (vis ? 'invisible' : 'visible') + ']', drag)[0]);
130 var node = source.insertNodes(false, [{
131 data : drag.innerHTML.replace(/GRPID/g, group.id()).replace(/GRPNAME/g, group.name()),
132 type : [group.id()+''] // use the type field to store the ID
137 if (groups.length == 0) {
139 } else if (selectedGrp == null) {
140 selectedGrp = groups[0].id();
143 drawGroupEntries(selectedGrp);
146 function drawLocations() {
149 locTbody = dojo.byId('acplg-loc-tbody');
150 locRowTemplate = locTbody.removeChild(dojo.byId('acplg-loc-row'));
152 // clear out the previous table
153 while (node = locTbody.childNodes[0])
154 locTbody.removeChild(node);
157 var allMyOrgs = fieldmapper.aou.fullPath(currentOrg, true);
159 dojo.forEach(locations,
161 if (allMyOrgs.indexOf(loc.owning_lib()) == -1) return;
163 // don't show locations contained in the current group
164 if (currentGroupMaps.length) {
165 var existing = currentGroupMaps.filter(
166 function(map) { return (map.location() == loc.id()) });
167 if (existing.length > 0) return;
170 var row = locRowTemplate.cloneNode(true);
171 row.setAttribute('location', loc.id());
172 dojo.query('[name=name]', row)[0].innerHTML = loc.name();
173 dojo.query('[name=owning_lib]', row)[0].innerHTML = fieldmapper.aou.findOrgUnit(loc.owning_lib()).shortname();
174 locTbody.appendChild(row);
179 function updateGroupOrder() {
183 // find any groups that have changed position and send them off for update
185 source.getAllNodes(),
187 var item = source.getItem(node.id);
188 var grpId = item.type[0];
189 var grp = groups.filter(function(g) { return g.id() == grpId })[0];
190 if (grp.pos() != pos) {
198 if (toUpdate.length == 0) return;
200 var pcrud = new openils.PermaCrud({authtoken : user.authtoken});
201 pcrud.update(toUpdate); // run sync to prevent UI changes mid-update
204 function newGroup() {
206 var dialog = new openils.widget.EditDialog({
209 parentNode : dojo.byId('acplg-edit-dialog'),
210 suppressFields : ['id'],
211 // note: when 'pos' is suppressed, the value is not propagated.
212 overrideWidgetArgs : {
213 pos : {widgetValue : groups.length, dijitArgs : {disabled : true}},
214 owner : {widgetValue : currentOrg, dijitArgs : {disabled : true}}
216 onPostSubmit : function(req, cudResults) {
217 if (cudResults && cudResults.length) {
218 // refresh the group display
219 drawGroupList(cudResults[0].id());
228 function editGroup(grpId) {
229 var grp = groups.filter(function(g) { return g.id() == grpId })[0];
231 var dialog = new openils.widget.EditDialog({
234 parentNode : dojo.byId('acplg-edit-dialog'),
235 suppressFields : ['id', 'pos', 'owner'],
236 onPostSubmit : function(req, cudResults) {
237 if (cudResults && cudResults.length) {
238 // refresh the group display
239 // pcrud.update returns ID only
240 drawGroupList(cudResults[0]);
249 function deleteGroup(grpId) {
250 // confirm and delete
251 var pcrud = new openils.PermaCrud({authtoken : user.authtoken});
252 var grp = groups.filter(function(g) { return g.id() == grpId })[0];
253 pcrud.eliminate(grp, {oncomplete : function() { drawGroupList() }});
256 function drawGroupEntries(grpId) {
257 currentGroupId = grpId;
259 // init/reset the table of mapped copy locations
261 locMapTbody = dojo.byId('acplg-loc-map-tbody');
262 locMapRowTemplate = locMapTbody.removeChild(dojo.byId('acplg-loc-map-row'));
264 // clear out the previous table
265 while (node = locMapTbody.childNodes[0])
266 locMapTbody.removeChild(node);
269 // update the 'selected' status
270 dojo.query('[group]').forEach(
272 if (node.getAttribute('group') == grpId) {
273 openils.Util.addCSSClass(node, 'acplg-group-selected');
275 openils.Util.removeCSSClass(node, 'acplg-group-selected');
280 currentGroupMaps = [];
284 var pcrud = new openils.PermaCrud({authtoken : user.authtoken});
285 currentGroupMaps = pcrud.search('acplgm', {lgroup : grpId});
288 // update the location selector to remove the already-selected orgs
291 // draw the mapped copy locations
292 // remove any mapped locations from the location selector
293 dojo.forEach(currentGroupMaps,
295 var row = locMapRowTemplate.cloneNode(true);
296 row.setAttribute('map', map.id());
297 var loc = locations.filter(
298 function(loc) { return (loc.id() == map.location()) })[0];
299 dojo.query('[name=name]', row)[0].innerHTML = loc.name();
300 dojo.query('[name=owning_lib]', row)[0].innerHTML =
301 fieldmapper.aou.findOrgUnit(loc.owning_lib()).shortname();
302 locMapTbody.appendChild(row);
304 // if the location is in the group, remove it from the location selection list
305 //removeLocationRow(loc.id());
310 function editLocations(action) {
312 var tbody = (action == 'create') ? locTbody : locMapTbody;
313 dojo.forEach(tbody.getElementsByTagName('tr'),
315 var selector = dojo.query('[name=selector]', row)[0];
316 if (selector.checked) {
317 var map = new fieldmapper.acplgm();
318 map.lgroup(currentGroupId);
319 if (action == 'create') {
320 map.location(row.getAttribute('location'));
322 map.id(row.getAttribute('map'));
329 if (maps.length == 0) return;
332 var pcrud = new openils.PermaCrud({authtoken : user.authtoken});
333 pcrud[action](maps, {
334 oncomplete : function() {
335 drawGroupEntries(currentGroupId)
337 if (action != 'create') {
345 function deSelectAll(node) {
346 dojo.query('[name=selector]', node).forEach(
348 selector.checked = false;
354 function removeLocationRow(locId) {
355 var row = dojo.query('[location=' + locId + ']', locTbody)[0];
356 if (row) locTbody.removeChild(row);
360 openils.Util.addOnLoad(init);