Validate new row in SmartGWT ListGrid - gwt

I use ListGrid without datasource. And I use validator for some fields.
But then I add new record, it is not validated till I change value in new record.
I don't want to use grid.startEditingNew(), because if I don't change them, they do not have Record instance.
ListGrid grid = new ListGrid();
grid.setCanEdit(true);
ListGridField field1 = new ListGridField("attr1", "Name1");
ListGridField field2 = new ListGridField("attr2", "Name2");
CustomValidator validator = new CustomValidator() {
#Override
protected boolean condition(Object value) {
Logger.log("Validate: " + value);
return true;
}
};
field1.setValidators(validator);
field2.setValidators(validator);
grid.setFields(field1, field2);
Label addButton = new Label();
//...
addButton.setTooltip("Add");
addButton.addClickHandler(new ClickHandler() {
public void onClick(final ClickEvent clickEvent) {
ListGridRecord record = new ListGridRecord();
grid.addData(record);
// we can use grid.startEditingNew() instead
}
});
How I can force validation of the new row? Calling grid.validateRow(grid.getRecords().length - 1) do not lead to calling the validatior.

Why not validate values being set to the new Record instance (from FormItems?) instead?
You can reuse validators on ListGridField and FormItem.

Related

How to Restrict deselecting all items in smartgwt SelectItem with multiple selection enabled?

I´m using the SelectItem component with configuration:
SelectItem selectItem = new SelectItem("SelectItem");
selectItem.setShowTitle(false);
selectItem.setMultiple(true);
selectItem.setMultipleValueSeparator(",");
selectItem.setDefaultValue("1");
Now I want to restrict user to deselecting all items,at least one item must be selected.
Can anybody help me how to restrict?
Hy Suresh,
here is the quick fix!
In my example you need to use second SelectItem for saving purpose and FocusHandler.
My example:
LinkedHashMap<String, String> valueMap = new LinkedHashMap<>();
valueMap.put("a", "a");
valueMap.put("b", "b");
valueMap.put("c", "c");
valueMap.put("d", "d");
valueMap.put("e", "e");
valueMap.put("f", "f");
final SelectItem saveSelectedItem = new SelectItem();
saveSelectedItem.setMultiple(true);
saveSelectedItem.setValueMap(valueMap);
final SelectItem selectedItem = new SelectItem();
selectedItem.setDefaultValue("Default");
selectedItem.setMultiple(true);
selectedItem.setTitle("Select: ");
selectedItem.setValueMap(valueMap);
selectedItem.addFocusHandler(new FocusHandler() {
#Override
public void onFocus(FocusEvent event) {
if(selectedItem.getValue() == null){
selectedItem.setValue(saveSelectedItem.getValue());
}else {
saveSelectedItem.setValue(selectedItem.getValue());
}
}
});
So user will be able to un/select all values, but value will be set to last selected value in SelectItem field.
Hope int helps.
Regards Jakov A.

GWT CellTable Custom Selection Model

I need a 'custom selection model' for GWT CellTable. One of the columns in CellTable is a Checkbox column.
Basic rquirements (both work in solution below):
- Row click (not on checkbox), selects that row and un-selects all other rows.
- Checkbox selection should select/un-select that row only.
Following is the code I am using, but its very very slow. Any guidance would be appreciated.
final SelectionModel<T> selectionModel = new MultiSelectionModel<T>();
dataTable.setSelectionModel(selectionModel,
DefaultSelectionEventManager.createCustomManager(
new DefaultSelectionEventManager.CheckboxEventTranslator<T>() {
#Override
public SelectAction translateSelectionEvent(CellPreviewEvent<T> event) {
SelectAction action = super.translateSelectionEvent(event);
if (action.equals(SelectAction.IGNORE)) {
selectionModel.clear();
return SelectAction.TOGGLE;
}
return action;
}
}
)
);
Following is the code snipped for CheckColumn callback.
Column<T, Boolean> checkColumn = new Column<T, Boolean>(
new CheckboxCell(true, false))
{
#Override
public Boolean getValue(T t)
{
// Get the value from the selection model.
return selectionModel.isSelected(t);
}
};
I have put in a KeyProvider for the CellTable and its not slow anymore. :)
ProvidesKey<T> keyProvider = new ProvidesKey<T>() {
public Object getKey(T t) {
return tip == null? null : tip.getId();
}
};
dataTable = new CellTable<T>(PAGE_SIZE, keyProvider);
You could just whitelist your checkbox
int checkboxColumn = 0;
DefaultSelectionEventManager.createCustomManager(new DefaultSelectionEventManager
.WhitelistEventTranslator(checkboxColumn));

Setting ListGrid selection in SmartGWT with method "selectRecords(Record record)"

I'm trying to set the selected records of a ListGrid table object in SmartGWT using records, but I can't find any way of doing it. I want to select with record, not index. I want to use selectRecord(Record record) method.
As an example;
public void onModuleLoad()
{
VLayout main = new VLayout();
final ListGrid grid = new ListGrid();
grid.setHeight(500);
grid.setWidth(400);
grid.setFields(new ListGridField("name", "Name"));
grid.setData(createRecords());
final IButton button = new IButton("Select some");
button.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event)
{
grid.selectRecord(createRecord("orange"));
}
});
main.addMember(grid);
main.addMember(button);
RootPanel.get().add(main);
}
private ListGridRecord[] createRecords()
{
return new ListGridRecord[]{
createRecord("monkey"),
createRecord("banana"),
createRecord("orange"),
createRecord("sun")
};
}
private ListGridRecord createRecord(String name)
{
ListGridRecord record = new ListGridRecord();
record.setAttribute("name", name);
return record;
}
In this case I want to select orange, But this code select anything.
Is it posible? If possible how?
Thanks in advance.
Found this solution;
selectRecord(grid.getRecordList().find("name", "orange"));
There's a problem with your code:
When you write
grid.selectRecord(record);
it goes to search the same record instance that the grid has. If both instances of record are equal, only then & then it selects the record. Otherwise nothing happens as you're facing right now. Here what you need to do is:
ListGridRecord[] records = countryGrid.getRecords();
int i;
for (i = 0; i < records.length; i++)
{
if (records[i].getAttribute("name").equalsIgnoreCase("orange"))
{
break;
}
}
countryGrid.selectRecord(i);

Setting ListGrid selection in SmartGWT

I'm trying to set the selected records of a ListGrid table object in SmartGWT, but I can't find any way of doing it. I know there's a getSelectedRecords() function, but no matching setSelectedRecords(). I tried to see if set/getSelectedState() would work, but GWT complains about needing a primary key and a DataSource object. Is there any way to set the selection of a ListGrid?
For this you can use one of the selectRecords() methods, like so:
public void onModuleLoad()
{
VLayout main = new VLayout();
final ListGrid grid = new ListGrid();
grid.setHeight(500);
grid.setWidth(400);
grid.setFields(new ListGridField("name", "Name"));
grid.setData(createRecords());
final IButton button = new IButton("Select some");
button.addClickHandler(new ClickHandler() {
public void onClick(ClickEvent event)
{
grid.selectRecords(new int[]{2, 3}); //This will select index 2 and 3
}
});
main.addMember(grid);
main.addMember(button);
RootPanel.get().add(main);
}
private ListGridRecord[] createRecords()
{
return new ListGridRecord[]{
createRecord("monkey"),
createRecord("banana"),
createRecord("orange"),
createRecord("sun")
};
}
private ListGridRecord createRecord(String name)
{
ListGridRecord record = new ListGridRecord();
record.setAttribute("name", name);
return record;
}

Display Field for select item in the list grid

Hello all
I am using smart gwt 2.2 on windows with mozilla browser.
I am using a list grid with two fields.
I set the editor type of second field to SelectItem.
In that select item I am rendering a grid.
For select item I set the value field and the display field.
But after the select any item from select item it is display value field.
I am also attaching the code for it.
code for grid
public void initializeGrid() {
ListGrid grid = new ListGrid();
setGridProperty(grid);
grid.setFields(getGridFields());
grid.setData(getGridData());
getSmartContainer().addChild(grid);
}
private static ListGridRecord[] getGridData() {
ListGridRecord record = new ListGridRecord();
record.setAttribute("id", "");
record.setAttribute("name", "");
ListGridRecord record1 = new ListGridRecord();
record1.setAttribute("id", "");
record1.setAttribute("name", "");
return new ListGridRecord[] { record, record1 };
}
private static void setGridProperty(ListGrid grid) {
grid.setWidth("90%");
grid.setHeight(125);
grid.setCanEdit(true);
grid.setEditEvent(ListGridEditEvent.CLICK);
grid.setEditByCell(true);
grid.setAlternateRecordStyles(true);
grid.setShowAllRecords(true);
}
private static ListGridField[] getGridFields() {
ListGridField field = new ListGridField("id");
FormItem item = new TextItem();
field.setEditorType(item);
ListGridField field1 = new ListGridField("name");
SelectItem item1 = new SelectItem("name");
setPropertyForSelectitem(item1);
DataSource dataSource = new DataSource();
dataSource.setClientOnly(true);
item1.setOptionDataSource(dataSource);
setDataForSelectItem(dataSource);
field1.setEditorType(item1);
return new ListGridField[] { field, field1 };
}
Code for select item
public static void setDataForSelectItem(DataSource dataSource) {
for (int i = 0; i < 2; i++) {
ListGridRecord record = new ListGridRecord();
record.setAttribute("id", "1");
record.setAttribute("name", "name" + i);
record.setAttribute("address", "address" + i);
dataSource.addData(record);
}
}
private static void setPropertyForSelectitem(SelectItem item) {
item.setPickListFields(getFieldsForSelectItem());
item.setWidth(150);
item.setValueField("id");
item.setDisplayField("name");
item.setPickListWidth(250);
}
private static ListGridField[] getFieldsForSelectItem() {
ListGridField idField = new ListGridField("id");
ListGridField nameField = new ListGridField("name");
ListGridField addField = new ListGridField("address");
return new ListGridField[] {idField,nameField,addField };
}
[/CODE]
After drawing this grid it is rendering value field for the select item, but i want to render the name (as it is the display field for the select item).
Same select item I used in the dynamic form but it is working well at that place, but for the grid it is not working well.
Please Help.
Thanks