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