]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/web/js/dojo/openils/widget/EditPane.js
added a new editpane class, which models the basic edit table of key/value pairs...
[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
19             /**
20              * Builds a basic table of key / value pairs.  Keys are IDL display labels.
21              * Values are dijit's, when values set
22              */
23             startup : function() {
24                 this.inherited(arguments);
25                 this.fmClass = (this.fmObject) ? this.fmObject.classname : this.fmClass;
26                 this.fmIDL = fieldmapper.IDL.fmclasses[this.fmClass];
27
28                 var table = document.createElement('table');
29                 var tbody = document.createElement('tbody');
30                 this.domNode.appendChild(table);
31                 table.appendChild(tbody);
32
33                 this.limitPerms = [];
34                 if(this.fmIDL.permacrud && this.fmIDL.permacrud[this.mode])
35                     this.limitPerms = this.fmIDL.permacrud[this.mode].perms;
36
37                 this._buildSortedFieldList()
38
39                 for(var f in this.sortedFieldList) {
40                     var field = this.sortedFieldList[f];
41                     if(!field || field.virtual) continue;
42
43                     var row = document.createElement('tr');
44                     var nameTd = document.createElement('td');
45                     var valTd = document.createElement('td');
46
47                     nameTd.appendChild(document.createTextNode(field.label));
48                     row.appendChild(nameTd);
49                     row.appendChild(valTd);
50                     tbody.appendChild(row);
51
52                     new openils.widget.AutoWidget({
53                         idlField : field, 
54                         fmObject : this.fmObject,
55                         parentNode : valTd,
56                         orgLimitPerms : this.limitPerms
57                     }).build();
58                 }
59
60                 openils.Util.addCSSClass(table, 'oils-fm-edit-dialog');
61             },
62
63             _buildSortedFieldList : function() {
64                 this.sortedFieldList = [];
65
66                 if(this.fieldOrder) {
67
68                     for(var idx in this.fieldOrder) {
69                         var name = this.fieldOrder[idx];
70                         for(var idx2 in this.fmIDL.fields) {
71                             if(this.fmIDL.fields[idx2].name == name) {
72                                 this.sortedFieldList.push(this.fmIDL.fields[idx2]);
73                                 break;
74                             }
75                         }
76                     }
77                     
78                     // if the user-defined order does not list all fields, 
79                     // shove the extras on the end.
80                     var anonFields = [];
81                     for(var idx in this.fmIDL.fields)  {
82                         var name = this.fmIDL.fields[idx].name;
83                         if(this.fieldOrder.indexOf(name) < 0) {
84                             anonFields.push(this.fmIDL.fields[idx]);
85                         }
86                     }
87
88                     anonFields = anonFields.sort(
89                         function(a, b) {
90                             if(a.label > b.label) return 1;
91                             if(a.label < b.label) return -1;
92                             return 0;
93                         }
94                     );
95
96                     this.sortedFieldList = this.sortedFieldList.concat(anonFields);
97
98                 } else {
99                     // no sort order defined, sort all fields on display label
100
101                     for(var f in this.fmIDL.fields) 
102                         this.sortedFieldList.push(this.fmIDL.fields[f]);
103                     this.sortedFieldList = this.sortedFieldList.sort(
104                         // by default, sort on label
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             }
113         }
114     );
115 }
116