This sample is similar to the Feature widget sample with the exception that this sample demonstrates docking the widget into a side panel. This is useful in circumstances where you may not necessarily want or need the associated feature's information to display directly within the map. It displays information based on the PopupTemplate using the Feature widget. The content of the PopupTemplate is saved within the referenced layer and makes use of custom text elements with chart media.
// Provide graphic to a new instance of a Feature widget
const feature = new Feature({
container: "feature-node",
graphic: graphic,
map: view.map,
spatialReference: view.spatialReference
});
view.whenLayerView(fLayer).then((layerView) => {
let highlight;
let objectId;
const debouncedUpdate = promiseUtils.debounce(async (event) => {
// Perform a hitTest on the View
const hitTest = await view.hitTest(event, { include: fLayer });
// Make sure graphic has a popupTemplate
const results = hitTest.results.filter((result) => {
return result.graphic.layer.popupTemplate;
});
const result = results[0];
const newObjectId = result && result.graphic.attributes[fLayer.objectIdField];
if (!newObjectId) {
highlight?.remove();
objectId = feature.graphic = null;
} else if (objectId !== newObjectId) {
highlight?.remove();
objectId = newObjectId;
feature.graphic = result.graphic;
highlight = layerView.highlight(result.graphic);
}
});
// Listen for the pointer-move event on the View
view.on("pointer-move", (event) => {
debouncedUpdate(event).catch((err) => {
if (!promiseUtils.isAbortError(err)) {
throw err;
}
});
});