Originally posted by mnenchev
Announcement
Collapse
No announcement yet.
X
-
Code:// news days data source public class NewsDaysDataSource extends GenericGwtRpcDataSource<NewsDayDTO> { private static NewsDaysDataSource instance = null; private static Object sync = new Object(); public static NewsDaysDataSource getInstance() { if (instance == null) { synchronized (sync) { if (instance == null) { instance = new NewsDaysDataSource(); } } } return instance; } private DataSourceIntegerField pk; private DataSourceField assetField; private DataSourceDateField dateField; private DataSourceField intervalField; public NewsDaysDataSource() { setClientOnly(true); pk = new DataSourceIntegerField("id", "News Day Id"); pk.setPrimaryKey(true); pk.setHidden(true); addField(pk); assetField = new DataSourceIntegerField("assetId"); assetField.setCanEdit(true); assetField.setEditorType(new WebSelectItem(AssetJsonDataSource.getInstance())); assetField.setForeignKey("assetsDS.key"); assetField.setRequired(true); addField(assetField); dateField = new DataSourceDateField("date", "Date"); final DateRangeValidator validator = new DateRangeValidator(); validator.setMin(new Date()); dateField.setRequired(true); dateField.setValidators(validator); addField(dateField); intervalField = new DataSourceIntegerField("interval", "Interval"); final IntegerRangeValidator integerValidator = new IntegerRangeValidator(); integerValidator.setMin(0); intervalField.setValidators(integerValidator); intervalField.setRequired(true); addField(intervalField); } @Override protected void executeAdd(final String requestId, final DSRequest request, final DSResponse response) { final JavaScriptObject data = request.getData(); final ListGridRecord rec = new ListGridRecord(data); final NewsDayDTO dto = new NewsDayDTO(); dto.setDate(rec.getAttributeAsDate("date")); dto.setAssetId(rec.getAttributeAsInt("assetId")); dto.setInterval(rec.getAttributeAsInt("interval")); final NewsDayServiceAsync service = ServiceUtils.getNewsDayServiceAsync(); service.addNewsDay(dto, new AsyncCallback<Integer>() { @Override public void onSuccess(Integer id) { rec.setAttribute("id",id); request.setData(rec.getJsObj()); processResponse(requestId, response); } @Override public void onFailure(Throwable e) { response.setStatus(RPCResponse.STATUS_FAILURE); processResponse(requestId, response); SC.warn("Error adding News Day : " + e.getMessage(), null); } }); } @Override protected void executeFetch(final String requestId, DSRequest request, final DSResponse response) { final Integer assetId = request.getAttributeAsInt("assetId"); if (assetId == null) { return; } final NewsDayServiceAsync service = ServiceUtils.getNewsDayServiceAsync(); service.getNewsDaysByAssetId(assetId, new AsyncCallback<List<NewsDayDTO>>() { @Override public void onSuccess(List<NewsDayDTO> data) { final ListGridRecord[] records = new ListGridRecord[data.size()]; for (int i = 0; i < data.size(); i++) { final ListGridRecord r = new ListGridRecord(); copyValues(data.get(i), r); records[i] = r; } response.setData(records); processResponse(requestId, response); } @Override public void onFailure(Throwable e) { response.setStatus(RPCResponse.STATUS_FAILURE); processResponse(requestId, response); } }); } @Override protected void executeRemove(final String requestId, DSRequest request, final DSResponse response) { final JavaScriptObject data = request.getData(); final ListGridRecord rec = new ListGridRecord(data); final int id = rec.getAttributeAsInt("id"); final NewsDayServiceAsync service = ServiceUtils.getNewsDayServiceAsync(); service.deleteNewsDay(id, new AsyncCallback<Void>() { @Override public void onSuccess(Void data) { final ListGridRecord[] list = new ListGridRecord[1]; list[0] = rec; response.setData(list); processResponse(requestId, response); } @Override public void onFailure(Throwable e) { response.setStatus(RPCResponse.STATUS_FAILURE); processResponse(requestId, response); SC.warn("Error deleting News Day: " + e.getMessage(), null); } }); } @Override protected void executeUpdate(String requestId, DSRequest request, DSResponse response) { } @Override protected Object getValueOf(NewsDayDTO from, String fieldName) { if (pk.getName().equals(fieldName)) { return from.getId(); } else if (dateField.getName().equals(fieldName)) { return from.getDate(); } else if (intervalField.getName().equals(fieldName)) { return from.getInterval(); } else if (assetField.getName().equals(fieldName)) { return from.getAssetId(); } return null; } }
The addeditDialog is just a window that displays the form.
Do you need the RPC implementations?
Regards.
Leave a comment:
-
Code:// view code: one SelectItems filled with assets and one grid, that shows all // news days for the selected asset public class NewsDayPanel extends VLayout { private static final String DESCRIPTION = "News Days"; public static class Factory implements PanelFactory { private String id; public Canvas create() { final NewsDayPanel panel = new NewsDayPanel(); id = panel.getID(); return panel; } public String getID() { return id; } public String getDescription() { return DESCRIPTION; } } private ListGrid grid; private SelectItem assets; private AddEditDialog addEditDialog; public NewsDayPanel() { this.setWidth100(); this.setHeight100(); this.setMembersMargin(10); // init grid grid = new ListGrid(); grid.setAlternateRecordStyles(true); grid.setWidth(600); grid.setHeight(400); grid.setAutoFitData(Autofit.VERTICAL); grid.setAutoFitMaxRecords(15); grid.setShowAllRecords(true); grid.setEditEvent(ListGridEditEvent.CLICK); grid.setDataSource(NewsDaysDataSource.getInstance()); grid.setAlign(Alignment.CENTER); grid.setSelectionType(SelectionStyle.SINGLE); final ListGridField id = new ListGridField("id", "NewsDay Id"); final ListGridField date = new ListGridField("date", "Date"); grid.setDateFormatter(DateDisplayFormat.TOEUROPEANSHORTDATE); final ListGridField interlval = new ListGridField("interval", "Interval"); final DynamicForm form = new DynamicForm(); grid.setFields(id, date, interlval); form.setWidth(500); form.setNumCols(2); // init assets assets = new SelectItem("Assets"); assets.setDefaultToFirstOption(false); assets.setDisplayField("value"); assets.setValueField("key"); assets.setOptionDataSource(AssetJsonDataSource.getInstance()); assets.addChangedHandler(new ChangedHandler() { @Override public void onChanged(ChangedEvent event) { loadUserData(); } }); form.setFields(assets); this.addMember(form); this.addMember(grid); // add edit form final DynamicForm newsDayForm = new DynamicForm(); newsDayForm.setDataSource(NewsDaysDataSource.getInstance()); // init buttons final IButton newButton = new IButton("New"); newButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { if (addEditDialog == null) { addEditDialog = new AddEditDialog(newsDayForm, new BooleanCallback() { @Override public void execute(Boolean value) { if (value) { if (newsDayForm.validate()) { newsDayForm.saveData(new DSCallback() { @Override public void execute(DSResponse response, Object rawData, DSRequest request) { final Record rec = new Record(request.getData()); if (rec.getAttributeAsInt("assetId") != (Integer) assets.getValue()) { loadUserData(); } } }); addEditDialog.hide(); } } else { addEditDialog.hide(); } } }); addEditDialog.setHeight(150); addEditDialog.setWidth(500); } addEditDialog.showForAdd(); } }); final IButton deleteButton = new IButton("Delete"); deleteButton.setLeft(110); deleteButton.addClickHandler(new ClickHandler() { @Override public void onClick(ClickEvent event) { final ListGridRecord selectedRecord = grid.getSelectedRecord(); if (selectedRecord != null) { grid.removeData(selectedRecord); } else { SC.warn("Select a News Day first!", null); } } }); // final IButton cancelButton = new IButton("Cancel"); // cancelButton.setLeft(220); // cancelButton.addClickHandler(new ClickHandler() { // @Override // public void onClick(ClickEvent event) { // grid.discardAllEdits(); // } // }); final HLayout buttons = new HLayout(); buttons.setMembersMargin(210); buttons.addChild(newButton); buttons.addChild(deleteButton); this.addMember(buttons); } private void loadUserData() { grid.invalidateCache(); final Integer assetId = (Integer) assets.getValue(); if (assetId == null) { return; } final DSRequest request = new DSRequest(); request.setAttribute("assetId", assetId); grid.fetchData(null, null, request); } } // assets data source public class AssetJsonDataSource extends BaseKeyValueDataSource { private static AssetJsonDataSource instance = null; private static Object sync = new Object(); public static AssetJsonDataSource getInstance() { if (instance == null) { synchronized (sync) { if (instance == null) { instance = new AssetJsonDataSource(); } } } return instance; } public AssetJsonDataSource() { super(); this.setID("assetsDS"); } @Override protected void executeAdd(String requestId, DSRequest request, DSResponse response) { } @Override protected void executeFetch(final String requestId, DSRequest request, final DSResponse response) { final AssetServiceAsync service = ServiceUtils.getAssetServiceAsync(); service.getAssetsMap(new KeyValueJsonAsyncCallback() { @Override public void responseFailure(Throwable e) { SC.warn("ERROR : " + e.getMessage(), null); response.setStatus(RPCResponse.STATUS_FAILURE); processResponse(requestId, response); } @Override public void responseSuccess(Record[] records) { response.setData(records); processResponse(requestId, response); } }); } @Override protected void executeRemove(String requestId, DSRequest request, DSResponse response) { // TODO Auto-generated method stub } @Override protected void executeUpdate(String requestId, DSRequest request, DSResponse response) { // TODO Auto-generated method stub } @Override protected Object getValueOf(String from, String fieldName) { return null; } } // key-value data source public abstract class BaseKeyValueDataSource extends GenericGwtRpcDataSource<String> { protected DataSourceIntegerField key; protected DataSourceField value; public BaseKeyValueDataSource() { key = new DataSourceIntegerField("key"); key.setHidden(true); key.setPrimaryKey(true); addField(key); value = new DataSourceTextField("value"); addField(value); setClientOnly(true); } } // key - value callback public abstract class KeyValueJsonAsyncCallback implements AsyncCallback<List<String>> { @Override public void onSuccess(List<String> data) { final Record[] records = new Record[data.size()]; int i = 0; for(final String json : data) { final JSONObject obj = (JSONObject) JSONParser.parse(json); final Record r = new Record(obj.getJavaScriptObject()); records[i++] = r; } responseSuccess(records); } @Override public void onFailure(Throwable e) { responseFailure(e); } public abstract void responseSuccess(Record[] records); public abstract void responseFailure(Throwable e); }
Leave a comment:
-
Originally posted by mnenchevI do not have deployable sample at the moment but here is the code connected with the problem:
I have asset:newsDays one to many relationship
Code://view final DynamicForm newsDayForm = new DynamicForm(); newsDayForm.setDataSource(NewsDaysDataSource.getInstance()); // newsDaysDS public NewsDaysDataSource() { setClientOnly(true); pk = new DataSourceIntegerField("id", "News Day Id"); pk.setPrimaryKey(true); pk.setHidden(true); addField(pk); assetField = new DataSourceIntegerField("assetId"); assetField.setCanEdit(true); assetField.setEditorType(new WebSelectItem(AssetJsonDataSource.getInstance())); assetField.setForeignKey("assetsDS.key"); assetField.setRequired(true); addField(assetField); dateField = new DataSourceDateField("date", "Date"); final DateRangeValidator validator = new DateRangeValidator(); validator.setMin(new Date()); dateField.setRequired(true); dateField.setValidators(validator); addField(dateField); intervalField = new DataSourceIntegerField("interval", "Interval"); final IntegerRangeValidator integerValidator = new IntegerRangeValidator(); integerValidator.setMin(0); intervalField.setValidators(integerValidator); intervalField.setRequired(true); addField(intervalField); } // AssetDS protected DataSourceIntegerField key; protected DataSourceField value; public AssetJsonDataSource() { key = new DataSourceIntegerField("key"); key.setHidden(true); key.setPrimaryKey(true); addField(key); value = new DataSourceTextField("value"); addField(value); setClientOnly(true); this.setID("assetsDS"); } @Override protected void executeAdd(String requestId, DSRequest request, DSResponse response) { } @Override protected void executeFetch(final String requestId, DSRequest request, final DSResponse response) { final AssetServiceAsync service = ServiceUtils.getAssetServiceAsync(); service.getAssetsMap(new KeyValueJsonAsyncCallback() { @Override public void responseFailure(Throwable e) { SC.warn("ERROR : " + e.getMessage(), null); response.setStatus(RPCResponse.STATUS_FAILURE); processResponse(requestId, response); } @Override public void responseSuccess(Record[] records) { response.setData(records); processResponse(requestId, response); } }); } @Override protected void executeRemove(String requestId, DSRequest request, DSResponse response) { // TODO Auto-generated method stub } @Override protected void executeUpdate(String requestId, DSRequest request, DSResponse response) { // TODO Auto-generated method stub } @Override protected Object getValueOf(String from, String fieldName) { return null; }
My AssetJsonDataSource is tested and working with SelectItems.
I would need to see all your code to understand what you're doing...
It looks like you're using JSON and client side only I'm using RPC and Objects (server side only).
Your declarations are a lot different from what I have so I would have to see it all.
Leave a comment:
-
Reparenting a node in a tree grid using GWT-RPC datasource doesn't work
Hello everyone,
I am using a GWT-RPC datasource with a tree grid. The problem I have is that reparenting a node doesn't actually move the node to its new location in the tree. It does work when the node is dragged and dropped, though.
Here are the details.
To reparent the node, I assign the primary key field (ID) of the new parent to the node being moved's foreign key field (PARENT_ID), which, in a tree, points to the parent:
[CODE]
// New parent
ListGridRecord newParent = treeGrid.getSelectedRecord();
// Set the record's PARENT_ID attribute equal to the parent ID
record.setAttribute(PARENT_ID, newParent.getAttribute(ID));
// Update the record
treeGrid.updateData(record);
[\CODE]
This results in a call to my datasource's executeUpdate method, where I call my server-side service and call response.setData, and processResponse with the response:
Code:protected void executeUpdate(final String requestId, final DSRequest request, final DSResponse response) { // Retrieve record to be updated. final ListGridRecord record = new ListGridRecord(request.getData()); final GroupDto group = new GroupDto(); copyValues(record, group); // Ask the server to update the group's properties corresponding to the specified module record. adminService.updateGroupProperties(group, new AsyncCallback<GroupDto>() { public void onFailure(Throwable caught) { // The server returned an error status; inform the module. response.setStatus(RPCResponse.STATUS_FAILURE); processResponse(requestId, response); } public void onSuccess(GroupDto updatedNode) { // The group's properties were successfully updated on the server so finish updating the record. copyValues(updatedNode, record); ListGridRecord[] responseData = new ListGridRecord[1]; responseData[0] = record; response.setData(responseData); processResponse(requestId, response); } }); }
I verified that executeUpdate(...) is called with the same parameters (i.e., operationType = UPDATE and updated record) when the user drags and drops the node, but, in that case, the node *does* move to its new location under the new parent.
Using the Developer Console I found that dragging and dropping passes two extra request parameters to the update operation versus invoking updateData explicitly, namely '_parent_isc_ResultTree_4: Obj{ID:305746317786}' and '_selection_2: false':
Code:10:19:37.232:INFO:ResultTree:isc_ResultTree_4 (created by: isc_OID_1):Updating cache: operationType 'update', 1 rows update data: [ {__ref: com.smartgwt.client.widgets.tree.TreeNode@10a250a, id: "305829641916", title: "Brasing Meats", parentId: "305833462635", _parent_isc_ResultTree_4: Obj{ID:305746317786}, isFolder: undef, _selection_2: false} ]
Thanks so much for your insights.
Luis
Leave a comment:
-
Originally posted by gcstangPlease post your sample application.
I have asset:newsDays one to many relationship
Code://view final DynamicForm newsDayForm = new DynamicForm(); newsDayForm.setDataSource(NewsDaysDataSource.getInstance()); // newsDaysDS public NewsDaysDataSource() { setClientOnly(true); pk = new DataSourceIntegerField("id", "News Day Id"); pk.setPrimaryKey(true); pk.setHidden(true); addField(pk); assetField = new DataSourceIntegerField("assetId"); assetField.setCanEdit(true); assetField.setEditorType(new WebSelectItem(AssetJsonDataSource.getInstance())); assetField.setForeignKey("assetsDS.key"); assetField.setRequired(true); addField(assetField); dateField = new DataSourceDateField("date", "Date"); final DateRangeValidator validator = new DateRangeValidator(); validator.setMin(new Date()); dateField.setRequired(true); dateField.setValidators(validator); addField(dateField); intervalField = new DataSourceIntegerField("interval", "Interval"); final IntegerRangeValidator integerValidator = new IntegerRangeValidator(); integerValidator.setMin(0); intervalField.setValidators(integerValidator); intervalField.setRequired(true); addField(intervalField); } // AssetDS protected DataSourceIntegerField key; protected DataSourceField value; public AssetJsonDataSource() { key = new DataSourceIntegerField("key"); key.setHidden(true); key.setPrimaryKey(true); addField(key); value = new DataSourceTextField("value"); addField(value); setClientOnly(true); this.setID("assetsDS"); } @Override protected void executeAdd(String requestId, DSRequest request, DSResponse response) { } @Override protected void executeFetch(final String requestId, DSRequest request, final DSResponse response) { final AssetServiceAsync service = ServiceUtils.getAssetServiceAsync(); service.getAssetsMap(new KeyValueJsonAsyncCallback() { @Override public void responseFailure(Throwable e) { SC.warn("ERROR : " + e.getMessage(), null); response.setStatus(RPCResponse.STATUS_FAILURE); processResponse(requestId, response); } @Override public void responseSuccess(Record[] records) { response.setData(records); processResponse(requestId, response); } }); } @Override protected void executeRemove(String requestId, DSRequest request, DSResponse response) { // TODO Auto-generated method stub } @Override protected void executeUpdate(String requestId, DSRequest request, DSResponse response) { // TODO Auto-generated method stub } @Override protected Object getValueOf(String from, String fieldName) { return null; }
My AssetJsonDataSource is tested and working with SelectItems.
Leave a comment:
-
Post a sample application ...
Originally posted by mnenchevHi, I updated my smartgwt jar to version 1.2-SNAPSHOT and my gwt to 1.7.0, but the problem remains.
Leave a comment:
-
Originally posted by gcstangWhat SmartGWT version and GWT version are you using...this only started working with 1.2 SmartGWT it was a bug before that.Last edited by mnenchev; 10 Sep 2009, 02:10.
Leave a comment:
-
SmartGWT Version
Originally posted by mnenchevHi, thanks for the help, it is working with one exception. If i set foreign key intField.setForeignKey("weblgds.websid"); the id is shown, but i want to show the displayValue and map it to the id.
Leave a comment:
-
Originally posted by gcstangIn this example the Datasource is used in a ListGrid.
Primary Datasource Code:
Code:public class MemberListGridDS extends GWTRPCDataSource<MemberRecord> { public MemberListGridDS() { //Replace with actual RPC Service super(SGWTMemberService.Impl.getInstance()); DataSourceIntegerField intField = new DataSourceIntegerField("mbrid"); intField.setPrimaryKey(true); intField.setCanEdit(false); addField(intField); intField = new DataSourceIntegerField("websid"); intField.setCanEdit(true); intField.setEditorType(new WebSelectItem()); intField.setForeignKey("weblgds.websid"); addField(intField);
Code:public class WebSelectItem extends SelectItem { public WebSelectItem() { WebListGridDS ds = new WebListGridDS(); ds.setID("weblgds"); setValueField("websid"); setDisplayField("dsc"); setEmptyPickListMessage("No data in table"); setPickListWidth(450); ListGridField websidField = new ListGridField("websid"); ListGridField dscField = new ListGridField("dsc"); setPickListFields(websidField, dscField); setOptionDataSource(ds); setAutoFetchData(true); } }
Leave a comment:
-
FK Example
Originally posted by mnenchevPost a snippet of code pls.
Primary Datasource Code:
Code:public class MemberListGridDS extends GWTRPCDataSource<MemberRecord> { public MemberListGridDS() { //Replace with actual RPC Service super(SGWTMemberService.Impl.getInstance()); DataSourceIntegerField intField = new DataSourceIntegerField("mbrid"); intField.setPrimaryKey(true); intField.setCanEdit(false); addField(intField); intField = new DataSourceIntegerField("websid"); intField.setCanEdit(true); intField.setEditorType(new WebSelectItem()); intField.setForeignKey("weblgds.websid"); addField(intField);
Code:public class WebSelectItem extends SelectItem { public WebSelectItem() { WebListGridDS ds = new WebListGridDS(); ds.setID("weblgds"); setValueField("websid"); setDisplayField("dsc"); setEmptyPickListMessage("No data in table"); setPickListWidth(450); ListGridField websidField = new ListGridField("websid"); ListGridField dscField = new ListGridField("dsc"); setPickListFields(websidField, dscField); setOptionDataSource(ds); setAutoFetchData(true); } }
Leave a comment:
-
Originally posted by gcstangI've done this using a ListGrid and a SelectItem, it works quite well.
The visual supplies the ListGrid and a drop down table with the FK's available for selection.
Leave a comment:
-
SmartGWT 2.0 updates?
Originally posted by justincHi all,
I see Sanjiv tagged netname's 303 issue for v2.0, excellent (Thanks for raising this netname, btw).
Which brings the question, when is 2.0 expected ;)
Thanks if you know the answer,
Justin
Thank you,
Leave a comment:
-
Hi all,
I see Sanjiv tagged netname's 303 issue for v2.0, excellent (Thanks for raising this netname, btw).
Which brings the question, when is 2.0 expected ;)
Thanks if you know the answer,
Justin
Leave a comment:
-
I've mapped FK's through the datasource....
Originally posted by mnenchevDid someone use smart gwt + gwt rpc to manage related data with foreign keys?
The visual supplies the ListGrid and a drop down table with the FK's available for selection.
Leave a comment:
Leave a comment: