]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/dojo/openils/widget/EditDialog.js
allow the caller to define the field sort order, either a full list or the initial...
[working/Evergreen.git] / Open-ILS / web / js / dojo / openils / widget / EditDialog.js
1 if(!dojo._hasResource['openils.widget.EditDialog']) {
2     dojo.provide('openils.widget.EditDialog');
3     dojo.require('openils.widget.AutoWidget');
4     dojo.require('fieldmapper.Fieldmapper');
5     dojo.require('dijit.Dialog');
6     dojo.require('openils.Util');
7     dojo.require('openils.User');
8     dojo.require('fieldmapper.IDL');
9
10
11     /**
12      * Given a fieldmapper object, this builds a pop-up dialog used for editing the object
13      */
14
15     dojo.declare(
16         'openils.widget.EditDialog',
17         [dijit.Dialog],
18         {
19             fmClass : '',
20             fmObject : null,
21             mode : 'update',
22             fieldOrder : null, // ordered list of field names, optional.
23
24             /**
25              * Builds a basic table of key / value pairs.  Keys are IDL display labels.
26              * Values are dijit's, when values set
27              */
28             startup : function() {
29                 this.inherited(arguments);
30                 this.fmClass = (this.fmObject) ? this.fmObject.classname : this.fmClass;
31                 this.fmIDL = fieldmapper.IDL.fmclasses[this.fmClass];
32
33                 var table = document.createElement('table');
34                 var tbody = document.createElement('tbody');
35                 this.domNode.appendChild(table);
36                 table.appendChild(tbody);
37
38                 this.limitPerms = [];
39                 if(this.fmIDL.permacrud && this.fmIDL.permacrud[this.mode])
40                     this.limitPerms = this.fmIDL.permacrud[this.mode].perms;
41
42                 this._buildSortedFieldList()
43
44                 for(var f in this.sortedFieldList) {
45                     var field = this.sortedFieldList[f];
46                     if(!field || field.virtual) continue;
47
48                     var row = document.createElement('tr');
49                     var nameTd = document.createElement('td');
50                     var valTd = document.createElement('td');
51
52                     nameTd.appendChild(document.createTextNode(field.label));
53                     row.appendChild(nameTd);
54                     row.appendChild(valTd);
55                     tbody.appendChild(row);
56
57                     new openils.widget.AutoWidget({
58                         idlField : field, 
59                         fmObject : this.fmObject,
60                         parentNode : valTd,
61                         orgLimitPerms : this.limitPerms
62                     }).build();
63                 }
64
65                 openils.Util.addCSSClass(table, 'oils-fm-edit-dialog');
66             },
67
68             _buildSortedFieldList : function() {
69                 this.sortedFieldList = [];
70
71                 if(this.fieldOrder) {
72
73                     for(var idx in this.fieldOrder) {
74                         var name = this.fieldOrder[idx];
75                         for(var idx2 in this.fmIDL.fields) {
76                             if(this.fmIDL.fields[idx2].name == name) {
77                                 this.sortedFieldList.push(this.fmIDL.fields[idx2]);
78                                 break;
79                             }
80                         }
81                     }
82                     
83                     // if the user-defined order does not list all fields, 
84                     // shove the extras on the end.
85                     var anonFields = [];
86                     for(var idx in this.fmIDL.fields)  {
87                         var name = this.fmIDL.fields[idx].name;
88                         if(this.fieldOrder.indexOf(name) < 0) {
89                             anonFields.push(this.fmIDL.fields[idx]);
90                         }
91                     }
92
93                     anonFields = anonFields.sort(
94                         function(a, b) {
95                             if(a.label > b.label) return 1;
96                             if(a.label < b.label) return -1;
97                             return 0;
98                         }
99                     );
100
101                     this.sortedFieldList = this.sortedFieldList.concat(anonFields);
102
103                 } else {
104                     // no sort order defined, sort all fields on display label
105
106                     for(var f in this.fmIDL.fields) 
107                         this.sortedFieldList.push(this.fmIDL.fields[f]);
108                     this.sortedFieldList = this.sortedFieldList.sort(
109                         // by default, sort on label
110                         function(a, b) {
111                             if(a.label > b.label) return 1;
112                             if(a.label < b.label) return -1;
113                             return 0;
114                         }
115                     );
116                 } 
117             }
118         }
119     );
120 }
121