UNPKG

terriajs

Version:

Geospatial data visualization platform.

980 lines (979 loc) 34.5 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 { action, computed, observable, reaction, runInAction, makeObservable } from "mobx"; import defined from "terriajs-cesium/Source/Core/defined"; import addedByUser from "../Core/addedByUser"; import { Category, HelpAction, StoryAction } from "../Core/AnalyticEvents/analyticEvents"; import Result from "../Core/Result"; import triggerResize from "../Core/triggerResize"; import CatalogMemberMixin, { getName } from "../ModelMixins/CatalogMemberMixin"; import GroupMixin from "../ModelMixins/GroupMixin"; import MappableMixin from "../ModelMixins/MappableMixin"; import ReferenceMixin from "../ModelMixins/ReferenceMixin"; import CommonStrata from "../Models/Definition/CommonStrata"; import getAncestors from "../Models/getAncestors"; import { SATELLITE_HELP_PROMPT_KEY } from "../ReactViews/HelpScreens/SatelliteHelpPrompt"; import { animationDuration } from "../ReactViews/StandardUserInterface/StandardUserInterface"; import { defaultTourPoints, RelativePosition } from "./defaultTourPoints"; import SearchState from "./SearchState"; import { getMarkerCatalogItem } from "../Models/LocationMarkerUtils"; export const DATA_CATALOG_NAME = "data-catalog"; export const USER_DATA_NAME = "my-data"; // check showWorkbenchButton delay and transforms // export const WORKBENCH_RESIZE_ANIMATION_DURATION = 250; export const WORKBENCH_RESIZE_ANIMATION_DURATION = 500; /** * Root of a global view model. Presumably this should get nested as more stuff goes into it. Basically this belongs to * the root of the UI and then it can choose to pass either the whole thing or parts down as props to its children. */ export default class ViewState { mobileViewOptions = Object.freeze({ data: "data", preview: "preview", nowViewing: "nowViewing", locationSearchResults: "locationSearchResults" }); searchState; terria; relativePosition = RelativePosition; _previewedItem; get previewedItem() { return this._previewedItem; } userDataPreviewedItem; explorerPanelIsVisible = false; activeTabCategory = DATA_CATALOG_NAME; activeTabIdInCategory = undefined; isDraggingDroppingFile = false; mobileView = null; isMapFullScreen = false; myDataIsUploadView = true; mobileMenuVisible = false; explorerPanelAnimating = false; topElement = "FeatureInfo"; // Map for storing react portal containers created by <Portal> component. portals = new Map(); storyBuilderShown = false; // Flesh out later showHelpMenu = false; showSatelliteGuidance = false; showWelcomeMessage = false; selectedHelpMenuItem = ""; helpPanelExpanded = false; disclaimerSettings = undefined; disclaimerVisible = false; videoGuideVisible = ""; trainerBarVisible = false; trainerBarExpanded = false; trainerBarShowingAllSteps = false; selectedTrainerItem = ""; currentTrainerItemIndex = 0; currentTrainerStepIndex = 0; printWindow = null; /** * The currently-selected web service type on the My Data -> Add web data panel. */ remoteDataType = undefined; /** * The ID of the Cesium ion token that is currently selected on the * My Data -> Add web data -> Cesium ion panel. */ currentCesiumIonToken = undefined; /** * Toggles ActionBar visibility. Do not set manually, it is * automatically set when rendering <ActionBar> */ isActionBarVisible = false; /** * A global list of functions that generate a {@link ViewingControl} option * for the given catalog item instance. This is useful for plugins to extend * the viewing control menu across catalog items. * * Use {@link ViewingControlsMenu.addMenuItem} instead of updating directly. */ globalViewingControlOptions = []; /** * A global list of hooks for generating input controls for items in the workbench. * The hooks in this list gets called once for each item in shown in the workbench. * This is a mechanism for plugins to extend workbench input controls by adding new ones. * * Use {@link WorkbenchItem.Inputs.addInput} instead of updating directly. */ workbenchItemInputGenerators = []; /** * A global list of generator functions for showing buttons in feature info panel. * Use {@link FeatureInfoPanelButton.addButton} instead of updating directly. */ featureInfoPanelButtonGenerators = []; setSelectedTrainerItem(trainerItem) { this.selectedTrainerItem = trainerItem; } setTrainerBarVisible(bool) { this.trainerBarVisible = bool; } setTrainerBarShowingAllSteps(bool) { this.trainerBarShowingAllSteps = bool; } setTrainerBarExpanded(bool) { this.trainerBarExpanded = bool; // if collapsing trainer bar, also hide steps if (!bool) { this.trainerBarShowingAllSteps = bool; } } setCurrentTrainerItemIndex(index) { this.currentTrainerItemIndex = index; this.currentTrainerStepIndex = 0; } setCurrentTrainerStepIndex(index) { this.currentTrainerStepIndex = index; } setActionBarVisible(visible) { this.isActionBarVisible = visible; } /** * Bottom dock state & action */ bottomDockHeight = 0; setBottomDockHeight(height) { if (this.bottomDockHeight !== height) { this.bottomDockHeight = height; } } errorProvider = null; // default value is null, because user has not made decision to show or // not show story // will be explicitly set to false when user 1. dismiss story // notification or 2. close a story storyShown = null; currentStoryId = 0; featurePrompts = []; /** * we need a layering system for touring the app, but also a way for it to be * chopped and changed from a terriamap * * this will be slightly different to the help sequences that were done in * the past, but may evolve to become a "sequence" (where the UI gets * programatically toggled to delve deeper into the app, e.g. show the user * how to add data via the data catalog window) * * rough points * - "all guide points visible" * - * * draft structure(?): * * maybe each "guide" item will have * { * ref: (react ref object) * dotOffset: (which way the dot and guide should be positioned relative to the ref component) * content: (component, more flexibility than a string) * ...? * } * and guide props? * { * enabled: parent component to decide this based on active index * ...? * } * */ tourPoints = defaultTourPoints; showTour = false; appRefs = new Map(); currentTourIndex = -1; showCollapsedNavigation = false; get tourPointsWithValidRefs() { // should viewstate.ts reach into document? seems unavoidable if we want // this to be the true source of tourPoints. // update: well it turns out you can be smarter about it and actually // properly clean up your refs - so we'll leave that up to the UI to // provide valid refs return this.tourPoints .slice() .sort((a, b) => { return a.priority - b.priority; }) .filter((tourPoint) => this.appRefs.get(tourPoint.appRefName)?.current); } setTourIndex(index) { this.currentTourIndex = index; } setShowTour(bool) { // If we're enabling the tour, make sure the trainer is collapsed if (bool) { this.setTrainerBarExpanded(false); // Ensure workbench is shown this.setIsMapFullScreen(false); setTimeout(() => { runInAction(() => { this.showTour = bool; }); }, animationDuration || 1); } else { this.showTour = bool; } } closeTour() { this.currentTourIndex = -1; this.showTour = false; } previousTourPoint() { const currentIndex = this.currentTourIndex; if (currentIndex !== 0) { this.currentTourIndex = currentIndex - 1; } } nextTourPoint() { const totalTourPoints = this.tourPointsWithValidRefs.length; const currentIndex = this.currentTourIndex; if (currentIndex >= totalTourPoints - 1) { this.closeTour(); } else { this.currentTourIndex = currentIndex + 1; } } closeCollapsedNavigation() { this.showCollapsedNavigation = false; } updateAppRef(refName, ref) { if (!this.appRefs.get(refName) || this.appRefs.get(refName) !== ref) { this.appRefs.set(refName, ref); } } deleteAppRef(refName) { this.appRefs.delete(refName); } /** * Gets or sets a value indicating whether the small screen (mobile) user interface should be used. * @type {Boolean} */ useSmallScreenInterface = false; /** * Gets or sets a value indicating whether the feature info panel is visible. * @type {Boolean} */ featureInfoPanelIsVisible = false; /** * Gets or sets a value indicating whether the feature info panel is collapsed. * When it's collapsed, only the title bar is visible. * @type {Boolean} */ featureInfoPanelIsCollapsed = false; /** * True if this is (or will be) the first time the user has added data to the map. * @type {Boolean} */ firstTimeAddingData = true; /** * Gets or sets a value indicating whether the feedback form is visible. * @type {Boolean} */ feedbackFormIsVisible = false; /** * Gets or sets a value indicating whether the catalog's modal share panel * is currently visible. */ shareModalIsVisible = false; // Small share modal inside StoryEditor /** * Used to indicate that the Share Panel should stay open even if it loses focus. * This is used when clicking a help link in the Share Panel - The Help Panel will open, and when it is closed, the Share Panel should still be visible for the user to continue their task. */ retainSharePanel = false; // The large share panel accessed via Share/Print button settingsPanelIsVisible = false; /** * The currently open tool */ currentTool; panel; _pickedFeaturesSubscription; _disclaimerVisibleSubscription; _isMapFullScreenSubscription; _showStoriesSubscription; _mobileMenuSubscription; _storyPromptSubscription; _previewedItemIdSubscription; _locationMarkerSubscription; _workbenchHasTimeWMSSubscription; _storyBeforeUnloadSubscription; constructor(options) { makeObservable(this); const terria = options.terria; this.searchState = new SearchState({ terria, catalogSearchProvider: options.catalogSearchProvider }); this.errorProvider = options.errorHandlingProvider ? options.errorHandlingProvider : null; this.terria = terria; // When features are picked, show the feature info panel. this._pickedFeaturesSubscription = reaction(() => this.terria.pickedFeatures, (pickedFeatures) => { if (defined(pickedFeatures)) { this.featureInfoPanelIsVisible = true; this.featureInfoPanelIsCollapsed = false; } else { this.featureInfoPanelIsVisible = false; } }); // When disclaimer is shown, ensure fullscreen // unsure about this behaviour because it nudges the user off center // of the original camera set from config once they acknowdge this._disclaimerVisibleSubscription = reaction(() => this.disclaimerVisible, (disclaimerVisible) => { this.isMapFullScreen = disclaimerVisible || terria.userProperties.get("hideWorkbench") === "1" || terria.userProperties.get("hideExplorerPanel") === "1"; }); this._isMapFullScreenSubscription = reaction(() => terria.userProperties.get("hideWorkbench") === "1" || terria.userProperties.get("hideExplorerPanel") === "1", (isMapFullScreen) => { this.isMapFullScreen = isMapFullScreen; // if /#hideWorkbench=1 exists in url onload, show stories directly // any show/hide workbench will not automatically show story if (!defined(this.storyShown)) { // why only check config params here? because terria.stories are not // set at the moment, and that property will be checked in rendering // Here are all are checking are: is terria story enabled in this app? // if so we should show it when app first load, if workbench is hidden this.storyShown = terria.configParameters.storyEnabled; } }); this._showStoriesSubscription = reaction(() => Boolean(terria.userProperties.get("playStory")), (playStory) => { this.storyShown = terria.configParameters.storyEnabled && playStory; }); this._mobileMenuSubscription = reaction(() => this.mobileMenuVisible, (mobileMenuVisible) => { if (mobileMenuVisible) { this.explorerPanelIsVisible = false; this.switchMobileView(null); } }); this._workbenchHasTimeWMSSubscription = reaction(() => this.terria.workbench.hasTimeWMS, (hasTimeWMS) => { if (this.terria.configParameters.showInAppGuides && hasTimeWMS === true && // // only show it once !this.terria.getLocalProperty(`${SATELLITE_HELP_PROMPT_KEY}Prompted`)) { this.setShowSatelliteGuidance(true); this.toggleFeaturePrompt(SATELLITE_HELP_PROMPT_KEY, true, true); } }); this._storyPromptSubscription = reaction(() => this.storyShown, (storyShown) => { if (storyShown === false) { // only show it once if (!this.terria.getLocalProperty("storyPrompted")) { this.toggleFeaturePrompt("story", true, false); } } }); this._locationMarkerSubscription = reaction(() => getMarkerCatalogItem(this.terria), (item) => { if (item) { terria.overlays.add(item); /* dispose subscription after init */ this._locationMarkerSubscription(); } }); this._previewedItemIdSubscription = reaction(() => this.terria.previewedItemId, async (previewedItemId) => { if (previewedItemId === undefined) { return; } try { const result = await this.terria.getModelByIdShareKeyOrCatalogIndex(previewedItemId); result.throwIfError(); const model = result.throwIfUndefined(); this.viewCatalogMember(model); } catch (e) { terria.raiseErrorToUser(e, { message: `Couldn't find model \`${previewedItemId}\` for preview` }); } }); const handleWindowClose = (e) => { // Cancel the event e.preventDefault(); // If you prevent default behavior in Mozilla Firefox prompt will always be shown // Chrome requires returnValue to be set e.returnValue = ""; }; this._storyBeforeUnloadSubscription = reaction(() => this.terria.stories.length > 0, (hasScenes) => { if (hasScenes) { window.addEventListener("beforeunload", handleWindowClose); } else { window.removeEventListener("beforeunload", handleWindowClose); } }); } dispose() { this._pickedFeaturesSubscription(); this._disclaimerVisibleSubscription(); this._mobileMenuSubscription(); this._isMapFullScreenSubscription(); this._showStoriesSubscription(); this._storyPromptSubscription(); this._previewedItemIdSubscription(); this._workbenchHasTimeWMSSubscription(); this._locationMarkerSubscription(); this._storyBeforeUnloadSubscription(); this.searchState.dispose(); } triggerResizeEvent() { triggerResize(); } setIsMapFullScreen(bool, animationDuration = WORKBENCH_RESIZE_ANIMATION_DURATION) { this.isMapFullScreen = bool; // Allow any animations to finish, then trigger a resize. // (wing): much better to do by listening for transitionend, but will leave // this as is until that's in place setTimeout(function () { // should we do this here in viewstate? it pulls in browser dependent things, // and (defensively) calls it. // but only way to ensure we trigger this resize, by standardising fullscreen // toggle through an action. triggerResize(); }, animationDuration); } toggleStoryBuilder() { this.storyBuilderShown = !this.storyBuilderShown; } setTopElement(key) { this.topElement = key; } openAddData() { this.explorerPanelIsVisible = true; this.activeTabCategory = DATA_CATALOG_NAME; this.switchMobileView(this.mobileViewOptions.data); } openUserData() { this.explorerPanelIsVisible = true; this.activeTabCategory = USER_DATA_NAME; } closeCatalog() { this.explorerPanelIsVisible = false; this.switchMobileView(null); this.clearPreviewedItem(); } searchInCatalog(query) { this.openAddData(); this.searchState.catalogSearchText = query; this.searchState.searchCatalog(); } /** * Open settings panel */ openSettingsPanel() { this.settingsPanelIsVisible = true; } clearPreviewedItem() { this.userDataPreviewedItem = undefined; this._previewedItem = undefined; } /** * Views a model in the catalog. If model is a * * - `Reference` - it will be dereferenced first. * - `CatalogMember` - `loadMetadata` will be called * - `Group` - its `isOpen` trait will be set according to the value of the `isOpen` parameter in the `stratum` indicated. * - If after doing this the group is open, its members will be loaded with a call to `loadMembers`. * - `Mappable` - `loadMapItems` will be called * * Then (if no errors have occurred) it will open the catalog. * Note - `previewItem` is set at the start of the function, regardless of errors. * * @param item The model to view in catalog. * @param [isOpen=true] True if the group should be opened. False if it should be closed. * @param stratum The stratum in which to mark the group opened or closed. * @param openAddData True if data catalog window should be opened. */ async viewCatalogMember(item, isOpen = true, stratum = CommonStrata.user, openAddData = true) { // Set preview item before loading - so we can see loading indicator and errors in DataPreview panel. runInAction(() => (this._previewedItem = item)); try { // If item is a Reference - recursively load and call viewCatalogMember on the target if (ReferenceMixin.isMixedInto(item)) { (await item.loadReference()).throwIfError(); if (item.target) { return this.viewCatalogMember(item.target); } else { return Result.error(`Could not view catalog member ${getName(item)}`); } } // Open "Add Data" if (openAddData) { if (addedByUser(item)) { runInAction(() => (this.userDataPreviewedItem = item)); this.openUserData(); } else { runInAction(() => { this.openAddData(); if (this.terria.configParameters.tabbedCatalog) { const parentGroups = getAncestors(item); if (parentGroups.length > 0) { // Go to specific tab this.activeTabIdInCategory = parentGroups[0].uniqueId; } } }); } // mobile switch to now viewing if not viewing a group if (!GroupMixin.isMixedInto(item)) { this.switchMobileView(this.mobileViewOptions.preview); } } if (GroupMixin.isMixedInto(item)) { item.setTrait(stratum, "isOpen", isOpen); if (item.isOpen) { (await item.loadMembers()).throwIfError(); } } else if (MappableMixin.isMixedInto(item)) (await item.loadMapItems()).throwIfError(); else if (CatalogMemberMixin.isMixedInto(item)) (await item.loadMetadata()).throwIfError(); } catch (e) { return Result.error(e, `Could not view catalog member ${getName(item)}`); } return Result.none(); } switchMobileView(viewName) { this.mobileView = viewName; } showHelpPanel() { this.terria.analytics?.logEvent(Category.help, HelpAction.panelOpened); this.showHelpMenu = true; this.helpPanelExpanded = false; this.selectedHelpMenuItem = ""; this.setTopElement("HelpPanel"); } openHelpPanelItemFromSharePanel(evt, itemName) { evt.preventDefault(); evt.stopPropagation(); this.setRetainSharePanel(true); this.showHelpPanel(); this.selectHelpMenuItem(itemName); } selectHelpMenuItem(key) { this.selectedHelpMenuItem = key; this.helpPanelExpanded = true; } hideHelpPanel() { this.showHelpMenu = false; } setRetainSharePanel(retain) { this.retainSharePanel = retain; } changeSearchState(newText) { this.searchState.catalogSearchText = newText; } setDisclaimerVisible(bool) { this.disclaimerVisible = bool; } hideDisclaimer() { this.setDisclaimerVisible(false); } setShowSatelliteGuidance(showSatelliteGuidance) { this.showSatelliteGuidance = showSatelliteGuidance; } setShowWelcomeMessage(welcomeMessageShown) { this.showWelcomeMessage = welcomeMessageShown; } setVideoGuideVisible(videoName) { this.videoGuideVisible = videoName; } /** * Removes references of a model from viewState */ removeModelReferences(model) { if (this._previewedItem === model) this._previewedItem = undefined; if (this.userDataPreviewedItem === model) this.userDataPreviewedItem = undefined; } toggleFeaturePrompt(feature, state, persistent = false) { const featureIndexInPrompts = this.featurePrompts.indexOf(feature); if (state && featureIndexInPrompts < 0 && !this.terria.getLocalProperty(`${feature}Prompted`)) { this.featurePrompts.push(feature); } else if (!state && featureIndexInPrompts >= 0) { this.featurePrompts.splice(featureIndexInPrompts, 1); } if (persistent) { this.terria.setLocalProperty(`${feature}Prompted`, true); } } viewingUserData() { return this.activeTabCategory === USER_DATA_NAME; } afterTerriaStarted() { if (this.terria.configParameters.openAddData) { this.openAddData(); } } openTool(tool) { this.currentTool = tool; } closeTool() { this.currentTool = undefined; } setPrintWindow(window) { if (this.printWindow) { this.printWindow.close(); } this.printWindow = window; } toggleMobileMenu() { this.setTopElement("mobileMenu"); this.mobileMenuVisible = !this.mobileMenuVisible; } runStories() { this.storyBuilderShown = false; this.storyShown = true; setTimeout(function () { triggerResize(); }, animationDuration || 1); this.terria.currentViewer.notifyRepaintRequired(); this.terria.analytics?.logEvent(Category.story, StoryAction.runStory); } get breadcrumbsShown() { return (this.previewedItem !== undefined || this.userDataPreviewedItem !== undefined); } get isToolOpen() { return this.currentTool !== undefined; } get hideMapUi() { return (this.terria.notificationState.currentNotification !== undefined && this.terria.notificationState.currentNotification.hideUi); } get isMapZooming() { return this.terria.currentViewer.isMapZooming; } /** * Returns true if the user is currently interacting with the map - like * picking a point or drawing a shape. */ get isMapInteractionActive() { return this.terria.mapInteractionModeStack.length > 0; } } __decorate([ observable ], ViewState.prototype, "_previewedItem", void 0); __decorate([ observable ], ViewState.prototype, "userDataPreviewedItem", void 0); __decorate([ observable ], ViewState.prototype, "explorerPanelIsVisible", void 0); __decorate([ observable ], ViewState.prototype, "activeTabCategory", void 0); __decorate([ observable ], ViewState.prototype, "activeTabIdInCategory", void 0); __decorate([ observable ], ViewState.prototype, "isDraggingDroppingFile", void 0); __decorate([ observable ], ViewState.prototype, "mobileView", void 0); __decorate([ observable ], ViewState.prototype, "isMapFullScreen", void 0); __decorate([ observable ], ViewState.prototype, "myDataIsUploadView", void 0); __decorate([ observable ], ViewState.prototype, "mobileMenuVisible", void 0); __decorate([ observable ], ViewState.prototype, "explorerPanelAnimating", void 0); __decorate([ observable ], ViewState.prototype, "topElement", void 0); __decorate([ observable ], ViewState.prototype, "portals", void 0); __decorate([ observable ], ViewState.prototype, "storyBuilderShown", void 0); __decorate([ observable ], ViewState.prototype, "showHelpMenu", void 0); __decorate([ observable ], ViewState.prototype, "showSatelliteGuidance", void 0); __decorate([ observable ], ViewState.prototype, "showWelcomeMessage", void 0); __decorate([ observable ], ViewState.prototype, "selectedHelpMenuItem", void 0); __decorate([ observable ], ViewState.prototype, "helpPanelExpanded", void 0); __decorate([ observable ], ViewState.prototype, "disclaimerSettings", void 0); __decorate([ observable ], ViewState.prototype, "disclaimerVisible", void 0); __decorate([ observable ], ViewState.prototype, "videoGuideVisible", void 0); __decorate([ observable ], ViewState.prototype, "trainerBarVisible", void 0); __decorate([ observable ], ViewState.prototype, "trainerBarExpanded", void 0); __decorate([ observable ], ViewState.prototype, "trainerBarShowingAllSteps", void 0); __decorate([ observable ], ViewState.prototype, "selectedTrainerItem", void 0); __decorate([ observable ], ViewState.prototype, "currentTrainerItemIndex", void 0); __decorate([ observable ], ViewState.prototype, "currentTrainerStepIndex", void 0); __decorate([ observable ], ViewState.prototype, "printWindow", void 0); __decorate([ observable ], ViewState.prototype, "remoteDataType", void 0); __decorate([ observable ], ViewState.prototype, "currentCesiumIonToken", void 0); __decorate([ observable ], ViewState.prototype, "isActionBarVisible", void 0); __decorate([ observable ], ViewState.prototype, "globalViewingControlOptions", void 0); __decorate([ observable ], ViewState.prototype, "workbenchItemInputGenerators", void 0); __decorate([ observable ], ViewState.prototype, "featureInfoPanelButtonGenerators", void 0); __decorate([ action ], ViewState.prototype, "setSelectedTrainerItem", null); __decorate([ action ], ViewState.prototype, "setTrainerBarVisible", null); __decorate([ action ], ViewState.prototype, "setTrainerBarShowingAllSteps", null); __decorate([ action ], ViewState.prototype, "setTrainerBarExpanded", null); __decorate([ action ], ViewState.prototype, "setCurrentTrainerItemIndex", null); __decorate([ action ], ViewState.prototype, "setCurrentTrainerStepIndex", null); __decorate([ action ], ViewState.prototype, "setActionBarVisible", null); __decorate([ observable ], ViewState.prototype, "bottomDockHeight", void 0); __decorate([ action ], ViewState.prototype, "setBottomDockHeight", null); __decorate([ observable ], ViewState.prototype, "storyShown", void 0); __decorate([ observable ], ViewState.prototype, "currentStoryId", void 0); __decorate([ observable ], ViewState.prototype, "featurePrompts", void 0); __decorate([ observable ], ViewState.prototype, "tourPoints", void 0); __decorate([ observable ], ViewState.prototype, "showTour", void 0); __decorate([ observable ], ViewState.prototype, "appRefs", void 0); __decorate([ observable ], ViewState.prototype, "currentTourIndex", void 0); __decorate([ observable ], ViewState.prototype, "showCollapsedNavigation", void 0); __decorate([ computed ], ViewState.prototype, "tourPointsWithValidRefs", null); __decorate([ action ], ViewState.prototype, "setTourIndex", null); __decorate([ action ], ViewState.prototype, "setShowTour", null); __decorate([ action ], ViewState.prototype, "closeTour", null); __decorate([ action ], ViewState.prototype, "previousTourPoint", null); __decorate([ action ], ViewState.prototype, "nextTourPoint", null); __decorate([ action ], ViewState.prototype, "closeCollapsedNavigation", null); __decorate([ action ], ViewState.prototype, "updateAppRef", null); __decorate([ action ], ViewState.prototype, "deleteAppRef", null); __decorate([ observable ], ViewState.prototype, "useSmallScreenInterface", void 0); __decorate([ observable ], ViewState.prototype, "featureInfoPanelIsVisible", void 0); __decorate([ observable ], ViewState.prototype, "featureInfoPanelIsCollapsed", void 0); __decorate([ observable ], ViewState.prototype, "firstTimeAddingData", void 0); __decorate([ observable ], ViewState.prototype, "feedbackFormIsVisible", void 0); __decorate([ observable ], ViewState.prototype, "shareModalIsVisible", void 0); __decorate([ observable ], ViewState.prototype, "retainSharePanel", void 0); __decorate([ observable ], ViewState.prototype, "settingsPanelIsVisible", void 0); __decorate([ observable ], ViewState.prototype, "currentTool", void 0); __decorate([ observable ], ViewState.prototype, "panel", void 0); __decorate([ action ], ViewState.prototype, "triggerResizeEvent", null); __decorate([ action ], ViewState.prototype, "setIsMapFullScreen", null); __decorate([ action ], ViewState.prototype, "toggleStoryBuilder", null); __decorate([ action ], ViewState.prototype, "setTopElement", null); __decorate([ action ], ViewState.prototype, "openAddData", null); __decorate([ action ], ViewState.prototype, "openUserData", null); __decorate([ action ], ViewState.prototype, "closeCatalog", null); __decorate([ action ], ViewState.prototype, "searchInCatalog", null); __decorate([ action ], ViewState.prototype, "openSettingsPanel", null); __decorate([ action ], ViewState.prototype, "clearPreviewedItem", null); __decorate([ action ], ViewState.prototype, "switchMobileView", null); __decorate([ action ], ViewState.prototype, "showHelpPanel", null); __decorate([ action ], ViewState.prototype, "openHelpPanelItemFromSharePanel", null); __decorate([ action ], ViewState.prototype, "selectHelpMenuItem", null); __decorate([ action ], ViewState.prototype, "hideHelpPanel", null); __decorate([ action ], ViewState.prototype, "setRetainSharePanel", null); __decorate([ action ], ViewState.prototype, "changeSearchState", null); __decorate([ action ], ViewState.prototype, "setDisclaimerVisible", null); __decorate([ action ], ViewState.prototype, "hideDisclaimer", null); __decorate([ action ], ViewState.prototype, "setShowSatelliteGuidance", null); __decorate([ action ], ViewState.prototype, "setShowWelcomeMessage", null); __decorate([ action ], ViewState.prototype, "setVideoGuideVisible", null); __decorate([ action ], ViewState.prototype, "removeModelReferences", null); __decorate([ action ], ViewState.prototype, "toggleFeaturePrompt", null); __decorate([ action ], ViewState.prototype, "openTool", null); __decorate([ action ], ViewState.prototype, "closeTool", null); __decorate([ action ], ViewState.prototype, "setPrintWindow", null); __decorate([ action ], ViewState.prototype, "toggleMobileMenu", null); __decorate([ action ], ViewState.prototype, "runStories", null); __decorate([ computed ], ViewState.prototype, "breadcrumbsShown", null); __decorate([ computed ], ViewState.prototype, "isToolOpen", null); __decorate([ computed ], ViewState.prototype, "hideMapUi", null); __decorate([ computed ], ViewState.prototype, "isMapInteractionActive", null); //# sourceMappingURL=ViewState.js.map