Using the ExtJS Row Editor
September 16, 2009 by Ed Spencer · 14 Comments
The RowEditor plugin was recently added to the ExtJS examples page. It works a lot like a normal Grid Editor, except you can edit several fields on a given row at once before saving.
This neatly solves the problem of adding a new row to an editor grid, entering data into the first field and finding it save itself straight away, which is rarely desired. In this fashion we can provide full CRUD for simple models in a single page.
Installation
You’ll need to get a copy of the javascript, css and images from the server. This is a bit of a pain. If you still have the ExtJS SDK around you can find these in the examples folder, if not you can get each file as follows:
Grab the plugin JS file below and put it where you usually put your .js files:
http://www.extjs.com/deploy/dev/examples/ux/RowEditor.js
This needs to go with your other stylesheets, usually in a directory called ‘css’:
http://www.extjs.com/deploy/dev/examples/ux/css/RowEditor.css
Download these two images and put them into your existing ‘images’ folder (the same place the other ExtJS images live):
http://www.extjs.com/deploy/dev/examples/ux/images/row-editor-bg.gif
http://www.extjs.com/deploy/dev/examples/ux/images/row-editor-btns.gif
Include the .js and .css files on your page and you should be ready to go.
Usage
RowEditor is a normal grid plugin, so you’ll need to instantiate it and add to your grid’s ‘plugins’ property. You also need to define what type of Editor is available (if any) on each column:
var editor = new Ext.ux.grid.RowEditor();
var grid = new Ext.grid.GridPanel({
plugins: [editor],
columns: [
{
header : 'User Name',
dataIndex: 'name',
editor : new Ext.form.TextField()
},
{
header : 'Email',
dataIndex: 'email',
editor : new Ext.form.TextField()
}
]
... the rest of your grid config here
});
RowEditor defines a few events, the most useful one being ‘afteredit’. Its signature looks like this:
/**
* @event afteredit
* Fired after a row is edited and passes validation. This event is fired
* after the store's update event is fired with this edit.
* @param {Ext.ux.grid.RowEditor} roweditor This object
* @param {Object} changes Object with changes made to the record.
* @param {Ext.data.Record} r The Record that was edited.
* @param {Number} rowIndex The rowIndex of the row just edited
*/
'afteredit'
All you need to do is listen to that event on your RowEditor and save your model object appropriately. First though, we’ll define the Ext.data.Record that we’re using in this grid’s store:
var User = Ext.data.Record.create([
{name: 'user_id', type: 'int'},
{name: 'name', type: 'string'},
{name: 'email', type: 'string'}
]);
And now the afteredit listener itself
editor.on({
scope: this,
afteredit: function(roweditor, changes, record, rowIndex) {
//your save logic here - might look something like this:
Ext.Ajax.request({
url : record.phantom ? '/users' : '/users/' + record.get('user_id'),
method: record.phantom ? 'POST' : 'PUT',
params: changes,
success: function() {
//post-processing here - this might include reloading the grid if there are calculated fields
}
});
}
});
The code above simply takes the changes object (which is just key: value object with all the changed fields) and issues a request to your server backend. ‘record.phantom’ returns true if this record does not yet exist on the server – we use this information above to specify whether we’re POSTing to /users or PUTing to /users/123, in line with normal RESTful practices.
Adding a new record
The example above allows for editing an existing record, but how do we add a new one? Like this:
var grid = new Ext.grid.GridPanel({
//... the same config from above goes here,
tbar: [
{
text : "Add User",
handler: function() {
//make a new empty User and stop any current editing
var newUser = new User({});
rowEditor.stopEditing();
//add our new record as the first row, select it
grid.store.insert(0, newUser);
grid.getView().refresh();
grid.getSelectionModel().selectRow(0);
//start editing our new User
rowEditor.startEditing(0);
}
}
]
});
Pretty simple stuff – we’ve just added a toolbar with a button which, when clicked, creates a new User record, inserts it at the top of the grid and focusses the RowEditor on it.
Configuration Options
Although not documented, the plugin has a few configuration options:
var editor = new Ext.ux.grid.RowEditor({
saveText : "My Save Button Text",
cancelText: "My Cancel Button Text",
clicksToEdit: 1, //this changes from the default double-click activation to single click activation
errorSummary: false //disables display of validation messages if the row is invalid
});
If you want to customise other elements of the RowEditor you probably can, but you’ll need to take a look at the source (it’s not scary).
Final Thought
RowEditor is a really nice component which can provide an intuitive interface and save you writing a lot of CRUD code. It is best employed on grids with only a few columns – for models with lots of data fields you’re better off with a full FormPanel.
I’d be pretty happy to see this included in the default ExtJS distribution, as I find myself returning to it frequently.
Have you tried to disable all editors in a single row without affecting the whole column?
hi
i have a probleme with dates, my app send this format of date to the server ( Fri Nov 13 2009 00:00:00 GMT+0100 )
there is a solution
thanks
Thanks for this in-depth tutorial.
Just wanted to point out that as of version 3.0.1, RowEditor has added a cancel event that makes adding new records quite easier. The basic gist is that a user might elect to add a record then cancel before saving. By listening for the cancel event you can make sure that the new record is not retained in the store when the user has elected to cancel.
Usefull plugin !
However, the row editor defaults to submit the changes in “dataindex – value” pair. I think this plugin should have an option so that the user can submit as “fieldname – value” pair instead. I need this. Currently, I solve this by messing up with RowEditor.js source code.
Hi,
There are some difference between 3.1.1 and 3.0.0, so be careful what version of Ext you have. Also I would like the RowEditor.js file for the 3.0.1 version, the on e with the cancel event.
Thanks, Sergiu
What about editon last row, Update/Canel buttons are not visible there?
Thanks for your tutorials!
hi, i’m looking solution for my problems with this row editor.
if the grid resize or move the columns, for the first time the row editor is fine,but in second time,if you do resize or move columns again,in next row editor will show not fine,it is untidy.
Thanks.
@firmansyah we’re aware of several problems with the RowEditor currently – it’s high on the list of things to fix
Repositioning or moving column headers in the grid screws up the editor row fields. Any ideas?
@TB there are several major known issues with RowEditor. It’s high on the list for a rewrite, probably coinciding with 4.0
can anyone post the back end php for row editor. it will be usefull for many of us..
Thanks man, I was making a silly mistake, I’ve found it with this tuto.
bye
I’ve one problem with RowEditor.
When I update or insert a row, if I visite all the fields with TAB key is all right, but when I arrive at finish of rows with TAB key and after with mouse I come back at start of row sometimes firebug give me a error “j is null” and I can’t navigate the fields with TAB key.
What am I doing of wrong?
Sorry for my english.