UNPKG

terriajs

Version:

Geospatial data visualization platform.

174 lines 8.27 kB
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 i18next from "i18next"; import { computed, runInAction, makeObservable, override } from "mobx"; import RequestErrorEvent from "terriajs-cesium/Source/Core/RequestErrorEvent"; import Resource from "terriajs-cesium/Source/Core/Resource"; import filterOutUndefined from "../../../Core/filterOutUndefined"; import isDefined from "../../../Core/isDefined"; import TerriaError, { TerriaErrorSeverity } from "../../../Core/TerriaError"; import TableMixin from "../../../ModelMixins/TableMixin"; import UrlMixin from "../../../ModelMixins/UrlMixin"; import Csv from "../../../Table/Csv"; import TableAutomaticStylesStratum from "../../../Table/TableAutomaticStylesStratum"; import SdmxCatalogItemTraits from "../../../Traits/TraitsClasses/SdmxCatalogItemTraits"; import CreateModel from "../../Definition/CreateModel"; import StratumOrder from "../../Definition/StratumOrder"; import { filterEnums } from "../../SelectableDimensions/SelectableDimensions"; import proxyCatalogItemUrl from "../proxyCatalogItemUrl"; import { SdmxJsonDataflowStratum } from "./SdmxJsonDataflowStratum"; import { sdmxErrorString, SdmxHttpErrorCodes } from "./SdmxJsonServerStratum"; export default class SdmxJsonCatalogItem extends TableMixin(UrlMixin(CreateModel(SdmxCatalogItemTraits))) { static get type() { return "sdmx-json"; } constructor(id, terria, sourceReference) { super(id, terria, sourceReference); makeObservable(this); this.strata.set(TableAutomaticStylesStratum.stratumName, new TableAutomaticStylesStratum(this)); } async forceLoadMetadata() { // Load SdmxJsonDataflowStratum if needed if (!this.strata.has(SdmxJsonDataflowStratum.stratumName)) { const stratum = await SdmxJsonDataflowStratum.load(this); runInAction(() => { this.strata.set(SdmxJsonDataflowStratum.stratumName, stratum); }); } await this.loadRegionProviderList(); } get type() { return SdmxJsonCatalogItem.type; } get cacheDuration() { return super.cacheDuration || "1d"; } /** * Map SdmxDimensionTraits to SelectableDimension */ get sdmxSelectableDimensions() { return this.dimensions.map((dim) => { return { id: dim.id, name: dim.name, options: dim.options, selectedId: dim.selectedId, allowUndefined: dim.allowUndefined, disable: dim.disable || this.columns.find((col) => col.name === dim.id)?.type === "region", setDimensionValue: async (stratumId, value) => { let dimensionTraits = this.dimensions?.find((sdmxDim) => sdmxDim.id === dim.id); if (!isDefined(dimensionTraits)) { dimensionTraits = this.addObject(stratumId, "dimensions", dim.id); } dimensionTraits.setTrait(stratumId, "selectedId", value); (await this.loadMapItems()).raiseError(this.terria); } }; }); } get selectableDimensions() { return filterOutUndefined([ ...super.selectableDimensions.filter((d) => d.id !== this.styleDimensions?.id), ...this.sdmxSelectableDimensions ]); } /** * Returns base URL (from traits), as SdmxJsonCatalogItem will override `url` property with SDMX Data request */ get baseUrl() { return super.url; } get url() { if (!super.url) return; // Get dataKey - this is used to filter dataflows by dimension values - it must be compliant with the KeyType defined in the SDMX WADL (period separated dimension values) - dimension order is very important! // We must sort the dimensions by position as traits lose their order across strata const dataKey = this.dimensions .slice() .sort((a, b) => (isDefined(a.position) ? a.position : this.dimensions.length) - (isDefined(b.position) ? b.position : this.dimensions.length)) // If a dimension is disabled, use empty string (which is wildcard) .map((dim) => !dim.disable && this.columns.find((col) => col.name === dim.id)?.type !== "region" ? dim.selectedId : "") .join("."); return `${super.url}/data/${this.dataflowId}/${dataKey}`; } async forceLoadTableData() { if (!this.url) return; try { const csvString = await new Resource({ url: proxyCatalogItemUrl(this, this.url), headers: { Accept: "application/vnd.sdmx.data+csv; version=1.0.0" } }).fetch(); if (!isDefined(csvString)) { throw new TerriaError({ title: i18next.t("models.sdmxCatalogItem.loadDataErrorTitle"), message: i18next.t("models.sdmxCatalogItem.loadDataErrorMessage", this) }); } return await Csv.parseString(csvString, true); } catch (error) { if (error instanceof RequestErrorEvent && typeof error.response === "string") { // If no results and we have selcetable dimensions, give message regarding dimensions // This message will include values for each selectable dimension if (error.statusCode === SdmxHttpErrorCodes.NoResults && this.selectableDimensions.length > 0) { throw new TerriaError({ message: i18next.t("models.sdmxCatalogItem.noResultsWithDimensions", { dimensions: filterEnums(this.selectableDimensions) .filter((dim) => !dim.disable && dim.options?.length !== 1) .map((dim) => // Format string into `${dimenion name} = ${dimenion selected value} `- ${dim.name} = \`${dim.options?.find((option) => option.id === dim.selectedId)?.name ?? dim.selectedId}\``) .join("\n") }), title: i18next.t("models.sdmxCatalogItem.loadDataErrorTitle", this), severity: TerriaErrorSeverity.Warning, importance: 1, overrideRaiseToUser: true }); } throw new TerriaError({ message: sdmxErrorString.has(error.statusCode) ? `${sdmxErrorString.get(error.statusCode)}: ${error.response}` : `${error.response}`, title: i18next.t("models.sdmxCatalogItem.loadDataErrorTitle", this) }); } else { throw TerriaError.from(error, { message: i18next.t("models.sdmxCatalogItem.loadDataErrorTitle", this) }); } } } } __decorate([ override ], SdmxJsonCatalogItem.prototype, "cacheDuration", null); __decorate([ computed ], SdmxJsonCatalogItem.prototype, "sdmxSelectableDimensions", null); __decorate([ override ], SdmxJsonCatalogItem.prototype, "selectableDimensions", null); __decorate([ computed ], SdmxJsonCatalogItem.prototype, "baseUrl", null); __decorate([ override ], SdmxJsonCatalogItem.prototype, "url", null); StratumOrder.addLoadStratum(TableAutomaticStylesStratum.stratumName); //# sourceMappingURL=SdmxJsonCatalogItem.js.map