Yesterday I was looking for something new (new widgets, new functionality) in the latest GXT version (2.2.1) and found that, it is now providing grid filtering support. You can add MS Excel like filtering option in your application through this. I think it was the most demanded and expected feature from the GXT developers which can be highly utilized in Enterprise Reporting. I am going to describe how to add this functionality in GXT Grid.
Create a new project named GxtFilterGrid and add GXT library in the project. As like my previous blogs about GXT Grid I have used the same Employee model and TestData class for generating data. You will find the code of these classes here. Go to the onModuleLoad method of GxtFilterGrid class and remove all the auto generated code of this method.
First create a list of ColumnConfig and a ColumnModel from this list.
List<ColumnConfig> configs = new ArrayList<ColumnConfig>(); ColumnConfig column = new ColumnConfig(); column.setId("name"); column.setHeader("Employee Name"); column.setWidth(200); configs.add(column); column = new ColumnConfig("department", "Department", 150); column.setAlignment(HorizontalAlignment.LEFT); configs.add(column); column = new ColumnConfig("designation", "Designation", 150); column.setAlignment(HorizontalAlignment.LEFT); configs.add(column); column = new ColumnConfig("salary", "Slary", 100); column.setAlignment(HorizontalAlignment.RIGHT); final NumberFormat number = NumberFormat.getFormat("0.00"); GridCellRenderer<Employee> checkSalary = new GridCellRenderer<Employee>() { @Override public Object render(Employee model, String property, com.extjs.gxt.ui.client.widget.grid.ColumnData config, int rowIndex, int colIndex, ListStore<Employee> store, Grid<Employee> grid) { double val = (Double) model.get(property); String style = val < 70000 ? "red" : "green"; return "" + number.format(val) + ""; } }; column.setRenderer(checkSalary); configs.add(column); column = new ColumnConfig("joiningdate", "Joining Date", 100); column.setAlignment(HorizontalAlignment.RIGHT); column.setDateTimeFormat(DateTimeFormat.getShortDateFormat()); configs.add(column); ColumnModel cm = new ColumnModel(configs);
Now create different types of filters like Numeric, String, Date, etc. Constructor of these filter classes takes the column name to bind the specific filter with a specific column.
NumericFilter numericFilter = new NumericFilter("salary"); StringFilter nameFilter = new StringFilter("name"); StringFilter designationFilter = new StringFilter("designation"); DateFilter dateFilter = new DateFilter("joiningdate");
You can also add a ListStore as a filtering option with the help of ListFilter. For adding a list filter, create a ListStore of ModelData or your own BaseModel class and add this as the source of ListFilter.
ListStore<ModelData> departmentStore = new ListStore<ModelData>(); departmentStore.add(departement("General Administration")); departmentStore.add(departement("Information Technology")); departmentStore.add(departement("Marketing")); departmentStore.add(departement("Accounts")); //department method is stated later ListFilter listFilter = new ListFilter("department", departmentStore); listFilter.setDisplayProperty("departmentname");
Display Property of the ListFilter will be the key name of your model data. Now create a GridFilters instance and add all the filters created above with this instance.
GridFilters filters = new GridFilters(); filters.setLocal(true); filters.addFilter(numericFilter); filters.addFilter(nameFilter); filters.addFilter(designationFilter); filters.addFilter(dateFilter); filters.addFilter(listFilter);
Finally create a ListStore of Employee Model and, a Grid from this ListStore and ColumnModel. Add the GridFilters instance as the Plugin of the Grid.
ListStore<Employee> employeeList = new ListStore<Employee>(); employeeList.add(TestData.getEmployees()); Grid<Employee> grid = new Grid<Employee>(employeeList, cm); grid.setStyleAttribute("borderTop", "none"); grid.setAutoExpandColumn("name"); grid.setBorders(true); grid.setStripeRows(true); grid.getView().setForceFit(true); grid.setColumnLines(true); grid.addPlugin(filters); ContentPanel cp = new ContentPanel(); cp.setBodyBorder(false); cp.setHeading("Employee List With Filtering Option"); cp.setButtonAlign(HorizontalAlignment.CENTER); cp.setLayout(new FitLayout()); cp.setSize(700, 300); cp.add(grid); RootPanel.get().add(cp);Here is the code of department method which is used previously.
private ModelData departement(String departement) { ModelData model = new BaseModelData(); model.set("departmentname", departement); return model; }
That's all. Run the project and the output will be like this
8 comments:
you maybe add "RootPanel.get().add(cp);" a the end of code to display your grid
Thanks, I missed it.
Great example! At my first attempt at displaying a filter grid, I get blank data. The headers display OK. I verified the grid's data model is populated OK (grid.getStore().getModels). Can you help?
After applying filters,data in the grid may be filtered.On remove of filter search,existing data in the grid must be reloaded by clearing filtered data.
For this reload()method should be override.
My filter doesn't reload my grid. How can i override the reload() method? And which reload method should i override? Could you write an example? Thanks
My grid doesn't show up in Chrome.
Any suggestions ?
The information/content is there but I can not see the grid ?
Is this client side filtering only?
Post a Comment