]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/js/dojo/openils/widget/EditPane.js
permacrud CUD actions support an oncomplete handler, but the request object passed...
[Evergreen.git] / Open-ILS / web / js / dojo / openils / widget / EditPane.js
1 if(!dojo._hasResource['openils.widget.EditPane']) {
2     dojo.provide('openils.widget.EditPane');
3     dojo.require('openils.widget.AutoWidget');
4     dojo.require('openils.widget.AutoFieldWidget');
5     dojo.require('fieldmapper.Fieldmapper');
6     dojo.require('dijit.layout.ContentPane');
7     dojo.require('openils.Util');
8     dojo.require('openils.PermaCrud');
9     dojo.require('dijit.form.Button');
10
11     dojo.declare(
12         'openils.widget.EditPane',
13         [dijit.layout.ContentPane, openils.widget.AutoWidget],
14         {
15             mode : 'update',
16             onPostSubmit : null, // apply callback
17             onCancel : null, // cancel callback
18             hideActionButtons : false,
19             fieldDocs : null,
20
21             constructor : function(args) {
22                 this.fieldList = [];
23                 for(var k in args)
24                     this[k] = args[k];
25             },
26
27             /**
28              * Builds a basic table of key / value pairs.  Keys are IDL display labels.
29              * Values are dijit's, when values set
30              */
31             startup : function() {
32                 this.inherited(arguments);
33                 this.initAutoEnv();
34                 if(this.readOnly)
35                     this.hideActionButtons = true;
36
37                 // grab any field-level docs
38                 /*
39                 var pcrud = new openils.PermaCrud();
40                 this.fieldDocs = pcrud.search('fdoc', {fm_class:this.fmClass});
41                 */
42
43                 var table = this.table = document.createElement('table');
44                 var tbody = document.createElement('tbody');
45                 this.domNode.appendChild(table);
46                 table.appendChild(tbody);
47
48                 this.limitPerms = [];
49                 if(this.fmIDL.permacrud && this.fmIDL.permacrud[this.mode])
50                     this.limitPerms = this.fmIDL.permacrud[this.mode].perms;
51
52                 if(!this.overrideWidgets)
53                     this.overrideWidgets = {};
54
55                 if(!this.overrideWidgetClass)
56                     this.overrideWidgetClass = {};
57
58                 if(!this.overrideWidgetArgs)
59                     this.overrideWidgetArgs = {};
60
61                 for(var f in this.sortedFieldList) {
62                     var field = this.sortedFieldList[f];
63                     if(!field || field.virtual) continue;
64
65                     if(field.name == this.fmIDL.pkey && this.mode == 'create' && this.fmIDL.pkey_sequence)
66                         continue; /* don't show auto-generated fields on create */
67
68                     var row = document.createElement('tr');
69                     //var docTd = document.createElement('td');
70                     var nameTd = document.createElement('td');
71                     var valTd = document.createElement('td');
72                     var valSpan = document.createElement('span');
73                     valTd.appendChild(valSpan);
74
75                     /*
76                     if(this.fieldDocs[field]) {
77                         var helpLink = dojo.create('a');
78                         var helpImg = dojo.create('img', {src:'/opac/images/advancedsearch-icon.png'}); // TODO Config
79                         helpLink.appendChild(helpImg);
80                         docTd.appendChild(helpLink);
81                     }
82                     */
83
84                     nameTd.appendChild(document.createTextNode(field.label));
85                     row.setAttribute('fmfield', field.name);
86                     //row.appendChild(docTd);
87                     row.appendChild(nameTd);
88                     row.appendChild(valTd);
89                     tbody.appendChild(row);
90                     //dojo.addClass(docTd, 'oils-fm-edit-pane-help');
91
92                     if(!this.overrideWidgetArgs[field.name])
93                         this.overrideWidgetArgs[field.name] = {};
94
95                     var args = dojo.mixin(
96                         this.overrideWidgetArgs[field.name], {
97                             idlField : field, 
98                             fmObject : this.fmObject,
99                             fmClass : this.fmClass,
100                             parentNode : valSpan,
101                             orgLimitPerms : this.limitPerms,
102                             readOnly : this.readOnly,
103                             widget : this.overrideWidgets[field.name],
104                             widgetClass : this.overrideWidgetClass[field.name],
105                             disableWidgetTest : this.disableWidgetTest
106                         }
107                     );
108
109                     var widget = new openils.widget.AutoFieldWidget(args);
110
111                     widget.build();
112                     this.fieldList.push({name:field.name, widget:widget});
113                 }
114                 if(!this.hideActionButtons)
115                     this.buildActionButtons(tbody);
116
117                 openils.Util.addCSSClass(table, 'oils-fm-edit-pane');
118             },
119
120             applySaveOnEnter : function(widget) {
121                 var self = this;
122                 dojo.connect(this, 'onKeyDown',
123                     function(e) {
124                         if(e.keyCode == dojo.keys.ENTER) 
125                             self.performAutoEditAction();
126                     }
127                 );
128             },
129
130             buildActionButtons : function(tbody) {
131                 var row = document.createElement('tr');
132                 var cancelTd = document.createElement('td');
133                 var applyTd = document.createElement('td');
134                 var cancelSpan = document.createElement('span');
135                 var applySpan = document.createElement('span');
136                 row.appendChild(cancelTd);
137                 row.appendChild(applyTd);
138                 cancelTd.appendChild(cancelSpan);
139                 applyTd.appendChild(applySpan);
140                 tbody.appendChild(row);
141
142                 var self = this;
143                 new dijit.form.Button({
144                     label:'Cancel', // XXX
145                     onClick : this.onCancel
146                 }, cancelSpan);
147
148                 new dijit.form.Button({
149                     label:'Save',  // XXX
150                     onClick: function() {self.performAutoEditAction();}
151                 }, applySpan);
152             },
153
154             getFields : function() {
155                 return this.fieldList.map(function(a) { return a.name });
156             },
157
158             getFieldValue : function(field) {
159                 for(var i in this.fieldList) {
160                     if(field == this.fieldList[i].name)
161                         return this.fieldList[i].widget.getFormattedValue();
162                 }
163             },
164
165             performAutoEditAction : function() {
166                 var self = this;
167                 self.performEditAction({
168                     oncomplete:function(req, cudResults) {
169                         if(self.onPostSubmit)
170                             self.onPostSubmit(req, cudResults);
171                     }
172                 });
173             },
174
175             performEditAction : function(opts) {
176                 var pcrud = new openils.PermaCrud();
177                 var fields = this.getFields();
178                 if(this.mode == 'create')
179                     this.fmObject = new fieldmapper[this.fmClass]();
180                 for(var idx in fields)  
181                     this.fmObject[fields[idx]](this.getFieldValue(fields[idx]));
182                 if(this.mode == 'create' && this.fmIDL.pkey_sequence)
183                     this.fmObject[this.fmIDL.pkey](null);
184                 pcrud[this.mode](this.fmObject, opts);
185             }
186         }
187     );
188 }
189