]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/dojo/openils/widget/EditPane.js
allow the caller to define a function that tells the autofield widget to disable...
[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
10     dojo.declare(
11         'openils.widget.EditPane',
12         [dijit.layout.ContentPane, openils.widget.AutoWidget],
13         {
14             mode : 'update',
15             onPostSubmit : null, // apply callback
16             onCancel : null, // cancel callback
17             hideActionButtons : false,
18
19             constructor : function(args) {
20                 this.fieldList = [];
21                 for(var k in args)
22                     this[k] = args[k];
23             },
24
25             /**
26              * Builds a basic table of key / value pairs.  Keys are IDL display labels.
27              * Values are dijit's, when values set
28              */
29             startup : function() {
30                 this.inherited(arguments);
31                 this.initAutoEnv();
32                 if(this.readOnly)
33                     this.hideActionButtons = true;
34
35                 var table = this.table = document.createElement('table');
36                 var tbody = document.createElement('tbody');
37                 this.domNode.appendChild(table);
38                 table.appendChild(tbody);
39
40                 this.limitPerms = [];
41                 if(this.fmIDL.permacrud && this.fmIDL.permacrud[this.mode])
42                     this.limitPerms = this.fmIDL.permacrud[this.mode].perms;
43
44                 if(!this.overrideWidgets)
45                     this.overrideWidgets = {};
46
47                 if(!this.overrideWidgetClass)
48                     this.overrideWidgetClass = {};
49
50                 for(var f in this.sortedFieldList) {
51                     var field = this.sortedFieldList[f];
52                     if(!field || field.virtual) continue;
53
54                     if(field.name == this.fmIDL.pkey && this.mode == 'create' && this.fmIDL.pkey_sequence)
55                         continue; /* don't show auto-generated fields on create */
56
57                     var row = document.createElement('tr');
58                     var nameTd = document.createElement('td');
59                     var valTd = document.createElement('td');
60                     var valSpan = document.createElement('span');
61                     valTd.appendChild(valSpan);
62
63
64                     nameTd.appendChild(document.createTextNode(field.label));
65                     row.setAttribute('fmfield', field.name);
66                     row.appendChild(nameTd);
67                     row.appendChild(valTd);
68                     tbody.appendChild(row);
69
70                     var widget = new openils.widget.AutoFieldWidget({
71                         idlField : field, 
72                         fmObject : this.fmObject,
73                         fmClass : this.fmClass,
74                         parentNode : valSpan,
75                         orgLimitPerms : this.limitPerms,
76                         readOnly : this.readOnly,
77                         widget : this.overrideWidgets[field.name],
78                         widgetClass : this.overrideWidgetClass[field.name],
79                         disableWidgetTest : this.disableWidgetTest
80                     });
81
82                     widget.build();
83                     this.fieldList.push({name:field.name, widget:widget});
84                 }
85                 if(!this.hideActionButtons)
86                     this.buildActionButtons(tbody);
87
88                 openils.Util.addCSSClass(table, 'oils-fm-edit-pane');
89             },
90
91             applySaveOnEnter : function(widget) {
92                 var self = this;
93                 dojo.connect(this, 'onKeyDown',
94                     function(e) {
95                         if(e.keyCode == dojo.keys.ENTER) 
96                             self.performAutoEditAction();
97                     }
98                 );
99             },
100
101             buildActionButtons : function(tbody) {
102                 var row = document.createElement('tr');
103                 var cancelTd = document.createElement('td');
104                 var applyTd = document.createElement('td');
105                 var cancelSpan = document.createElement('span');
106                 var applySpan = document.createElement('span');
107                 row.appendChild(cancelTd);
108                 row.appendChild(applyTd);
109                 cancelTd.appendChild(cancelSpan);
110                 applyTd.appendChild(applySpan);
111                 tbody.appendChild(row);
112
113                 var self = this;
114                 new dijit.form.Button({
115                     label:'Cancel', // XXX
116                     onClick : this.onCancel
117                 }, cancelSpan);
118
119                 new dijit.form.Button({
120                     label:'Save',  // XXX
121                     onClick: function() {self.performAutoEditAction();}
122                 }, applySpan);
123             },
124
125             getFields : function() {
126                 return this.fieldList.map(function(a) { return a.name });
127             },
128
129             getFieldValue : function(field) {
130                 for(var i in this.fieldList) {
131                     if(field == this.fieldList[i].name)
132                         return this.fieldList[i].widget.getFormattedValue();
133                 }
134             },
135
136             performAutoEditAction : function() {
137                 var self = this;
138                 self.performEditAction({
139                     oncomplete:function(r) {
140                         if(self.onPostSubmit)
141                             self.onPostSubmit(r);
142                     }
143                 });
144             },
145
146             performEditAction : function(opts) {
147                 var pcrud = new openils.PermaCrud();
148                 var fields = this.getFields();
149                 if(this.mode == 'create')
150                     this.fmObject = new fieldmapper[this.fmClass]();
151                 for(var idx in fields)  
152                     this.fmObject[fields[idx]](this.getFieldValue(fields[idx]));
153                 if(this.mode == 'create' && this.fmIDL.pkey_sequence)
154                     this.fmObject[this.fmIDL.pkey](null);
155                 pcrud[this.mode](this.fmObject, opts);
156             }
157         }
158     );
159 }
160