/* eslint-disable @typescript-eslint/quotes */
/* eslint-disable @typescript-eslint/consistent-type-imports */
/* eslint-disable @typescript-eslint/no-unused-vars */
import { React, type AllWidgetProps } from 'jimu-core';
import { type IMConfig } from '../config';
import DashboardTiles, { TileConfig } from '../components/DashboardCard';
import Query from '@arcgis/core/rest/support/Query';
import * as query from '@arcgis/core/rest/query';
import { useState, useEffect } from 'react';
// import { JimuMapView, JimuMapViewComponent } from 'jimu-arcgis';
import { JimuMapViewComponent, type JimuMapView } from 'jimu-arcgis';
const Widget = (props: AllWidgetProps<IMConfig>) => {
const [tilesCountData, setTilesCountData] = useState<TileConfig[]>([]);
const [jimuMapView, setJimuMapView] = useState<JimuMapView | null>(null);
// Debug: Log useMapWidgetIds
useEffect(() => {
console.log('Map widget IDs:', props.useMapWidgetIds);
}, [props.useMapWidgetIds]);
// Debug: Log jimuMapView changes
useEffect(() => {
console.log('Jimu Map:', jimuMapView);
}, [jimuMapView]);
const onActiveMapViewChange = (jimuMapView: JimuMapView | null) => {
console.log('onActiveMapViewChange called, jimuMapView:', jimuMapView);
setJimuMapView(jimuMapView);
};
// Fetch tile counts
useEffect(() => {
const tilesData: TileConfig[] = props.config?.jsonData?.asMutable({ deep: true }) ?? [];
const fetchCounts = async () => {
const updatedTiles = await Promise.all(
tilesData.map(async (tile) => {
const queryParam = new Query({
where: tile.whereClause,
returnGeometry: false,
outFields: ['*'],
});
try {
const result = await query.executeQueryJSON(tile.layerUrl, queryParam);
return {
...tile,
count: result.features?.length ?? 0,
};
} catch (err) {
console.error('Error fetching tile count:', err);
return {
...tile,
count: 0,
};
}
})
);
setTilesCountData(updatedTiles);
};
fetchCounts();
}, [props.config?.jsonData]);
// Handle tile click and apply query to map
// const handleTileClick = async (tile: TileConfig) => {
// console.log('Tile clicked:', tile);
// // Apply query to map
// if (jimuMapView && jimuMapView.view) {
// try {
// // Find the layer in the map by URL
// const layer = jimuMapView.view.map.layers.find((layer) => layer.url === tile.layerUrl);
// if (layer) {
// // Apply query as a definition expression
// layer.definitionExpression = tile.whereClause;
// console.log(`Applied query to layer: ${tile.whereClause}`);
// // Optional: Zoom to features
// const queryParam = new Query({
// where: tile.whereClause,
// returnGeometry: true,
// outFields: ['*'],
// });
// const result = await query.executeQueryJSON(tile.layerUrl, queryParam);
// if (result.features.length > 0) {
// await jimuMapView.view.goTo(result.features.map((f) => f.geometry));
// console.log('Zoomed to features');
// }
// } else {
// console.warn(`Layer with URL ${tile.layerUrl} not found in map`);
// console.log('Available layers:', jimuMapView.view.map.layers.toArray());
// }
// } catch (error) {
// console.error('Error applying query to map:', error);
// }
// } else {
// console.warn('Map view is not available, jimuMapView:', jimuMapView);
// }
// // Existing REST query
// const queryParam = new Query({
// where: tile.whereClause,
// returnGeometry: true,
// outFields: ['*'],
// });
// try {
// const result = await query.executeQueryJSON(tile.layerUrl, queryParam);
// console.log('Query result:', result?.features);
// } catch (error) {
// console.error('Query error:', error);
// }
// };
const handleTileClick = async (tile: TileConfig) => {
console.log("Clicked on Tile");
}
return (
<div className="widget-starter jimu-widget">
{props.useMapWidgetIds && props.useMapWidgetIds.length === 1 && (
<JimuMapViewComponent useMapWidgetId={props.useMapWidgetIds?.[0]} />
)}
<DashboardTiles tilesConfig={tilesCountData} onTileClick={handleTileClick} />
</div>
);
};
export default Widget;
setting.jsx
// runtime/setting/settings.tsx
import { React } from 'jimu-core';
import { AllWidgetSettingProps } from 'jimu-for-builder';
import { MapWidgetSelector } from 'jimu-ui/advanced/setting-components';
const Settings = (props: AllWidgetSettingProps<any>) => {
const onMapWidgetSelected = (useMapWidgetIds: string[]) => {
props.onSettingChange({
id: props.id,
useMapWidgetIds: useMapWidgetIds
});
};
return (
<div className="widget-setting-demo">
<MapWidgetSelector useMapWidgetIds={props.useMapWidgetIds} onSelect={onMapWidgetSelected} />
</div>
);
};
export default Settings;
widget menifest.json
{
"name": "dashboardTiles",
"label": "Dashboard Tiles",
"type": "widget",
"version": "1.16.0",
"exbVersion": "1.16.0",
"dependency": ["jimu-arcgis"],
"author": "Muhammad Ahsan Ali",
"description": "Displays dashboard tiles",
"properties": {
"hasMap": true,
"supportMapWidget": true,
"useMapWidget": true,
"useMapWidgetIds": {
"type": "array"
}
},
"translatedLocales": [
"en"
],
"defaultSize": {
"width": 800,
"height": 500
}
}
What i am missing, why it is not working for me?