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