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 limitSetEditor = null;
9 var limitSetEntryCache = [];
10 var limitSetCache = {};
13 cmGrid.overrideWidgetArgs.grp = {hrbefore : true};
14 cmGrid.overrideWidgetArgs.is_renewal = {ternary : true};
15 cmGrid.overrideWidgetArgs.ref_flag = {ternary : true};
16 cmGrid.overrideWidgetArgs.juvenile_flag = {ternary : true};
17 cmGrid.overrideWidgetArgs.circulate = {inherits : true, hrbefore : true};
18 cmGrid.overrideWidgetArgs.duration_rule = {inherits : true};
19 cmGrid.overrideWidgetArgs.recurring_fine_rule = {inherits : true};
20 cmGrid.overrideWidgetArgs.max_fine_rule = {inherits : true};
21 cmGrid.overrideWidgetArgs.available_copy_hold_ratio = {inherits : true};
22 cmGrid.overrideWidgetArgs.total_copy_hold_ratio = {inherits : true};
23 cmGrid.overrideWidgetArgs.renewals = {inherits : true};
24 cmGrid.overrideWidgetArgs.grace_period = {inherits : true};
25 cmGrid.overrideWidgetArgs.hard_due_date = {inherits : true};
26 cmGrid.loadAll({order_by:{ccmm:'circ_modifier'}});
27 cmGrid.onEditPane = buildEditPaneAdditions;
28 cmGrid.onPostUpdate = updateLinked;
29 cmGrid.onPostCreate = updateLinked;
30 limitSetEditor = dojo.byId('limit-set-editor').parentNode.removeChild(dojo.byId('limit-set-editor'));
32 // Cache limit set info for later display
33 var pcrud = new openils.PermaCrud();
34 var temp = pcrud.retrieveAll('ccls');
35 dojo.forEach(temp, function(g) { limitSetCache[g.id()] = g; } );
38 function byName(name, ctxt) {
39 return dojo.query('[name=' + name + ']', ctxt)[0];
42 function buildEditPaneAdditions(editPane) {
43 limitSetEntryCache = [];
44 var tr = document.createElement('tr');
45 var td = document.createElement('td');
46 td.setAttribute('colspan','2');
48 // editPane.domNode.lastChild = Table
49 // .lastChild = Table Body
50 // .lastChild = Table Row containing Action Buttons
51 editPane.domNode.lastChild.lastChild.insertBefore(tr, editPane.domNode.lastChild.lastChild.lastChild);
53 curLimitSetEditor = limitSetEditor.cloneNode(true);
54 td.appendChild(curLimitSetEditor);
55 var limitSetTmpl = byName('limit-set-entry-tbody', curLimitSetEditor).removeChild(byName('limit-set-entry-row', curLimitSetEditor));
57 var selector = new openils.widget.AutoFieldWidget({
59 fmField : 'limit_set',
60 parentNode : byName('limit-set-selector', curLimitSetEditor)
64 function addSet(lset) {
65 var row = limitSetTmpl.cloneNode(true);
66 row.setAttribute('limit_set', lset);
67 byName('limit-set', row).innerHTML = limitSetCache[lset].name();
68 byName('remove-limit-set', row).onclick = function() {
69 byName('limit-set-entry-tbody', cmGrid.editPane.domNode).removeChild(row);
71 byName('limit-set-active', row).setAttribute('checked', 'true');
72 byName('limit-set-entry-tbody', editPane.domNode).appendChild(row);
75 byName('add-limit-set', editPane.domNode).onclick = function() {
76 addSet(selector.widget.attr('value'));
79 // On edit we need to load existing entries.
80 // On create, not so much.
81 if(!editPane.fmObject) return;
82 var matchpoint = editPane.fmObject.id();
84 if(editPane.mode == 'update') {
85 var pcrud = new openils.PermaCrud();
86 limitSetEntryCache = pcrud.search('ccmlsm', {matchpoint: editPane.fmObject.id()});
87 dojo.forEach(limitSetEntryCache, function(g) { addLimitSet(limitSetTmpl, g); } );
91 function addLimitSet(tmpl, limit_set_entry) {
92 var row = tmpl.cloneNode(true);
93 var lset = limit_set_entry.limit_set();
94 row.setAttribute('limit_set', lset);
95 byName('limit-set', row).innerHTML = limitSetCache[lset].name();
96 if(limit_set_entry.active() == 't') {
97 byName('limit-set-active', row).setAttribute('checked', 'true');
99 if(limit_set_entry.fallthrough() == 't') {
100 byName('limit-set-fallthrough', row).setAttribute('checked', 'true');
102 byName('remove-limit-set', row).onclick = function() {
103 byName('limit-set-entry-tbody', cmGrid.editPane.domNode).removeChild(row);
105 byName('limit-set-entry-tbody', cmGrid.editPane.domNode).appendChild(row);
108 function format_hard_due_date(name, id) {
109 var item=this.grid.getItem(id);
110 if(!item) return name;
111 switch (this.grid.store.getValue(this.grid.getItem(id), 'hard_due_date')) {
117 return "<a href='" + oilsBasePath +
118 "/conify/global/config/hard_due_date?name=" +
119 encodeURIComponent(name) + "'>" + name + "</a>";
123 function updateLinked(fmObject, rowindex) {
125 if(rowindex != undefined && this.editPane && this.editPane.fmObject) {
126 // Edit, grab existing ID
127 id = this.editPane.fmObject.id();
128 } else if(fmObject.id) {
129 // Create, grab new ID
132 // If we don't have an ID, drop out.
133 if(id == null) return;
134 var pcrud = new openils.PermaCrud();
135 progressDialog.show(true);
142 dojo.query('[name=limit-set-entry-row]', this.editPane.domNode).forEach(
144 var lset = row.getAttribute('limit_set');
145 limit_sets.push(lset);
146 var cached = limitSetEntryCache.filter(function(i) { return (i.limit_set() == lset); })[0];
148 var entry = new fieldmapper.ccmlsm();
150 entry.matchpoint(id);
151 entry.limit_set(lset);
152 entry.active(byName('limit-set-active', row).checked ? 't' : 'f');
153 entry.fallthrough(byName('limit-set-fallthrough', row).checked ? 't' : 'f');
156 var active = byName('limit-set-active', row).checked;
157 var fallthrough = byName('limit-set-fallthrough', row).checked;
158 if((active != (cached.active() == 't')) || (fallthrough != (cached.fallthrough() == 't'))) {
159 cached.active(active ? 't' : 'f');
160 cached.fallthrough(fallthrough ? 't' : 'f');
161 cached.ischanged(true);
167 dojo.forEach(limitSetEntryCache, function(eSet) {
168 if(!limit_sets.filter(function(i) { return (i == eSet.limit_set()); })[0]) {
169 eSet.isdeleted(true);
175 function updateEntries() {
176 pcrud.update(update, {
177 oncomplete : function () {
178 progressDialog.hide();
183 function removeEntries() {
184 pcrud.eliminate(remove, {
185 oncomplete : function () {
189 progressDialog.hide();
195 function addEntries() {
197 oncomplete : function () {
200 } else if (update.length) {
203 progressDialog.hide();
211 else if (remove.length)
213 else if (update.length)
216 progressDialog.hide();
219 openils.Util.addOnLoad(load);