@arcgis/map-components
Version:
ArcGIS Map Components
144 lines (143 loc) • 5.27 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.1/LICENSE.txt */
import { c as l } from "../../chunks/runtime.js";
import s from "@arcgis/core/Graphic.js";
import { html as o } from "lit";
import { createRef as m, ref as g } from "lit/directives/ref.js";
import { LitElement as u, safeStyleMap as c } from "@arcgis/lumina";
import p from "@arcgis/core/symbols/SimpleFillSymbol.js";
import y from "@arcgis/core/symbols/SimpleLineSymbol.js";
import d from "@arcgis/core/symbols/SimpleMarkerSymbol.js";
import * as n from "@arcgis/toolkit/log";
import { previewGraphic as i } from "@arcgis/core/applications/Components/symbolUtils.js";
const f = new p(), I = new y(), _ = new d();
function b(a) {
if (!a)
return null;
switch (a.geometryType) {
case "multipoint":
case "point":
return _;
case "polygon":
return f;
case "polyline":
return I;
default:
return null;
}
}
class S extends u {
constructor() {
super(...arguments), this._lastRun = 0, this._attempted = !1, this._isCurrentlyInView = !1, this._io = null, this._imageContainerDiv = m(), this._generatedImageData = null, this.useTrueShape = !1, this.widthInPixels = 16, this.heightInPixels = 16;
}
static {
this.properties = { _generatedImageData: 16, graphic: 0, layer: 0, tableSymbolIcon: 0, minWidth: 9, useTrueShape: 5, actualSymbol: 0, widthInPixels: 9, heightInPixels: 9 };
}
get rootLayer() {
return this.layer?.type === "subtype-sublayer" ? this.layer.parent : this.layer;
}
loaded() {
this.manager.onLifecycle(() => (this._addIntersectionObserver(), () => {
this._removeIntersectionObserver();
}));
}
willUpdate(e) {
e.has("graphic") && (this.hasUpdated || this.graphic !== null) && this._changeGraphic();
}
updated() {
!this._attempted && this._isCurrentlyInView && (this._attempted = !0, this._handleImage().catch((e) => {
n.log("warn", this, "Failed processing image");
}));
}
_changeGraphic() {
this._changeData();
}
_changeData() {
this._generatedImageData = null, this._attempted = !1;
}
async _generateImage() {
return this.actualSymbol && this.graphic?.geometry && this.useTrueShape && !this.layer ? await i(new s({
attributes: this.graphic.attributes,
geometry: this.graphic.geometry
}), {
format: "string",
widthInPixels: this.widthInPixels,
heightInPixels: this.heightInPixels,
useGeometryForShape: this.useTrueShape,
fallbackSymbol: this.actualSymbol
}) : this.actualSymbol ? await i(null, {
format: "string",
widthInPixels: this.widthInPixels,
heightInPixels: this.heightInPixels,
useGeometryForShape: !1,
fallbackSymbol: this.actualSymbol
}) : this.layer && this.graphic ? this.rootLayer.isTable ? this.tableSymbolIcon ? await i(null, {
format: "string",
widthInPixels: this.widthInPixels,
heightInPixels: this.heightInPixels,
useGeometryForShape: !1,
fallbackSymbol: this.tableSymbolIcon
}) : "" : this.useTrueShape ? this.graphic.geometry ? await this._generatePreviewGraphic() : "" : await this._generatePreviewGraphic() : "";
}
async _generatePreviewGraphic() {
return await i(new s({
attributes: this.graphic.attributes,
geometry: this.graphic.geometry,
layer: this.layer
}), {
format: "string",
widthInPixels: this.widthInPixels,
heightInPixels: this.heightInPixels,
useGeometryForShape: this.useTrueShape,
fallbackSymbol: b(this.layer)
});
}
async _handleImage() {
const e = ++this._lastRun;
if (!this._generatedImageData || this._generatedImageData === "")
try {
const t = await this._generateImage();
if (this._lastRun !== e || this._generatedImageData === t)
return;
this._generatedImageData = t;
} finally {
this._attempted = !0;
}
}
_addIntersectionObserver() {
const e = {
// If the image gets within 50px in the Y axis, start the download.
rootMargin: "50px 0px",
threshold: 0.01
};
this._imageContainerDiv.value && requestAnimationFrame(() => {
this.isConnected && (this._io = new IntersectionObserver((t) => {
let r = !1;
t.forEach((h) => {
h.intersectionRatio > 0 && !r ? (r = !0, this._isCurrentlyInView = !0, this._handleImage().catch((w) => {
n.log("warn", this, "Failed processing image");
})) : this._isCurrentlyInView = !1;
});
}, e), this._io?.observe(this._imageContainerDiv.value));
});
}
_removeIntersectionObserver() {
this._io?.disconnect(), this._io = null;
}
_generateInnerHTML() {
return this._generatedImageData ? this._generatedImageData.startsWith("<") ? this._generatedImageData : `
<img
alt=''
src=${this._generatedImageData}
style="width: 100%;" >
</img>
` : "";
}
render() {
const e = this._generateInnerHTML();
return o`<div style=${c(this.minWidth ? { "min-width": `${this.minWidth.toString()}px` } : {})} .innerHTML=${e ?? ""} ${g(this._imageContainerDiv)}></div>`;
}
}
l("arcgis-feature-image", S);
export {
S as ArcgisFeatureImage
};