]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/dojo/openils/widget/EditPane.js
plugged in initial support for performing edit operations on the server
[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
22             /**
23              * Builds a basic table of key / value pairs.  Keys are IDL display labels.
24              * Values are dijit's, when values set
25              */
26             startup : function() {
27                 this.inherited(arguments);
28                 this.fmClass = (this.fmObject) ? this.fmObject.classname : this.fmClass;
29                 this.fmIDL = fieldmapper.IDL.fmclasses[this.fmClass];
30
31                 var table = document.createElement('table');
32                 var tbody = document.createElement('tbody');
33                 this.domNode.appendChild(table);
34                 table.appendChild(tbody);
35
36                 this.limitPerms = [];
37                 if(this.fmIDL.permacrud && this.fmIDL.permacrud[this.mode])
38                     this.limitPerms = this.fmIDL.permacrud[this.mode].perms;
39
40                 this._buildSortedFieldList()
41
42                 for(var f in this.sortedFieldList) {
43                     var field = this.sortedFieldList[f];
44                     if(!field || field.virtual) continue;
45
46                     var row = document.createElement('tr');
47                     var nameTd = document.createElement('td');
48                     var valTd = document.createElement('td');
49
50                     nameTd.appendChild(document.createTextNode(field.label));
51                     row.appendChild(nameTd);
52                     row.appendChild(valTd);
53                     tbody.appendChild(row);
54
55                     var widget = new openils.widget.AutoWidget({
56                         idlField : field, 
57                         fmObject : this.fmObject,
58                         parentNode : valTd,
59                         orgLimitPerms : this.limitPerms
60                     });
61                     widget.build();
62                     this.fieldList.push({name:field.name, widget:widget});
63                 }
64
65                 openils.Util.addCSSClass(table, 'oils-fm-edit-dialog');
66             },
67
68             getFields : function() {
69                 return this.fieldList.map(function(a) { return a.name });
70             },
71
72             getFieldValue : function(field) {
73                 for(var i in this.fieldList) {
74                     if(field == this.fieldList[i].name)
75                         return this.fieldList[i].widget.getFormattedValue();
76                 }
77             },
78
79             _buildSortedFieldList : function() {
80                 this.sortedFieldList = [];
81
82                 if(this.fieldOrder) {
83
84                     for(var idx in this.fieldOrder) {
85                         var name = this.fieldOrder[idx];
86                         for(var idx2 in this.fmIDL.fields) {
87                             if(this.fmIDL.fields[idx2].name == name) {
88                                 this.sortedFieldList.push(this.fmIDL.fields[idx2]);
89                                 break;
90                             }
91                         }
92                     }
93                     
94                     // if the user-defined order does not list all fields, 
95                     // shove the extras on the end.
96                     var anonFields = [];
97                     for(var idx in this.fmIDL.fields)  {
98                         var name = this.fmIDL.fields[idx].name;
99                         if(this.fieldOrder.indexOf(name) < 0) {
100                             anonFields.push(this.fmIDL.fields[idx]);
101                         }
102                     }
103
104                     anonFields = anonFields.sort(
105                         function(a, b) {
106                             if(a.label > b.label) return 1;
107                             if(a.label < b.label) return -1;
108                             return 0;
109                         }
110                     );
111
112                     this.sortedFieldList = this.sortedFieldList.concat(anonFields);
113
114                 } else {
115                     // no sort order defined, sort all fields on display label
116
117                     for(var f in this.fmIDL.fields) 
118                         this.sortedFieldList.push(this.fmIDL.fields[f]);
119                     this.sortedFieldList = this.sortedFieldList.sort(
120                         // by default, sort on label
121                         function(a, b) {
122                             if(a.label > b.label) return 1;
123                             if(a.label < b.label) return -1;
124                             return 0;
125                         }
126                     );
127                 } 
128             },
129
130             performEditAction : function(opts) {
131
132                 var pcrud = new openils.PermaCrud();
133                 var fields = this.getFields();
134                 for(var idx in fields) 
135                     this.fmObject[fields[idx]](this.getFieldValue(fields[idx]));
136
137                 if(opts.async) {
138                     opts.oncomplete = function(r) {
139                         pcrud.disconnect()
140                         opts.oncomplete(r);
141                     };
142                 }
143
144                 pcrud[this.mode](this.fmObject, opts);
145                 if(!opts.async) pcrud.disconnect();
146             }
147         }
148     );
149 }
150