]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/dojo/openils/widget/EditPane.js
allow config settings to be passed in via args object to constructor
[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('fieldmapper.Fieldmapper');
5     dojo.require('dijit.layout.ContentPane');
6     dojo.require('openils.Util');
7     dojo.require('openils.User');
8     dojo.require('fieldmapper.IDL');
9     dojo.require('openils.PermaCrud');
10
11     dojo.declare(
12         'openils.widget.EditPane',
13         [dijit.layout.ContentPane],
14         {
15             fmClass : '',
16             fmObject : null,
17             mode : 'update',
18             fieldOrder : null, // ordered list of field names, optional.
19             fieldList : [], // holds the field name + associated widget
20             sortedFieldList : [], // holds the sorted IDL defs for our fields
21             onPostApply : null, // apply callback
22             onCancel : null, // cancel callback
23             hideActionButtons : false,
24
25             constructor : function(args) {
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.fmClass = (this.fmObject) ? this.fmObject.classname : this.fmClass;
37                 this.fmIDL = fieldmapper.IDL.fmclasses[this.fmClass];
38
39                 var table = document.createElement('table');
40                 var tbody = document.createElement('tbody');
41                 this.domNode.appendChild(table);
42                 table.appendChild(tbody);
43
44                 this.limitPerms = [];
45                 if(this.fmIDL.permacrud && this.fmIDL.permacrud[this.mode])
46                     this.limitPerms = this.fmIDL.permacrud[this.mode].perms;
47
48                 this._buildSortedFieldList()
49
50                 for(var f in this.sortedFieldList) {
51                     var field = this.sortedFieldList[f];
52                     if(!field || field.virtual) continue;
53
54                     var row = document.createElement('tr');
55                     var nameTd = document.createElement('td');
56                     var valTd = document.createElement('td');
57
58                     nameTd.appendChild(document.createTextNode(field.label));
59                     row.appendChild(nameTd);
60                     row.appendChild(valTd);
61                     tbody.appendChild(row);
62
63                     var widget = new openils.widget.AutoWidget({
64                         idlField : field, 
65                         fmObject : this.fmObject,
66                         parentNode : valTd,
67                         orgLimitPerms : this.limitPerms
68                     });
69                     widget.build();
70                     this.fieldList.push({name:field.name, widget:widget});
71                 }
72                 if(!this.hideActionButtons)
73                     this.buildActionButtons(tbody);
74     
75                 openils.Util.addCSSClass(table, 'oils-fm-edit-dialog');
76             },
77
78             buildActionButtons : function(tbody) {
79                 var row = document.createElement('tr');
80                 var cancelTd = document.createElement('td');
81                 var applyTd = document.createElement('td');
82                 row.appendChild(cancelTd);
83                 row.appendChild(applyTd);
84                 tbody.appendChild(row);
85
86                 var self = this;
87                 new dijit.form.Button({
88                     label:'Cancel', // XXX
89                     onClick : this.onCancel
90                 }, cancelTd);
91
92                 new dijit.form.Button({
93                     label:'Save',  // XXX
94                     onClick: function() {
95                         self.performEditAction({
96                             oncomplete:function() {
97                                 if(self.onPostApply)
98                                     self.onPostApply();
99                             }
100                         });
101                     }
102                 }, applyTd);
103             },
104
105             getFields : function() {
106                 return this.fieldList.map(function(a) { return a.name });
107             },
108
109             getFieldValue : function(field) {
110                 for(var i in this.fieldList) {
111                     if(field == this.fieldList[i].name)
112                         return this.fieldList[i].widget.getFormattedValue();
113                 }
114             },
115
116             _buildSortedFieldList : function() {
117                 this.sortedFieldList = [];
118
119                 if(this.fieldOrder) {
120
121                     for(var idx in this.fieldOrder) {
122                         var name = this.fieldOrder[idx];
123                         for(var idx2 in this.fmIDL.fields) {
124                             if(this.fmIDL.fields[idx2].name == name) {
125                                 this.sortedFieldList.push(this.fmIDL.fields[idx2]);
126                                 break;
127                             }
128                         }
129                     }
130                     
131                     // if the user-defined order does not list all fields, 
132                     // shove the extras on the end.
133                     var anonFields = [];
134                     for(var idx in this.fmIDL.fields)  {
135                         var name = this.fmIDL.fields[idx].name;
136                         if(this.fieldOrder.indexOf(name) < 0) {
137                             anonFields.push(this.fmIDL.fields[idx]);
138                         }
139                     }
140
141                     anonFields = anonFields.sort(
142                         function(a, b) {
143                             if(a.label > b.label) return 1;
144                             if(a.label < b.label) return -1;
145                             return 0;
146                         }
147                     );
148
149                     this.sortedFieldList = this.sortedFieldList.concat(anonFields);
150
151                 } else {
152                     // no sort order defined, sort all fields on display label
153
154                     for(var f in this.fmIDL.fields) 
155                         this.sortedFieldList.push(this.fmIDL.fields[f]);
156                     this.sortedFieldList = this.sortedFieldList.sort(
157                         // by default, sort on label
158                         function(a, b) {
159                             if(a.label > b.label) return 1;
160                             if(a.label < b.label) return -1;
161                             return 0;
162                         }
163                     );
164                 } 
165             },
166
167             performEditAction : function(opts) {
168                 var pcrud = new openils.PermaCrud();
169                 var fields = this.getFields();
170                 if(this.mode == 'create')
171                     this.fmObject = new fieldmapper[this.fmClass]();
172                 for(var idx in fields) 
173                     this.fmObject[fields[idx]](this.getFieldValue(fields[idx]));
174                 pcrud[this.mode](this.fmObject, opts);
175             }
176         }
177     );
178 }
179