--- /dev/null
+dojo.require('dijit.layout.ContentPane');
+dojo.require('dijit.form.Button');
+dojo.require('openils.widget.AutoGrid');
+dojo.require('openils.widget.AutoFieldWidget');
+dojo.require('openils.PermaCrud');
+dojo.require('openils.widget.ProgressDialog');
+
+var circModEditor = null;
+var circModGroupTables = [];
+var circModGroupCache = {};
+var circModEntryCache = {};
+var matchPoint;
+
+function load(){
+ cmGrid.overrideWidgetArgs.is_renewal = {ternary : true};
+ cmGrid.loadAll({order_by:{ccmm:'circ_modifier'}});
+ cmGrid.onEditPane = buildEditPaneAdditions;
+ circModEditor = dojo.byId('circ-mod-editor').parentNode.removeChild(dojo.byId('circ-mod-editor'));
+}
+
+function byName(name, ctxt) {
+ return dojo.query('[name=' + name + ']', ctxt)[0];
+}
+
+function buildEditPaneAdditions(editPane) {
+ if(!editPane.fmObject) return;
+ var node = circModEditor.cloneNode(true);
+ var tableTmpl = node.removeChild(byName('circ-mod-group-table', node));
+ circModGroupTables = [];
+ matchPoint = editPane.fmObject.id();
+
+ byName('add-circ-mod-group', node).onclick = function() {
+ addCircModGroup(node, tableTmpl)
+ }
+
+ if(editPane.mode == 'update') {
+ var groups = new openils.PermaCrud().search('ccmcmt', {matchpoint: editPane.fmObject.id()});
+ dojo.forEach(groups, function(g) { addCircModGroup(node, tableTmpl, g); } );
+ }
+
+ editPane.domNode.appendChild(node);
+}
+
+
+function addCircModGroup(node, tableTmpl, group) {
+
+ var table = tableTmpl.cloneNode(true);
+ var circModRowTmpl = byName('circ-mod-entry-tbody', table).removeChild(byName('circ-mod-entry-row', table));
+ circModGroupTables.push(table);
+
+ var entries = [];
+ if(group) {
+ entries = new openils.PermaCrud().search('ccmcmtm', {circ_mod_test : group.id()});
+ table.setAttribute('group', group.id());
+ circModGroupCache[group.id()] = group;
+ circModEntryCache[group.id()] = entries;
+ }
+
+ function addMod(code, name) {
+ name = name || code; // XXX
+ var row = circModRowTmpl.cloneNode(true);
+ byName('circ-mod', row).innerHTML = name;
+ byName('circ-mod', row).setAttribute('code', code);
+ byName('circ-mod-entry-tbody', table).appendChild(row);
+ byName('remove-circ-mod', row).onclick = function() {
+ byName('circ-mod-entry-tbody', table).removeChild(row);
+ }
+ }
+
+ dojo.forEach(entries, function(e) { addMod(e.circ_mod()); });
+
+ byName('circ-mod-count', table).value = (group) ? group.items_out() : 0;
+
+ var selector = new openils.widget.AutoFieldWidget({
+ fmClass : 'ccmcmtm',
+ fmField : 'circ_mod',
+ parentNode : byName('circ-mod-selector', table)
+ });
+ selector.build();
+
+ byName('add-circ-mod', table).onclick = function() {
+ addMod(selector.widget.attr('value'), selector.widget.attr('displayedValue'));
+ }
+
+ node.insertBefore(table, byName('add-circ-mod-group-span', node));
+ node.insertBefore(dojo.create('hr'), byName('add-circ-mod-group-span', node));
+}
+
+function applyCircModChanges() {
+ var pcrud = new openils.PermaCrud();
+ progressDialog.show(true);
+
+ for(var idx in circModGroupTables) {
+ var table = circModGroupTables[idx];
+ var gp = table.getAttribute('group');
+
+ var count = byName('circ-mod-count', table).value;
+ var mods = [];
+ var entries = [];
+
+ dojo.forEach(dojo.query('[name=circ-mod]', table), function(td) {
+ mods.push(td.getAttribute('code'));
+ });
+
+ var group = circModGroupCache[gp];
+
+ if(!group) {
+
+ group = new fieldmapper.ccmcmt();
+ group.isnew(true);
+ dojo.forEach(mods, function(mod) {
+ var entry = new fieldmapper.ccmcmtm();
+ entry.isnew(true);
+ entry.circ_mod(mod);
+ entries.push(entry);
+ });
+
+
+ } else {
+
+ var existing = circModEntryCache[group.id()];
+ dojo.forEach(mods, function(mod) {
+
+ // new circ mod for this group
+ if(!existing.filter(function(i){ return (i.circ_mod() == mod)})[0]) {
+ var entry = new fieldmapper.ccmcmtm();
+ entry.isnew(true);
+ entry.circ_mod(mod);
+ entries.push(entry);
+ entry.circ_mod_test(group.id());
+ }
+ });
+
+ dojo.forEach(existing, function(eMod) {
+ if(!mods.filter(function(i){ return (i == eMod.circ_mod()) })[0]) {
+ eMod.isdeleted(true);
+ entries.push(eMod);
+ }
+ });
+ }
+
+ group.items_out(count);
+ group.matchpoint(matchPoint);
+
+ if(group.isnew()) {
+
+ pcrud.create(group, {
+ oncomplete : function(r, cudResults) {
+ var group = cudResults[0];
+ dojo.forEach(entries, function(e) { e.circ_mod_test(group.id()) } );
+ pcrud.create(entries, {
+ oncomplete : function() {
+ progressDialog.hide();
+ }
+ });
+ }
+ });
+
+ } else {
+
+ pcrud.update(group, {
+ oncomplete : function(r, cudResults) {
+ var newOnes = entries.filter(function(e) { return e.isnew() });
+ var delOnes = entries.filter(function(e) { return e.isdeleted() });
+ if(!delOnes.length && !newOnes.length) {
+ progressDialog.hide();
+ return;
+ }
+ if(newOnes.length) {
+ pcrud.create(newOnes, {
+ oncomplete : function() {
+ if(delOnes.length) {
+ pcrud.eliminate(delOnes, {
+ oncomplete : function() {
+ progressDialog.hide();
+ }
+ });
+ } else {
+ progressDialog.hide();
+ }
+ }
+ });
+ } else {
+ pcrud.eliminate(delOnes, {
+ oncomplete : function() {
+ progressDialog.hide();
+ }
+ });
+ }
+ }
+ });
+ }
+ }
+}
+
+openils.Util.addOnLoad(load);
+