]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/js/dojo/openils/widget/EditPane.js
teach edit pane and the (pending) pcrud filter code about local (non-IDL) fields...
[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 || field.nonIdl) continue;
64
65
66                     if(field.name == this.fmIDL.pkey && this.mode == 'create' && this.fmIDL.pkey_sequence)
67                         continue; /* don't show auto-generated fields on create */
68
69                     var row = document.createElement('tr');
70                     //var docTd = document.createElement('td');
71                     var nameTd = document.createElement('td');
72                     var valTd = document.createElement('td');
73                     var valSpan = document.createElement('span');
74                     valTd.appendChild(valSpan);
75
76                     /*
77                     if(this.fieldDocs[field]) {
78                         var helpLink = dojo.create('a');
79                         var helpImg = dojo.create('img', {src:'/opac/images/advancedsearch-icon.png'}); // TODO Config
80                         helpLink.appendChild(helpImg);
81                         docTd.appendChild(helpLink);
82                     }
83                     */
84
85                     nameTd.appendChild(document.createTextNode(field.label));
86                     row.setAttribute('fmfield', field.name);
87                     //row.appendChild(docTd);
88                     row.appendChild(nameTd);
89                     row.appendChild(valTd);
90                     tbody.appendChild(row);
91                     //dojo.addClass(docTd, 'oils-fm-edit-pane-help');
92
93                     if(!this.overrideWidgetArgs[field.name])
94                         this.overrideWidgetArgs[field.name] = {};
95
96                     var args = dojo.mixin(
97                         this.overrideWidgetArgs[field.name], {
98                             idlField : field, 
99                             fmObject : this.fmObject,
100                             fmClass : this.fmClass,
101                             parentNode : valSpan,
102                             orgLimitPerms : this.limitPerms,
103                             readOnly : this.readOnly,
104                             widget : this.overrideWidgets[field.name],
105                             widgetClass : this.overrideWidgetClass[field.name],
106                             disableWidgetTest : this.disableWidgetTest
107                         }
108                     );
109
110                     var widget = new openils.widget.AutoFieldWidget(args);
111
112                     widget.build();
113                     this.fieldList.push({name:field.name, widget:widget});
114                 }
115                 if(!this.hideActionButtons)
116                     this.buildActionButtons(tbody);
117
118                 openils.Util.addCSSClass(table, 'oils-fm-edit-pane');
119             },
120
121             applySaveOnEnter : function(widget) {
122                 var self = this;
123                 dojo.connect(this, 'onKeyDown',
124                     function(e) {
125                         if(e.keyCode == dojo.keys.ENTER) 
126                             self.performAutoEditAction();
127                     }
128                 );
129             },
130
131             buildActionButtons : function(tbody) {
132                 var row = document.createElement('tr');
133                 var cancelTd = document.createElement('td');
134                 var applyTd = document.createElement('td');
135                 var cancelSpan = document.createElement('span');
136                 var applySpan = document.createElement('span');
137                 row.appendChild(cancelTd);
138                 row.appendChild(applyTd);
139                 cancelTd.appendChild(cancelSpan);
140                 applyTd.appendChild(applySpan);
141                 tbody.appendChild(row);
142
143                 var self = this;
144                 new dijit.form.Button({
145                     label:'Cancel', // XXX
146                     onClick : this.onCancel
147                 }, cancelSpan);
148
149                 new dijit.form.Button({
150                     label:'Save',  // XXX
151                     onClick: function() {self.performAutoEditAction();}
152                 }, applySpan);
153             },
154
155             getFields : function() {
156                 return this.fieldList.map(function(a) { return a.name });
157             },
158
159             getFieldValue : function(field) {
160                 for(var i in this.fieldList) {
161                     if(field == this.fieldList[i].name)
162                         return this.fieldList[i].widget.getFormattedValue();
163                 }
164             },
165
166             performAutoEditAction : function() {
167                 var self = this;
168                 self.performEditAction({
169                     oncomplete:function(req, cudResults) {
170                         if(self.onPostSubmit)
171                             self.onPostSubmit(req, cudResults);
172                     }
173                 });
174             },
175
176             performEditAction : function(opts) {
177                 var pcrud = new openils.PermaCrud();
178                 var fields = this.getFields();
179                 if(this.mode == 'create')
180                     this.fmObject = new fieldmapper[this.fmClass]();
181                 for(var idx in fields)  
182                     this.fmObject[fields[idx]](this.getFieldValue(fields[idx]));
183                 if(this.mode == 'create' && this.fmIDL.pkey_sequence)
184                     this.fmObject[this.fmIDL.pkey](null);
185                 pcrud[this.mode](this.fmObject, opts);
186             }
187         }
188     );
189 }
190