]> git.evergreen-ils.org Git - working/Evergreen.git/blob - Open-ILS/web/js/dojo/openils/widget/AutoGrid.js
consistent focus handling after user clicks cancel/save in edit dialog. still funky...
[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             defaultCellWidth : null,
17
18             startup : function() {
19
20                 this.selectionMode = 'single';
21                 this.inherited(arguments);
22                 this.initAutoEnv();
23                 var existing = (this.structure && this.structure[0].cells[0]) ? 
24                     this.structure[0].cells[0] : [];
25                 var fields = [];
26
27                 for(var f in this.sortedFieldList) {
28                     var field = this.sortedFieldList[f];
29                     if(!field || field.virtual) continue;
30                     var entry = existing.filter(
31                         function(i){return (i.field == field.name)})[0];
32                     if(entry) entry.name = field.label;
33                     else entry = {field:field.name, name:field.label};
34                     fields.push(entry);
35                     if(!entry.get) 
36                         entry.get = openils.widget.AutoGrid.defaultGetter
37                     if(!entry.width && this.defaultCellWidth)
38                         entry.width = this.defaultCellWidth;
39                 }
40
41                 this.setStructure([{cells: [fields]}]);
42                 this.setStore(this.buildAutoStore());
43                 if(this.editOnEnter) 
44                     this._applyEditOnEnter();
45             },
46
47             /* capture keydown and launch edit dialog on enter */
48             _applyEditOnEnter : function() {
49
50                 this.onMouseOverRow = function(e) {};
51                 this.onMouseOutRow = function(e) {};
52                 this.onCellFocus = function(cell, rowIndex) { 
53                     this.selection.deselectAll();
54                     this.selection.select(this.focus.rowIndex);
55                 };
56
57                 dojo.connect(this, 'onRowDblClick',
58                     function(e) {
59                         this._drawEditDialog(this.selection.getFirstSelected(), this.focus.rowIndex);
60                     }
61                 );
62
63                 dojo.connect(this, 'onKeyDown',
64                     function(e) {
65                         if(e.keyCode == dojo.keys.ENTER) {
66                             this.selection.deselectAll();
67                             this.selection.select(this.focus.rowIndex);
68                             this._drawEditDialog(this.selection.getFirstSelected(), this.focus.rowIndex);
69                         }
70                     }
71                 );
72             },
73
74             _drawEditDialog : function(storeItem, rowIndex) {
75                 var grid = this;
76                 var fmObject = new fieldmapper[this.fmClass]().fromStoreItem(storeItem);
77                 var idents = grid.store.getIdentityAttributes();
78                 var dialog = new openils.widget.EditDialog({
79                     fmObject:fmObject,
80                     onPostSubmit : function() {
81                         for(var i in fmObject._fields) {
82                             var field = fmObject._fields[i];
83                             if(idents.filter(function(j){return (j == field)})[0])
84                                 continue; // don't try to edit an identifier field
85                             grid.store.setValue(storeItem, field, fmObject[field]());
86                         }
87                         dialog.destroy();
88                         setTimeout(function(){
89                             grid.views.views[1].getCellNode(rowIndex, 0).focus();},200);
90                     },
91                     onCancel : function() {
92                         setTimeout(function(){
93                             grid.views.views[1].getCellNode(rowIndex, 0).focus();},200);
94                     }
95                 });
96                 dialog.editPane.fieldOrder = this.fieldOrder;
97                 dialog.editPane.mode = 'update';
98                 dialog.startup();
99                 dialog.show();
100             },
101
102             showCreateDialog : function() {
103                 var grid = this;
104                 var dialog = new openils.widget.EditDialog({
105                     fmClass : this.fmClass,
106                     onPostSubmit : function(r) {
107                         var fmObject = openils.Util.readResponse(r);
108                         if(fmObject) 
109                             grid.store.newItem(fmObject.toStoreItem());
110                         dialog.destroy();
111                         setTimeout(function(){
112                             grid.selection.select(grid.rowCount-1);
113                             grid.views.views[1].getCellNode(grid.rowCount-1, 1).focus();
114                         },200);
115                     },
116                 });
117                 dialog.editPane.fieldOrder = this.fieldOrder;
118                 dialog.editPane.mode = 'create';
119                 dialog.startup();
120                 dialog.show();
121             }
122         } 
123     );
124     openils.widget.AutoGrid.markupFactory = dojox.grid.DataGrid.markupFactory;
125
126     openils.widget.AutoGrid.defaultGetter = function(rowIndex, item) {
127         if(!item) return '';
128         var val = this.grid.store.getValue(item, this.field);
129         var autoWidget = new openils.widget.AutoFieldWidget({
130             fmClass: this.grid.fmClass,
131             fmField: this.field,
132             widgetValue : val,
133         });
134         return autoWidget.getDisplayString();
135     }
136 }
137