Hello!
I'm facing the following problem: I've created a widget to add graphical layers and buffers to the main map. After the user marks the point on the map, I run a query that returns the results of that query and throws its contents into a new tab of the AttributeTable widget. The first time, a new tab is created at the beginning of the widget, and the other tabs, which have layers enabled by default, are in sequence.
The problem is that if the user performs a new query, the attributetable widget is not updated. To update it, the user needs to open the layerlist widget, and click on the option to view in the attribute table of the new layer. I do not understand why it does not work with a "publishData" command. Is there any way to run the Send function from the layer to the attribute table, which is inside the layerlist widget?
Note: I am Brazilian, and my English is not very good. I hope I have managed to express myself well.
Thank you!
Gilberto.
Solved! Go to Solution.
Gilberto,
Yes you can use the publishData from your code. Normally you can look at other widgets that do what you are wanting to do and use the code from them. My eSearch widget does this and as you mention the LayerList does as well.
Here is some code for that:
define([
...
'dojo/_base/array',
'dojo/_base/html',
'jimu/WidgetManager',
'jimu/LayerInfos/LayerInfos'
],
function(...
array,
html,
WidgetManager,
LayerInfos) {
...
wManager: null,
...
this.wManager = WidgetManager.getInstance();
...
//Code to add to your function
//currentLayer is the layer object that you want to open in the AT widget
if (this.wManager) {
var widgetCfg = this._getWidgetConfig('AttributeTable');
if(widgetCfg){
var attWidget = this.wManager.getWidgetByLabel(widgetCfg.label);
if(attWidget){
this.wManager.openWidget(attWidget);
attWidget._openTable().then(lang.hitch(this, this._openResultInAttributeTable, currentLayer));
}else{
/*Attribute Table Widget is not loaded*/
this.wManager.loadWidget(widgetCfg).then(lang.hitch(this, function(widget){
if(widget){
widget.setPosition(this.getOffPanelWidgetPosition(widget));
this.wManager.openWidget(widget);
widget._openTable().then(lang.hitch(this, this._openResultInAttributeTable, currentLayer));
}
}));
}
}else{
console.warn('The Attribute Table Widget is not configured in this app.');
}
}
//end code to add to your function
//Support functions
_openResultInAttributeTable: function (currentLayer) {
var layerInfosObj = LayerInfos.getInstanceSync();
var layerInfo = layerInfosObj.getLayerInfoById(currentLayer.id);
this.publishData({
'target': 'AttributeTable',
'layer': layerInfo
});
},
getOffPanelWidgetPosition: function(widget){
var position = {
relativeTo: widget.position.relativeTo
};
var pbox = html.getMarginBox(this.domNode);
var sbox = this.widgetManager.getWidgetMarginBox(widget);
var containerBox = html.getMarginBox(position.relativeTo === 'map'?
this.map.id: jimuConfig.layoutId);
var top = pbox.t + pbox.h + 1;//put under icon by default
if(top + sbox.h > containerBox.h){
position.bottom = containerBox.h - pbox.t + 1;
}else{
position.top = top;
}
if (window.isRTL) {
if(pbox.l + pbox.w - sbox.w < 0){
position.right = 0;
}else{
position.right = pbox.l + pbox.w - sbox.w;
}
} else {
if(pbox.l + sbox.w > containerBox.w){
position.right = 0;
}else{
position.left = pbox.l;
}
}
return position;
},
_getWidgetConfig: function(widgetName){
var widgetCnfg = null;
array.some(this.wManager.appConfig.widgetPool.widgets, function(aWidget) {
if(aWidget.name == widgetName) {
widgetCnfg = aWidget;
return true;
}
return false;
});
if(!widgetCnfg){
/*Check OnScreen widgets if not found in widgetPool*/
array.some(this.wManager.appConfig.widgetOnScreen.widgets, function(aWidget) {
if(aWidget.name == widgetName) {
widgetCnfg = aWidget;
return true;
}
return false;
});
}
return widgetCnfg;
},
Gilberto,
Yes you can use the publishData from your code. Normally you can look at other widgets that do what you are wanting to do and use the code from them. My eSearch widget does this and as you mention the LayerList does as well.
Here is some code for that:
define([
...
'dojo/_base/array',
'dojo/_base/html',
'jimu/WidgetManager',
'jimu/LayerInfos/LayerInfos'
],
function(...
array,
html,
WidgetManager,
LayerInfos) {
...
wManager: null,
...
this.wManager = WidgetManager.getInstance();
...
//Code to add to your function
//currentLayer is the layer object that you want to open in the AT widget
if (this.wManager) {
var widgetCfg = this._getWidgetConfig('AttributeTable');
if(widgetCfg){
var attWidget = this.wManager.getWidgetByLabel(widgetCfg.label);
if(attWidget){
this.wManager.openWidget(attWidget);
attWidget._openTable().then(lang.hitch(this, this._openResultInAttributeTable, currentLayer));
}else{
/*Attribute Table Widget is not loaded*/
this.wManager.loadWidget(widgetCfg).then(lang.hitch(this, function(widget){
if(widget){
widget.setPosition(this.getOffPanelWidgetPosition(widget));
this.wManager.openWidget(widget);
widget._openTable().then(lang.hitch(this, this._openResultInAttributeTable, currentLayer));
}
}));
}
}else{
console.warn('The Attribute Table Widget is not configured in this app.');
}
}
//end code to add to your function
//Support functions
_openResultInAttributeTable: function (currentLayer) {
var layerInfosObj = LayerInfos.getInstanceSync();
var layerInfo = layerInfosObj.getLayerInfoById(currentLayer.id);
this.publishData({
'target': 'AttributeTable',
'layer': layerInfo
});
},
getOffPanelWidgetPosition: function(widget){
var position = {
relativeTo: widget.position.relativeTo
};
var pbox = html.getMarginBox(this.domNode);
var sbox = this.widgetManager.getWidgetMarginBox(widget);
var containerBox = html.getMarginBox(position.relativeTo === 'map'?
this.map.id: jimuConfig.layoutId);
var top = pbox.t + pbox.h + 1;//put under icon by default
if(top + sbox.h > containerBox.h){
position.bottom = containerBox.h - pbox.t + 1;
}else{
position.top = top;
}
if (window.isRTL) {
if(pbox.l + pbox.w - sbox.w < 0){
position.right = 0;
}else{
position.right = pbox.l + pbox.w - sbox.w;
}
} else {
if(pbox.l + sbox.w > containerBox.w){
position.right = 0;
}else{
position.left = pbox.l;
}
}
return position;
},
_getWidgetConfig: function(widgetName){
var widgetCnfg = null;
array.some(this.wManager.appConfig.widgetPool.widgets, function(aWidget) {
if(aWidget.name == widgetName) {
widgetCnfg = aWidget;
return true;
}
return false;
});
if(!widgetCnfg){
/*Check OnScreen widgets if not found in widgetPool*/
array.some(this.wManager.appConfig.widgetOnScreen.widgets, function(aWidget) {
if(aWidget.name == widgetName) {
widgetCnfg = aWidget;
return true;
}
return false;
});
}
return widgetCnfg;
},
Robert, worked perfectly. Thanks again for your help.
Hug,
Gilberto.
Gilberto,
Don't forget to mark this question as answered by clicking on the "Correct Answer" link on the reply that answered your question. If you do not see the Mark Correct button then you need to open the thread (not just look at the thread in your inbox).
Robert,
Answer marked as correct. Thank you!
Gilberto