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