terriajs
Version:
Geospatial data visualization platform.
117 lines • 5.15 kB
JavaScript
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
import { action, computed, makeObservable } from "mobx";
import DeveloperError from "terriajs-cesium/Source/Core/DeveloperError";
import { isJsonObject } from "../../Core/Json";
import Result from "../../Core/Result";
import TerriaError from "../../Core/TerriaError";
import isDefined from "../../Core/isDefined";
import MappableMixin from "../../ModelMixins/MappableMixin";
import ModelReference from "../../Traits/ModelReference";
import { BaseMapTraits, BaseMapsTraits } from "../../Traits/TraitsClasses/BaseMapTraits";
import BingMapsCatalogItem from "../Catalog/CatalogItems/BingMapsCatalogItem";
import CommonStrata from "../Definition/CommonStrata";
import CreateModel from "../Definition/CreateModel";
import { BaseModel } from "../Definition/Model";
import updateModelFromJson from "../Definition/updateModelFromJson";
import { defaultBaseMaps } from "./defaultBaseMaps";
export class BaseMapModel extends CreateModel(BaseMapTraits) {
}
export class BaseMapsModel extends CreateModel(BaseMapsTraits) {
constructor(...args) {
super(...args);
makeObservable(this);
}
/**
* List of the basemaps to show in setting panel
*/
get baseMapItems() {
const enabledBaseMaps = [];
const baseMapItems = this.enabledBaseMaps
?.map((enabledBaseMapId) => {
return this.items.find((item) => item.item === enabledBaseMapId);
})
.filter(isDefined) ?? this.items;
baseMapItems.forEach((baseMapItem) => {
if (baseMapItem.item && !ModelReference.isRemoved(baseMapItem.item)) {
const itemModel = this.terria.getModelById(BaseModel, baseMapItem.item);
if (MappableMixin.isMixedInto(itemModel)) {
enabledBaseMaps.push({
image: baseMapItem.image,
contrastColor: baseMapItem.contrastColor,
backgroundColor: baseMapItem.backgroundColor,
item: itemModel
});
}
}
});
return enabledBaseMaps;
}
// Can't do this in constructor since {@link CatalogMemberFactory} doesn't
// have any values at the moment of initializing Terria class.
initializeDefaultBaseMaps() {
return this.loadFromJson(CommonStrata.definition, {
items: defaultBaseMaps(this.terria)
});
}
add(stratumId, baseMap) {
if (baseMap.item === undefined) {
throw new DeveloperError("A model without a `uniqueId` cannot be added to a group.");
}
const resolvedItem = this.terria.getModelById(BaseModel, baseMap.item);
if (resolvedItem instanceof BingMapsCatalogItem) {
addBingMapsKey(resolvedItem, this.terria);
}
const items = this.getTrait(stratumId, "items");
if (isDefined(items)) {
items.push(baseMap);
}
else {
this.setTrait(stratumId, "items", [baseMap]);
}
}
loadFromJson(stratumId, newBaseMaps) {
const errors = [];
const { items, ...rest } = newBaseMaps;
if (items !== undefined) {
const { items: itemsTrait } = this.traits;
const newItemsIds = itemsTrait.fromJson(this, stratumId, items);
newItemsIds
.pushErrorTo(errors)
?.forEach((member, i) => {
const existingItem = this.items.find((baseMap) => baseMap.item === member.item);
if (existingItem) {
// object array trait doesn't automatically update model item
updateModelFromJson(existingItem, stratumId, items[i]);
}
else {
this.add(stratumId, member);
}
});
}
if (isJsonObject(rest))
updateModelFromJson(this, stratumId, rest).pushErrorTo(errors);
else
errors.push(TerriaError.from("Invalid JSON object"));
return new Result(undefined, TerriaError.combine(errors, `Failed to add members from JSON for model \`${this.uniqueId}\``));
}
}
__decorate([
computed
], BaseMapsModel.prototype, "baseMapItems", null);
__decorate([
action
], BaseMapsModel.prototype, "add", null);
__decorate([
action
], BaseMapsModel.prototype, "loadFromJson", null);
function addBingMapsKey(item, terria) {
if (!item.key) {
item.setTrait(CommonStrata.defaults, "key", terria.configParameters.bingMapsKey);
}
}
//# sourceMappingURL=BaseMapsModel.js.map