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