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');
8 var circModEditor = null;
9 var circModGroupTables = [];
10 var circModGroupCache = {};
11 var circModEntryCache = {};
15 cmGrid.overrideWidgetArgs.grp = {hrbefore : true};
16 cmGrid.overrideWidgetArgs.is_renewal = {ternary : true};
17 cmGrid.overrideWidgetArgs.ref_flag = {ternary : true};
18 cmGrid.overrideWidgetArgs.juvenile_flag = {ternary : true};
19 cmGrid.overrideWidgetArgs.circulate = {inherits : true, hrbefore : true};
20 cmGrid.overrideWidgetArgs.duration_rule = {inherits : true};
21 cmGrid.overrideWidgetArgs.recurring_fine_rule = {inherits : true};
22 cmGrid.overrideWidgetArgs.max_fine_rule = {inherits : true};
23 cmGrid.overrideWidgetArgs.available_copy_hold_ratio = {inherits : true};
24 cmGrid.overrideWidgetArgs.total_copy_hold_ratio = {inherits : true};
25 cmGrid.overrideWidgetArgs.renewals = {inherits : true};
26 cmGrid.overrideWidgetArgs.grace_period = {inherits : true};
27 cmGrid.overrideWidgetArgs.hard_due_date = {inherits : true};
28 cmGrid.loadAll({order_by:{ccmm:'circ_modifier'}});
29 cmGrid.onEditPane = buildEditPaneAdditions;
30 circModEditor = dojo.byId('circ-mod-editor').parentNode.removeChild(dojo.byId('circ-mod-editor'));
33 function byName(name, ctxt) {
34 return dojo.query('[name=' + name + ']', ctxt)[0];
37 function buildEditPaneAdditions(editPane) {
38 if(!editPane.fmObject) return;
39 var node = circModEditor.cloneNode(true);
40 var tableTmpl = node.removeChild(byName('circ-mod-group-table', node));
41 circModGroupTables = [];
42 matchPoint = editPane.fmObject.id();
44 byName('add-circ-mod-group', node).onclick = function() {
45 addCircModGroup(node, tableTmpl)
48 if(editPane.mode == 'update') {
49 var groups = new openils.PermaCrud().search('ccmcmt', {matchpoint: editPane.fmObject.id()});
50 dojo.forEach(groups, function(g) { addCircModGroup(node, tableTmpl, g); } );
53 editPane.domNode.appendChild(node);
57 function addCircModGroup(node, tableTmpl, group) {
59 var table = tableTmpl.cloneNode(true);
60 var circModRowTmpl = byName('circ-mod-entry-tbody', table).removeChild(byName('circ-mod-entry-row', table));
61 circModGroupTables.push(table);
65 entries = new openils.PermaCrud().search('ccmcmtm', {circ_mod_test : group.id()});
66 table.setAttribute('group', group.id());
67 circModGroupCache[group.id()] = group;
68 circModEntryCache[group.id()] = entries;
71 function addMod(code, name) {
72 name = name || code; // XXX
73 var row = circModRowTmpl.cloneNode(true);
74 byName('circ-mod', row).innerHTML = name;
75 byName('circ-mod', row).setAttribute('code', code);
76 byName('circ-mod-entry-tbody', table).appendChild(row);
77 byName('remove-circ-mod', row).onclick = function() {
78 byName('circ-mod-entry-tbody', table).removeChild(row);
82 dojo.forEach(entries, function(e) { addMod(e.circ_mod()); });
84 byName('circ-mod-count', table).value = (group) ? group.items_out() : 0;
86 var selector = new openils.widget.AutoFieldWidget({
89 parentNode : byName('circ-mod-selector', table)
93 byName('add-circ-mod', table).onclick = function() {
94 addMod(selector.widget.attr('value'), selector.widget.attr('displayedValue'));
97 node.insertBefore(table, byName('add-circ-mod-group-span', node));
98 node.insertBefore(dojo.create('hr'), byName('add-circ-mod-group-span', node));
101 function applyCircModChanges() {
102 var pcrud = new openils.PermaCrud();
103 progressDialog.show(true);
105 for(var idx in circModGroupTables) {
106 var table = circModGroupTables[idx];
107 var gp = table.getAttribute('group');
109 var count = byName('circ-mod-count', table).value;
113 dojo.forEach(dojo.query('[name=circ-mod]', table), function(td) {
114 mods.push(td.getAttribute('code'));
117 var group = circModGroupCache[gp];
121 group = new fieldmapper.ccmcmt();
123 dojo.forEach(mods, function(mod) {
124 var entry = new fieldmapper.ccmcmtm();
133 var existing = circModEntryCache[group.id()];
134 dojo.forEach(mods, function(mod) {
136 // new circ mod for this group
137 if(!existing.filter(function(i){ return (i.circ_mod() == mod)})[0]) {
138 var entry = new fieldmapper.ccmcmtm();
142 entry.circ_mod_test(group.id());
146 dojo.forEach(existing, function(eMod) {
147 if(!mods.filter(function(i){ return (i == eMod.circ_mod()) })[0]) {
148 eMod.isdeleted(true);
154 group.items_out(count);
155 group.matchpoint(matchPoint);
159 pcrud.create(group, {
160 oncomplete : function(r, cudResults) {
161 var group = cudResults[0];
162 dojo.forEach(entries, function(e) { e.circ_mod_test(group.id()) } );
163 pcrud.create(entries, {
164 oncomplete : function() {
165 progressDialog.hide();
173 pcrud.update(group, {
174 oncomplete : function(r, cudResults) {
175 var newOnes = entries.filter(function(e) { return e.isnew() });
176 var delOnes = entries.filter(function(e) { return e.isdeleted() });
177 if(!delOnes.length && !newOnes.length) {
178 progressDialog.hide();
182 pcrud.create(newOnes, {
183 oncomplete : function() {
185 pcrud.eliminate(delOnes, {
186 oncomplete : function() {
187 progressDialog.hide();
191 progressDialog.hide();
196 pcrud.eliminate(delOnes, {
197 oncomplete : function() {
198 progressDialog.hide();
208 openils.Util.addOnLoad(load);