UNPKG

terriajs

Version:

Geospatial data visualization platform.

198 lines (164 loc) 7.06 kB
import addedByUser from '../Core/addedByUser'; import clone from 'terriajs-cesium/Source/Core/clone'; import defined from 'terriajs-cesium/Source/Core/defined'; import DisclaimerHandler from './DisclaimerHandler'; import getAncestors from '../Models/getAncestors'; import knockout from 'terriajs-cesium/Source/ThirdParty/knockout'; import MouseCoords from './MouseCoords'; import SearchState from './SearchState'; /** * 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 { constructor(options) { const terria = options.terria; this.mobileViewOptions = Object.freeze({ data: 'data', preview: 'preview', nowViewing: 'nowViewing', locationSearchResults: 'locationSearchResults' }); this.searchState = new SearchState({ terria: terria, catalogSearchProvider: options.catalogSearchProvider, locationSearchProviders: options.locationSearchProviders }); this.terria = terria; this.previewedItem = undefined; this.userDataPreviewedItem = undefined; this.explorerPanelIsVisible = false; this.activeTabCategory = 'data-catalog'; this.activeTabSubCategory = null; // Used to refer to an individual data-catalog tab this.isDraggingDroppingFile = false; this.mobileView = null; this.isMapFullScreen = false; this.myDataIsUploadView = true; /** * Gets or sets a value indicating whether the small screen (mobile) user interface should be used. * @type {Boolean} */ this.useSmallScreenInterface = false; /** * Gets or sets a value indicating whether the feature info panel is visible. * @type {Boolean} */ this.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} */ this.featureInfoPanelIsCollapsed = false; /** * True if this is (or will be) the first time the user has added data to the map. * @type {Boolean} */ this.firstTimeAddingData = true; this.notifications = []; /** * Gets or sets a value indicating whether the feedback form is visible. * @type {Boolean} */ this.feedbackFormIsVisible = false; this.myDataIsUploadView = true; this.mouseCoords = new MouseCoords(); this.mobileMenuVisible = false; this.panelVisible = undefined; this.explorerPanelAnimating = false; knockout.track(this, [ 'previewedItem', 'catalogSearch', 'explorerPanelIsVisible', 'activeTabCategory', 'activeTabIdInCategory', 'userDataPreviewedItem', 'isDraggingDroppingFile', 'mobileView', 'useSmallScreenInterface', 'featureInfoPanelIsVisible', 'featureInfoPanelIsCollapsed', 'notifications', 'isMapFullScreen', 'feedbackFormIsVisible', 'myDataIsUploadView', 'mobileMenuVisible', 'panelVisible', 'explorerPanelAnimating' ]); // Show errors to the user as notifications. this._unsubscribeErrorListener = terria.error.addEventListener(e => { // Only add this error if an identical one doesn't already exist. if (this.notifications.filter(item => item.title === e.title && item.message === e.message).length === 0) { this.notifications.push(clone(e)); } }); // When features are picked, show the feature info panel. this._pickedFeaturesSubscription = knockout.getObservable(terria, 'pickedFeatures').subscribe(pickedFeatures => { if (defined(pickedFeatures)) { this.featureInfoPanelIsVisible = true; this.featureInfoPanelIsCollapsed = false; } }, this); const updateIsMapFullscreen = () => { this.isMapFullScreen = (terria.userProperties.hideWorkbench === '1' || terria.userProperties.hideExplorerPanel === '1'); }; this.terria.getUserProperty('hideWorkbench'); this.terria.getUserProperty('hideExplorerPanel'); this._userPropertiesHideWorkbenchSubscription = knockout.getObservable(terria.userProperties, 'hideWorkbench').subscribe(updateIsMapFullscreen); this._userPropertiesHideEPSubscription = knockout.getObservable(terria.userProperties, 'hideExplorerPanel').subscribe(updateIsMapFullscreen); this._mobileMenuSubscription = knockout.getObservable(this, 'mobileMenuVisible').subscribe(mobileMenuVisible => { if (mobileMenuVisible) { this.explorerPanelIsVisible = false; this.switchMobileView(null); } }); this._disclaimerHandler = new DisclaimerHandler(terria, this); } dispose() { this._pickedFeaturesSubscription.dispose(); this._unsubscribeErrorListener(); this._mobileMenuSubscription.dispose(); this._userPropertiesHideWorkbenchSubscription.dispose(); this._userPropertiesHideEPSubscription.dispose(); this._disclaimerHandler.dispose(); } openAddData() { this.explorerPanelIsVisible = true; this.activeTabCategory = 'data-catalog'; } openUserData() { this.explorerPanelIsVisible = true; this.activeTabCategory = 'my-data'; } closeCatalog() { this.explorerPanelIsVisible = false; } searchInCatalog(query) { this.openAddData(); this.searchState.catalogSearchText = query; this.searchState.searchCatalog(); } viewCatalogMember(catalogMember) { if (addedByUser(catalogMember)) { this.userDataPreviewedItem = catalogMember; this.openUserData(); } else { this.previewedItem = catalogMember; this.openAddData(); if (this.terria.configParameters.tabbedCatalog) { // Go to specific tab this.activeTabIdInCategory = getAncestors(catalogMember)[0].name; } } } switchMobileView(viewName){ this.mobileView = viewName; } getNextNotification() { return this.notifications[0]; } hideMapUi() { return this.getNextNotification() && this.getNextNotification().hideUi; } }