@arcgis/map-components
Version:
ArcGIS Map Components
512 lines (511 loc) • 21.9 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.1/LICENSE.txt */
import { c as T } from "../../chunks/runtime.js";
import { css as g, html as o } from "lit";
import { LitElement as b, createEvent as h } from "@arcgis/lumina";
import { u as w } from "../../chunks/useT9n.js";
import { u as F } from "../../chunks/useView.js";
import { m as M } from "../../chunks/useViewModel.js";
import { property as l, subclass as S } from "/core/core/accessorSupport/decorators.js";
import _ from "@arcgis/core/core/Accessor.js";
import u from "@arcgis/core/editing/templates/TemplateListItem.js";
import { getAllStandardFeatureTemplatesForLayer as $, getTemplatesForLayers as x } from "@arcgis/core/applications/Components/templateUtils.js";
import { i as y, c as v } from "../../chunks/layer-utils.js";
import { isTable as m, getEffectiveLayerCapabilities as B } from "@arcgis/core/applications/Components/layerUtils.js";
import { usePropertyChange as D } from "@arcgis/lumina/controllers";
import { watch as f } from "@arcgis/core/core/reactiveUtils.js";
import { debounce as L } from "@arcgis/toolkit/function";
const E = g`:host{display:flex;position:relative;background-color:var(--calcite-color-foreground-1);color:var(--calcite-color-text-2);font-size:var(--calcite-font-size);line-height:var(--calcite-font-line-height-relative-tight)}.filter-no-results{padding:var(--calcite-spacing-md) var(--calcite-spacing-lg)}.root{display:flex;flex:1 1 auto;overflow:hidden auto;transition:max-height .25s ease-in-out}.root>*{width:100%;box-sizing:border-box}.feature-template-tabs{--calcite-tab-background-color: transparent}`;
var U = Object.defineProperty, I = Object.getOwnPropertyDescriptor, a = (t, e, i, r) => {
for (var n = r > 1 ? void 0 : r ? I(e, i) : e, p = t.length - 1, c; p >= 0; p--)
(c = t[p]) && (n = (r ? c(e, i, n) : c(n)) || n);
return r && n && U(e, i, n), n;
};
function C(t) {
switch (t) {
case "point":
case "multipoint":
case "polyline":
case "polygon":
case "extent":
case "mesh":
return t;
}
return "noneSpecified";
}
const R = (t) => C(t.layer.geometryType ?? "");
let s = class extends _ {
//#region Lifecycle
constructor(t) {
super(t), this._hasRunInitialLoad = !1, this.favoritesEnabled = !1, this.recentlyUsedEnabled = !1, this.hideTemplateDescription = !1, this.filterText = "", this.recentFilterText = "", this.favoritesFilterText = "", this.display = "grouped", this.groupBy = "layer", this.hideTemplatesMode = "never", this.disableTemplatesMode = "never", this.sectionSortBy = "system", this.templateSortBy = "alphabetical", this.sharedTemplatesDisabled = !1, this.excludeTables = !1, this.favorites = /* @__PURE__ */ new Set(), this.fetchingTemplateMetaData = !1, this.recentlyUsed = [];
}
//#endregion
//#region Public methods
/*
* The template source has changed. This maybe because layers
* have been added or removed, the map changed or application templates
* supplied.
*/
async handleTemplateSourceDefinitionChanged() {
if (this._hasRunInitialLoad = !1, this.applicationTemplates) {
await this._restore();
return;
}
try {
this.fetchingTemplateMetaData = !0;
const t = this.activeLayers;
if (await Promise.allSettled(t.map((e) => e.load())), this.sharedTemplatesDisabled) {
const e = [];
for (const i of t) {
const r = $(i);
r.length > 0 && e.push({
layer: i,
templates: r
});
}
this.mapTemplates = e;
return;
}
this.mapTemplates = await x(t, this.view, void 0, {
returnVisibleTemplatesOnly: !0
}), await this._restore();
} catch {
this.mapTemplates = [];
} finally {
this.fetchingTemplateMetaData = !1;
}
}
get loading() {
return !this._hasRunInitialLoad || this.layers !== void 0 || this.applicationTemplates !== void 0 || !this.view?.ready;
}
/*
* Add a favorite
*/
async addFavorite(t) {
this.favorites.add(t.id), this.favorites = new Set(this.favorites);
}
/*
* Remove a favorite
*/
async removeFavorite(t) {
this.favorites.delete(t.id), this.favorites = new Set(this.favorites);
}
/*
* Add a recently selected Template
*/
addRecent(t) {
if (!this.recentlyUsedEnabled)
return;
const e = this.recentlyUsed.filter((i) => i !== t.id);
e.unshift(t.id) > 20 && (e.length = 20), this.recentlyUsed = e;
}
/*
* Remove a favorite
*/
async removeRecent(t) {
this.recentlyUsed = this.recentlyUsed.filter((e) => e !== t.id);
}
//#endregion
//#region Private methods
/*
* Restore favorites and recents, if there is a provider.
*/
async _restore() {
try {
if (this.favoritesEnabled && this.restoreFavorites) {
const t = await this.restoreFavorites();
this.favorites = new Set(t ?? []);
}
} catch {
}
try {
if (this.recentlyUsedEnabled && this.restoreRecentlyUsed) {
const t = await this.restoreRecentlyUsed();
this.recentlyUsed = t ?? [];
}
} catch {
}
}
/*
* Sort the templates based on a function or alphabetical.
*/
_sortTemplates(t) {
if (this.templateSortByFunction) {
const e = this.templateSortByFunction(t) ?? null;
return e === null ? t : e;
}
return this.templateSortBy === "alphabetical" ? t.toSorted((e, i) => e.label.localeCompare(i.label)) : t;
}
/*
* Sort the sections based on a function or alphabetical, and sort the templates within the sections as well.
*/
_sortSections(t) {
if (this.sectionSortByFunction) {
const e = this.sectionSortByFunction(t);
e && (t = e);
} else if (this.sectionSortBy === "alphabetical")
t = t.toSorted((e, i) => e.sectionName.localeCompare(i.sectionName));
else if (this.groupBy === "geometry" && !this.groupByFunction) {
const e = {
point: 1,
multipoint: 2,
polyline: 3,
polygon: 4,
extent: 5,
mesh: 6,
noneSpecified: 7
};
t = t.toSorted((i, r) => {
const n = e[i.sectionName] ?? 10, p = e[r.sectionName] ?? 10;
return n - p;
});
}
for (const e of t)
e.templates = this._sortTemplates(e.templates);
return t;
}
_layerIsVisibleAtCurrentScale(t) {
if (!this.view)
return !0;
let e = t;
y(t) && (e = t.parent);
const i = this.view.allLayerViews.find((r) => r.layer === e);
if (!i)
return !0;
if (y(t)) {
const r = this.view.scale;
if (i.visibleAtCurrentScale) {
const n = t.minScale, p = t.maxScale;
let c = !n, d = !p;
return !c && r <= n && (c = !0), !d && r >= p && (d = !0), c && d;
}
}
return i.visibleAtCurrentScale;
}
get activeLayers() {
const t = [];
for (const e of this.layers ?? [])
if (v(e))
for (const i of e.sublayers)
t.push(i);
else
t.push(e);
if (this.layers === void 0 || this.layers === null) {
for (const e of [
...this.view?.map?.allLayers?.slice(0).reverse() ?? [],
...this.excludeTables ? [] : this.view?.map?.allTables?.slice(0).reverse() ?? []
])
if (e.type === "feature" || e.type === "scene" || e.type === "geojson" || e.type === "oriented-imagery" || e.type === "knowledge-graph")
t.push(e);
else if (v(e))
for (const i of e.sublayers)
t.push(i);
}
return t;
}
get selectedTemplate() {
return this.allTemplates.find((t) => t.id === this.selectedTemplateId);
}
get effectiveTemplates() {
return this.templates.map((t) => ({ ...t, templates: t.templates.filter((e) => this.inclusionFilter(e)) })).filter((t) => t.templates.length > 0);
}
get templateList() {
return this._sortTemplates(this.effectiveTemplates.flatMap((t) => t.templates));
}
get allTemplates() {
return this._sortTemplates(this.templates.flatMap((t) => t.templates));
}
inclusionFilter(t) {
if (this.excludeTables && m(t.layer) || this.applicationFilterFunction?.(t) === !1)
return !1;
const e = B(t.layer)?.operations;
return e?.supportsEditing === !1 && !e?.supportsAdd ? !1 : m(t.layer) ? !0 : !(this.hideTemplatesMode === "visible" && !t.layer.visible || this.hideTemplatesMode === "scale" && !this._layerIsVisibleAtCurrentScale(t.layer));
}
get templateSetKey() {
return this._sortTemplates(this.allTemplates).map((t) => t.id).join(",");
}
get disabledTemplates() {
const t = /* @__PURE__ */ new Set();
for (const e of this.allTemplates) {
if (this.applicationDisabledFunction && this.applicationDisabledFunction(e)) {
t.add(e);
continue;
}
if (!m(e.layer)) {
if (this.disableTemplatesMode === "visible" && !e.layer.visible) {
t.add(e);
continue;
}
if (this.disableTemplatesMode === "scale" && this.view && !this._layerIsVisibleAtCurrentScale(e.layer)) {
t.add(e);
continue;
}
}
}
return t;
}
get templates() {
return this.applicationTemplates ?? this.organizedMapTemplates;
}
get organizedMapTemplates() {
if (this.groupByFunction || this.groupBy === "geometry") {
const t = !this.groupByFunction, e = this.groupByFunction ?? R, i = /* @__PURE__ */ new Map();
for (const r of this.mapTemplates ?? [])
for (const n of r.templates) {
const p = new u({ template: n, layer: r.layer }), c = e(p);
if (c != null)
if (i.has(c))
i.get(c)?.templates.push(p);
else {
const d = {
sectionName: c,
...t ? { autoTranslate: !0 } : {},
templates: [p]
};
i.set(c, d);
}
}
return this._sortSections(Array.from(i.values()));
}
return this._sortSections(
(this.mapTemplates ?? []).map(({ layer: t, templates: e }) => ({
sectionName: t.title ?? "",
templates: e.map((i) => new u({ layer: t, template: i }))
})).filter((t) => t.templates.length > 0)
);
}
get updating() {
return this.fetchingTemplateMetaData;
}
get favoriteTemplates() {
const t = [];
for (const e of this.effectiveTemplates)
for (const i of e.templates)
this.favorites.has(i.id) && t.push(i);
return t;
}
get recentTemplates() {
const t = /* @__PURE__ */ new Map();
for (const i of this.effectiveTemplates)
for (const r of i.templates)
t.set(r.id, r);
const e = [];
for (const i of this.recentlyUsed)
t.has(i) && e.push(t.get(i));
return e;
}
//#endregion
};
a([
l()
], s.prototype, "loading", 1);
a([
l()
], s.prototype, "_hasRunInitialLoad", 2);
a([
l()
], s.prototype, "activeLayers", 1);
a([
l()
], s.prototype, "favoritesEnabled", 2);
a([
l()
], s.prototype, "recentlyUsedEnabled", 2);
a([
l()
], s.prototype, "hideTemplateDescription", 2);
a([
l()
], s.prototype, "filterText", 2);
a([
l()
], s.prototype, "recentFilterText", 2);
a([
l()
], s.prototype, "favoritesFilterText", 2);
a([
l()
], s.prototype, "selectedTemplateId", 2);
a([
l()
], s.prototype, "selectedTemplate", 1);
a([
l()
], s.prototype, "layers", 2);
a([
l()
], s.prototype, "restoreFavorites", 2);
a([
l()
], s.prototype, "restoreRecentlyUsed", 2);
a([
l()
], s.prototype, "applicationDisabledFunction", 2);
a([
l()
], s.prototype, "applicationFilterFunction", 2);
a([
l()
], s.prototype, "display", 2);
a([
l()
], s.prototype, "groupBy", 2);
a([
l()
], s.prototype, "hideTemplatesMode", 2);
a([
l()
], s.prototype, "disableTemplatesMode", 2);
a([
l()
], s.prototype, "groupByFunction", 2);
a([
l()
], s.prototype, "sectionSortBy", 2);
a([
l()
], s.prototype, "templateSortBy", 2);
a([
l()
], s.prototype, "sectionSortByFunction", 2);
a([
l()
], s.prototype, "templateSortByFunction", 2);
a([
l()
], s.prototype, "sharedTemplatesDisabled", 2);
a([
l()
], s.prototype, "excludeTables", 2);
a([
l()
], s.prototype, "favorites", 2);
a([
l()
], s.prototype, "effectiveTemplates", 1);
a([
l()
], s.prototype, "templateList", 1);
a([
l()
], s.prototype, "allTemplates", 1);
a([
l()
], s.prototype, "templateSetKey", 1);
a([
l()
], s.prototype, "disabledTemplates", 1);
a([
l()
], s.prototype, "templates", 1);
a([
l()
], s.prototype, "mapTemplates", 2);
a([
l()
], s.prototype, "organizedMapTemplates", 1);
a([
l()
], s.prototype, "fetchingTemplateMetaData", 2);
a([
l()
], s.prototype, "updating", 1);
a([
l()
], s.prototype, "applicationTemplates", 2);
a([
l()
], s.prototype, "favoriteTemplates", 1);
a([
l()
], s.prototype, "recentTemplates", 1);
a([
l()
], s.prototype, "recentlyUsed", 2);
a([
l()
], s.prototype, "view", 2);
s = a([
S("components.feature-templates.FeatureTemplatesViewModel")
], s);
const A = M(s);
class P extends b {
constructor() {
super(...arguments), this._messages = w(), this.viewModel = A(this), this.favoritesEnabled = this.viewModel.favoritesEnabled, this.favorites = this.viewModel.favorites, this.restoreFavorites = this.viewModel.restoreFavorites, this.restoreRecentlyUsed = this.viewModel.restoreRecentlyUsed, this.recentlyUsed = this.viewModel.recentlyUsed, this.sharedTemplatesDisabled = this.viewModel.sharedTemplatesDisabled, this.filterText = this.viewModel.filterText, this.recentFilterText = this.viewModel.recentFilterText, this.favoritesFilterText = this.viewModel.favoritesFilterText, this.recentlyUsedEnabled = this.viewModel.recentlyUsedEnabled, this.excludeTables = this.viewModel.excludeTables, this.effectiveTemplates = this.viewModel.effectiveTemplates, this.applicationTemplates = this.viewModel.applicationTemplates, this.selectedTemplateId = this.viewModel.selectedTemplateId, this.selectedTemplate = this.viewModel.selectedTemplate, this.applicationFilterFunction = this.viewModel.applicationFilterFunction, this.applicationDisabledFunction = this.viewModel.applicationDisabledFunction, this.display = this.viewModel.display, this.groupBy = this.viewModel.groupBy, this.sectionSortBy = this.viewModel.sectionSortBy, this.templateSortBy = this.viewModel.templateSortBy, this.templateSortByFunction = this.viewModel.templateSortByFunction, this.sectionSortByFunction = this.viewModel.sectionSortByFunction, this.hideTemplatesMode = this.viewModel.hideTemplatesMode, this.disableTemplatesMode = this.viewModel.disableTemplatesMode, this.groupByFunction = this.viewModel.groupByFunction, this.hideTemplateDescription = this.viewModel.hideTemplateDescription, this.layers = this.viewModel.layers, this.view = F(this), this.autoDestroyDisabled = !1, this.updating = this.viewModel.updating, this.disabled = !1, this.showCollapseButton = !1, this.showFilter = !1, this.minRequiredFilterCount = 2, this.arcgisPropertyChange = D()("effectiveTemplates", "filterText", "recentlyUsed", "favorites"), this.arcgisReady = h(), this.arcgisTemplatesChanged = h(), this.arcgisSelectTemplate = h();
}
static {
this.properties = { favoritesEnabled: 5, favorites: 32, restoreFavorites: 0, restoreRecentlyUsed: 0, recentlyUsed: 32, sharedTemplatesDisabled: 5, filterText: 1, recentFilterText: 1, favoritesFilterText: 1, recentlyUsedEnabled: 5, excludeTables: 5, effectiveTemplates: 32, applicationTemplates: 0, selectedTemplateId: 1, selectedTemplate: 32, applicationFilterFunction: 0, applicationDisabledFunction: 0, display: 1, groupBy: 1, sectionSortBy: 1, templateSortBy: 1, templateSortByFunction: 0, sectionSortByFunction: 0, hideTemplatesMode: 1, disableTemplatesMode: 1, groupByFunction: 0, hideTemplateDescription: 5, layers: 0, view: 0, referenceElement: 1, autoDestroyDisabled: 5, updating: 32, disabled: 5, showCollapseButton: 5, showFilter: 5, minRequiredFilterCount: 9 };
}
static {
this.styles = E;
}
async destroy() {
await this.manager.destroy();
}
loaded() {
this.manager.onLifecycle(() => [
// Ensure the view is always mapped to the viewmodel
f(() => this.view, () => {
this.viewModel.view = this.view;
}, { initial: !0 }),
f(() => this.viewModel.templateSetKey, () => {
this.arcgisTemplatesChanged.emit();
}),
// Watch if the list of active layers changes. This will trigger a reload
f(() => [
this.viewModel.activeLayers?.map((e) => e.id).join(","),
this.viewModel?.applicationTemplates,
this.viewModel?.sharedTemplatesDisabled
], L(() => (
// Trigger refetching of templates
this.viewModel.handleTemplateSourceDefinitionChanged()
), 10), { initial: !0 })
]);
}
_handleSelectTemplate(e) {
this.selectedTemplateId = e.id, this.arcgisSelectTemplate.emit({ template: e }), this.viewModel.addRecent(e);
}
_removeTemplateFromList(e, i) {
if (i === "favorites") {
this.viewModel.removeFavorite(e);
return;
}
this.viewModel.removeRecent(e);
}
_renderTemplates() {
return this.effectiveTemplates.length === 0 ? o`<calcite-notice icon=list open class="filter-no-results"><div slot=message>${this._messages.noTemplates}</div></calcite-notice>` : o`<calcite-list .filterPlaceholder=${this._messages.filterPlaceholder ?? ""} .filterText=${this.filterText} .label=${this._messages?.templates ?? ""} .filterEnabled=${this.showFilter && this.viewModel.templateList.length >= this.minRequiredFilterCount} selection-appearance=border selection-mode=single =${(e) => {
this.filterText = e.target.filterText;
}}>${this.display === "grouped" ? this.effectiveTemplates.map((e) => o`<calcite-list-item-group .heading=${e.autoTranslate ? this._messages[e.sectionName] ?? "" : e.sectionName}>${e.templates.map((i) => o`<calcite-list-item .disabled=${this.viewModel.disabledTemplates.has(i)} .label=${i.label} .selected=${i.id === this.selectedTemplateId} .description=${this.hideTemplateDescription ? void 0 : i.description} .value=${i.id} =${() => {
this._handleSelectTemplate(i);
}}><arcgis-template-image slot=content-start .template=${i}></arcgis-template-image>${this._renderAddFavorite(i)}</calcite-list-item>`)}</calcite-list-item-group>`) : this.viewModel.templateList.map((e) => o`<calcite-list-item .disabled=${this.viewModel.disabledTemplates.has(e)} .label=${e.label} .selected=${e.id === this.selectedTemplateId} .description=${this.hideTemplateDescription ? void 0 : e.description} .value=${e.id} =${() => {
this._handleSelectTemplate(e);
}}><arcgis-template-image slot=content-start .template=${e}></arcgis-template-image>${this._renderAddFavorite(e)}</calcite-list-item>`)}${this._renderFilteredEmpty()}</calcite-list>`;
}
_renderAddFavorite(e) {
return this.viewModel.favoritesEnabled ? o`<calcite-action slot=actions-end .icon=${this.viewModel.favorites.has(e.id) ? "heart-f" : "heart"} =${() => {
this.viewModel.favorites.has(e.id) ? this.viewModel.removeFavorite(e) : this.viewModel.addFavorite(e);
}} .text=${this._messages.addFavorite ?? ""}></calcite-action>` : "";
}
_renderList(e) {
const i = e === "favorites" ? this.viewModel.favoriteTemplates : this.viewModel.recentTemplates;
return i.length === 0 ? o`<calcite-notice icon=list open class="filter-no-results"><div slot=message>${e === "favorites" ? this._messages.noFavorites : this._messages.noRecent}</div></calcite-notice>` : o`<calcite-list .filterText=${e === "favorites" ? this.favoritesFilterText : this.recentFilterText} .filterPlaceholder=${this._messages.filterPlaceholder ?? ""} .label=${(e === "favorites" ? this._messages.favorites : this._messages.recent) ?? ""} .filterEnabled=${this.showFilter} selection-appearance=border selection-mode=single =${(r) => {
this.filterText = r.target.filterText;
}}>${i.map((r) => o`<calcite-list-item .disabled=${this.viewModel.disabledTemplates.has(r)} .label=${r.label} .description=${this.hideTemplateDescription ? void 0 : r.description} .value=${r.id} =${() => {
this._handleSelectTemplate(r);
}}><arcgis-template-image slot=content-start .template=${r}></arcgis-template-image><calcite-action slot=actions-end icon=x =${() => {
this._removeTemplateFromList(r, e);
}} .text=${(e === "favorites" ? this._messages.removeFavorite : this._messages.removeRecent) ?? ""}></calcite-action></calcite-list-item>`)}${this._renderFilteredEmpty()}</calcite-list>`;
}
_renderFilteredEmpty() {
return o`<calcite-notice icon=filter slot=filter-no-results open class="filter-no-results"><div slot=message>${this._messages.noMatchingTemplates}</div></calcite-notice>`;
}
_renderContent() {
return this.effectiveTemplates.length === 0 && this.viewModel.loading ? null : this.favoritesEnabled || this.recentlyUsedEnabled ? o`<calcite-tabs class="feature-template-tabs"><calcite-tab-nav slot=title-group><calcite-tab-title icon-start=templates selected>${this._messages.templates}</calcite-tab-title>${this.recentlyUsedEnabled ? o`<calcite-tab-title icon-start=clock>${this._messages.recent}</calcite-tab-title>` : ""}${this.favoritesEnabled ? o`<calcite-tab-title icon-start=heart>${this._messages.favorites}</calcite-tab-title>` : ""}</calcite-tab-nav><calcite-tab selected>${this._renderTemplates()}</calcite-tab><calcite-tab>${this._renderList("recent")}</calcite-tab><calcite-tab>${this._renderList("favorites")}</calcite-tab></calcite-tabs>` : this._renderTemplates();
}
render() {
return o`<div class="root">${this._renderContent()}${this.viewModel.updating || this.disabled ? o`<calcite-scrim><calcite-loader scale=s label .hidden=${!this.viewModel.updating}></calcite-loader></calcite-scrim>` : null}</div>`;
}
}
T("arcgis-feature-templates", P);
export {
P as ArcgisFeatureTemplates
};