]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/ui/default/conify/global/asset/copy_location_group.js
9a9770b083995ca7f9f9ba7c99ba122329ed0b25
[working/Evergreen.git] / Open-ILS / web / js / ui / default / conify / global / asset / copy_location_group.js
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');
14
15 var user;
16 var groups;
17 var locations;
18 var source;
19 var locTbody;
20 var locRowTemplate;
21 var locMapTbody;
22 var locMapRowTemplate;
23 var currentGroupId;
24 var currentGroupMaps;
25 var currentOrg;
26
27 function init() {
28
29     user = new openils.User();
30    
31     // init the DnD environment
32     source = new dojo.dnd.Source('acplg-list');
33     dojo.connect(source, 'onDndDrop', updateGroupOrder);
34
35     // context org selector
36     user.buildPermOrgSelector(
37         'ADMIN_COPY_LOCATION_GROUP', 
38         contextOrgSelector, 
39         null, 
40         function() {
41             dojo.connect(contextOrgSelector, 'onChange', drawPage);
42         }
43     );
44
45     fetchCopyLocations();
46 }
47
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.
52     user.getPermOrgList(
53         ['ADMIN_COPY_LOCATION_GROUP'], 
54         function(list) {
55
56             var ownerOrgList = [];
57             dojo.forEach(list,
58                 function(org) {
59                     // include parent orgs
60                     ownerOrgList = ownerOrgList.concat(org).concat(
61                         fieldmapper.aou.orgNodeTrail(fieldmapper.aou.findOrgUnit(org), true));
62                 }
63             );
64
65             var pcrud = new openils.PermaCrud({authtoken : user.authtoken});
66             pcrud.search('acpl', // this can take some time...
67                 {owning_lib : ownerOrgList},
68                 {   
69                     async : true,
70                     join : 'aou',
71                     oncomplete : function(r) {
72                         locations = openils.Util.readResponse(r);
73                         sortCopyLocations();
74                         drawPage(user.user.ws_ou());
75                     }
76                 }
77             );
78         },
79         true,
80         true
81     );
82 }
83
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() {
87     var newlist = [];
88
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);
96     }
97
98     addNode(fieldmapper.aou.globalOrgTree);
99     locations = newlist;
100 }
101
102
103 function drawPage(org) {
104     currentOrg = org;
105     currentGroupId = null;
106     currentGroupMaps = [];
107     //drawLocations();
108     drawGroupList();
109 }
110
111 function drawGroupList(selectedGrp) {
112     var pcrud = new openils.PermaCrud({authtoken : user.authtoken});
113     groups = pcrud.search('acplg', {owner : currentOrg}, {order_by : {acplg : 'pos'}});
114
115
116     source.selectAll();
117     source.deleteSelectedNodes();
118     source.clearItems();
119
120     dojo.forEach(groups,
121         function(group) {
122             if(!group) return;
123
124             var drag = dojo.byId('dnd-drag-actions').cloneNode(true);
125             drag.id = '';
126             var vis = openils.Util.isTrue(group.opac_visible());
127             openils.Util.hide(dojo.query('[name=' + (vis ? 'invisible' : 'visible') + ']', drag)[0]);
128
129
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
133             }]);
134         }
135     );
136
137     if (groups.length == 0) {
138         selectedGrp = null
139     } else if (selectedGrp == null) {
140         selectedGrp = groups[0].id();
141     }
142
143     drawGroupEntries(selectedGrp);
144 }
145
146 function drawLocations() {
147
148     if (!locTbody) {
149         locTbody = dojo.byId('acplg-loc-tbody');
150         locRowTemplate = locTbody.removeChild(dojo.byId('acplg-loc-row'));
151     } else {
152         // clear out the previous table
153         while (node = locTbody.childNodes[0])
154             locTbody.removeChild(node);
155     }
156
157     var allMyOrgs = fieldmapper.aou.fullPath(currentOrg, true);
158
159     dojo.forEach(locations,
160         function(loc) {
161             if (allMyOrgs.indexOf(loc.owning_lib()) == -1) return;
162
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;
168             }
169
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);
175         }
176     );
177 }
178
179 function updateGroupOrder() {
180     var pos = 0;
181     var toUpdate = [];
182
183     // find any groups that have changed position and send them off for update
184     dojo.forEach(
185         source.getAllNodes(),
186         function(node) {
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) {
191                 grp.pos(pos);
192                 toUpdate.push(grp);
193             }
194             pos++;
195         }
196     );
197
198     if (toUpdate.length == 0) return;
199
200     var pcrud = new openils.PermaCrud({authtoken : user.authtoken});
201     pcrud.update(toUpdate); // run sync to prevent UI changes mid-update 
202 }
203
204 function newGroup() {
205
206     var dialog = new openils.widget.EditDialog({
207         fmClass : 'acplg',
208         mode : 'create',
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}}
215         },
216         onPostSubmit : function(req, cudResults) {
217             if (cudResults && cudResults.length) {
218                 // refresh the group display
219                 drawGroupList(cudResults[0].id());
220             }
221         }
222     });
223
224     dialog.startup();
225     dialog.show();
226 }
227
228 function editGroup(grpId) {
229     var grp = groups.filter(function(g) { return g.id() == grpId })[0];
230
231     var dialog = new openils.widget.EditDialog({
232         fmObject : grp,
233         mode : 'update',
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]);
241             }
242         }
243     });
244
245     dialog.startup();
246     dialog.show();
247 }
248
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() }});
254 }
255
256 function drawGroupEntries(grpId) {
257     currentGroupId = grpId;
258
259     // init/reset the table of mapped copy locations
260     if (!locMapTbody) {
261         locMapTbody = dojo.byId('acplg-loc-map-tbody');
262         locMapRowTemplate = locMapTbody.removeChild(dojo.byId('acplg-loc-map-row'));
263     } else {
264         // clear out the previous table
265         while (node = locMapTbody.childNodes[0])
266             locMapTbody.removeChild(node);
267     }
268     
269     // update the 'selected' status
270     dojo.query('[group]').forEach(
271         function(node) {
272             if (node.getAttribute('group') == grpId) {
273                 openils.Util.addCSSClass(node, 'acplg-group-selected');
274             } else {
275                 openils.Util.removeCSSClass(node, 'acplg-group-selected');
276             }
277         }
278     );
279
280     currentGroupMaps = [];
281
282     // fetch the group
283     if (grpId) {
284         var pcrud = new openils.PermaCrud({authtoken : user.authtoken});
285         currentGroupMaps = pcrud.search('acplgm', {lgroup : grpId});
286     } 
287
288     // update the location selector to remove the already-selected orgs
289     drawLocations();
290
291     // draw the mapped copy locations
292     // remove any mapped locations from the location selector
293     dojo.forEach(currentGroupMaps,
294         function(map) {
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);
303
304             // if the location is in the group, remove it from the location selection list
305             //removeLocationRow(loc.id());
306         }
307     );
308 }
309
310 function editLocations(action) {
311     var maps = [];
312     var tbody = (action == 'create') ? locTbody : locMapTbody;
313     dojo.forEach(tbody.getElementsByTagName('tr'),
314         function(row) {
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'));
321                 } else {
322                     map.id(row.getAttribute('map'));
323                 }
324                 maps.push(map);
325             }
326         }
327     );
328
329     if (maps.length == 0) return;
330
331     // check for dupes
332     var pcrud = new openils.PermaCrud({authtoken : user.authtoken});
333     pcrud[action](maps, {
334         oncomplete : function() { 
335             drawGroupEntries(currentGroupId) 
336             /*
337             if (action != 'create') {
338                 drawLocations();
339             }
340             */
341         }
342     });
343 }
344
345 function deSelectAll(node) {
346     dojo.query('[name=selector]', node).forEach(
347         function(selector) {
348             selector.checked = false;
349         }
350     );
351 }
352
353 /*
354 function removeLocationRow(locId) {
355     var row = dojo.query('[location=' + locId + ']', locTbody)[0];
356     if (row) locTbody.removeChild(row);
357 }
358 */
359
360 openils.Util.addOnLoad(init);