1 dojo.require('dijit.layout.ContentPane');
2 dojo.require('dijit.form.Button');
3 dojo.require('openils.widget.AutoGrid');
4 dojo.require('openils.widget.AutoFieldWidget');
5 dojo.require('openils.PermaCrud');
6 dojo.require('openils.widget.ProgressDialog');
7 dojo.require('openils.User');
9 var linkedEditor = null;
10 var circModEntryCache = [];
11 var copyLocEntryCache = [];
12 var limitGroupEntryCache = [];
13 var circModCache = {};
14 var copyLocCache = {};
15 var limitGroupCache = {};
19 clsGrid.loadAll({order_by:{ccls:'name'}});
20 clsGrid.onEditPane = buildEditPaneAdditions;
21 clsGrid.onPostUpdate = updateLinked;
22 clsGrid.onPostCreate = updateLinked;
23 linkedEditor = dojo.byId('linked-editor').parentNode.removeChild(dojo.byId('linked-editor'));
25 // Cache circ mod/limit group info for later display
26 var pcrud = new openils.PermaCrud();
27 var temp = pcrud.retrieveAll('ccm');
28 dojo.forEach(temp, function(g) { circModCache[g.code()] = g; } );
29 temp = pcrud.retrieveAll('cclg');
30 dojo.forEach(temp, function(g) { limitGroupCache[g.id()] = g; } );
32 // Avoid fetching all copy locations because there can be many
33 // thousands. Limit to those within permission range of the user.
34 new openils.User().getPermOrgList(
35 'ADMIN_CIRC_MATRIX_MATCHPOINT',
37 temp = pcrud.search('acpl', {owning_lib : orgList});
38 dojo.forEach(temp, function(g) { copyLocCache[g.id()] = g; } );
44 function byName(name, ctxt) {
45 return dojo.query('[name=' + name + ']', ctxt)[0];
48 function buildEditPaneAdditions(editPane) {
49 circModEntryCache = [];
50 limitGroupEntryCache = [];
51 copyLocEntryCache = [];
52 var tr = document.createElement('tr');
53 var td = document.createElement('td');
54 td.setAttribute('colspan','2');
56 // editPane.domNode.lastChild = Table
57 // .lastChild = Table Body
58 // .lastChild = Table Row containing Action Buttons
59 editPane.domNode.lastChild.lastChild.insertBefore(tr, editPane.domNode.lastChild.lastChild.lastChild);
61 curLinkedEditor = linkedEditor.cloneNode(true);
62 td.appendChild(curLinkedEditor);
63 var circModTmpl = byName('circ-mod-entry-tbody', curLinkedEditor).removeChild(byName('circ-mod-entry-row', curLinkedEditor));
64 var copyLocTmpl = byName('copy-loc-entry-tbody', curLinkedEditor).removeChild(byName('copy-loc-entry-row', curLinkedEditor));
65 var limitGroupTmpl = byName('limit-group-entry-tbody', curLinkedEditor).removeChild(byName('limit-group-entry-row', curLinkedEditor));
67 var cm_selector = new openils.widget.AutoFieldWidget({
70 parentNode : byName('circ-mod-selector', curLinkedEditor)
74 var cl_selector = new openils.widget.AutoFieldWidget({
77 parentNode : byName('copy-loc-selector', curLinkedEditor)
81 var lg_selector = new openils.widget.AutoFieldWidget({
83 fmField : 'limit_group',
84 parentNode : byName('limit-group-selector', curLinkedEditor)
88 function addMod(code) {
89 var row = circModTmpl.cloneNode(true);
90 row.setAttribute('code', code);
91 byName('circ-mod', row).innerHTML = code + ' : ' + circModCache[code].name();
92 byName('remove-circ-mod', row).onclick = function() {
93 byName('circ-mod-entry-tbody', clsGrid.editPane.domNode).removeChild(row);
95 byName('circ-mod-entry-tbody', editPane.domNode).appendChild(row);
99 var row = copyLocTmpl.cloneNode(true);
100 row.setAttribute('loc_id', id);
101 var copyloc = copyLocCache[id];
102 byName('copy-loc', row).innerHTML =
103 fieldmapper.aou.findOrgUnit(copyloc.owning_lib()).shortname() +
104 ' : ' + copyloc.name();
105 byName('remove-copy-loc', row).onclick = function() {
106 byName('copy-loc-entry-tbody', clsGrid.editPane.domNode).removeChild(row);
108 byName('copy-loc-entry-tbody', editPane.domNode).appendChild(row);
111 function addGroup(group) {
112 var row = limitGroupTmpl.cloneNode(true);
113 row.setAttribute('limit_group', group);
114 byName('limit-group', row).innerHTML = limitGroupCache[group].name();
115 byName('remove-limit-group', row).onclick = function() {
116 byName('limit-group-entry-tbody', clsGrid.editPane.domNode).removeChild(row);
118 byName('limit-group-entry-tbody', editPane.domNode).appendChild(row);
121 byName('add-circ-mod', editPane.domNode).onclick = function() {
122 addMod(cm_selector.widget.attr('value'));
125 byName('add-copy-loc', editPane.domNode).onclick = function() {
126 addLoc(cl_selector.widget.attr('value'));
129 byName('add-limit-group', editPane.domNode).onclick = function() {
130 addGroup(lg_selector.widget.attr('value'));
133 // On edit we need to load existing entries.
134 // On create, not so much.
135 if(!editPane.fmObject) return;
136 var limitSet = editPane.fmObject.id();
138 if(editPane.mode == 'update') {
139 var pcrud = new openils.PermaCrud();
140 circModEntryCache = pcrud.search('cclscmm', {limit_set: limitSet});
141 copyLocEntryCache = pcrud.search('cclsacpl', {limit_set: limitSet});
142 limitGroupEntryCache = pcrud.search('cclsgm', {limit_set: limitSet});
143 dojo.forEach(circModEntryCache, function(g) { addCircMod(circModTmpl, g); } );
144 dojo.forEach(copyLocEntryCache, function(g) { addCopyLoc(copyLocTmpl, g); } );
145 dojo.forEach(limitGroupEntryCache, function(g) { addLimitGroup(limitGroupTmpl, g); } );
149 function addCircMod(tmpl, circ_mod_entry) {
150 var row = tmpl.cloneNode(true);
151 var code = circ_mod_entry.circ_mod();
152 row.setAttribute('code', code);
153 byName('circ-mod', row).innerHTML = code + ' : ' + circModCache[code].name();
154 byName('remove-circ-mod', row).onclick = function() {
155 byName('circ-mod-entry-tbody', clsGrid.editPane.domNode).removeChild(row);
157 byName('circ-mod-entry-tbody', clsGrid.editPane.domNode).appendChild(row);
160 function addCopyLoc(tmpl, copy_loc_entry) {
161 var row = tmpl.cloneNode(true);
162 var id = copy_loc_entry.copy_loc();
163 var copyloc = copyLocCache[id];
164 row.setAttribute('loc_id', id);
165 byName('copy-loc', row).innerHTML =
166 fieldmapper.aou.findOrgUnit(copyloc.owning_lib()).shortname() +
167 ' : ' + copyloc.name();
168 byName('remove-copy-loc', row).onclick = function() {
169 byName('copy-loc-entry-tbody', clsGrid.editPane.domNode).removeChild(row);
171 byName('copy-loc-entry-tbody', clsGrid.editPane.domNode).appendChild(row);
174 function addLimitGroup(tmpl, limit_group_entry) {
175 var row = tmpl.cloneNode(true);
176 var group = limit_group_entry.limit_group();
177 row.setAttribute('limit_group', group);
178 byName('limit-group', row).innerHTML = limitGroupCache[group].name();
179 if(limit_group_entry.check_only() == 't') {
180 byName('limit-group-check-only', row).setAttribute('checked', 'true');
182 byName('remove-limit-group', row).onclick = function() {
183 byName('limit-group-entry-tbody', clsGrid.editPane.domNode).removeChild(row);
185 byName('limit-group-entry-tbody', clsGrid.editPane.domNode).appendChild(row);
188 function updateLinked(fmObject, rowindex) {
190 if(rowindex != undefined && this.editPane && this.editPane.fmObject) {
191 // Edit, grab existing ID
192 id = this.editPane.fmObject.id();
193 } else if(fmObject.id) {
194 // Create, grab new ID
197 // If we don't have an ID, drop out.
198 if(id == null) return;
199 var pcrud = new openils.PermaCrud();
200 progressDialog.show(true);
206 // First up, circ mods.
208 dojo.query('[name=circ-mod-entry-row]', this.editPane.domNode).forEach(
210 var mod = row.getAttribute('code');
212 if(!circModEntryCache.filter(function(i) { return (i.circ_mod() == mod); })[0]) {
213 var entry = new fieldmapper.cclscmm();
221 dojo.forEach(circModEntryCache, function(eMod) {
222 if(!circ_mods.filter(function(i) { return (i == eMod.circ_mod()); })[0]) {
223 eMod.isdeleted(true);
229 // Next, copy locations
231 dojo.query('[name=copy-loc-entry-row]', this.editPane.domNode).forEach(
233 var loc_id = row.getAttribute('loc_id');
234 copy_locs.push(loc_id);
235 if(!copyLocEntryCache.filter(function(i) { return (i.copy_loc() == loc_id); })[0]) {
236 var entry = new fieldmapper.cclsacpl();
239 entry.copy_loc(loc_id);
244 dojo.forEach(copyLocEntryCache, function(eLoc) {
245 if(!copy_locs.filter(function(i) { return (i == eLoc.copy_loc()); })[0]) {
246 eLoc.isdeleted(true);
253 // Next, limit groups
254 var limit_groups = [];
255 dojo.query('[name=limit-group-entry-row]', this.editPane.domNode).forEach(
257 var group = row.getAttribute('limit_group');
258 limit_groups.push(group);
259 var cached = limitGroupEntryCache.filter(function(i) { return (i.limit_group() == group); })[0];
261 var entry = new fieldmapper.cclsgm();
264 entry.limit_group(group);
265 entry.check_only(byName('limit-group-check-only', row).checked ? 't' : 'f');
268 var check_only = byName('limit-group-check-only', row).checked;
269 if(check_only != (cached.check_only() == 't')) {
270 cached.check_only(check_only ? 't' : 'f');
271 cached.ischanged(true);
277 dojo.forEach(limitGroupEntryCache, function(eGroup) {
278 if(!limit_groups.filter(function(i) { return (i == eGroup.limit_group()); })[0]) {
279 eGroup.isdeleted(true);
285 function updateEntries() {
286 pcrud.update(update, {
287 oncomplete : function () {
288 progressDialog.hide();
293 function removeEntries() {
294 pcrud.eliminate(remove, {
295 oncomplete : function () {
299 progressDialog.hide();
305 function addEntries() {
307 oncomplete : function () {
310 } else if (update.length) {
313 progressDialog.hide();
321 else if (remove.length)
323 else if (update.length)
326 progressDialog.hide();
329 openils.Util.addOnLoad(load);