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