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');
12 'openils.widget.EditPane',
13 [dijit.layout.ContentPane],
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,
26 * Builds a basic table of key / value pairs. Keys are IDL display labels.
27 * Values are dijit's, when values set
29 startup : function() {
30 this.inherited(arguments);
31 this.fmClass = (this.fmObject) ? this.fmObject.classname : this.fmClass;
32 this.fmIDL = fieldmapper.IDL.fmclasses[this.fmClass];
34 var table = document.createElement('table');
35 var tbody = document.createElement('tbody');
36 this.domNode.appendChild(table);
37 table.appendChild(tbody);
40 if(this.fmIDL.permacrud && this.fmIDL.permacrud[this.mode])
41 this.limitPerms = this.fmIDL.permacrud[this.mode].perms;
43 this._buildSortedFieldList()
45 for(var f in this.sortedFieldList) {
46 var field = this.sortedFieldList[f];
47 if(!field || field.virtual) continue;
49 var row = document.createElement('tr');
50 var nameTd = document.createElement('td');
51 var valTd = document.createElement('td');
53 nameTd.appendChild(document.createTextNode(field.label));
54 row.appendChild(nameTd);
55 row.appendChild(valTd);
56 tbody.appendChild(row);
58 var widget = new openils.widget.AutoWidget({
60 fmObject : this.fmObject,
62 orgLimitPerms : this.limitPerms
65 this.fieldList.push({name:field.name, widget:widget});
67 if(!this.hideActionButtons)
68 this.buildActionButtons(tbody);
70 openils.Util.addCSSClass(table, 'oils-fm-edit-dialog');
73 buildActionButtons : function(tbody) {
74 var row = document.createElement('tr');
75 var cancelTd = document.createElement('td');
76 var applyTd = document.createElement('td');
77 row.appendChild(cancelTd);
78 row.appendChild(applyTd);
79 tbody.appendChild(row);
82 new dijit.form.Button({
83 label:'Cancel', // XXX
84 onClick : this.onCancel
87 new dijit.form.Button({
90 self.performEditAction({
91 oncomplete:function() {
100 getFields : function() {
101 return this.fieldList.map(function(a) { return a.name });
104 getFieldValue : function(field) {
105 for(var i in this.fieldList) {
106 if(field == this.fieldList[i].name)
107 return this.fieldList[i].widget.getFormattedValue();
111 _buildSortedFieldList : function() {
112 this.sortedFieldList = [];
114 if(this.fieldOrder) {
116 for(var idx in this.fieldOrder) {
117 var name = this.fieldOrder[idx];
118 for(var idx2 in this.fmIDL.fields) {
119 if(this.fmIDL.fields[idx2].name == name) {
120 this.sortedFieldList.push(this.fmIDL.fields[idx2]);
126 // if the user-defined order does not list all fields,
127 // shove the extras on the end.
129 for(var idx in this.fmIDL.fields) {
130 var name = this.fmIDL.fields[idx].name;
131 if(this.fieldOrder.indexOf(name) < 0) {
132 anonFields.push(this.fmIDL.fields[idx]);
136 anonFields = anonFields.sort(
138 if(a.label > b.label) return 1;
139 if(a.label < b.label) return -1;
144 this.sortedFieldList = this.sortedFieldList.concat(anonFields);
147 // no sort order defined, sort all fields on display label
149 for(var f in this.fmIDL.fields)
150 this.sortedFieldList.push(this.fmIDL.fields[f]);
151 this.sortedFieldList = this.sortedFieldList.sort(
152 // by default, sort on label
154 if(a.label > b.label) return 1;
155 if(a.label < b.label) return -1;
162 performEditAction : function(opts) {
163 var pcrud = new openils.PermaCrud();
164 var fields = this.getFields();
165 if(this.mode == 'create')
166 this.fmObject = new fieldmapper[this.fmClass]();
167 for(var idx in fields)
168 this.fmObject[fields[idx]](this.getFieldValue(fields[idx]));
169 pcrud[this.mode](this.fmObject, opts);