The html is remarkably simple.
<div id="CategoriesContainer">
<div class="TabContent"></div>
</div>Next comes the more complex part of the implementation :)
$(document).ready(function() {
$.namespace("category", {
inherited: true,
InitialiseControl: function() {
$.fn.category.LoadCategoryGrid();
},
LoadCategoryGrid: function() {
var tabContent = $("#CategoriesContainer").children(".TabContent");
var proxy = new Ext.data.HttpProxy({
url: 'Data/Categories.aspx'
});
var reader = new Ext.data.JsonReader({
root: 'Data',
totalProperty: 'Count',
idProperty: 'CategoryId',
fields: [
{ name: 'CategoryId', type: 'int' },
{ name: 'CategoryName', type: 'string', allowBlank: false },
{ name: 'BudgetAmount', type: 'float', allowBlank: false },
{ name: 'IsActive', type: 'boolean' },
{ name: 'Timestamp', type: 'date', dateFormat: 'M$' },
{ name: 'Version', type: 'auto' }
]
});
var writer = new Ext.data.JsonWriter({
encode: true, // <-- don't return encoded JSON -- causes Ext.Ajax#request to send data using
// jsonData config rather than HTTP params
writeAllFields: true
});
var store = new Ext.data.Store({
id: 'dsCategores',
proxy: proxy,
reader: reader,
writer: writer,
listeners: {
'update': function(store, record, operation) {
store.commitChanges();
},
'remove': function(store, record, index) {
store.commitChanges();
}
}
});
var colModel = new Ext.grid.ColumnModel({
defaults: {
sortable: true
},
columns: [
{header: 'Name', dataIndex: 'CategoryName', editor: new Ext.form.TextField({}) },
{ header: 'Budget Amount', dataIndex: 'BudgetAmount', xtype: 'numbercolumn', format: '$0,0.00', align: 'right', editor: new Ext.form.NumberField({}) },
{ header: 'Active', dataIndex: 'IsActive', xtype: 'booleancolumn', trueText: 'Yes', falseText: 'No', align: 'center', editor: new Ext.form.Checkbox({}) }
]
});
// use RowEditor for editing
var editor = new Ext.ux.grid.RowEditor({
saveText: 'Update'
});
var grid = new Ext.grid.GridPanel({
iconCls: 'icon-grid',
frame: true,
title: 'Categories',
loadMask: true,
autoScroll: true,
height: 300,
store: store,
plugins: [editor],
colModel: colModel,
tbar: [{
text: 'Add',
iconCls: 'silk-add',
handler: function(btn, ev) {
var u = new grid.store.recordType({
Description: '',
Amount: '',
IsActive: true
});
editor.stopEditing();
grid.store.insert(0, u);
editor.startEditing(0);
}
}, '-', '->', '-', {
text: 'refresh',
iconCls: 'silk-table-refresh',
handler: function() {
grid.store.load();
}
}],
viewConfig: {
forceFit: true
}
});
grid.render(tabContent[0]);
store.load();
}
});
});So what's actually going on here?
Firstly,
$(document).ready(function() {
$.namespace("category", {
inherited: true,
InitialiseControl: function() {
$.fn.category.LoadCategoryGrid();
},
Here I am using a jquery namespace pluging to create (oddly enough!) a namespace for the javascript for this particular control (or tab). The line inherited: true allows you to interact with function parameters as normal, rather than referring to them as params[0], params[1] etc.The rest of the javascript is fairly standard ExtJs syntax and extensive definitions can be found at the ExtJs API, but in short I follow these steps when setting up a grid:
- Create a proxy object and set the URL it should post to;
- Create a reader object. In my case it's a JsonReader and I set the properties that allow the object to interact with the returned Json data;
- Create a writer object. This creates default CRUD actions for you;
- Create a store object and set up listeners for update and delete calls (mind you I'm not actually deleting anything);
- Create a column model for the grid. This maps the fields from the reader to the columns;
- Create a RowEditor object. This is a plug-in that gets applied to the grid and can be downloaded from an ExtJs example Grid with RowEditor;
- Create the grid;
- Get the grid to render to a particular DOM element;
- And lastly load the store object;
Next up will be a short post on how to deal with the Ajax requests server side in a C# environment.
Enjoy!
No comments:
Post a Comment