]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/dojo/openils/widget/AutoGrid.js
auto-grid now has the ability to pop up an edit dialog for the given fieldmapper...
[working/Evergreen.git] / Open-ILS / web / js / dojo / openils / widget / AutoGrid.js
1 if(!dojo._hasResource['openils.widget.AutoGrid']) {
2     dojo.provide('openils.widget.AutoGrid');
3     dojo.require('dojox.grid.DataGrid');
4     dojo.require('openils.widget.AutoWidget');
5     dojo.require('openils.widget.AutoFieldWidget');
6     dojo.require('openils.widget.EditDialog');
7     dojo.require('openils.Util');
8
9     dojo.declare(
10         'openils.widget.AutoGrid',
11         [dojox.grid.DataGrid, openils.widget.AutoWidget],
12         {
13
14             /* if true, pop up an edit dialog when user hits Enter on a give row */
15             editOnEnter : false, 
16
17             /* maps dojo store items to fieldmapper objects, since the 
18              * grid may not have access to all fm objects */
19             storeItemObjectMapper : null,  
20
21             startup : function() {
22                 this.inherited(arguments);
23                 this.initAutoEnv();
24                 var existing = (this.structure && this.structure[0].cells[0]) ? 
25                     this.structure[0].cells[0] : [];
26                 var fields = [];
27                 for(var f in this.sortedFieldList) {
28                     var field = this.sortedFieldList[f];
29                     if(!field || field.virtual) continue;
30                     var entry = existing.filter(function(i){return (i.field == field.name)})[0];
31                     if(entry) entry.name = field.label;
32                     else entry = {field:field.name, name:field.label};
33                     fields.push(entry);
34                     if(!entry.get) 
35                         entry.get = openils.widget.AutoGrid.defaultGetter
36                 }
37                 this.setStructure([{cells: [fields]}]);
38                 this.setStore(this.buildAutoStore());
39                 if(this.editOnEnter) 
40                     this._applyEditOnEnter();
41             },
42
43             /* capture keydown and launch edit dialog on enter */
44             _applyEditOnEnter : function() {
45                 dojo.connect(this, 'onKeyDown',
46                     function(e) {
47                         if(e.keyCode == dojo.keys.ENTER) {
48                             this.selection.deselectAll();
49                             this.selection.select(this.focus.rowIndex);
50                             this._drawEditDialog(this.selection.getFirstSelected());
51                         }
52                     }
53                 );
54             },
55
56             _drawEditDialog : function(storeItem) {
57                 var grid = this;
58                 var fmObject = this.storeItemObjectMapper(storeItem);
59                 var idents = grid.store.getIdentityAttributes();
60                 var dialog = new openils.widget.EditDialog({
61                     fmObject:fmObject,
62                     onPostApply : function() {
63                         // update the grid store
64                         for(var i in fmObject._fields) {
65                             var field = fmObject._fields[i];
66                             if(idents.filter(function(j){return (j == field)})[0])
67                                 continue; // don't try to edit an identifier field
68                             grid.store.setValue(storeItem, field, fmObject[field]());
69                         }
70                     }
71                 });
72                 dialog.editPane.fieldOrder = this.fieldOrder;
73                 dialog.startup();
74                 dialog.show();
75             }
76         }
77     );
78     openils.widget.AutoGrid.markupFactory = dojox.grid.DataGrid.markupFactory;
79
80     openils.widget.AutoGrid.defaultGetter = function(rowIndex, item) {
81         if(!item) return '';
82         var val = this.grid.store.getValue(item, this.field);
83         var autoWidget = new openils.widget.AutoFieldWidget({
84             fmClass: this.grid.fmClass,
85             fmField: this.field,
86             widgetValue : val,
87         });
88         return autoWidget.getDisplayString();
89     }
90 }
91