<html>

<head>
	<meta charset="utf-8" />
	<meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no" />
	<title>ArcGIS JSAPI Calcite</title>
	<link rel="stylesheet" type="text/css" href="https://unpkg.com/@esri/calcite-components@1.0.0-beta.75/dist/calcite/calcite.css" />
	<link rel="stylesheet" href="https://js.arcgis.com/next/esri/themes/light/main.css" />
	<script src="https://js.arcgis.com/calcite-components/1.0.0-beta.74/calcite.esm.js" type="module"></script>
</head>

<body>
	<main>
		<div class="container">
			<calcite-card>
				<div id="featureTarget"></div>
				<calcite-button slot="footer-leading" color="neutral" scale="s" icon-start="magnifying-glass-plus" id="btnZoom"></calcite-button>
				<div slot="footer-trailing">
					<span id="infoCount" class="ui-info--count">
					</span>
					<calcite-button id="btnPrevious" color="neutral" icon-start="chevron-left"></calcite-button>
					<calcite-button id="btnNext" color="neutral" icon-start="chevron-right"></calcite-button>
				</div>
			</calcite-card>
		</div>
		<div id="viewDiv"></div>
	</main>

</body>

</html>
html,
body {
	height: 100%;
	width: 100%;
	margin: 0;
	padding: 0;
}

#viewDiv {
	width: 100%;
}

main {
	display: flex;
	height: 100%;
}

.container {
	width: 400px;
	height: 100vh;
	overflow-y: auto;
}

.ui-info--count {
    margin-left: 1rem;
    margin-right: 1rem;
}
import ArcGISMap from "https://js.arcgis.com/next/@arcgis/core/Map.js";
import MapView from "https://js.arcgis.com/next/@arcgis/core/views/MapView.js";
import FeatureLayer from "https://js.arcgis.com/next/@arcgis/core/layers/FeatureLayer.js";
import { whenFalseOnce } from "https://js.arcgis.com/next/@arcgis/core/core/watchUtils.js";
import Feature from "https://js.arcgis.com/next/@arcgis/core/widgets/Feature.js";

const fLayer = new FeatureLayer({
	portalItem: {
		id: "f430d25bf03744edbb1579e18c4bf6b8"
	},
	layerId: 2,
	outFields: ["*"]
});

const map = new ArcGISMap({
	basemap: "gray-vector",
	layers: [fLayer]
});

const view = new MapView({
	container: "viewDiv",
	map,
	center: [-118, 34],
	zoom: 12
});

const featureTarget = document.getElementById("featureTarget");
const btnZoom = document.getElementById("btnZoom");
const previous = document.getElementById("btnPrevious");
const next = document.getElementById("btnNext");
const info = document.getElementById("infoCount");

const feature = new Feature({
	view,
	container: featureTarget
});

view.when(async () => {
	// do stuff here
	let highlight;
	let currIndex = 0;
	let totalCount = 1;
	const layerView = await view.whenLayerView(fLayer);
	await whenFalseOnce(view, "updating");
	const query = fLayer.createQuery();
	query.geometry = view.extent;
	const { features } = await layerView.queryFeatures(query);
	
	const update = () => {
		if (currIndex < 0) {
			currIndex = features.length - 1;
		}
		else if (currIndex === features.length) {
			currIndex = 0;
		}
		
		feature.graphic = features[currIndex];
		info.innerText = `${currIndex + 1} of ${features.length}`;
		
		// highlight
		highlight && highlight.remove();
		highlight = layerView.highlight(feature.graphic);
	};
	
	btnPrevious.addEventListener("click", () => {
		currIndex = currIndex - 1;
		update();
	});
	btnNext.addEventListener("click", () => {
		currIndex = currIndex + 1;
		update();
	});
	
	btnZoom.addEventListener("click", () => {
		view.goTo({
			target: feature.graphic
		});
	});
	
	update();
	
});

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.