{"version":3,"sources":["webpack:///./Shared/Classes/Mediator.js","webpack:///./Shared/Widgets/MessageManager/MessageObserver.js","webpack:///./Shared/Helpers/html.js","webpack:///./Shared/Helpers/StyleConstants.js","webpack:///./Shared/Widgets/GenericSearch/Result.js","webpack:///./Shared/Widgets/GenericSearch/ResultSet.js","webpack:///./Shared/Helpers/auth.js","webpack:///./Shared/Widgets/GWindow.js","webpack:///./Shared/Helpers/storage.js","webpack:///./src/utils/sleep.js","webpack:///./Shared/Widgets/NodeHash.js","webpack:///./src/banner-message.js","webpack:///./src/banner-message.less?a6dd","webpack:///./src/update-check.js","webpack:///./Shared/Helpers/arcgis/feature-layer-utils.ts","webpack:///./src/utils/Observer.js","webpack:///./Shared/Widgets/GWindowList/index.js","webpack:///./eCounty/Widgets/utils.js","webpack:///./Shared/Widgets/GenericSearch/SearchUtility.js","webpack:///./Shared/Helpers/type.js","webpack:///./Shared/Widgets/JSTManager/JSTManager.js","webpack:///./Shared/Classes/Factory.js","webpack:///./Shared/Helpers/MapLayerCredientials.js","webpack:///./Shared/Widgets/MessageManager/MessageManager.js","webpack:///./Shared/Widgets/GWindowList/GWindowList.js","webpack:///./src/web-components/GWorksWindow.js","webpack:///./Shared/Widgets/gwindow.less?af8f","webpack:///./Shared/Widgets/GWindowList/Resizable.js","webpack:///./Shared/Widgets/GWindowManager.js","webpack:///./Shared/Widgets/MessageManager/screenSizeWarning.js","webpack:///./Shared/Widgets/MessageManager/ScreenSizeWarning.html","webpack:///./eCounty/Data.js","webpack:///./eCounty/Handlers.js","webpack:///./eCounty/Widgets/BasemapManager.js","webpack:///./eCounty/Widgets/BottomRightMenu.js","webpack:///./eCounty/Widgets/bottom-right-menu.less?56c2","webpack:///./eCounty/Widgets/CenterMenu.js","webpack:///./eCounty/Widgets/LayersManager.js","webpack:///./eCounty/Widgets/toc.less?34e4","webpack:///./eCounty/Widgets/RightMenu.js","webpack:///./Shared/Widgets/PaymentSearch/PaymentSearch.js","webpack:///./eCounty/Widgets/ToolsManager.js","webpack:///./eCounty/Main.js"],"names":["serverData","jstManager","_handlers","_widgets","currentUser","inMobileMode","showTabletOption","showDesktopOption","tabletMode","desktopMode","isMobileDevice","showDesktopMessage","showDesktopWarning","ignoreURLTab","constructor","config","this","JSTManager","layerConfigs","isMobile","_isMobile","window","addEventListener","test","navigator","userAgent","_getWidth","self","innerHeight","innerWidth","document","documentElement","clientHeight","clientWidth","body","defineHandler","name","fn","handle","command","hasOwnProperty","Array","isArray","args","handler","registerHandlers","fnHash","store","value","deleteOnReload","startup","push","destroyStoredWidgets","forEach","w","domNode","remove","destroyWidget","hasWidgetsToDelete","length","widget","dijit","registry","id","destroyRecursive","destroy","AlwaysOnIdentify","helppage","destroyWidgets","mapLayerCredientials","login","toolsManager","baseMapManager","layermanager","centerMenu","rightMenu","bottomRightMenu","resultsPanel","paymentPanel","CartPanel","leftPanel","gWindowManager","getCurrentLayer","_processLoginData","initChurnZero","getCurrentTabName","getLayersVisibleAtCurrentScale","getCurrentTabID","getTabNameByLabel","tabLabel","tabName","replace","trim","tabLableKey","TabLabel","getCurrentTabLabel","getQueryParameter","CheckSub","GetLayerIDByName","GetLayerIDListByName","RegisterPreserveLayer","RegisterProtectedLayer","ClearGraphics","GetFrontEndOptionIDByName","map","currentTab","activeTool","currentToolGroup","createAndShowPanel","MapNavExtraTools","ToolsTitleDiscription","MapNavigation","Full_Extent","Zoom_In","Zoom_Out","Zoom_To_Previous_Extent","Zoom_To_Next_Extent","Clear_","BRatio","BulkImageUploader","BookmarkPublic","Current_Location","WeedsInfestation","PinDrop","PublicNotice","RoadsProjectManagement","ReportBuilder","TMRM","Factory","preserveLayers","protectedLayers","messageObserver","Observer","messageManager","MessageManager","subscribe","message","addMessage","parseHtml","string","tmp","createElement","innerHTML","children","template","substitutions","String","raw","DRAW","Style","image","Circle","fill","Fill","color","stroke","Stroke","width","radius","REDCIRCLE","WARNINGTEXT","text","Text","font","BUFFER","HIGHLIGHT","PARCEL","POINT","ROTATE","Icon","src","size","STOP","displayName","layerID","feature","mapping","merged","fromFindResult","findResult","layerId","LayerName","CamaField","LayerField","source","fromQueryResult","fromControllerResult","result","DisplayValue","Feature","attributes","Fields","categories","results","mappings","setSource","addResult","category","i","r","isGISCamaKeyMatched","oldAttributes","includes","cleanResults","cleanParcels","hasMerged","hasDecimal","cleanedArray","decimalRegexp","j","res","moveMergedParcelToTop","cleanPrivateParcels","privateParcels","pid","Object","values","mergedObject","splice","unshift","addMapping","isEmpty","cat","numResults","numFound","gisKey","camaKey","layerField","gKey","cKey","toLowerCase","toString","define","Deferred","request","init","options","loginUrl","logoutUrl","entityName","loggedIn","siteHasLogin","siteLoginRequired","permissionRequiredForTab","loginInfo","authenticate","username","password","that","deferred","postData","JSON","stringify","e","sendRequest","then","data","CredencialMsg","reject","resolve","err","promise","url","method","handleAs","headers","Accept","logout","classList","add","assign","autoResize","className","closeCallback","content","key","position","showCloseButton","startMinimized","title","callbacks","close","closable","label","show","appendChild","cb","observer","MutationObserver","delayRefresh","observe","childList","subtree","disconnect","domStyle","set","top","left","_destroyed","toggle","deleteGWin","addCloseCallback","closing","dispatchEvent","CustomEvent","bubbles","detail","isMinimized","timeout","clearTimeout","_timeoutID","setTimeout","refresh","setContent","node","setValue","localStorage","setItem","getItem","parse","startsWith","ms","Promise","NodeHash","createNode","initItems","noNestedDiv","containerNode","nodeHash","dataAttr","count","itemParams","_makeArray","param","_initNode","keys","containsKey","get","getIndex","previousSibling","getKey","getAttribute","isItem","itemEventListener","eventName","callback","ref","pauseInterval","thisArg","selector","pauseOnEvent","isPaused","event","target","closest","_getContainingItemKey","call","_getContainingItem","currentNode","parentNode","setAttribute","onClose","html","item","prepend","dismissButton","api","__esModule","default","module","exports","locals","timeoutKey","isFetching","isMessageDisplayed","async","updateCheck","fetch","cache","ok","process","json","timestamp","hasUpdate","catch","console","error","finally","token","$","ajax","f","dataType","layerInfos","layers","types","defaultAttributes","layer","type","pushTemplates","templates","getDefaultAttributes","Mediator","jstError","fieldInfo","attribute","nullable","defaultValue","getDomInputType","Date","geometryType","GeometryType","LINE_STRING","POLYGON","prototype","broadcast","observers","subscriber","unsubscribe","filter","entry","updatesUrl","URL","location","href","searchParams","append","Error","resultSetFromPids","resultSet","ResultSet","Source","Features","Name","Results","Result","groupBy","list","jstToolEvent","action","msg","lat","long","jstEvent","jstMapEvent","jst","jstWarn","logLevel","entity","department","loglevel","dependencies","genericsearchbar","require","loginpage","resultspanel","cartpanel","activitymanagement","address","alwaysonidentify","bratio","buffer","bookmark","bulkimageuploader","dmat","draw","identify","landuse","mapnavigation","full_extent","zoom_in","zoom_out","zoom_to_previous_extent","zoom_to_next_extent","clear_","pan","measure","personalproperty","pictometry","print","photo","plume","bookmarkpublic","salessearch","quicksearch","instrumentsearch","paymentpanel","subscription","editor","weedsinfestation","current_location","pindrop","publicnotice","roadsprojectmanagement","reportbuilder","tmrm","_cache","mod","params","MyObj","Constructor","oldcredentials","credentialRenewalTasks","layerTypeUserId","timerOffset","getMapLayerAuthenticated","curTabId","FrontEndOption","BoltonMenk","auth","privateLayerData","tabID","requestDataResults","Key","credentialObject","createLayerCredientialObject","UserID","crediencialObject","credentials","dojo","clone","tokentimeout","Expiration","isNaN","Number","parseFloat","renewMapLayerCredentials","updateAllMapLayersCrediential","Status","Code","Message","isCredientialsExpired","isCredientialExpired","credential","now","expires","mapLayers","dynamicLayers","updateLayersObjsCrediential","layersObjs","thisLayerUserId","curLayer","getCredientialByUserId","getSource","getParams","updateParams","UserId","userId","time","userid","hostname","tokenServiceUrl","adminTokenServiceUrl","server","resource","imObject","serverInfos","shortLivedTokenValidity","currentVersion","hasServer","oAuthInfos","validity","ssl","creationTime","scope","resources","getNewCredentialsOrdered","newcredentials","concat","getLayerURLandToken","layerObj","isJson","curCreds","resultObj","tokenString","url_","expired","indexOf","shiftUp","height","offsetHeight","adjustedHeight","offsetTop","fx","animateProperty","duration","properties","play","stripHTMLTags","str","bind","previousMessage","toolName","domList","closeButton","textContent","messageDiv","titleSpan","messageContainer","toolLeaveScreen","leaveScreen","getElementById","getValue","openTool","addToolNode","addNode","baseUrl","cleanMessage","errorLoggingUrl","right","style","offsetWidth","marginLeft","marginRight","checkbox","htmlFor","button","directionsLabel","offsetLeft","opacity","index","checked","initGWindows","resizable","gWindows","Map","resizeHelper","Resizable","domRef","startResizing","p","windowResizeHandler","removeEventListener","enableResizing","gWindow","autoResizeHandler","_trackGWin","GWindow","_createGWindow","addTool","_trackTool","_createToolGWindow","isGWindowKey","preventDestruction","_untrackGWin","gwin","getGWindow","c","closeAllOpened","toggleKeys","Set","from","entries","openAllClosed","keySet","promises","reverse","toggleKey","all","__timeoutID","visibleGWindows","getComputedStyle","display","gWindowsOpened","gWindowsClosed","usableSpace","parseInt","maxHeight","reduce","total","getBoundingClientRect","marginBottom","current","newMaxHeight","Math","floor","setProperty","tocNode","querySelector","ej2_instances","tempLayers","tempBasemap","delete","GWorksWindow","LitElement","reflect","Boolean","css","super","connectedCallback","update","changedProperties","has","disconnectedCallback","onToggleClick","newShow","onCloseClick","render","unsafeHTML","customElements","handlePointerDown","handlePointerMove","handlePointerOut","enabled","ownerDocument","passive","onLeftBorder","initialLeft","initialWidth","innerPointerMove","newWidthOffset","clientX","newWidth","min","max","once","stopPropagation","cursor","clientY","GWindowManager","closeAllWindows","createGWindow","_closeGWinCallback","removeGWindow","destroyGWindow","screenSizeWarningModal","parseHTML","screenSizeWarningTemplate","on","modal","preProcess","isExceedMaxZoom","_initChurnZero","_getCurrentTabName","_getLayersVisibleAtCurrentScale","_getCurrentTabID","_getCurrentTabLabel","_GetQueryParameter","getDemoCountyName","_getDemoCountyName","getCountyDisplayName","_getCountyDisplayName","_CheckSub","_GetLayerIDByName","_GetLayerIDListByName","_RegisterPreserveLayer","_RegisterProtectedLayer","_ClearGraphics","postProcess","setInitialTab","searchBar","paramName","parameterName","search","slashIndex","substring","split","decodeURI","layerName","temp","preserve","protect","getLayers","isProtected","ol_uid","isPreserved","LayerVector","clear","Options","detailsPanel","isSub","sub","countyName","_dumbLogic","curTabLabel","_isDemoTab","_getEntityNameFromDemoTab","tabLabelParts","curTabName","startUpTab","Tabs","TabName","TabIDs","ID","LoginInfo","LayerConfigurations","UserName","userRoles","UserRoles","StartUpTab","TabTools","TabLayers","TabSubLayers","TabFeatureLayers","widgetItems","userPermissions","UserPermissions","permission","curTabInfo","DatabaseID","TabQuickSearches","QuickSearches","FeatureLayers","Tools","processLoginData","MapService","SubMapService","ChurnZero","success","Ids","AccountExternalId","ContactExternalId","currentLayer","currentVisibleLayers","visibleLayers","returnResult","annotationID","curLayerInfo","_getCurrentLayerByID","isNotAnnotation","subLayerIds","parentLayerId","isInScaleRange","minScale","getHandlers","graphicsSource","SourceVector","graphicsLayer","renderOrder","featureA","featureB","PID","loadStartUpTool","targetTool","toolUrl","getTool","hasTool","startupTools","hasStartupTools","tabHasStartupTools","bootStartupTools","toolContainer","toolsMain","firstElementChild","toolsSecondary","click","closeActiveTool","tool","hasContent","handleAlwaysOnIdentify","resume","mobileLeftVisible","hideMobileLeft","mobileSearchVisible","hideMobileRight","toolGWin","mobileTool","toolTitleDescription","bottom","maxWidth","zIndex","otherParams","GWindowParams","msgBox","tab","hasStartupTool","disableSpecialBootUp","ac","reset","zoomToCurrentLayerFullExtent","toolsMenuWidget","getToolsMenuButtonsForTab","switchBaseMapForTab","getTOC","getDomNode","copyTools","updateHelpInfo","clearList","setSearchPlaceHolder","populateAdvancedSearch","setSelectListValue","buttonHandler","activeToolName","shutdownActiveTool","resultGWin","gNameInput","gName","zoomToGeometry","clearMap","loadResults","displayResults","gWindowList","getTargetElement","showWaitCursor","isMapLoading","loading","hideWaitCursor","keepSalesSearch","keepPaymentSearch","keepInstrumentSearch","keepQuickSearch","clearSearchInput","hideResults","addSubResult","featureArray","zoomToExtent","forceZoom","hasGeometry","removeLayer","addLayer","geometry","getGeometry","getType","olFeature","setStyle","addFeature","geom","getView","animate","center","getCoordinates","zoom","fit","getExtent","nearest","searchStrings","strDate","paymentType","loadPanel","parcelId","typeId","addToCart","open","searchString","executeSearch","searchPersonalProperty","zoomToSTR","section","township","range","_tools","thumbnailGridDiv","combineMapUrl","mapserver","mapservicename","tabsDefaultBasemap","SubOptions","log","loadLayers","onExtentChange","isLoadingEmptyImage","is","urls","streetLabel","EntityAerials","aerial","Label","baseMapBtnsWidget","_toggleSelectBtnCSS","currentBasemap","basemapName","switchBaseMap","getCurrentBasemap","baseMapLayers","TileLayer","OSM","XYZ","crossOrigin","transition","streetUrl","maxZoom","streetMaxZoom","entityAerial","AerialServer","AerialServiceName","MaxZoom","basemap","prevBasemap","curBasemap","insertAt","warn","loadEmptyCacheImage","attr","toggleIsLightBasemap","toggleOSMCredit","updateLogo","curZoomLevel","getZoom","setZoom","aerials","targetId","tileMaxZoom","find","a","removeClass","addClass","mouseCoordinates","dataUpdateContainer","OSMCreditContainer","latlng","showCoordinates","initializeCoordinates","getUpdateInformation","updates","updateMessage","maxDate","updated","toLocaleDateString","un","isLightBasemap","isOSMBasemap","copyCoordsToClipboard","queryCommandSupported","longitude","latitude","mapPoint","copyText","element","tagName","focus","setSelectionRange","select","rangeObj","createRange","selectNodeContents","selection","getSelection","removeAllRanges","addRange","selectText","execCommand","coordinate","toLonLat","toFixed","isDecimalDegrees","latDMS","calculateDMS","longDMS","degrees","minutes","seconds","toggleLatLongStyle","showDegreesMinutesSeconds","showDecimalDegrees","decimalCoord","ceil","remainder","abs","lastButtonPressed","buttonExists","buttonName","tabs","btnName","some","tabSelectList","optionNameToIndex","menuButtons","menuBtns","selectBtn","tabContainer","tabSelect","searchContainer","navToolMain","postCreate","defaultTabs","tabsBtnsGridWidget","tw","btnsGrid","querySelectorAll","addGridBtnsToAttachPoints","getTabMenuNodeHash","getInitTabsToItems","setDisplayNameAndLogo","setTabContainerWidth","EntityNameDisplayType","displayNameLabel","currentMenuBtn","contains","inner","roadsTabLink","Value","stateName","StateFull","siteNameDiv","isBelowToolbar","currentInnerHtml","getDisplayName","classNameTobeAdded","parentElement","tools","regTools","navTools","getToolColor","lang","btnNameInput","currentTabName","expirationDate","setFullYear","getFullYear","toUTCString","tabNameInURL","entityDisplayName","_onNodeChecked","layerLookup","layerInfo","inactiveParent","getNode","isChecked","_subLayerInfos","expandAll","collapseAll","updatedLayerIds","_getUpdatedLayerIds","curId","curIndex","_updateVisibleLayers","setVisibleLayers","checkedNodes","getAllCheckedNodes","_addSubLayers","topId","childLayerIds","addSubLayer","childLayerId","childIsChecked","isParent","tocWidgetsReplace","isFirstLoad","layerUrl","getUrl","fetchSubFeature","curTab","formatSub","getAvailableChildLayers","_getAvailableChildLayers","treeData","loadTOC","switchLayersForTab","tabKey","removeAllSubMapLayers","layerKey","removeLayerFromMap","oldLayer","alwaysZoom","loaded","zoomToLayer","view","getProjection","getCode","fullExtent","spatialReference","latestWkid","fitParams","layerExtent","xmin","ymin","xmax","ymax","mapCentered","containsCoordinate","getCenter","calculateExtent","tablayers","tabSublayers","getDynamicMapServiceLayer","tabSub","subTabName","layerurl","subs","ImageArcGISRest","hidpi","ratio","dynamicLayerKey","Image","LAYERS","join","setVisible","btnKey","container","_getLegendInfo","tocTitle","sliderContainer","Slider","getOpacity","step","change","setOpacity","_makeSlider","treeObj","treeContainer","TreeView","cssClass","fields","dataSource","child","imageUrl","showCheckBox","autoCheck","nodeChecked","nodeClicked","getNodeData","uncheckAll","checkAll","expandOn","animation","expand","collapse","_makeTreeView","menuId","menuContainer","selectedNode","ContextMenu","beforeOpen","HTMLElement","listItem","items","extent","getAuthenticatedLayerURLandToken","urlTokenObj","zoomLayer","_onContextMenuSelect","_makeContextMenu","fillTOC","_processServiceInfo","initialExtent","defaultVisibleLayers","defaultVisibility","_processLegendInfo","hiddenLayers","_getHiddenLayers","slice","_AddIconData","_ProcessTreeData","entityType","LayerID","IsVisible","legInfo","legend","icon","imageData","curLegInfo","treeId","htmlAttributes","expanded","parent","_nestLayerInfos","visibleIndex","_isValidTreeData","subLayerInfos","subLayer","_isValidGroupLayer","hasVisibleSubLayer","subLayerInfo","undefined","GWindowList","hasResultsPanel","salesSearch","instSearch","quickSearch","PaymentSearch","loadingContainer","createLoadingContainer","helpContainer","placeAt","hasAdminTools","origin","pathname","createAdminButton","textIndent","createProfileButton","buttonContainer","Create","showMobileRight","resultNode","sidePanel","layername","setResult","showAllOnMap","resultsSidePanel","positionInput","keepOpen","visibility","tabTools","clearSearchOptions","hasAdvancedSearch","isLoaded","createInstrumentSearch","addSearchOption","isWindowOpen","onSubmitPaymentSearch","cartButton","searchOptions","quickSearchGWindow","bootUp","searchOptionBtn","showSearchOption","searchUtil","SearchUtility","bootUpPersonalProperty","parentDom","searchedType","val","serialize","onSearchSuccess","DONT_SHOW_SET","PAUSE_ALWAYS_ON_ID","COLOR_KEYS","COLOR_MAP","NO_CONTENT_SET","ATOMIC_OP_SET","ToolsManager","_tabTools","nextActiveToolName","isSelfClose","_nodeHashByTab","nodeHashes","getNodeHash","colorGroups","option","UserSpecificTool","certifiedUsers","ShowButton","nextItems","sort","_alphabeticalish","toUpperCase","_getInitItemsForTab","_initialAllToolMenuButton","loadMapNavigation","getToolWidgetAsync","mapNavigation","curTabTools","_getToolsMenuButtonsForTab","isMapNavTool","toolNames","input","searcher","txtSearch","activateTool","bootUpSpecialTool","bootUpTool","mnt","zoomIn","zoomOut","toggleGeolocationTracking","_zoomAndTrack","stopGeolocationTracking","_bootUpMapNavTool","_callToolMethod","arg","_callToolMethodSpecial","bootUpActiveTool","bootUpSpecialActiveTool","shutdownTool","navToolbar","deactivate","_widgetName","isAtomicOpTool","stack","bootUpSpecial","tabNameInput","tabNames","currentTabTools","pause","PersonalProperty","mixPersonalPropertyData","mixedResults","getArray","addArray","pop","domClass","clearRegExp","RegExp","locationRegExp","t1","t2","b","errorOld","others","onerror","line","col","mSort","each","_","group","jQuery","ajaxSetup","MapLayerCredientials","ctrlKey","keyCode","streetViewURL","Data","_destroyWidgets","div","loginInit","_LoginInit","_loadLoginPanel","_init","showDisclaimer","disclaimer","HelpBoxInfos","Title","needsDisclaimer","reloaded","startupWidgetsIds","_getCurRegisteredWidgetsIds","isDestroyed","NoDisclaimer","hide","initTabContainers","_loadToolManager","View","constrainResolution","fromLonLat","scaleAtZoom","getResolution","OLMap","controls","previousExtents","currentExtent","_loadMap","_bootUpAlwaysOnIdentify","BaseMapManager","LayersManager","CenterMenu","payment","_loadRightMenu","BottomRightMenu","_loadBottomRightMenu","_loadCart","_loadLeftPanel","gWinManager","_loadGWindowManager","returnPageIndex","setupMobile","addTabletMode","removeTabletMode","showMobileLeft","revertToDesktop","_reloadWidgets","tabletModeButton","helpButtonContainer","insertBefore","firstChild","loginContainer","curEntityDisplayName","showDesktopTabs","loadingMain","helpTabContainer","mobileLeft","helpButtons","removeChild","curMobileDisplayName","mobileCountyName","nextSibling","mobileRight","sw","toolsButton","hideButton","clearButton","mobileSearchButton","searchHideButton","desktopButton","desktopMobileButton","searchContainerMain","toolsContainerMain","_unused","hideTools","webkitTransform","getTranslate","transform","host","desktopMessageTimer","constants","curWidgetsIds","len","curWidget","curDijit","byId","RightMenu","lazyLoad","toArray","d"],"mappings":"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","file":"26.5c818a9071fc3ef895e2.js","sourcesContent":["import forIn from 'lodash/forIn';\r\nimport get from 'lodash/get';\r\nimport set from 'lodash/set';\r\n\r\nimport JSTManager from 'gisw/Widgets/JSTManager/JSTManager';\r\n\r\nimport Factory from './Factory';\r\n\r\nconst Mediator = {\r\n /** @type {ServerData} */\r\n serverData: null,\r\n /** @type {JSTManager} */\r\n jstManager: null,\r\n /** @type {Record} */\r\n _handlers: {},\r\n _widgets: [],\r\n\r\n currentUser: '',\r\n inMobileMode: false,\r\n showTabletOption: false,\r\n showDesktopOption: false,\r\n tabletMode: false,\r\n desktopMode: false,\r\n isMobileDevice: false,\r\n showDesktopMessage: false,\r\n showDesktopWarning: false,\r\n\r\n ignoreURLTab: false,\r\n\r\n /**\r\n * @param {object} config\r\n * @param {ServerData} config.serverData\r\n * An object containing data necessary for running the website, e.g.\r\n * URLs to web services, available tabs, and tools. This data is\r\n * set by the server in a (cs)html file and passed to the\r\n * constructor. (see `Views/eCounty/Index.cshtml`)\r\n */\r\n constructor (config) {\r\n this.serverData = config.serverData;\r\n\r\n this.jstManager = new JSTManager();\r\n\r\n // get this out of server data so we can update it when a user logs in\r\n // (server data is read only and should not be used for dynamic info)\r\n this.currentUser = this.serverData.currentUser;\r\n this.layerConfigs = this.serverData.layerConfigs;\r\n this.isMobile = this._isMobile();\r\n\r\n window.addEventListener('resize', () => {\r\n this.isMobile = this._isMobile();\r\n });\r\n },\r\n\r\n _isMobile () {\r\n if (/android|ios/.test(navigator.userAgent)) {\r\n this.inMobileMode = true;\r\n this.isMobileDevice = true;\r\n\r\n if (this._getWidth() > 900) {\r\n this.showTabletOption = true;\r\n this.showDesktopOption = true;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n if (this._getWidth() < 1024 && this._getWidth() > 750) {\r\n this.showDesktopMessage = false;\r\n this.showDesktopWarning = true;\r\n this.showTabletOption = true;\r\n this.showDesktopOption = true;\r\n }\r\n\r\n if (this._getWidth() <= 750) {\r\n this.showDesktopWarning = false;\r\n this.showDesktopMessage = true;\r\n this.showDesktopOption = false;\r\n this.showTabletOption = false;\r\n // this.inMobileMode = true;\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n\r\n _getWidth () {\r\n if (self.innerHeight) {\r\n return self.innerWidth;\r\n }\r\n\r\n if (document.documentElement && document.documentElement.clientHeight) {\r\n return document.documentElement.clientWidth;\r\n }\r\n\r\n return document.body.clientWidth;\r\n },\r\n\r\n /**\r\n * @method Mediator#defineHandler\r\n * @description Use this method to define more methods for Mediator using\r\n * strings. Use \"dot\" notation to emulate namespacing of actions.\r\n *\r\n * @example\r\n * myMediator.defineHandler(\"tool.small\", function(args) {\r\n * \t\t// do something w/ args\r\n * });\r\n *\r\n * // to use...\r\n * myMediator.handle({\r\n * \t\tname: \"tool.small\",\r\n * \t\targs: [arg1,arg2,...]\r\n * }, this);\r\n *\r\n * @param {string} name\r\n * Name of method; can use \"dot\" notation.\r\n * @param {function} fn\r\n * defintion of method specified by name\r\n * @return {void}\r\n */\r\n defineHandler (name, fn) {\r\n set(this._handlers, name, fn);\r\n },\r\n\r\n /**\r\n * @template {import('eCounty/Handlers').HandlerNames} T\r\n * @param {object} command\r\n * @param {T} command.name\r\n * @param {import('eCounty/Handlers').HandlerParams} [command.args=[]]\r\n * @returns {ReturnType}\r\n */\r\n handle (command) {\r\n if (!command.hasOwnProperty('name') || typeof command.name !== 'string') {\r\n return null;\r\n }\r\n\r\n if (!command.hasOwnProperty('args')) {\r\n command.args = [];\r\n } else if (!Array.isArray(command.args)) {\r\n command.args = [command.args];\r\n }\r\n\r\n const handler = get(this._handlers, command.name);\r\n return handler(...command.args);\r\n },\r\n\r\n /**\r\n * Define multiple handlers\r\n * @param {Record} fnHash\r\n * each key name is a string that defines a handler function\r\n * for the action of the same name\r\n */\r\n registerHandlers (fnHash) {\r\n forIn(fnHash, (fn, name) => {\r\n set(this._handlers, name, fn);\r\n });\r\n },\r\n\r\n /**\r\n * Convenience method for adding properties to a mediator.\r\n * If `value` has a `startup` method, e.g. if `value` is a widget,\r\n * then that widget's start method is called automatically.\r\n * @param {string} name\r\n * key used to access `value` via `Mediator` instance.\r\n * @param {any} value item to store\r\n * @param {boolean} [deleteOnReload]\r\n */\r\n store (name, value, deleteOnReload = true) {\r\n set(this, name, value);\r\n\r\n if (typeof value.startup === 'function') {\r\n value.startup();\r\n }\r\n\r\n if (deleteOnReload) {\r\n this._widgets.push(value);\r\n }\r\n },\r\n\r\n destroyStoredWidgets () {\r\n this._widgets.forEach(w => {\r\n if (w.domNode) {\r\n w.domNode.remove();\r\n }\r\n\r\n this.destroyWidget(w);\r\n });\r\n\r\n this._widgets = [];\r\n },\r\n\r\n hasWidgetsToDelete () {\r\n return this._widgets.length > 0;\r\n },\r\n\r\n destroyWidget (widget) {\r\n if (!widget) {\r\n return;\r\n }\r\n\r\n dijit.registry.remove(widget.id);\r\n\r\n if (widget.destroyRecursive) {\r\n widget.destroyRecursive();\r\n }\r\n\r\n if (widget.destroy) {\r\n widget.destroy();\r\n }\r\n },\r\n\r\n // Defined in `eCounty/Main`\r\n /** @type {import('gisw/Tools/AlwaysOnIdentify/AlwaysOnIdentify').default} */\r\n AlwaysOnIdentify: null,\r\n /** @type {import('eCounty/Widgets/HelpPage').default} */\r\n helppage: null,\r\n destroyWidgets: null,\r\n /** @type {import('gisw/Helpers/MapLayerCredientials').default} */\r\n mapLayerCredientials: null,\r\n login: null,\r\n /** @type {import('eCounty/Widgets/ToolsManager').default} */\r\n toolsManager: null,\r\n /** @type {import('eCounty/Widgets/BasemapManager').default} */\r\n baseMapManager: null,\r\n /** @type {import('eCounty/Widgets/LayersManager').default} */\r\n layermanager: null,\r\n /** @type {import('eCounty/Widgets/CenterMenu').default} */\r\n centerMenu: null,\r\n /** @type {import('eCounty/Widgets/RightMenu').default} */\r\n rightMenu: null,\r\n /** @type {import('eCounty/Widgets/BottomRightMenu').default} */\r\n bottomRightMenu: null,\r\n /** @type {import('gisw/Widgets/GenericSearch/ResultsPanel').default} */\r\n resultsPanel: null,\r\n paymentPanel: null,\r\n CartPanel: null,\r\n /** @type {import('gisw/Widgets/GWindowList').default} */\r\n leftPanel: null,\r\n /** @type {import('gisw/Widgets/GWindowManager').default} */\r\n gWindowManager: null,\r\n\r\n // Defined in `eCounty/Data`\r\n getCurrentLayer: null,\r\n _processLoginData: null,\r\n initChurnZero: null,\r\n getCurrentTabName: null,\r\n getLayersVisibleAtCurrentScale: null,\r\n getCurrentTabID: null,\r\n\r\n /**\r\n * @param {string} tabLabel\r\n */\r\n getTabNameByLabel (tabLabel) {\r\n const tabName = tabLabel.replace('
', ' ').trim();\r\n\r\n for (const tabLableKey in this.serverData.TabLabel) {\r\n if (this.serverData.TabLabel[tabLableKey] === tabName) {\r\n return tabLableKey;\r\n }\r\n }\r\n\r\n return tabName;\r\n },\r\n\r\n getCurrentTabLabel: null,\r\n getQueryParameter: null,\r\n CheckSub: null,\r\n GetLayerIDByName: null,\r\n GetLayerIDListByName: null,\r\n RegisterPreserveLayer: null,\r\n RegisterProtectedLayer: null,\r\n ClearGraphics: null,\r\n GetFrontEndOptionIDByName: null,\r\n /** @type {import('ol/Map').default} */\r\n map: null,\r\n /** @type {string} */\r\n currentTab: null,\r\n activeTool: null,\r\n currentToolGroup: null,\r\n createAndShowPanel: null,\r\n MapNavExtraTools: [\r\n 'Zoom_In',\r\n 'Zoom_Out',\r\n 'Zoom_To_Previous_Extent',\r\n 'Zoom_To_Next_Extent',\r\n 'Clear_',\r\n 'Full_Extent',\r\n 'Pan',\r\n 'Current_Location'\r\n ],\r\n\r\n /* eslint-disable camelcase */\r\n /** @type {Record} */\r\n ToolsTitleDiscription: {\r\n MapNavigation: 'Map Nav.',\r\n Full_Extent: 'Full Extent',\r\n Zoom_In: 'Zoom In',\r\n Zoom_Out: 'Zoom Out',\r\n Zoom_To_Previous_Extent: 'Previous',\r\n Zoom_To_Next_Extent: 'Next',\r\n // @ts-ignore\r\n Clear_: 'Clear',\r\n BRatio: 'Base Ratio',\r\n BulkImageUploader: 'Bulk Photos Uploader',\r\n BookmarkPublic: 'Bookmark',\r\n Current_Location: 'Current Location',\r\n WeedsInfestation: 'Weeds Infestation',\r\n PinDrop: 'Pin Drop',\r\n PublicNotice: 'Public Notice',\r\n RoadsProjectManagement: 'Roads Projects',\r\n ReportBuilder: 'Report Builder',\r\n TMRM: 'Tablet MRM'\r\n },\r\n /* eslint-enable camelcase */\r\n Factory: new Factory(),\r\n preserveLayers: null,\r\n protectedLayers: null\r\n};\r\n\r\nif (process.env.NODE_ENV === 'development') {\r\n // @ts-ignore\r\n window.mediator = Mediator;\r\n}\r\n\r\nexport default Mediator;\r\n","import Observer from 'src/utils/Observer';\r\n\r\nimport MessageManager from './MessageManager';\r\n\r\n/**\r\n * @typedef {object} MessageData\r\n * @property {number} [duration]\r\n * @property {string} message\r\n * @property {string} title\r\n * @property {string} [toolName]\r\n */\r\n\r\n/** @type {Observer} */\r\nconst messageObserver = new Observer();\r\n\r\nexport const messageManager = new MessageManager();\r\n\r\nmessageObserver.subscribe(message => {\r\n messageManager.addMessage(message);\r\n});\r\n\r\nexport default messageObserver;\r\n","/**\r\n * Note: `thead`, `tbody`, `tr`, `th`, `td` must be inside a ``\r\n * @param {TemplateStringsArray} template\r\n * @param {...any} substitutions\r\n */\r\nexport function html (template, ...substitutions) {\r\n return parseHtml(String.raw(template, ...substitutions));\r\n}\r\n\r\n/**\r\n * @param {string} string\r\n * @returns {HTMLCollection}\r\n */\r\nfunction parseHtml (string) {\r\n const tmp = document.createElement('div');\r\n tmp.innerHTML = string;\r\n return tmp.children;\r\n}\r\n\r\nexport default parseHtml;\r\n","import Circle from 'ol/style/Circle';\r\nimport Fill from 'ol/style/Fill';\r\nimport Icon from 'ol/style/Icon';\r\nimport Stroke from 'ol/style/Stroke';\r\nimport Style from 'ol/style/Style';\r\nimport Text from 'ol/style/Text';\r\n\r\nexport const DRAW = new Style({\r\n image: new Circle({\r\n fill: new Fill({ color: '#ffffff88' }),\r\n stroke: new Stroke({ color: '#0099ffff', width: 3 }),\r\n radius: 2\r\n }),\r\n fill: new Fill({ color: '#ffffff88' }),\r\n stroke: new Stroke({ color: '#0099ffff', width: 3 })\r\n});\r\n\r\nexport const REDCIRCLE = new Style({\r\n image: new Circle({\r\n fill: new Fill({ color: '#ffffff88' }),\r\n stroke: new Stroke({ color: '#ff2200ff', width: 3 }),\r\n radius: 2\r\n }),\r\n fill: new Fill({ color: '#ffffff88' }),\r\n stroke: new Stroke({ color: '#ff2200ff', width: 3 })\r\n});\r\n\r\nexport const WARNINGTEXT = new Style({\r\n stroke: new Stroke({ color: '#ff220000', width: 1 }),\r\n fill: new Fill({ color: '#ff2200ff' }),\r\n text: new Text({\r\n font: '18px Calibri,sans-serif',\r\n fill: new Fill({ color: '#ff2200ff' })\r\n })\r\n});\r\n\r\nexport const BUFFER = new Style({\r\n stroke: new Stroke({ color: '#8a0ab5FF', width: 2 }),\r\n fill: new Fill({ color: '#8a0ab540' })\r\n});\r\n\r\nexport const HIGHLIGHT = new Style({\r\n stroke: new Stroke({ color: '#00ffffff', width: 3 }),\r\n fill: new Fill({ color: '#00000000' }),\r\n image: new Circle({\r\n radius: 5,\r\n fill: new Fill({ color: '#00000000' }),\r\n stroke: new Stroke({ color: '#00ffffff', width: 3 })\r\n })\r\n});\r\n\r\nexport const PARCEL = new Style({\r\n stroke: new Stroke({ color: '#ff0000ff', width: 3 }),\r\n fill: new Fill({ color: '#00000000' })\r\n});\r\n\r\nexport const POINT = new Style({\r\n image: new Circle({\r\n radius: 5,\r\n fill: new Fill({ color: '#008080ff' }),\r\n stroke: new Stroke({ color: '#00ffffff', width: 3 })\r\n })\r\n});\r\n\r\nexport const ROTATE = new Style({\r\n image: new Icon({\r\n src: './Content/eCounty/images/rotate.png',\r\n size: [24, 24]\r\n })\r\n});\r\n\r\n/**\r\n * Used to highlight points to end drawings\r\n * Radius needs to match ol/interaction/Draw snapTolerance\r\n */\r\nexport const STOP = new Style({\r\n fill: new Fill({ color: '#ff0000ff' }),\r\n stroke: new Stroke({ color: '#ffffffff' }),\r\n image: new Circle({\r\n radius: 8,\r\n fill: new Fill({ color: '#ff0000ff' }),\r\n stroke: new Stroke({ color: '#ffffffff' })\r\n })\r\n});\r\n","import Feature from 'ol/Feature';\r\n\r\nclass Result {\r\n /**\r\n * @param {object} [config]\r\n * @param {string} [config.displayName]\r\n * @param {string | number} [config.layerID]\r\n * @param {Feature} [config.feature]\r\n * @param {import('./ResultSet').ResultSetMapping} [config.mapping]\r\n */\r\n constructor (config = {}) {\r\n this.displayName = config.displayName || null;\r\n\r\n if (config.layerID >= 0) {\r\n this.layerID = config.layerID;\r\n }\r\n\r\n this.feature = config.feature || null;\r\n this.mapping = config.mapping || null;\r\n this.merged = false;\r\n }\r\n\r\n /**\r\n * @param {object} findResult\r\n * @param {string} findResult.value\r\n * @param {string | number} findResult.layerId\r\n * @param {Feature} findResult.feature\r\n */\r\n fromFindResult (findResult) {\r\n this.displayName = findResult.value;\r\n this.layerID = findResult.layerId;\r\n this.feature = findResult.feature;\r\n this.mapping =\r\n this.layerID === 'Parcels'\r\n ? { LayerName: 'Parcels', CamaField: 'PID', LayerField: 'PID' }\r\n : null;\r\n this.source = 'GIS';\r\n }\r\n\r\n /**\r\n * Quick Search Results\r\n * @param {Feature} feature\r\n * @param {string} displayName\r\n * @param {string | number} layerID\r\n * @param {string} source\r\n */\r\n fromQueryResult (feature, displayName, layerID, source) {\r\n this.feature = feature;\r\n this.displayName = displayName;\r\n this.layerID = layerID;\r\n this.source = source;\r\n this.mapping = null;\r\n }\r\n\r\n /**\r\n * @param {object} result\r\n * @param {string} result.DisplayValue\r\n * @param {Record} result.Fields\r\n * @param {import('./ResultSet').ResultSetMapping} [mapping]\r\n */\r\n fromControllerResult (result, mapping = null) {\r\n this.displayName = result.DisplayValue;\r\n this.feature = new Feature();\r\n this.feature.attributes = result.Fields;\r\n this.mapping = mapping;\r\n }\r\n}\r\n\r\nexport default Result;\r\n","class ResultSet {\r\n constructor () {\r\n this.source = null;\r\n /** @type {Array} */\r\n this.categories = [];\r\n /** @type {Record} */\r\n this.results = {};\r\n /** @type {Record} */\r\n this.mappings = {};\r\n }\r\n\r\n /**\r\n * @param {string} source\r\n */\r\n setSource (source) {\r\n this.source = source;\r\n }\r\n\r\n /**\r\n * @param {string} category\r\n * @param {import('./Result').default} result\r\n */\r\n addResult (category, result) {\r\n // if object has a spatial mapping to a category we already have...\r\n // attempt to merge this object into existing result from gis layer\r\n if (\r\n result.mapping &&\r\n this.results.hasOwnProperty(result.mapping.LayerName)\r\n ) {\r\n const id = result.feature.attributes[result.mapping.CamaField];\r\n const results = this.results[result.mapping.LayerName];\r\n\r\n for (let i = 0; i < results.length; i++) {\r\n const r = results[i];\r\n\r\n if (\r\n !this.isGISCamaKeyMatched(\r\n r.feature.attributes[result.mapping.LayerField],\r\n id,\r\n result.mapping.LayerField\r\n )\r\n ) {\r\n continue;\r\n }\r\n\r\n // merge the attributes and spatial mapping\r\n // from the search controller into result from gis layer\r\n const oldAttributes = r.feature.attributes;\r\n\r\n // keep GlobalID if it exists\r\n if (oldAttributes.hasOwnProperty('GlobalID')) {\r\n result.feature.attributes['GlobalID'] = oldAttributes['GlobalID'];\r\n }\r\n\r\n r.feature.attributes = result.feature.attributes;\r\n r.mapping = result.mapping;\r\n r.merged = true;\r\n\r\n // don't need to add in its own category now\r\n return;\r\n }\r\n }\r\n\r\n // check if result set has given category, and add it if it doesn't\r\n const found = this.categories.includes(category);\r\n\r\n if (!found) {\r\n this.categories.push(category);\r\n this.results[category] = [];\r\n }\r\n\r\n this.results[category].push(result);\r\n }\r\n\r\n cleanResults () {\r\n this.cleanParcels();\r\n }\r\n\r\n /**\r\n * @private\r\n * Removes the extra parcels the ESRI find task gets when searching for PIDs\r\n * with a decimal in the name.\r\n *\r\n * ESRI Find task converts the full string into the smallest representation\r\n * and does a wild card search on that.\r\n *\r\n * I.E. for stanton county 0000181.00 will be transformed into 181\r\n * then wild card searched, returning results for 0001181.00, 0001810.01, etc.\r\n */\r\n cleanParcels () {\r\n const results = this.results['Parcels'];\r\n\r\n if (!results) {\r\n return;\r\n }\r\n\r\n let hasMerged = false;\r\n let hasDecimal = false;\r\n const cleanedArray = [];\r\n const decimalRegexp = /^\\d+\\.\\d+$/;\r\n\r\n for (let j = 0; j < results.length; j++) {\r\n const res = results[j];\r\n\r\n hasDecimal = hasDecimal || decimalRegexp.test(res.displayName);\r\n\r\n if (res.merged) {\r\n hasMerged = true;\r\n\r\n cleanedArray.push(res);\r\n }\r\n }\r\n\r\n // Remove the extra results ESRI might have erroneously found.\r\n if (hasDecimal && hasMerged) {\r\n this.results['Parcels'] = cleanedArray;\r\n }\r\n\r\n // If the results contain merged results,\r\n // make sure the headers in the grid use it instead of an unmerged one.\r\n if (hasMerged && !this.results['Parcels'].merged) {\r\n this.moveMergedParcelToTop();\r\n }\r\n }\r\n\r\n cleanPrivateParcels (privateParcels) {\r\n const results = this.results['Parcels'];\r\n\r\n if (!results) {\r\n return;\r\n }\r\n\r\n for (let j = 0; j < results.length; j++) {\r\n const pid = results[j].displayName;\r\n\r\n if (Object.values(privateParcels).includes(pid)) {\r\n results[j].feature.attributes['LegalDesc'] = '';\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n moveMergedParcelToTop () {\r\n let i = 0;\r\n let merged = this.results['Parcels'][i].merged;\r\n\r\n while (!merged) {\r\n i++;\r\n merged = this.results['Parcels'][i].merged;\r\n }\r\n\r\n const mergedObject = this.results['Parcels'][i];\r\n this.results['Parcels'].splice(i, 1);\r\n this.results['Parcels'].unshift(mergedObject);\r\n }\r\n\r\n /**\r\n * @param {string} category\r\n * @param {ResultSetMapping} [mapping]\r\n */\r\n addMapping (category, mapping = null) {\r\n const found = this.categories.includes(category);\r\n\r\n if (!found) {\r\n this.categories.push(category);\r\n this.results[category] = [];\r\n }\r\n\r\n this.mappings[category] = mapping;\r\n }\r\n\r\n isEmpty () {\r\n for (let i = 0; i < this.categories.length; i++) {\r\n const cat = this.categories[i];\r\n\r\n const res = this.results[cat];\r\n\r\n if (res.length > 0) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n numResults () {\r\n let numFound = 0;\r\n\r\n for (let i = 0; i < this.categories.length; i++) {\r\n const cat = this.categories[i];\r\n\r\n const res = this.results[cat];\r\n numFound += res.length;\r\n }\r\n\r\n return numFound;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {any} gisKey\r\n * @param {any} camaKey\r\n * @param {string} layerField\r\n */\r\n isGISCamaKeyMatched (gisKey, camaKey, layerField) {\r\n let gKey = gisKey || '';\r\n let cKey = camaKey || '';\r\n\r\n if (layerField && layerField.toLowerCase() === 'pid') {\r\n gKey = gKey.toString().trim().replace('.', '');\r\n cKey = cKey.toString().trim().replace('.', '');\r\n }\r\n\r\n return gKey === cKey;\r\n }\r\n}\r\n\r\n/**\r\n * @typedef {object} ResultSetMapping\r\n * @property {string} CamaField\r\n * @property {string} LayerName\r\n * @property {string} LayerField\r\n */\r\n\r\nexport default ResultSet;\r\n","/**\r\n * @module gisw/env\r\n * @description\r\n * Helper methods for user authentication.\r\n */\r\ndefine(['dojo/Deferred', 'dojo/request'], function (Deferred, request) {\r\n 'use strict';\r\n\r\n return {\r\n /**\r\n * @param {object} options\r\n * @param {string} [options.loginUrl]\r\n * @param {string} [options.logoutUrl]\r\n * @param {string} [options.entityName]\r\n * @param {boolean} [options.loggedIn]\r\n * @param {boolean} [options.siteHasLogin]\r\n * @param {boolean} [options.siteLoginRequired]\r\n * @param {boolean} [options.permissionRequiredForTab]\r\n */\r\n init (options) {\r\n this.loginUrl = options.loginUrl || 'Login/loginGetEntityInfo';\r\n this.logoutUrl = options.logoutUrl || 'Login/logout';\r\n this.entityName = options.entityName || '';\r\n this.loggedIn = options.loggedIn || false;\r\n this.siteHasLogin = options.siteHasLogin || false;\r\n this.siteLoginRequired = options.siteLoginRequired || false;\r\n this.permissionRequiredForTab = options.permissionRequiredForTab || false;\r\n\r\n this.loginInfo = null;\r\n },\r\n\r\n /**\r\n * @param {string} username\r\n * @param {string} password\r\n * @param {boolean} ignoreURLTab\r\n * @returns {Promise}\r\n */\r\n authenticate (username, password, ignoreURLTab) {\r\n const that = this;\r\n const deferred = new Deferred();\r\n const postData = JSON.stringify({\r\n e: this.entityName,\r\n username,\r\n password,\r\n ignoreURLTab\r\n });\r\n\r\n this.sendRequest(this.loginUrl, postData).then(\r\n function (data) {\r\n if (_loginSuccess(data)) {\r\n that.loggedIn = data.CredencialMsg !== 'public';\r\n that.loginInfo = data;\r\n deferred.resolve(data);\r\n } else {\r\n deferred.reject('Invalid credentials.');\r\n }\r\n },\r\n function (err) {\r\n deferred.reject(err);\r\n }\r\n );\r\n\r\n return deferred.promise;\r\n },\r\n\r\n /**\r\n * @param {string} url\r\n * @param {string} data JSON string data\r\n * @returns {Promise}\r\n */\r\n sendRequest (url, data) {\r\n return request(url, {\r\n method: 'POST',\r\n handleAs: 'json',\r\n data,\r\n headers: {\r\n 'Content-Type': 'application/json;charset=utf-8',\r\n Accept: 'application/json'\r\n }\r\n });\r\n },\r\n\r\n /**\r\n * @returns {Promise} Logout result\r\n */\r\n logout () {\r\n const that = this;\r\n const deferred = new Deferred();\r\n\r\n this.sendRequest(this.logoutUrl, null).then(\r\n function (data) {\r\n if (_logoutSuccess(data)) {\r\n that.loggedIn = false;\r\n that.loginInfo = null;\r\n deferred.resolve('Success.');\r\n } else {\r\n deferred.reject('Fail.');\r\n }\r\n },\r\n function (err) {\r\n deferred.reject(err);\r\n }\r\n );\r\n\r\n return deferred.promise;\r\n }\r\n };\r\n\r\n function _loginSuccess (r) {\r\n return !!r && (r.CredencialMsg === 'valid' || r.CredencialMsg === 'public');\r\n }\r\n\r\n function _logoutSuccess (r) {\r\n return r.CredencialMsg === 'Logout';\r\n }\r\n});\r\n","import domStyle from 'dojo/dom-style';\r\n\r\nimport sleep from 'src/utils/sleep';\r\nimport 'src/web-components/GWorksWindow';\r\nimport './gwindow.less';\r\n\r\n/**\r\n * @typedef {object} GWindowConfig\r\n * @property {boolean} [autoResize]\r\n * @property {string} [class]\r\n * @property {(key: string) => void} [closeCallback]\r\n * @property {HTMLElement} content\r\n * @property {string} id\r\n * @property {string} [key]\r\n * @property {Partial} [position]\r\n * @property {boolean} [showCloseButton]\r\n * @property {boolean} [startMinimized]\r\n * @property {string} title\r\n */\r\n\r\nclass GWindow {\r\n domNode = document.createElement('gworks-window');\r\n\r\n /**\r\n * @param {GWindowConfig} config\r\n */\r\n constructor (config) {\r\n this.domNode.classList.add('gisw-wndw');\r\n\r\n Object.assign(this, config);\r\n\r\n const {\r\n autoResize = false,\r\n 'class': className = '',\r\n closeCallback = null,\r\n content = null,\r\n id,\r\n key = id,\r\n position = {},\r\n showCloseButton = false,\r\n startMinimized = false,\r\n title\r\n } = config;\r\n\r\n /** @private */\r\n this.callbacks = { close: [] };\r\n\r\n if (closeCallback) {\r\n this.callbacks.close.push(closeCallback);\r\n }\r\n\r\n this.id = id;\r\n this.key = key;\r\n this.content = content;\r\n\r\n this.domNode.id = id;\r\n this.domNode.className += ` ${className}`;\r\n\r\n this.domNode.closable = showCloseButton;\r\n this.domNode.label = title;\r\n this.domNode.show = !startMinimized;\r\n this.domNode.appendChild(content);\r\n this.domNode.addEventListener('close', () => {\r\n this.callbacks.close.forEach(cb => {\r\n cb(key);\r\n });\r\n });\r\n\r\n if (autoResize) {\r\n const observer = new MutationObserver(() => {\r\n this.delayRefresh(550);\r\n });\r\n observer.observe(this.domNode, {\r\n childList: true,\r\n subtree: true\r\n });\r\n\r\n this.domNode.addEventListener('close', () => {\r\n observer.disconnect();\r\n });\r\n }\r\n\r\n domStyle.set(this.domNode, Object.assign({ top: '', left: '' }, position));\r\n }\r\n\r\n destroy () {\r\n if (this._destroyed) {\r\n return;\r\n }\r\n\r\n /** @private */\r\n this._destroyed = true;\r\n\r\n this.domNode.close();\r\n }\r\n\r\n get isMinimized () {\r\n return !this.domNode.show;\r\n }\r\n\r\n set isMinimized (value) {\r\n this.domNode.show = !value;\r\n }\r\n\r\n toggle () {\r\n this.domNode.toggle();\r\n }\r\n\r\n close () {\r\n this.deleteGWin(true);\r\n }\r\n\r\n /**\r\n * @param {(key: string) => void} cb\r\n */\r\n addCloseCallback (cb) {\r\n this.callbacks.close.push(cb);\r\n }\r\n\r\n /**\r\n * @param {boolean} [closing]\r\n */\r\n deleteGWin (closing = false) {\r\n this.content.remove();\r\n\r\n if (closing) {\r\n this.callbacks.close.forEach(cb => {\r\n try {\r\n cb(this.key);\r\n } catch (err) {}\r\n });\r\n }\r\n\r\n this.destroy();\r\n }\r\n\r\n async refresh () {\r\n this.domNode.dispatchEvent(\r\n new CustomEvent('refresh', {\r\n bubbles: true,\r\n detail: { isMinimized: this.isMinimized }\r\n })\r\n );\r\n\r\n await sleep();\r\n }\r\n\r\n /**\r\n * @param {number} timeout\r\n */\r\n delayRefresh (timeout) {\r\n clearTimeout(this._timeoutID);\r\n\r\n /** @private */\r\n this._timeoutID = setTimeout(() => {\r\n if (!this.isMinimized) {\r\n this.refresh();\r\n }\r\n\r\n this._timeoutID = null;\r\n }, timeout);\r\n }\r\n\r\n /**\r\n * @param {HTMLElement} node\r\n */\r\n setContent (node) {\r\n this.content.remove();\r\n this.content = node;\r\n this.domNode.appendChild(node);\r\n }\r\n}\r\n\r\nexport default GWindow;\r\n","/**\r\n * @param {string} name\r\n * @param {any} value\r\n */\r\nexport function setValue (name, value) {\r\n localStorage.setItem(name, JSON.stringify(value));\r\n}\r\n\r\n/**\r\n * @param {string} name\r\n */\r\nexport function getValue (name) {\r\n const value = localStorage.getItem(name);\r\n\r\n if (!value) {\r\n return null;\r\n }\r\n\r\n return JSON.parse(value);\r\n}\r\n\r\nexport function resetToolHints () {\r\n for (let i = 0; i < localStorage.length; i++) {\r\n const key = localStorage.key(i);\r\n\r\n if (key.startsWith('gisw')) {\r\n setValue(key, null);\r\n }\r\n }\r\n}\r\n","/**\r\n * @param {number} [ms]\r\n * @returns {Promise}\r\n */\r\nconst sleep = (ms = 0) => new Promise(resolve => setTimeout(resolve, ms));\r\n\r\nexport default sleep;\r\n","/**\r\n * @template {{ key: string; }} T\r\n * @template {HTMLElement} U\r\n */\r\nclass NodeHash {\r\n domNode = document.createElement('div');\r\n\r\n /**\r\n * @param {object} config\r\n * @param {string} [config.className]\r\n * @param {(p: T) => HTMLElement} config.createNode\r\n * @param {string} [config.id]\r\n * @param {Array} [config.initItems]\r\n * @param {boolean} [config.noNestedDiv]\r\n */\r\n constructor (config) {\r\n const {\r\n className = '',\r\n createNode,\r\n id = null,\r\n initItems = null,\r\n noNestedDiv = false\r\n } = config;\r\n\r\n if (noNestedDiv) {\r\n /** @private */\r\n this.containerNode = this.domNode;\r\n } else {\r\n /** @private */\r\n this.containerNode = document.createElement('div');\r\n this.domNode.appendChild(this.containerNode);\r\n }\r\n\r\n /** @private */\r\n this.id = id;\r\n\r\n if (this.id) {\r\n this.domNode.id = this.id;\r\n }\r\n\r\n if (className) {\r\n this.domNode.className = className;\r\n }\r\n\r\n /** @private @type {Record} */\r\n this.nodeHash = {};\r\n\r\n /** @private */\r\n this.createNode = createNode;\r\n\r\n /** @private */\r\n this.dataAttr = 'data-nodehash' + NodeHash.count + '-key';\r\n\r\n NodeHash.count++;\r\n\r\n if (initItems) {\r\n this.add(initItems);\r\n }\r\n }\r\n\r\n destroy () {\r\n this.domNode.remove();\r\n }\r\n\r\n /**\r\n * @param {Array} itemParams\r\n */\r\n add (itemParams) {\r\n _makeArray(itemParams).forEach(param => {\r\n this.containerNode.appendChild(this._initNode(param));\r\n });\r\n }\r\n\r\n /**\r\n * @param {Array} keys\r\n */\r\n remove (keys) {\r\n _makeArray(keys).forEach(key => {\r\n if (this.containsKey(key)) {\r\n this.nodeHash[key].remove();\r\n delete this.nodeHash[key];\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @param {string} key\r\n */\r\n containsKey (key) {\r\n return !!this.nodeHash[key];\r\n }\r\n\r\n /**\r\n * @param {string} key\r\n */\r\n get (key) {\r\n return this.containsKey(key) ? this.nodeHash[key] : null;\r\n }\r\n\r\n /**\r\n * @deprecated\r\n * @private\r\n */\r\n getIndex (key) {\r\n let i = 0;\r\n let node = this.nodeHash[key];\r\n\r\n if (!node) {\r\n return -1;\r\n }\r\n\r\n while ((node = node.previousSibling) !== null) {\r\n i++;\r\n }\r\n\r\n return i;\r\n }\r\n\r\n /**\r\n * @param {U} node\r\n */\r\n getKey (node) {\r\n if (!node) {\r\n return null;\r\n }\r\n\r\n return node.getAttribute(this.dataAttr);\r\n }\r\n\r\n /**\r\n * @param {U} node\r\n */\r\n isItem (node) {\r\n const key = this.getKey(node);\r\n\r\n return !!key && !!this.containsKey(key);\r\n }\r\n\r\n /**\r\n * @param {string} eventName\r\n * @param {(node: U, key: string, event: Event) => void} callback\r\n * @param {any} [ref]\r\n * @param {number} [pauseInterval]\r\n */\r\n itemEventListener (eventName, callback, ref = null, pauseInterval = 0) {\r\n const thisArg = ref || this;\r\n const selector = '[' + this.dataAttr + ']';\r\n const pauseOnEvent = pauseInterval > 0;\r\n\r\n /** @private */\r\n this.isPaused = false;\r\n\r\n document.body.addEventListener(eventName, event => {\r\n // @ts-ignore\r\n if (!event.target.closest(selector) && pauseOnEvent && this.isPaused) {\r\n return;\r\n }\r\n\r\n this.isPaused = pauseOnEvent;\r\n\r\n // @ts-ignore\r\n const key = this._getContainingItemKey(event.target);\r\n\r\n if (!key) {\r\n return;\r\n }\r\n\r\n callback.call(thisArg, this.nodeHash[key], key, event);\r\n\r\n if (pauseOnEvent) {\r\n setTimeout(() => {\r\n this.isPaused = false;\r\n }, pauseInterval);\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * @param {U} node\r\n */\r\n _getContainingItemKey (node) {\r\n return this.getKey(this._getContainingItem(node));\r\n }\r\n\r\n /**\r\n * Travels up the document tree to find the hash item element\r\n * @private\r\n * @param {U} node\r\n */\r\n _getContainingItem (node) {\r\n let currentNode = node;\r\n\r\n while (\r\n currentNode &&\r\n currentNode !== document.body &&\r\n !this.isItem(currentNode)\r\n ) {\r\n // @ts-ignore\r\n currentNode = currentNode.parentNode;\r\n }\r\n\r\n return currentNode;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {T} param\r\n */\r\n _initNode (param) {\r\n /** @type {U} */\r\n // @ts-ignore\r\n const node = this.createNode(param);\r\n node.setAttribute(this.dataAttr, param.key);\r\n this.nodeHash[param.key] = node;\r\n\r\n return node;\r\n }\r\n}\r\n\r\nNodeHash.count = 0;\r\n\r\n/**\r\n * @template T\r\n * @param {Array | T} value\r\n */\r\nfunction _makeArray (value) {\r\n return Array.isArray(value) ? value : [value];\r\n}\r\n\r\nexport default NodeHash;\r\n","import { html } from 'gisw/Helpers/html';\r\n\r\nimport './banner-message.less';\r\n\r\n/**\r\n * @param {string} message\r\n * @param {() => void} [onClose]\r\n */\r\nfunction bannerMessage (message, onClose = null) {\r\n const domNode = html`
\r\n ${message}\r\n
`.item(0);\r\n document.body.prepend(domNode);\r\n\r\n /** @type {HTMLButtonElement} */\r\n // @ts-ignore\r\n const dismissButton = html``.item(0);\r\n dismissButton.addEventListener('click', () => {\r\n if (onClose) {\r\n onClose();\r\n }\r\n\r\n domNode.remove();\r\n });\r\n domNode.appendChild(dismissButton);\r\n}\r\n\r\nexport default bannerMessage;\r\n","var api = require(\"!../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../node_modules/mini-css-extract-plugin/dist/loader.js!../node_modules/css-loader/dist/cjs.js??ref--5-2!../node_modules/postcss-loader/src/index.js??ref--5-3!../node_modules/less-loader/dist/cjs.js??ref--5-4!./banner-message.less\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","import bannerMessage from './banner-message';\r\n\r\nconst UPDATE_INTERVAL = 10 * 60000;\r\n\r\nlet timeoutKey = null;\r\nlet isFetching = false;\r\nlet isMessageDisplayed = false;\r\n\r\n/**\r\n * Checks for build timestamp after a set interval.\r\n * Resets interval if manually called.\r\n */\r\nasync function updateCheck () {\r\n if (\r\n isFetching ||\r\n isMessageDisplayed ||\r\n process.env.NODE_ENV !== 'production'\r\n ) {\r\n return;\r\n }\r\n\r\n clearTimeout(timeoutKey);\r\n\r\n const updated = await hasUpdate()\r\n .catch(console.error)\r\n .finally(() => {\r\n isFetching = false;\r\n });\r\n\r\n if (updated) {\r\n isMessageDisplayed = true;\r\n bannerMessage(\r\n 'The site has an update available. Please refresh your browser.',\r\n () => {\r\n isMessageDisplayed = false;\r\n }\r\n );\r\n } else {\r\n // Check again later\r\n timeoutKey = setTimeout(updateCheck, UPDATE_INTERVAL);\r\n }\r\n}\r\n\r\nasync function hasUpdate () {\r\n isFetching = true;\r\n\r\n const res = await fetch('Scripts/dist/timestamp.json', { cache: 'no-cache' });\r\n\r\n if (!res.ok) {\r\n // Site is in the middle of updating\r\n return false;\r\n }\r\n\r\n const data = await res.json();\r\n\r\n return process.env.timestamp < data.timestamp;\r\n}\r\n\r\nexport default updateCheck;\r\n","import GeometryType from 'ol/geom/GeometryType';\r\n\r\nimport Mediator from 'gisw/Classes/Mediator';\r\n\r\n/**\r\n * Get default attributes for a feature layer\r\n */\r\nfunction getDefaultAttributes (layer: any) {\r\n const attributes = {};\r\n\r\n for (const type of layer.types) {\r\n pushTemplates(attributes, type.templates);\r\n }\r\n\r\n if (layer.templates.length > 0) {\r\n pushTemplates(attributes, layer.templates);\r\n }\r\n\r\n return attributes;\r\n}\r\n\r\n/**\r\n * Add the first value we find for each attribute\r\n */\r\nfunction pushTemplates (attributes: any, templates: Array) {\r\n if (!Array.isArray(templates)) {\r\n return;\r\n }\r\n\r\n for (const template of templates) {\r\n const keys = Object.keys(attributes);\r\n\r\n if (keys.length === 0) {\r\n Object.assign(attributes, template.prototype.attributes);\r\n continue;\r\n }\r\n\r\n for (const key of keys) {\r\n if (attributes[key] === null) {\r\n attributes[key] = template.prototype.attributes[key];\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Get Server info\r\n */\r\nexport async function fetchSubFeature (url: string, token: string) {\r\n let results: any = null;\r\n\r\n try {\r\n results = await new Promise((resolve, reject) => {\r\n $.ajax({\r\n data: { f: 'json', token },\r\n dataType: 'json',\r\n url\r\n })\r\n .then(resolve)\r\n .catch(reject);\r\n });\r\n\r\n results.url = url;\r\n results.layerInfos = results.layers;\r\n\r\n // Feature Layers\r\n if (results.types) {\r\n results.defaultAttributes = getDefaultAttributes(results);\r\n }\r\n\r\n return results;\r\n } catch (err) {\r\n Mediator.jstManager.jstError('Tool', 'Editor', 'fetchSubFeature', err);\r\n }\r\n\r\n return results;\r\n}\r\n\r\n// eslint-disable-next-line no-undef\r\nexport function getDomInputType (type: Backend.FieldValueType) {\r\n switch (type) {\r\n case 'esriFieldTypeDouble':\r\n case 'esriFieldTypeInteger':\r\n case 'esriFieldTypeSingle':\r\n case 'esriFieldTypeSmallInteger':\r\n case 'esriFieldTypeOID':\r\n return 'number';\r\n\r\n case 'esriFieldTypeDate':\r\n return 'date';\r\n\r\n case 'esriFieldTypeString':\r\n default:\r\n return 'text';\r\n }\r\n}\r\n\r\nexport function getFieldValue (\r\n // eslint-disable-next-line no-undef\r\n fieldInfo: Backend.FieldInfo,\r\n attribute: any = null\r\n) {\r\n if (!attribute) {\r\n return fieldInfo.nullable ? null : fieldInfo.defaultValue;\r\n }\r\n\r\n if (getDomInputType(fieldInfo.type) === 'date') {\r\n return new Date(attribute);\r\n }\r\n\r\n return attribute;\r\n}\r\n\r\n/**\r\n * Get front end geometry type from backend geometry type\r\n */\r\nexport function getGeometryType (geometryType: string) {\r\n switch (geometryType) {\r\n case 'esriGeometryPoint':\r\n return GeometryType.POINT;\r\n case 'esriGeometryPolyline':\r\n return GeometryType.LINE_STRING;\r\n case 'esriGeometryPolygon':\r\n return GeometryType.POLYGON;\r\n default:\r\n return null;\r\n }\r\n}\r\n","/**\r\n * @template T\r\n */\r\nclass Observer {\r\n /** @type {Array>} */\r\n observers = [];\r\n\r\n /**\r\n * @param {T} data\r\n */\r\n broadcast (data) {\r\n this.observers.forEach(subscriber => subscriber(data));\r\n }\r\n\r\n /**\r\n * @param {SubscribeFn} fn\r\n */\r\n subscribe (fn) {\r\n this.observers.push(fn);\r\n return fn;\r\n }\r\n\r\n /**\r\n * @param {SubscribeFn} fn\r\n */\r\n unsubscribe (fn) {\r\n this.observers = this.observers.filter(entry => entry !== fn);\r\n return fn;\r\n }\r\n}\r\n\r\n/**\r\n * @template T\r\n * @callback SubscribeFn\r\n * @param {T} data\r\n * @returns {void}\r\n */\r\n\r\nexport default Observer;\r\n","export { default } from './GWindowList';\r\n","import Mediator from 'gisw/Classes/Mediator';\r\n\r\nexport async function getUpdateInformation () {\r\n const updatesUrl = new URL('Documents/GetUpdates', location.href);\r\n updatesUrl.searchParams.append('entityName', Mediator.serverData.entityName);\r\n\r\n const res = await fetch(updatesUrl.toString(), { method: 'get' });\r\n\r\n if (!res.ok) {\r\n throw Error('Could not retrieve updates.');\r\n }\r\n\r\n /** @type {Array<{ name: string, updated: string; }>} */\r\n const data = await res.json();\r\n\r\n return data;\r\n}\r\n","import Mediator from 'gisw/Classes/Mediator';\r\nimport Result from 'gisw/Widgets/GenericSearch/Result';\r\nimport ResultSet from 'gisw/Widgets/GenericSearch/ResultSet';\r\n\r\n/**\r\n * Probably should change this into a set of functions\r\n */\r\nclass SearchUtility {\r\n /**\r\n * @param {*} data\r\n */\r\n resultSetFromPids (data) {\r\n const mapping = {\r\n CamaField: 'PID',\r\n LayerName: 'Parcels',\r\n LayerField: 'PID'\r\n };\r\n\r\n return this.addMapping(data, mapping);\r\n }\r\n\r\n /**\r\n * @param {*} data\r\n * @param {import('./ResultSet').ResultSetMapping} mapping\r\n */\r\n // eslint-disable-next-line class-methods-use-this\r\n addMapping (data, mapping) {\r\n const resultSet = new ResultSet();\r\n resultSet.setSource(data.Source);\r\n\r\n for (let i = 0; i < data.Features.length; i++) {\r\n resultSet.addMapping(data.Features[i].Name, mapping);\r\n\r\n for (let j = 0; j < data.Features[i].Results.length; j++) {\r\n const result = new Result();\r\n result.fromControllerResult(data.Features[i].Results[j], mapping);\r\n resultSet.addResult(data.Features[i].Name, result);\r\n }\r\n }\r\n\r\n Mediator.handle({ name: 'loading.hide' });\r\n\r\n return resultSet;\r\n }\r\n}\r\n\r\nexport default SearchUtility;\r\n","/**\r\n * @module gisw/Helpers/type\r\n * @description\r\n * a helper module for working with and determining types of objects.\r\n */\r\ndefine([], function () {\r\n 'use strict';\r\n\r\n return {\r\n /**\r\n * @function groupBy\r\n * @public\r\n * @memberOf module:gisw/Helpers/type\r\n *\r\n * @param {Array} list\r\n * @param {function (any): string} callback\r\n * return key used to store elem.\r\n */\r\n groupBy (list, callback) {\r\n /** @type {Record} */\r\n const results = {};\r\n\r\n for (const item of list) {\r\n const key = callback(item);\r\n\r\n if (!results.hasOwnProperty(key)) {\r\n results[key] = [];\r\n }\r\n\r\n results[key].push(item);\r\n }\r\n\r\n return results;\r\n },\r\n\r\n /**\r\n * @function forEach\r\n * @public\r\n * @memberOf module:gisw/Helpers/type\r\n * @description\r\n * normalizes looping through arrays and objects. If parameter `value`\r\n * is any array, this function is equivalent to the usual `Array.forEach`\r\n * method with the addition that the (second) parameter `thisArg` defaults\r\n * to the array being looped over. If `value` is an object, the `element`s\r\n * recieved in `callback` are obtained by looping through the keys of\r\n * `value` filtered using `hasOwnProperty`.\r\n *\r\n * @example\r\n * type.forEach(someObject, function(key) {\r\n * // do something w/keys\r\n * });\r\n *\r\n * type.forEach(someArray, function(item, index, arr) {\r\n // the usual...\r\n * })\r\n *\r\n * @param {Record|Array} value\r\n * @param {forEachCallback} callback\r\n * function to be executed for each key/index and value.\r\n * @param {any} [thisArg=`value`]\r\n * sets the value of `this` in the callback function\r\n */\r\n forEach (value, callback, thisArg = value) {\r\n if (Array.isArray(value)) {\r\n value.forEach(callback);\r\n } else if (typeof value === 'object' && value !== null) {\r\n for (const key in value) {\r\n if (value.hasOwnProperty(key)) {\r\n callback.call(thisArg, value[key], key, value);\r\n }\r\n }\r\n }\r\n }\r\n };\r\n});\r\n/**\r\n * @callback forEachCallback\r\n * @description\r\n * In short, the parameters of this callback satisfy\r\n * `iterable[position] = element` when `value` is an array or object.\r\n * @param {object} element\r\n * If `value` is an array,\r\n * then this is element at the index given by `position`.\r\n *\r\n * If `value` is an object,\r\n * then this is the element whose key is `position`.\r\n * @param {number|string} position\r\n * The index/key for `element`\r\n * @param {array|object} iterable\r\n * The array/object being looped through, i.e. `value`.\r\n */\r\n","import Mediator from 'gisw/Classes/Mediator';\r\n\r\nclass JSTManager {\r\n /**\r\n * Specific tool event\r\n * @param {any} label i.e tool name\r\n * @param {any} action The action of the label\r\n * @param {any} msg Any additional comment\r\n * @param {any} [lat] latitude of the event\r\n * @param {any} [long] longitude of the event\r\n */\r\n jstToolEvent (label, action, msg, lat, long) {\r\n this.jstEvent('Tool', label, action, msg, lat, long, null);\r\n }\r\n\r\n /**\r\n * Map event\r\n * @param {any} label i.e tool name\r\n * @param {any} action The action of the label\r\n * @param {any} msg Any additional comment\r\n * @param {any} lat latitude of the event\r\n * @param {any} long longitude of the event\r\n */\r\n jstMapEvent (label, action, msg, lat, long) {\r\n this.jstEvent('Map', label, action, msg, lat, long, null);\r\n }\r\n\r\n /**\r\n * Error event\r\n * @param {any} category i.e tool\r\n * @param {any} label i.e tool name\r\n * @param {any} action The action of the label\r\n * @param {any} msg Any additional comment\r\n * @param {any} [lat] latitude of the event\r\n * @param {any} [long] longitude of the event\r\n */\r\n jstError (category, label, action, msg, lat, long) {\r\n this.jst('Error', category, label, action, msg, lat, long, null);\r\n }\r\n\r\n /**\r\n * Warning\r\n * @param {any} category i.e tool\r\n * @param {any} label i.e tool name\r\n * @param {any} action The action of the label\r\n * @param {any} msg Any additional comment\r\n * @param {any} [lat] latitude of the event\r\n * @param {any} [long] longitude of the event\r\n */\r\n jstWarn (category, label, action, msg, lat, long) {\r\n this.jst('Warn', category, label, action, msg, lat, long, null);\r\n }\r\n\r\n /**\r\n * Send specific event\r\n * @param {any} category i.e tool\r\n * @param {any} label i.e tool name\r\n * @param {any} action The action of the label\r\n * @param {any} msg Any additional comment\r\n * @param {any} lat latitude of the event\r\n * @param {any} long longitude of the event\r\n * @param {any} json JSON string\r\n */\r\n jstEvent (category, label, action, msg, lat, long, json) {\r\n this.jst('Event', category, label, action, msg, lat, long, json);\r\n }\r\n\r\n /**\r\n * Send events\r\n * @param {any} logLevel i.e Event, Info, Error, Warn...\r\n * @param {any} category i.e tool\r\n * @param {any} label i.e tool name\r\n * @param {any} action The action of the label\r\n * @param {any} msg Any additional comment\r\n * @param {any} lat latitude of the event\r\n * @param {any} long longitude of the event\r\n * @param {any} json JSON string\r\n */\r\n // eslint-disable-next-line class-methods-use-this\r\n jst (logLevel, category, label, action, msg, lat, long, json) {\r\n if (process.env.NODE_ENV === 'development') {\r\n console.debug({\r\n logLevel,\r\n category,\r\n label,\r\n action,\r\n msg,\r\n lat,\r\n long,\r\n json\r\n });\r\n return;\r\n }\r\n\r\n if (\r\n window.location.href.includes('localhost') ||\r\n process.env.NODE_ENV !== 'production'\r\n ) {\r\n return;\r\n }\r\n\r\n // Use try catch to prevent other functions from breaking if this fails.\r\n try {\r\n $.ajax({\r\n url: '/jst/',\r\n data: {\r\n entity: Mediator.serverData.entityName.toLowerCase(),\r\n department: Mediator.currentTab,\r\n loglevel: logLevel,\r\n category,\r\n label,\r\n action,\r\n lat,\r\n 'long': long,\r\n msg,\r\n json: json && json.replace(/&/g, '%amp;')\r\n },\r\n type: 'GET'\r\n });\r\n } catch (err) {\r\n // No further handling, do nothing\r\n }\r\n }\r\n}\r\n\r\nexport default JSTManager;\r\n","// Factory treats keys in a case insensitively...\r\n// so they do not need to match the class name.\r\n\r\nimport updateCheck from 'src/update-check';\r\n\r\n/* eslint-disable import/no-dynamic-require */\r\n/* eslint-disable array-bracket-spacing */\r\n/** @type {Record} */\r\nconst dependencies = {\r\n // SHARED\r\n genericsearchbar: cb =>\r\n require([\r\n /* webpackChunkName: 'Search' */ 'gisw/Widgets/GenericSearch/Search'\r\n // @ts-ignore\r\n ], cb),\r\n loginpage: cb =>\r\n // @ts-ignore\r\n require([/* webpackChunkName: 'Login' */ 'gisw/Widgets/Login/Login'], cb),\r\n helppage: cb =>\r\n require([\r\n /* webpackChunkName: 'HelpPage' */ 'eCounty/Widgets/HelpPage'\r\n // @ts-ignore\r\n ], cb),\r\n resultspanel: cb =>\r\n require([\r\n /* webpackChunkName: 'ResultsPanel' */\r\n 'gisw/Widgets/GenericSearch/ResultsPanel'\r\n // @ts-ignore\r\n ], cb),\r\n // @ts-ignore\r\n cartpanel: cb => require(['gisw/Tools/Payment/Cart'], cb),\r\n\r\n // TOOLS\r\n activitymanagement: cb =>\r\n require([\r\n /* webpackChunkName: 'ActivityManagement' */\r\n 'gisw/Tools/ActivityManagement/ActivityManagement'\r\n // @ts-ignore\r\n ], cb),\r\n // @ts-ignore\r\n address: cb => require(['gisw/Tools/Address/Address'], cb),\r\n alwaysonidentify: cb =>\r\n // @ts-ignore\r\n require(['gisw/Tools/AlwaysOnIdentify/AlwaysOnIdentify'], cb),\r\n // @ts-ignore\r\n bratio: cb => require(['gisw/Tools/BRatio/BRatio'], cb),\r\n // @ts-ignore\r\n buffer: cb => require(['gisw/Tools/Buffer/Buffer'], cb),\r\n // @ts-ignore\r\n bookmark: cb => require(['gisw/Tools/Bookmark/Bookmark'], cb),\r\n bulkimageuploader: cb =>\r\n // @ts-ignore\r\n require(['gisw/Tools/BulkImageUploader/BulkImageUploader'], cb),\r\n // @ts-ignore\r\n dmat: cb => require(['gisw/Tools/DMAT/DMAT'], cb),\r\n draw: cb =>\r\n // @ts-ignore\r\n require(['gisw/Tools/Draw/Draw'], cb),\r\n // @ts-ignore\r\n identify: cb => require(['gisw/Tools/Identify/Identify'], cb),\r\n // @ts-ignore\r\n landuse: cb => require(['gisw/Tools/Landuse/Landuse'], cb),\r\n mapnavigation: cb =>\r\n // @ts-ignore\r\n require(['gisw/Tools/MapNavigation/MapNavigation'], cb),\r\n // @ts-ignore\r\n full_extent: cb => require(['gisw/Tools/OffOnTool/OffOnTool'], cb),\r\n // @ts-ignore\r\n zoom_in: cb => require(['gisw/Tools/OffOnTool/OffOnTool'], cb),\r\n // @ts-ignore\r\n zoom_out: cb => require(['gisw/Tools/OffOnTool/OffOnTool'], cb),\r\n zoom_to_previous_extent: cb =>\r\n // @ts-ignore\r\n require(['gisw/Tools/OffOnTool/OffOnTool'], cb),\r\n // @ts-ignore\r\n zoom_to_next_extent: cb => require(['gisw/Tools/OffOnTool/OffOnTool'], cb),\r\n // @ts-ignore\r\n clear_: cb => require(['gisw/Tools/OffOnTool/OffOnTool'], cb),\r\n // @ts-ignore\r\n pan: cb => require(['gisw/Tools/OffOnTool/OffOnTool'], cb),\r\n // @ts-ignore\r\n measure: cb => require(['gisw/Tools/Measure/Measure'], cb),\r\n personalproperty: cb =>\r\n // @ts-ignore\r\n require(['gisw/Tools/PersonalProperty/PersonalProperty'], cb),\r\n // @ts-ignore\r\n pictometry: cb => require(['gisw/Tools/Pictometry/Pictometry'], cb),\r\n // @ts-ignore\r\n print: cb => require(['gisw/Tools/Print/Print'], cb),\r\n // @ts-ignore\r\n photo: cb => require(['gisw/Tools/Photo/Photo'], cb),\r\n // @ts-ignore\r\n plume: cb => require(['gisw/Tools/Identify/Identify'], cb),\r\n bookmarkpublic: cb =>\r\n // @ts-ignore\r\n require(['gisw/Tools/Bookmark/Public/PublicBookmark'], cb),\r\n salessearch: cb => require(['gisw/Widgets/SalesSearch/SalesSearch'], cb),\r\n // @ts-ignore\r\n quicksearch: cb => require(['gisw/Widgets/QuickSearch/QuickSearch'], cb),\r\n instrumentsearch: cb =>\r\n // @ts-ignore\r\n require(['gisw/Widgets/InstrumentSearch/InstrumentSearch'], cb),\r\n // @ts-ignore\r\n paymentpanel: cb => require(['gisw/Tools/Payment/Payment'], cb),\r\n // @ts-ignore\r\n subscription: cb => require(['gisw/Tools/Subscription/Subscription'], cb),\r\n // @ts-ignore\r\n editor: cb => require(['eCity/Tools/Editor/Editor'], cb),\r\n weedsinfestation: cb =>\r\n // @ts-ignore\r\n require(['gisw/Tools/WeedsInfestation/WeedsInfestation'], cb),\r\n // @ts-ignore\r\n current_location: cb => require(['gisw/Tools/OffOnTool/OffOnTool'], cb),\r\n // @ts-ignore\r\n pindrop: cb => require(['eCity/Tools/PinDropTool/PinDropTool'], cb),\r\n publicnotice: cb =>\r\n // @ts-ignore\r\n require(['gisw/Tools/PublicNotice/PublicNotice'], cb),\r\n roadsprojectmanagement: cb =>\r\n // @ts-ignore\r\n require(['gisw/Tools/RoadsProjectManagement/RoadsProjectManagement'], cb),\r\n // @ts-ignore\r\n reportbuilder: cb =>\r\n // @ts-ignore\r\n require(['gisw/Tools/ReportBuilder/ReportBuilder'], cb),\r\n // @ts-ignore\r\n tmrm: cb => require(['gisw/Tools/TMRM/TMRM'], cb)\r\n};\r\n\r\n/**\r\n * @callback DynamicImportCallback\r\n * @param {any} module\r\n * @returns {void}\r\n */\r\n/* eslint-enable array-bracket-spacing */\r\n/* eslint-enable import/no-dynamic-require */\r\n\r\n/**\r\n * a factory for lazy-loading classes.\r\n */\r\nclass Factory {\r\n constructor () {\r\n /** @type {Record} */\r\n this._cache = {};\r\n }\r\n\r\n /**\r\n * Load and create classes\r\n * @template {FactoryTypes.ModuleNames} T\r\n * @param {object} options\r\n * @param {T} options.name Name of tool/module to be loaded\r\n * @param {HTMLElement} [options.node]\r\n * DOM element replaced by the root node of the created class\r\n * @param {object} options.params\r\n * Passed to the constructor of the class\r\n * @returns {Promise}\r\n */\r\n async Create (options) {\r\n // @ts-ignore\r\n options.name = options.name.toLowerCase();\r\n\r\n if (this._cache.hasOwnProperty(options.name)) {\r\n const mod = this._cache[options.name];\r\n const Constructor = mod.default || mod;\r\n\r\n return new Constructor(options.params, options.node);\r\n }\r\n\r\n if (!dependencies.hasOwnProperty(options.name)) {\r\n return null;\r\n }\r\n\r\n try {\r\n const tool = await new Promise(resolve => {\r\n dependencies[options.name](MyObj => {\r\n this._cache[options.name] = MyObj;\r\n\r\n const Constructor = MyObj.default || MyObj;\r\n resolve(new Constructor(options.params, options.node));\r\n });\r\n });\r\n\r\n return tool;\r\n } catch (error) {\r\n updateCheck();\r\n throw error;\r\n }\r\n }\r\n}\r\n\r\nexport default Factory;\r\n","import request from 'dojo/request';\r\n\r\nimport Mediator from 'gisw/Classes/Mediator';\r\nimport messageObserver from 'gisw/Widgets/MessageManager/MessageObserver';\r\n\r\n// @ts-ignore\r\nimport auth from './auth';\r\n\r\nclass MapLayerCredientials {\r\n constructor () {\r\n this.oldcredentials = null;\r\n /** @type {Record} */\r\n this.credentialRenewalTasks = {};\r\n /** @type {Record} */\r\n this.layerTypeUserId = {};\r\n // -10 seconds\r\n this.timerOffset = -10000;\r\n }\r\n\r\n /**\r\n * @param {string} type\r\n * @returns {Promise}\r\n */\r\n getMapLayerAuthenticated (type) {\r\n const curTabId = Mediator.getCurrentTabID();\r\n\r\n if (!Mediator.serverData.FrontEndOption.BoltonMenk && !auth.loggedIn) {\r\n return Promise.resolve(null);\r\n } else if (!curTabId) {\r\n return Promise.reject(Error('Tab ID is not set'));\r\n }\r\n\r\n return new Promise(resolve => {\r\n const privateLayerData = { tabID: curTabId, type };\r\n\r\n this.requestDataResults(\r\n privateLayerData,\r\n 'PrivateLayer/GetPrivateLayerToken'\r\n ).then(results => {\r\n if (results && results.Key) {\r\n const credentialObject = this.createLayerCredientialObject(results);\r\n\r\n this.layerTypeUserId[type] = results.UserID;\r\n this.crediencialObject = credentialObject;\r\n this.credentials = credentialObject.credentials;\r\n this.oldcredentials = dojo.clone(this.credentials);\r\n\r\n const tokentimeout =\r\n results.Expiration && !isNaN(results.Expiration)\r\n ? Number.parseFloat(results.Expiration)\r\n : 60;\r\n this.renewMapLayerCredentials(type, tokentimeout);\r\n this.updateAllMapLayersCrediential();\r\n\r\n resolve(results.Key);\r\n } else {\r\n if (results.Status && results.Status.Code === 'Error') {\r\n messageObserver.broadcast({\r\n title: results.Status.Code,\r\n message: 'Private Map layer: ' + results.Status.Message\r\n });\r\n }\r\n\r\n resolve(null);\r\n }\r\n });\r\n });\r\n }\r\n\r\n isCredientialsExpired () {\r\n if (this.credentials && this.credentials.length > 0) {\r\n for (let i = 0; i < this.credentials.length; i++) {\r\n if (this.isCredientialExpired(this.credentials[i])) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n isCredientialExpired (credential) {\r\n const now = Date.now();\r\n\r\n if (now > credential.expires + this.timerOffset) {\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n updateAllMapLayersCrediential () {\r\n if (!Mediator.layermanager || !Mediator.layermanager.mapLayers) {\r\n return;\r\n }\r\n\r\n const dynamicLayers = Mediator.layermanager.mapLayers.dynamicLayers;\r\n\r\n if (dynamicLayers) {\r\n this.updateLayersObjsCrediential(\r\n dynamicLayers,\r\n this.layerTypeUserId['submap']\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * @param {Record} layersObjs\r\n * @param {*} thisLayerUserId\r\n */\r\n updateLayersObjsCrediential (layersObjs, thisLayerUserId) {\r\n if (!layersObjs || !thisLayerUserId) {\r\n return;\r\n }\r\n\r\n for (const key in layersObjs) {\r\n if (layersObjs.hasOwnProperty(key)) {\r\n const curLayer = layersObjs[key];\r\n\r\n if (\r\n curLayer &&\r\n curLayer.get('credential') &&\r\n this.isCredientialExpired(curLayer.get('credential'))\r\n ) {\r\n const credential = this.getCredientialByUserId(thisLayerUserId);\r\n /** @type {import('ol/source').ImageArcGISRest} */\r\n // @ts-ignore\r\n const source = curLayer.getSource();\r\n const params = source.getParams();\r\n\r\n params.token = credential.token;\r\n source.updateParams(params);\r\n curLayer.set('credential', credential);\r\n }\r\n }\r\n }\r\n }\r\n\r\n getCredientialByUserId (UserId) {\r\n if (this.credentials) {\r\n for (let i = 0; i < this.credentials.length; i++) {\r\n if (this.credentials[i].userId === UserId) {\r\n return this.credentials[i];\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {string} type\r\n * @param {number} tokentimeout In minutes\r\n */\r\n renewMapLayerCredentials (type, tokentimeout) {\r\n const time = tokentimeout * 60000 + this.timerOffset;\r\n\r\n if (this.credentialRenewalTasks[type]) {\r\n clearTimeout(this.credentialRenewalTasks[type]);\r\n }\r\n\r\n if (auth.loggedIn || Mediator.serverData.FrontEndOption.BoltonMenk) {\r\n this.credentialRenewalTasks[type] = setTimeout(() => {\r\n if (auth.loggedIn || Mediator.serverData.FrontEndOption.BoltonMenk) {\r\n this.getMapLayerAuthenticated(type);\r\n }\r\n }, time);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {*} results\r\n */\r\n createLayerCredientialObject (results) {\r\n let userid = '';\r\n let tokentimeout;\r\n\r\n if (results) {\r\n this.token = results.Key;\r\n tokentimeout =\r\n results.Expiration && isNaN(results.Expiration) === false\r\n ? parseFloat(results.Expiration)\r\n : 60;\r\n userid = results.UserID;\r\n }\r\n\r\n const now = Date.now();\r\n\r\n const expires = now + tokentimeout * 60000;\r\n let hostname = '';\r\n let tokenServiceUrl = '';\r\n let adminTokenServiceUrl = '';\r\n let server = '';\r\n let resource = '';\r\n\r\n if (results.Status && results.Status.Code === 'ServicerName') {\r\n hostname = 'https://' + results.Status.Message + '.gworks.com';\r\n tokenServiceUrl = hostname + '/arcgis/tokens/';\r\n adminTokenServiceUrl = hostname + '/arcgis/admin/generateToken';\r\n server = hostname + '/arcgis';\r\n resource = server + '/rest/services';\r\n }\r\n\r\n if (Mediator.serverData.FrontEndOption.BoltonMenk) {\r\n hostname = 'https://gis.bolton-menk.com/metia';\r\n tokenServiceUrl = 'https://gis.bolton-menk.com/metia/tokens/';\r\n adminTokenServiceUrl =\r\n 'https://gis.bolton-menk.com/metia/admin/generateToken/';\r\n server = hostname;\r\n resource = 'https://gis.bolton-menk.com/metia/rest/services';\r\n }\r\n\r\n const imObject = {\r\n serverInfos: [\r\n {\r\n server: hostname,\r\n tokenServiceUrl,\r\n adminTokenServiceUrl,\r\n shortLivedTokenValidity: tokentimeout,\r\n currentVersion: 10.22,\r\n hasServer: true\r\n }\r\n ],\r\n oAuthInfos: [],\r\n credentials: [\r\n {\r\n userId: userid,\r\n server,\r\n token: this.token,\r\n expires,\r\n validity: 50,\r\n ssl: false,\r\n creationTime: now,\r\n scope: 'server',\r\n resources: [resource]\r\n }\r\n ]\r\n };\r\n imObject.credentials = this.getNewCredentialsOrdered(\r\n this.oldcredentials,\r\n imObject.credentials[0]\r\n );\r\n return imObject;\r\n }\r\n\r\n getNewCredentialsOrdered (oldcredentials, newcredentials) {\r\n if (oldcredentials && newcredentials) {\r\n for (let i = 0; i < oldcredentials.length; i++) {\r\n if (oldcredentials[i].server === newcredentials.server) {\r\n oldcredentials[i] = newcredentials;\r\n return oldcredentials;\r\n }\r\n }\r\n\r\n return oldcredentials.concat(newcredentials);\r\n }\r\n\r\n return [newcredentials];\r\n }\r\n\r\n /**\r\n * @param {import('ol/layer').Layer} layerObj\r\n * @param {boolean} [isJson]\r\n */\r\n getLayerURLandToken (layerObj, isJson = false) {\r\n const source = layerObj.getSource();\r\n const curCreds = this.credentials && this.credentials[0];\r\n\r\n const resultObj = {\r\n token: curCreds ? curCreds.token : '',\r\n tokenString: curCreds ? '?token=' + curCreds.token : '',\r\n url: source.url_,\r\n expired: curCreds ? this.isCredientialsExpired() : null\r\n };\r\n\r\n if (isJson) {\r\n resultObj.tokenString +=\r\n resultObj.tokenString.indexOf('?') >= 0 ? '&f=json' : '?f=json';\r\n }\r\n\r\n return resultObj;\r\n }\r\n\r\n /**\r\n * @param {import('ol/layer').Layer} layerObj\r\n */\r\n async getAuthenticatedLayerURLandToken (layerObj) {\r\n if (this.isCredientialsExpired()) {\r\n await this.getMapLayerAuthenticated('submap');\r\n }\r\n\r\n return this.getLayerURLandToken(layerObj);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {*} data\r\n * @param {string} url\r\n */\r\n requestDataResults (data, url) {\r\n return new Promise((resolve, reject) => {\r\n request(url, {\r\n handleAs: 'json',\r\n headers: {\r\n 'Content-Type': 'application/json;charset=utf-8',\r\n Accept: 'application/json'\r\n },\r\n data: JSON.stringify(data),\r\n method: 'POST'\r\n }).then(resolve, reject);\r\n });\r\n }\r\n}\r\n\r\nexport default MapLayerCredientials;\r\n","import fx from 'dojo/_base/fx';\r\n\r\nimport Mediator from 'gisw/Classes/Mediator';\r\nimport { getValue, setValue } from 'gisw/Helpers/storage';\r\n\r\nclass MessageManager {\r\n /** @type {Array} */\r\n domList = [];\r\n\r\n currentTop = 0;\r\n\r\n /** @type {string} */\r\n previousMessage = null;\r\n\r\n // Function written for removing the html tags\r\n // (if any) before logging the messages.\r\n /**\r\n * @param {string} str\r\n */\r\n stripHTMLTags (str) {\r\n // Condition for checking if the string is null\r\n // or empty then return empty string.\r\n if (str === null || str === '') {\r\n return '';\r\n } else {\r\n }\r\n\r\n // Regular expression to identify HTML tags in\r\n // the input string. Replacing the identified\r\n // HTML tag with a empty string.\r\n this.stripHTMLTags = this.stripHTMLTags.bind(this);\r\n return str.replace(/(<([^>]+)>)/ig, '');\r\n }\r\n\r\n /**\r\n * @param {object} msg\r\n * @param {number} [msg.duration]\r\n * @param {string} msg.message\r\n * @param {string} msg.title\r\n * @param {string} [msg.toolName]\r\n */\r\n addMessage (msg) {\r\n // Ignore repeat messages, unless a tool name is given\r\n if (this.previousMessage === msg.message && !msg.toolName) {\r\n return;\r\n }\r\n\r\n this.previousMessage = msg.message;\r\n\r\n // Limit number of messages on screen\r\n if (this.domList.length >= 9) {\r\n return;\r\n }\r\n\r\n const closeButton = document.createElement('button');\r\n closeButton.classList.add('close');\r\n closeButton.textContent = 'X';\r\n\r\n const messageDiv = document.createElement('div');\r\n messageDiv.classList.add('messageDiv');\r\n messageDiv.innerHTML = msg.message;\r\n\r\n const titleSpan = document.createElement('span');\r\n titleSpan.classList.add('title');\r\n titleSpan.innerHTML = msg.title;\r\n\r\n this.timeout = msg.duration || 10000;\r\n this.timeout = this.timeout < 1000 ? this.timeout * 1000 : this.timeout;\r\n\r\n const messageContainer = document.createElement('div');\r\n\r\n if (msg.toolName) {\r\n messageContainer.classList.add('tool-message');\r\n } else {\r\n messageContainer.classList.add('message');\r\n }\r\n\r\n closeButton.addEventListener('click', () => {\r\n if (msg.toolName) {\r\n this.toolLeaveScreen(messageContainer);\r\n } else {\r\n this.leaveScreen(messageContainer);\r\n }\r\n });\r\n\r\n messageContainer.append(titleSpan, closeButton, messageDiv);\r\n document.getElementById('message-container').appendChild(messageContainer);\r\n\r\n if (msg.toolName) {\r\n if (getValue('gisw_' + msg.toolName)) {\r\n if (this.openTool) {\r\n this.toolLeaveScreen(this.openTool);\r\n }\r\n\r\n this.openTool = messageContainer;\r\n return;\r\n }\r\n\r\n this.addToolNode(messageContainer, msg.toolName);\r\n } else {\r\n this.addNode(messageContainer);\r\n }\r\n\r\n // Code written to send client side\r\n // javascript errors on the Server for the logging purposes.\r\n // The logging will be done on the IIS Server\r\n // which would include the messageTitle\r\n // entityName (county/city) & errorMessage.\r\n try {\r\n if (msg.title === 'Error' || msg.title === 'Warning') {\r\n const baseUrl = '/MagnumOpus/';\r\n const entityName = Mediator.serverData.entityName;\r\n\r\n let cleanMessage = '';\r\n cleanMessage = this.stripHTMLTags(msg.message);\r\n\r\n const errorLoggingUrl = baseUrl + 'messages/'\r\n + msg.title + '-' + entityName + '-' + cleanMessage + '';\r\n $.ajax({\r\n url: errorLoggingUrl,\r\n type: 'post',\r\n data: cleanMessage\r\n });\r\n }\r\n } catch (error) {\r\n }\r\n }\r\n\r\n /**\r\n * @param {HTMLDivElement} domNode\r\n */\r\n addNode (domNode) {\r\n const self = this;\r\n document.getElementById('message-container').appendChild(domNode);\r\n this.domList.push(domNode);\r\n\r\n fx.animateProperty({\r\n node: domNode,\r\n properties: {\r\n /**\r\n * @param {HTMLDivElement} node\r\n */\r\n right (node) {\r\n if (window.innerWidth < 599) {\r\n node.style.height = 'auto;';\r\n node.style.width = '90%;';\r\n return -10;\r\n } else {\r\n return (\r\n (node.offsetWidth +\r\n +node.style.marginLeft +\r\n +node.style.marginRight) *\r\n 0.15\r\n );\r\n }\r\n },\r\n /**\r\n * @param {HTMLDivElement} node\r\n */\r\n top (node) {\r\n if (window.innerWidth < 599) {\r\n return 60;\r\n } else {\r\n const result =\r\n node.offsetTop + self.domList.length * (node.offsetHeight + 15);\r\n\r\n return result;\r\n }\r\n }\r\n }\r\n }).play();\r\n\r\n setTimeout(() => {\r\n this.leaveScreen(domNode);\r\n }, this.timeout);\r\n }\r\n\r\n /**\r\n * @param {HTMLDivElement} domNode\r\n * @param {string} toolName\r\n */\r\n addToolNode (domNode, toolName) {\r\n if (this.openTool) {\r\n this.toolLeaveScreen(this.openTool);\r\n }\r\n\r\n this.openTool = domNode;\r\n\r\n document.getElementById('message-container').appendChild(domNode);\r\n\r\n const checkbox = document.createElement('input');\r\n checkbox.type = 'checkbox';\r\n checkbox.id = 'tool-checkbox';\r\n\r\n const label = document.createElement('label');\r\n label.htmlFor = 'tool-checkbox';\r\n label.textContent = 'Do not show this again *';\r\n\r\n const button = document.createElement('button');\r\n button.type = 'button';\r\n button.id = 'tool-button';\r\n button.textContent = 'Got It';\r\n\r\n button.addEventListener('click', () => {\r\n this.toolLeaveScreen(domNode, toolName);\r\n });\r\n\r\n const directionsLabel = document.createElement('label');\r\n directionsLabel.id = 'helpDirections';\r\n directionsLabel.textContent =\r\n `*To show hints again, click 'Help' ` + `-> Enable Tool Hints`;\r\n\r\n domNode.append(\r\n checkbox,\r\n label,\r\n document.createElement('br'),\r\n button,\r\n document.createElement('br'),\r\n document.createElement('br'),\r\n directionsLabel\r\n );\r\n\r\n fx.animateProperty({\r\n node: domNode,\r\n properties: {\r\n left (node) {\r\n if (window.innerWidth < 599) {\r\n node.style.height = 'auto';\r\n node.style.width = '90%';\r\n return 15;\r\n } else {\r\n const leftPanel = document.getElementById('left-panel');\r\n return leftPanel.offsetLeft + leftPanel.offsetWidth + 15;\r\n }\r\n },\r\n top (node) {\r\n if (window.innerWidth < 599) {\r\n return 15;\r\n } else {\r\n const leftPanel = document.getElementById('left-panel');\r\n return leftPanel.offsetTop;\r\n }\r\n }\r\n }\r\n }).play();\r\n }\r\n\r\n leaveScreen (domNode) {\r\n fx.animateProperty({\r\n node: domNode,\r\n duration: 500,\r\n properties: {\r\n /**\r\n * @param {HTMLElement} node\r\n */\r\n right (node) {\r\n return node.offsetWidth * -1.15;\r\n },\r\n opacity: 0\r\n }\r\n }).play();\r\n\r\n setTimeout(() => {\r\n const index = this.domList.indexOf(domNode);\r\n\r\n if (index > -1) {\r\n this.domList.splice(index, 1);\r\n\r\n for (let i = index; i < this.domList.length; i++) {\r\n shiftUp(this.domList[i]);\r\n }\r\n }\r\n\r\n domNode.remove();\r\n\r\n if (this.domList.length === 0) {\r\n this.previousMessage = null;\r\n }\r\n }, 500);\r\n }\r\n\r\n /**\r\n * @param {HTMLDivElement} domNode\r\n * @param {string} toolName\r\n */\r\n toolLeaveScreen (domNode = null, toolName = null) {\r\n // @ts-ignore\r\n if (toolName && document.getElementById('tool-checkbox')?.checked) {\r\n Mediator.jstManager.jstToolEvent(\r\n toolName,\r\n 'Hide Tip - ',\r\n null,\r\n null,\r\n null\r\n );\r\n\r\n setValue(`gisw_${toolName}`, true);\r\n }\r\n\r\n if (domNode) {\r\n domNode.remove();\r\n } else if (this.openTool) {\r\n this.openTool.remove();\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * @param {HTMLDivElement} domNode\r\n */\r\nfunction shiftUp (domNode) {\r\n const height = domNode.offsetHeight;\r\n const currentTop = domNode.offsetTop;\r\n const adjustedHeight = currentTop - height;\r\n\r\n fx.animateProperty({\r\n node: domNode,\r\n duration: 500,\r\n properties: { top: adjustedHeight }\r\n }).play();\r\n}\r\n\r\nexport default MessageManager;\r\n","import Mediator from 'gisw/Classes/Mediator';\r\n\r\nimport sleep from 'src/utils/sleep';\r\n\r\nimport GWindow from '../GWindow';\r\nimport NodeHash from '../NodeHash';\r\n\r\nimport Resizable from './Resizable';\r\n\r\nconst REFRESH_DELAY_DURATION = 300;\r\n\r\n/**\r\n * @typedef {object} GWindowListConfig\r\n * @property {string} id\r\n * @property {Array} [initGWindows]\r\n * @property {boolean} [resizable]\r\n */\r\n\r\nclass GWindowList {\r\n domNode = document.createElement('div');\r\n\r\n /**\r\n * @param {GWindowListConfig} config\r\n */\r\n constructor (config) {\r\n this.domNode.classList.add('gisw-wndw-list');\r\n\r\n const { id, initGWindows = [], resizable = false } = config;\r\n\r\n this.domNode.id = id;\r\n\r\n /** @private @type {Map} */\r\n this.gWindows = new Map();\r\n\r\n /** @private */\r\n this.resizeHelper = new Resizable({\r\n domRef: this.domNode,\r\n startResizing: resizable\r\n });\r\n\r\n /**\r\n * @typedef {object} GWindowItem\r\n * @property {string} [id]\r\n * @property {string} key\r\n * @property {import('src/web-components/GWorksWindow').default} node\r\n */\r\n\r\n /**\r\n * @private\r\n * @type {NodeHash}\r\n */\r\n this.nodeHash = new NodeHash({\r\n id: id + 'NodeHash',\r\n className: 'gisw-wndw-list__hash',\r\n createNode: p => p.node,\r\n noNestedDiv: true\r\n });\r\n this.domNode.appendChild(this.nodeHash.domNode);\r\n\r\n this.add(initGWindows);\r\n\r\n this.windowResizeHandler = this.windowResizeHandler.bind(this);\r\n window.addEventListener('resize', this.windowResizeHandler);\r\n }\r\n\r\n destroy () {\r\n window.removeEventListener('resize', this.windowResizeHandler);\r\n this.resizeHelper.enableResizing(false);\r\n this.nodeHash.destroy();\r\n\r\n for (const gWindow of this.gWindows.values()) {\r\n gWindow.destroy();\r\n }\r\n\r\n this.domNode.remove();\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n windowResizeHandler () {\r\n this.delayRefresh(REFRESH_DELAY_DURATION);\r\n }\r\n\r\n autoResizeHandler () {\r\n this.delayRefresh(REFRESH_DELAY_DURATION);\r\n }\r\n\r\n /**\r\n * @param {Array} params\r\n */\r\n add (params) {\r\n params.forEach(param => {\r\n this._trackGWin(_createGWindow(param), param.key);\r\n });\r\n }\r\n\r\n /**\r\n * @param {import('../GWindow').GWindowConfig} param\r\n */\r\n addTool (param) {\r\n this._trackTool(_createToolGWindow(param), param.key);\r\n }\r\n\r\n /**\r\n * @param {string} key\r\n * @param {object} [options]\r\n * @param {boolean} [options.preventDestruction]\r\n */\r\n remove (key, options = {}) {\r\n if (!this.isGWindowKey(key)) {\r\n return null;\r\n }\r\n\r\n const { preventDestruction = false } = options;\r\n\r\n const gWindow = this._untrackGWin(key);\r\n\r\n if (!preventDestruction && gWindow) {\r\n gWindow.destroy();\r\n }\r\n\r\n return gWindow;\r\n }\r\n\r\n /**\r\n * @param {string} key\r\n */\r\n deleteGWin (key) {\r\n const gwin = this.remove(key);\r\n\r\n if (gwin) {\r\n gwin.deleteGWin();\r\n }\r\n }\r\n\r\n /**\r\n * @param {string} key\r\n */\r\n isGWindowKey (key) {\r\n return this.nodeHash.containsKey(key);\r\n }\r\n\r\n /**\r\n * @param {string} key\r\n */\r\n getGWindow (key) {\r\n if (!this.isGWindowKey(key)) {\r\n return null;\r\n }\r\n\r\n return this.gWindows.get(key);\r\n }\r\n\r\n /**\r\n * @param {string} key\r\n * @param {HTMLElement} c\r\n */\r\n setContent (key, c) {\r\n if (!this.isGWindowKey(key)) {\r\n return;\r\n }\r\n\r\n this.gWindows.get(key).setContent(c);\r\n this.delayRefresh(300);\r\n }\r\n\r\n closeAllOpened () {\r\n return this.toggleKeys(\r\n new Set(\r\n Array.from(this.gWindows.entries())\r\n .filter(([, gWindow]) => !gWindow.isMinimized)\r\n .map(([key]) => key)\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * @deprecated\r\n */\r\n openAllClosed () {\r\n return this.toggleKeys(\r\n new Set(\r\n Array.from(this.gWindows.entries())\r\n .filter(([, gWindow]) => gWindow.isMinimized)\r\n .map(([key]) => key)\r\n )\r\n );\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {Set} keySet\r\n */\r\n async toggleKeys (keySet) {\r\n const promises = Array.from(keySet)\r\n .reverse()\r\n .map(key => this.toggleKey(key));\r\n\r\n await Promise.all(promises);\r\n }\r\n\r\n /**\r\n * @param {string} key\r\n */\r\n async toggleKey (key) {\r\n if (!this.nodeHash.containsKey(key)) {\r\n return;\r\n }\r\n\r\n const gwin = this.gWindows.get(key);\r\n\r\n gwin.toggle();\r\n await this.refresh();\r\n }\r\n\r\n /**\r\n * @param {number} timeout\r\n */\r\n delayRefresh (timeout) {\r\n clearTimeout(this.__timeoutID);\r\n\r\n /** @private */\r\n this.__timeoutID = setTimeout(() => {\r\n if (this.gWindows.size > 0) {\r\n this.refresh();\r\n }\r\n\r\n this.__timeoutID = null;\r\n }, timeout);\r\n }\r\n\r\n async refresh () {\r\n // Waits for batched updates in `` to complete\r\n await sleep();\r\n\r\n const visibleGWindows = Array.from(this.gWindows.values()).filter(\r\n gWindow => getComputedStyle(gWindow.domNode).display !== 'none'\r\n );\r\n\r\n const gWindowsOpened = visibleGWindows.filter(\r\n gWindow => !gWindow.isMinimized\r\n );\r\n\r\n const gWindowsClosed = visibleGWindows.filter(\r\n gWindow => gWindow.isMinimized\r\n );\r\n\r\n // Calculate new `--content-max-height` for each opened gWindow\r\n const totalSpace = Number.parseInt(\r\n getComputedStyle(this.nodeHash.domNode).maxHeight.replace('px', '')\r\n );\r\n const closedWindowSpace = gWindowsClosed.reduce(\r\n (total, gWindow) =>\r\n total + gWindow.domNode.getBoundingClientRect().height,\r\n 0\r\n );\r\n const marginSpace = visibleGWindows\r\n .map(gWindow => {\r\n const { marginBottom } = getComputedStyle(gWindow.domNode);\r\n\r\n return Number.parseInt(marginBottom.replace('px', ''));\r\n })\r\n .reduce((total, current) => total + current, 0);\r\n\r\n const usableSpace = totalSpace - (closedWindowSpace + marginSpace);\r\n\r\n // Distribute the remaining free space\r\n const newMaxHeight = Math.floor(usableSpace / gWindowsOpened.length);\r\n\r\n await Promise.all(\r\n gWindowsOpened.map(gWindow => {\r\n gWindow.domNode.style.setProperty(\r\n '--content-max-height',\r\n `${newMaxHeight}px`\r\n );\r\n\r\n return gWindow.refresh();\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {GWindow} gwin\r\n * @param {string} key\r\n */\r\n _trackGWin (gwin, key) {\r\n this.nodeHash.add([{ key, node: gwin.domNode }]);\r\n this.gWindows.set(key, gwin);\r\n gwin.domNode.addEventListener('toggle', () => this.refresh());\r\n\r\n // Would prefer to have this outside of GWindowList later\r\n if (key === 'layers') {\r\n // Syncfusion won't render correctly if the gWindow is shut\r\n // Dangit Syncfusion!\r\n gwin.domNode.addEventListener('toggle', async () => {\r\n await sleep();\r\n\r\n try {\r\n const tocNode = gwin.domNode.querySelector('.toc');\r\n\r\n tocNode\r\n .querySelector(`#${tocNode.id}--slider`)\r\n // @ts-ignore\r\n .ej2_instances[0].refresh();\r\n } catch (error) {\r\n // Shh\r\n }\r\n });\r\n }\r\n\r\n gwin.addCloseCallback(key => {\r\n this.remove(key);\r\n this.refresh();\r\n });\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {GWindow} gwin\r\n * @param {string} key\r\n */\r\n _trackTool (gwin, key) {\r\n gwin.addCloseCallback(key => {\r\n this.remove(key);\r\n this.refresh();\r\n });\r\n\r\n this.nodeHash.add([{ key, id: gwin.id + 'Container', node: gwin.domNode }]);\r\n this.gWindows.set(key, gwin);\r\n\r\n gwin.domNode.addEventListener('toggle', () => this.refresh());\r\n\r\n const tempLayers = this.getGWindow('layers');\r\n const tempBasemap = this.getGWindow('basemaps');\r\n this.remove('layers');\r\n this.remove('basemaps');\r\n\r\n this.add([\r\n {\r\n content: tempLayers.content,\r\n id: 'layersContainer',\r\n key: 'layers',\r\n title: 'Layers'\r\n },\r\n {\r\n content: tempBasemap.content,\r\n id: 'basemapContainer',\r\n key: 'basemaps',\r\n title: 'Basemap'\r\n }\r\n ]);\r\n\r\n if (Mediator.isMobile && !Mediator.desktopMode) {\r\n document.body.appendChild(this.getGWindow('activeTool').domNode);\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {string} key\r\n */\r\n _untrackGWin (key) {\r\n const gwin = this.gWindows.get(key);\r\n\r\n this.nodeHash.remove([key]);\r\n\r\n this.gWindows.delete(key);\r\n\r\n return gwin;\r\n }\r\n}\r\n\r\nexport default GWindowList;\r\n\r\n/**\r\n * @param {import('../GWindow').GWindowConfig} param\r\n */\r\nfunction _createGWindow (param) {\r\n return new GWindow({ startMinimized: true, ...param });\r\n}\r\n\r\n/**\r\n * @param {import('../GWindow').GWindowConfig} param\r\n */\r\nfunction _createToolGWindow (param) {\r\n return new GWindow({\r\n autoResize: true,\r\n 'class': 'toolGWindow',\r\n showCloseButton: true,\r\n ...param\r\n });\r\n}\r\n","import { css, html, LitElement } from 'lit-element';\r\nimport { unsafeHTML } from 'lit-html/directives/unsafe-html';\r\n\r\nconst MAX_ICON = '➚';\r\nconst MIN_ICON = '➘';\r\nconst CLOSE_ICON = '✖';\r\n\r\nclass GWorksWindow extends LitElement {\r\n static get properties () {\r\n return {\r\n closable: { reflect: true, type: Boolean },\r\n label: { reflect: true, type: String },\r\n show: { reflect: true, type: Boolean }\r\n };\r\n }\r\n\r\n static get styles () {\r\n return css`:host,\r\n *,\r\n *::after,\r\n *::before {\r\n box-sizing: border-box;\r\n }\r\n\r\n :host {\r\n display: block;\r\n max-height: calc(100vh - 100px);\r\n }\r\n\r\n .title-bar {\r\n align-items: flex-start;\r\n background-color: var(--titlebar-bg-color, #396430);\r\n color: var(--titlebar-text-color, white);\r\n display: flex;\r\n flex-direction: row;\r\n flex-wrap: nowrap;\r\n font-family: Roboto, sans-serif;\r\n line-height: 2.5;\r\n width: 100%;\r\n }\r\n\r\n .title-bar button {\r\n background-color: transparent;\r\n border: 0;\r\n color: inherit;\r\n cursor: pointer;\r\n font-family: inherit;\r\n font-size: inherit;\r\n line-height: inherit;\r\n }\r\n\r\n .title-bar button:focus {\r\n outline: 0.125rem dotted currentColor;\r\n }\r\n\r\n .title-bar__title-btn {\r\n padding: 0;\r\n text-align: left;\r\n width: 100%;\r\n }\r\n\r\n .title-bar__left {\r\n flex: 1 1 auto;\r\n padding-left: 0.5rem;\r\n }\r\n\r\n .title-bar__right {\r\n display: flex;\r\n flex-wrap: nowrap;\r\n }\r\n\r\n .container {\r\n background-color: var(--content-bg-color, rgba(242, 248, 241, 0.8));\r\n height: 100%;\r\n max-height: calc(var(--content-max-height, 70vh) - 2.5em);\r\n overflow: auto;\r\n }\r\n\r\n @media screen and (prefers-reduced-motion: no-preference) {\r\n .container {\r\n animation: slide-down 150ms ease-in;\r\n will-change: transform, opacity;\r\n }\r\n }\r\n\r\n @keyframes slide-down {\r\n from {\r\n opacity: 0;\r\n transform: scaleY(0.5), translateY(-50%);\r\n }\r\n\r\n to {\r\n opacity: 1;\r\n transform: scaleY(1), translateY(0%);\r\n }\r\n }\r\n`;\r\n }\r\n\r\n constructor () {\r\n super();\r\n\r\n this.closable = false;\r\n this.label = '';\r\n /** @type {boolean} */\r\n this.show = false;\r\n }\r\n\r\n connectedCallback () {\r\n super.connectedCallback();\r\n\r\n this.setAttribute('role', 'region');\r\n this.setAttribute('aria-label', this.label);\r\n }\r\n\r\n /**\r\n * @param {Map} changedProperties\r\n */\r\n update (changedProperties) {\r\n if (changedProperties.has('label')) {\r\n this.setAttribute('aria-label', this.label);\r\n }\r\n\r\n super.update(changedProperties);\r\n }\r\n\r\n disconnectedCallback () {\r\n super.disconnectedCallback();\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n onToggleClick () {\r\n this.toggle();\r\n }\r\n\r\n /**\r\n * Emits `toggle` event\r\n */\r\n toggle () {\r\n const newShow = !this.show;\r\n\r\n this.show = newShow;\r\n\r\n this.dispatchEvent(\r\n new CustomEvent('toggle', { bubbles: true, detail: { show: newShow } })\r\n );\r\n\r\n return newShow;\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n onCloseClick () {\r\n this.close();\r\n }\r\n\r\n /**\r\n * Emits `close` event and removes self from DOM\r\n */\r\n close () {\r\n this.dispatchEvent(new CustomEvent('close', { bubbles: true }));\r\n this.remove();\r\n }\r\n\r\n render () {\r\n return html`
\r\n
\r\n \r\n ${this.label}\r\n \r\n
\r\n
\r\n \r\n ${this.show ? unsafeHTML(MAX_ICON) : unsafeHTML(MIN_ICON)}\r\n ${unsafeHTML(CLOSE_ICON)}\r\n \r\n
\r\n
\r\n
\r\n \r\n
`;\r\n }\r\n}\r\n\r\ncustomElements.define('gworks-window', GWorksWindow);\r\n\r\nexport default GWorksWindow;\r\n","var api = require(\"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../../node_modules/mini-css-extract-plugin/dist/loader.js!../../node_modules/css-loader/dist/cjs.js??ref--5-2!../../node_modules/postcss-loader/src/index.js??ref--5-3!../../node_modules/less-loader/dist/cjs.js??ref--5-4!./gwindow.less\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","const MIN_WIDTH = 407;\r\n\r\n/**\r\n * @typedef {object} ResizeConfig\r\n * @property {HTMLElement} domRef\r\n * @property {boolean} [startResizing]\r\n */\r\n\r\n/**\r\n * Uses `data-resizable` attribute\r\n */\r\nclass Resizable {\r\n /**\r\n * @param {ResizeConfig} config\r\n */\r\n constructor (config) {\r\n const { domRef, startResizing = false } = config;\r\n\r\n /** @private */\r\n this.domRef = domRef;\r\n\r\n this.handlePointerDown = this.handlePointerDown.bind(this);\r\n this.handlePointerMove = this.handlePointerMove.bind(this);\r\n this.handlePointerOut = this.handlePointerOut.bind(this);\r\n\r\n this.enableResizing(startResizing);\r\n }\r\n\r\n /**\r\n * @param {boolean} enabled\r\n */\r\n enableResizing (enabled) {\r\n this.domRef.setAttribute('data-resizable', enabled ? 'true' : 'false');\r\n\r\n // Always initially remove to prevent duplicated events\r\n this.domRef.ownerDocument.removeEventListener(\r\n 'pointerdown',\r\n this.handlePointerDown\r\n );\r\n this.domRef.ownerDocument.removeEventListener(\r\n 'pointermove',\r\n this.handlePointerMove\r\n );\r\n this.domRef.removeEventListener('pointerout', this.handlePointerOut);\r\n\r\n if (enabled) {\r\n this.domRef.ownerDocument.addEventListener(\r\n 'pointerdown',\r\n this.handlePointerDown,\r\n { passive: true }\r\n );\r\n this.domRef.ownerDocument.addEventListener(\r\n 'pointermove',\r\n this.handlePointerMove,\r\n { passive: true }\r\n );\r\n this.domRef.addEventListener('pointerout', this.handlePointerOut, {\r\n passive: true\r\n });\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {PointerEvent} event\r\n */\r\n handlePointerDown (event) {\r\n if (!this.onLeftBorder(event)) {\r\n return;\r\n }\r\n\r\n const {\r\n left: initialLeft,\r\n width: initialWidth\r\n } = this.domRef.getBoundingClientRect();\r\n\r\n /**\r\n * @param {PointerEvent} event\r\n */\r\n const innerPointerMove = event => {\r\n const newWidthOffset = event.clientX - initialLeft;\r\n\r\n const newWidth = initialWidth - newWidthOffset;\r\n\r\n this.domRef.style.width =\r\n Math.min(\r\n window.innerWidth - 300,\r\n Math.max(newWidth, MIN_WIDTH)\r\n ).toString() + 'px';\r\n\r\n this.domRef.ownerDocument.addEventListener(\r\n 'pointerup',\r\n () => {\r\n this.domRef.ownerDocument.removeEventListener(\r\n 'pointermove',\r\n innerPointerMove\r\n );\r\n },\r\n { once: true, passive: true }\r\n );\r\n };\r\n\r\n this.domRef.ownerDocument.addEventListener(\r\n 'pointermove',\r\n innerPointerMove,\r\n {\r\n passive: true\r\n }\r\n );\r\n\r\n this.domRef.ownerDocument.addEventListener(\r\n 'pointerup',\r\n () => {\r\n this.domRef.dispatchEvent(\r\n new CustomEvent('resizeend', { bubbles: true })\r\n );\r\n },\r\n { once: true, passive: true }\r\n );\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {PointerEvent} event\r\n */\r\n handlePointerMove (event) {\r\n // @ts-ignore\r\n if (!event.target?.closest) {\r\n return;\r\n }\r\n\r\n const isPointerInside =\r\n // @ts-ignore\r\n event.target.closest('[data-resizable=\"true\"]') === this.domRef;\r\n\r\n if (isPointerInside) {\r\n const isOnLeftBorder = this.onLeftBorder(event);\r\n\r\n if (isOnLeftBorder) {\r\n event.stopPropagation();\r\n this.domRef.ownerDocument.body.style.cursor = 'w-resize';\r\n } else {\r\n this.domRef.ownerDocument.body.style.cursor = 'auto';\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n handlePointerOut () {\r\n this.domRef.ownerDocument.body.style.cursor = 'auto';\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {PointerEvent} event\r\n */\r\n onLeftBorder (event) {\r\n const { clientX, clientY } = event;\r\n const { left, top, height } = this.domRef.getBoundingClientRect();\r\n\r\n const minX = left;\r\n const maxX = left + 10;\r\n const minY = top;\r\n const maxY = top + height - 10;\r\n\r\n return (\r\n minX < clientX &&\r\n clientX < maxX &&\r\n minY < clientY &&\r\n clientY < maxY &&\r\n height > 30\r\n );\r\n }\r\n}\r\n\r\nexport default Resizable;\r\n","import GWindow from './GWindow';\r\n\r\nclass GWindowManager {\r\n /** @private */\r\n static count = 0;\r\n\r\n domNode = document.createElement('div');\r\n\r\n /** @private @type {Map} */\r\n gWindows = new Map();\r\n\r\n constructor () {\r\n this.domNode.id = 'gwndw-mngr';\r\n this.containerNode = this.domNode.appendChild(\r\n document.createElement('div')\r\n );\r\n }\r\n\r\n destroy () {\r\n this.closeAllWindows();\r\n\r\n this.domNode.remove();\r\n }\r\n\r\n closeAllWindows () {\r\n for (const gwin of this.gWindows.values()) {\r\n gwin.close();\r\n }\r\n }\r\n\r\n /**\r\n * @param {string} key\r\n */\r\n isGWindowKey (key) {\r\n return this.gWindows.has(key);\r\n }\r\n\r\n /**\r\n * @param {string} key\r\n */\r\n getGWindow (key) {\r\n if (!this.isGWindowKey(key)) {\r\n return null;\r\n }\r\n\r\n return this.gWindows.get(key);\r\n }\r\n\r\n /**\r\n * @param {import('./GWindow').GWindowConfig} param\r\n */\r\n createGWindow (param) {\r\n if (!param.key) {\r\n param.key = 'Window' + GWindowManager.count++;\r\n }\r\n\r\n // Always disabling `autoResize` since this is used for mobile view\r\n const gwin = new GWindow({ ...param, autoResize: false });\r\n\r\n gwin.addCloseCallback(key => this._closeGWinCallback(key));\r\n this._trackGWin(gwin, param.key);\r\n\r\n return { key: param.key, gWindow: gwin };\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {string} key\r\n */\r\n removeGWindow (key) {\r\n if (!this.isGWindowKey(key)) {\r\n return null;\r\n }\r\n\r\n const gwin = this.gWindows.get(key);\r\n gwin.domNode.remove();\r\n\r\n return gwin;\r\n }\r\n\r\n /**\r\n * @param {string} key\r\n */\r\n destroyGWindow (key) {\r\n if (!this.isGWindowKey(key)) {\r\n return;\r\n }\r\n\r\n const gwin = this.removeGWindow(key);\r\n this._untrackGWin(key);\r\n gwin.destroy();\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {string} key\r\n */\r\n _closeGWinCallback (key) {\r\n this._untrackGWin(key);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {GWindow} gwin\r\n * @param {string} key\r\n */\r\n _trackGWin (gwin, key) {\r\n this.gWindows.set(key, gwin);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {string} key\r\n */\r\n _untrackGWin (key) {\r\n this.gWindows.delete(key);\r\n }\r\n}\r\n\r\nexport default GWindowManager;\r\n","import { setValue } from 'gisw/Helpers/storage';\r\n\r\nimport screenSizeWarningTemplate from './ScreenSizeWarning.html';\r\n\r\n/**\r\n * @param {string} message\r\n */\r\nfunction screenSizeWarning (message) {\r\n const screenWarningId = '#ScreenSizeWarning';\r\n const screenWarningModalId = '#ScreenSizeWarningModal';\r\n const disableCheckboxId = '#ScreenWarningDisable';\r\n const screenWarningTitle = '#screenWarningTitle';\r\n const screenWarningBodyText = '#ScreenWarningBodyText';\r\n\r\n if ($(screenWarningId).length === 0) {\r\n const [screenSizeWarningModal] = $.parseHTML(screenSizeWarningTemplate);\r\n document.body.appendChild(screenSizeWarningModal);\r\n\r\n // Saves disable flag\r\n $(disableCheckboxId).on('change', event => {\r\n // @ts-ignore\r\n setValue('disableSizeWarning', event.target.checked);\r\n });\r\n\r\n $(screenWarningModalId).on('hide.bs.modal', function () {\r\n // @ts-ignore\r\n $(disableCheckboxId).get(0).checked = false;\r\n });\r\n } else if (\r\n // @ts-ignore\r\n $(disableCheckboxId).get(0).checked\r\n ) {\r\n $(screenWarningModalId).modal('hide');\r\n return;\r\n }\r\n\r\n // Fill template and open modal\r\n $(screenWarningTitle).html('Screen Size Warning');\r\n $(screenWarningBodyText).html(message);\r\n $(screenWarningModalId).modal('show');\r\n}\r\n\r\nexport default screenSizeWarning;\r\n","module.exports = \"\\r\\n
\\r\\n
\\r\\n \\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n
\\r\\n
\\r\\n \\r\\n
\\r\\n \\r\\n\\r\\n\";","import LayerVector from 'ol/layer/Vector';\r\n\r\nimport Mediator from 'gisw/Classes/Mediator';\r\n// @ts-ignore\r\nimport auth from 'gisw/Helpers/auth';\r\nimport messageObserver from 'gisw/Widgets/MessageManager/MessageObserver';\r\n\r\nexport default {\r\n preProcess () {\r\n // see eCounty/Index.cshtml for variables defined by server.\r\n\r\n Mediator.map = null;\r\n Mediator.currentTab = null;\r\n Mediator.activeTool = null;\r\n Mediator.currentToolGroup = null;\r\n Mediator.createAndShowPanel = null;\r\n\r\n /* 'global' methods */\r\n Mediator.getCurrentLayer = () => Mediator.layermanager.getCurrentLayer();\r\n Mediator.isExceedMaxZoom = () => Mediator.baseMapManager.isExceedMaxZoom();\r\n Mediator._processLoginData = _processLoginData.bind(Mediator);\r\n Mediator.initChurnZero = _initChurnZero;\r\n\r\n Mediator.getCurrentTabName = _getCurrentTabName;\r\n Mediator.getLayersVisibleAtCurrentScale = _getLayersVisibleAtCurrentScale;\r\n\r\n Mediator.getCurrentTabID = _getCurrentTabID;\r\n Mediator.getCurrentTabLabel = _getCurrentTabLabel;\r\n Mediator.getQueryParameter = _GetQueryParameter;\r\n\r\n // For eCountyDemo\r\n Mediator.getDemoCountyName = _getDemoCountyName;\r\n Mediator.getCountyDisplayName = _getCountyDisplayName;\r\n // Check Subscription based on CountyName,\r\n // or Tab name/ID in the future (Assessor sub VS EM sub)\r\n Mediator.CheckSub = _CheckSub;\r\n\r\n Mediator.GetLayerIDByName = _GetLayerIDByName;\r\n Mediator.GetLayerIDListByName = _GetLayerIDListByName;\r\n\r\n Mediator.RegisterPreserveLayer = _RegisterPreserveLayer.bind(Mediator);\r\n Mediator.RegisterProtectedLayer = _RegisterProtectedLayer.bind(Mediator);\r\n Mediator.ClearGraphics = _ClearGraphics;\r\n Mediator.preserveLayers = {};\r\n Mediator.protectedLayers = {};\r\n\r\n Mediator.GetFrontEndOptionIDByName = GetFrontEndOptionIDByName;\r\n },\r\n\r\n postProcess () {\r\n Mediator.centerMenu.setInitialTab();\r\n\r\n /** @type {import('gisw/Widgets/GenericSearch/Search').default} */\r\n const searchBar = Mediator.rightMenu.searchBar;\r\n\r\n Mediator.createAndShowPanel = params =>\r\n searchBar.createAndShowPanel(params);\r\n }\r\n};\r\n\r\nfunction _GetQueryParameter (paramName) {\r\n const parameterName = paramName + '=';\r\n const search = window.location.search;\r\n const slashIndex = search.indexOf('/');\r\n const query =\r\n slashIndex > 0 ? search.substring(1, slashIndex) : search.substring(1);\r\n const params = query.split('&');\r\n\r\n for (let i = 0; i < params.length; i++) {\r\n if (params[i].substring(0, parameterName.length) === parameterName) {\r\n return decodeURI(params[i].replace(parameterName, ''));\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * Returns the layers unique ID in the map service given its name.\r\n * In the case of duplicates the first will be selected.\r\n * @param {any} layerObj\r\n * @param {string} layerName\r\n */\r\nfunction _GetLayerIDByName (layerObj, layerName) {\r\n for (let i = 0; i < layerObj.layerInfos.length; i++) {\r\n if (layerObj.layerInfos[i].name.toLowerCase() === layerName.toLowerCase()) {\r\n return layerObj.layerInfos[i].id;\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\n/**\r\n * @param {*} layerObj\r\n * @param {string} layerName\r\n */\r\nfunction _GetLayerIDListByName (layerObj, layerName) {\r\n const temp = [];\r\n\r\n for (let i = 0; i < layerObj.layerInfos.length; i++) {\r\n if (\r\n layerObj.layerInfos[i].name\r\n .toLowerCase()\r\n .indexOf(layerName.toLowerCase()) !== -1\r\n ) {\r\n temp.push(i);\r\n }\r\n }\r\n\r\n return temp;\r\n}\r\n\r\n// Sometimes we want these layers to stick around (it depends)\r\nfunction _RegisterPreserveLayer (layerId) {\r\n this.preserveLayers[layerId] = true;\r\n}\r\n\r\n// We want these removed only when the clear button is clicked\r\nfunction _RegisterProtectedLayer (layerId) {\r\n this.protectedLayers[layerId] = true;\r\n}\r\n\r\nfunction _ClearGraphics (preserve, protect) {\r\n const layers = Mediator.map.getLayers();\r\n const preserveLayers = Mediator.preserveLayers;\r\n const protectedLayers = Mediator.protectedLayers;\r\n\r\n layers.forEach(function (layer) {\r\n const isProtected = !protect && protectedLayers[layer.ol_uid];\r\n const isPreserved = preserve && preserveLayers[layer.ol_uid];\r\n\r\n if (layer instanceof LayerVector && !isProtected && !isPreserved) {\r\n layer.getSource().clear();\r\n }\r\n });\r\n}\r\n\r\n/**\r\n * @param {string} name\r\n */\r\nfunction GetFrontEndOptionIDByName (name) {\r\n if (Mediator.serverData && Mediator.serverData.FrontEndOption) {\r\n for (let i = 0; i < Mediator.serverData.FrontEndOption.length; i++) {\r\n if (Mediator.serverData.FrontEndOption[i].Options === name) {\r\n return i;\r\n }\r\n }\r\n }\r\n\r\n return -1;\r\n}\r\n\r\n/**\r\n * @param {string} entityName\r\n */\r\nasync function _CheckSub (entityName) {\r\n if (entityName === '') {\r\n // not subscriber\r\n return;\r\n }\r\n\r\n const data = await fetch('subscription/IsSubscriptionEntity', {\r\n method: 'post',\r\n body: JSON.stringify({ entityName }),\r\n headers: {\r\n 'Content-Type': 'application/json;charset=utf-8',\r\n Accept: 'application/json'\r\n }\r\n }).then(res => res.json());\r\n\r\n const status = data.Status.Code;\r\n\r\n if (status !== 'OK') {\r\n messageObserver.broadcast({ title: 'Error', message: data.Status.Message });\r\n return;\r\n }\r\n\r\n // Update the isSub in detailsPanel\r\n // We might move isSub varibale to mediator when time permis\r\n Mediator.resultsPanel.detailsPanel.isSub = _dumbLogic(\r\n data.Features[0].Results.length > 0\r\n );\r\n}\r\n\r\n/**\r\n * Dumn logic from Flex code\r\n * Eventually this would be replaced with new logic codes\r\n * that take subscription and login.\r\n * @param {boolean} sub\r\n */\r\nfunction _dumbLogic(sub) {\r\n // specific change for deuel \r\n const countyName = _getCountyDisplayName().toLowerCase();\r\n // console.log(\"countyName=\" + countyName);\r\n if (countyName === \"deuel county\" && auth.loggedIn === true) {\r\n return true;\r\n } else if (countyName != \"deuel county\" && (auth.loggedIn && sub || sub === false)) {\r\n return true;\r\n } else if (sub && auth.loggedIn === false) {\r\n // 1. Has Sub but NOT logged in\r\n return false;\r\n } else {\r\n return false;\r\n }\r\n}\r\n\r\n// eCountyDemo tab LABEL example:\r\n// 1. 'Assessor | York'\r\n// 2. 'Tax Director | Dunn'\r\n// Default return name is the entity name/label\r\nfunction _getDemoCountyName () {\r\n const curTabLabel = Mediator.getCurrentTabLabel();\r\n\r\n if (_isDemoTab(curTabLabel)) {\r\n return _getEntityNameFromDemoTab(curTabLabel);\r\n }\r\n\r\n return Mediator.serverData.entityName;\r\n}\r\n\r\n// GIS-288 - added to allow retreiving the county display name from the tab label - JC 2024-02-21\r\nfunction _getCountyDisplayName() {\r\n const curTabLabel = Mediator.getCurrentTabLabel();\r\n\r\n if (_isDemoTab(curTabLabel)) {\r\n return _getEntityNameFromDemoTab(curTabLabel);\r\n }\r\n\r\n return Mediator.serverData.displayName;\r\n}\r\n\r\nfunction _isDemoTab (curTabLabel) {\r\n return curTabLabel.indexOf('|') >= 0;\r\n}\r\n\r\nfunction _getEntityNameFromDemoTab (curTabLabel) {\r\n const tabLabelParts = curTabLabel.split('|');\r\n\r\n if (tabLabelParts.length > 1) {\r\n // Last part: Get the County name\r\n return tabLabelParts[tabLabelParts.length - 1].trim();\r\n }\r\n\r\n return curTabLabel;\r\n}\r\n\r\nfunction _getCurrentTabLabel () {\r\n return Mediator.serverData.TabLabel[_getCurrentTabName()];\r\n}\r\n\r\nfunction _getCurrentTabName () {\r\n let curTabName =\r\n Mediator.currentTab ||\r\n Mediator.serverData.startUpTab ||\r\n Mediator.serverData.Tabs[0];\r\n\r\n if (!curTabName && auth.loggedIn && auth.loginInfo?.Tabs) {\r\n curTabName = auth.loginInfo.Tabs[0].TabName;\r\n }\r\n\r\n return curTabName;\r\n}\r\n\r\nfunction _getCurrentTabID () {\r\n const name = _getCurrentTabName();\r\n\r\n for (let i = 0; i < Mediator.serverData.Tabs.length; i++) {\r\n if (Mediator.serverData.Tabs[i].toLowerCase() === name.toLowerCase()) {\r\n return Mediator.serverData.TabIDs[name].toString();\r\n }\r\n }\r\n\r\n if (auth.loggedIn && auth.loginInfo?.Tabs) {\r\n for (let i = 0; i < auth.loginInfo.Tabs.length; i++) {\r\n if (auth.loginInfo.Tabs[i].TabName.toLowerCase() === name.toLowerCase()) {\r\n return auth.loginInfo.Tabs[i].ID.toString();\r\n }\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction _processLoginData (LoginInfo) {\r\n this.layerConfigs = LoginInfo.LayerConfigurations;\r\n this.currentUser = LoginInfo.UserName;\r\n this.userRoles = LoginInfo.UserRoles;\r\n this.serverData.startUpTab =\r\n LoginInfo.StartUpTab || this.serverData.startUpTab;\r\n this.serverData.Tabs = [];\r\n this.serverData.TabTools = {};\r\n this.serverData.TabLayers = {};\r\n this.serverData.TabSubLayers = {};\r\n this.serverData.TabFeatureLayers = {};\r\n\r\n if (this.layermanager) {\r\n this.layermanager.widgetItems = {};\r\n }\r\n\r\n this.userPermissions = LoginInfo.UserPermissions.reduce(function (\r\n results,\r\n permission\r\n ) {\r\n results[permission.Name] = permission;\r\n return results;\r\n },\r\n {});\r\n\r\n for (let i = 0; i < LoginInfo.Tabs.length; i++) {\r\n const curTabInfo = LoginInfo.Tabs[i];\r\n const curTabName = curTabInfo.TabName;\r\n\r\n this.serverData.Tabs[i] = curTabName;\r\n this.serverData.TabLabel[curTabName] = curTabInfo.TabLabel;\r\n this.serverData.TabIDs[curTabName] = curTabInfo.DatabaseID;\r\n this.serverData.TabQuickSearches[curTabName] = curTabInfo.QuickSearches;\r\n\r\n this.serverData.TabFeatureLayers[curTabName] = curTabInfo.FeatureLayers;\r\n this.serverData.TabTools[curTabName] = curTabInfo.Tools;\r\n\r\n if (this.layermanager) {\r\n this.layermanager.processLoginData(curTabInfo);\r\n } else {\r\n this.serverData.TabLayers[curTabInfo.TabName] = curTabInfo.MapService;\r\n\r\n if (curTabInfo.SubMapService) {\r\n this.serverData.TabSubLayers[curTabInfo.TabName] =\r\n curTabInfo.SubMapService;\r\n }\r\n }\r\n }\r\n}\r\n\r\nfunction _initChurnZero () {\r\n window.ChurnZero.push([\r\n 'setAppKey',\r\n 'WjQlKSnP4LfrVTETxgnAijGNhZtvk78iKQnqTBzNRR0'\r\n ]);\r\n\r\n $.ajax('/churnzero/getexternalids', {\r\n dataType: 'json',\r\n success (Ids) {\r\n window.ChurnZero.push([\r\n 'setContact',\r\n Ids.AccountExternalId,\r\n Ids.ContactExternalId\r\n ]);\r\n }\r\n });\r\n}\r\n\r\nfunction _getLayersVisibleAtCurrentScale () {\r\n // RESRI coming back to this\r\n const currentLayer = Mediator.getCurrentLayer();\r\n const currentVisibleLayers = currentLayer.visibleLayers;\r\n const currentScale = -1;\r\n const returnResult = [];\r\n let annotationID = -2;\r\n\r\n // ignore Annotation Layer for buffer\r\n for (let i = 0; i < currentVisibleLayers.length; i++) {\r\n const layer =\r\n currentLayer &&\r\n currentLayer.layerInfos &&\r\n currentLayer.layerInfos[currentVisibleLayers[i]];\r\n const isAnnotation = layer && layer.name === 'Annotation';\r\n\r\n if (isAnnotation) {\r\n annotationID = i;\r\n }\r\n }\r\n\r\n for (let j = 0; j < currentVisibleLayers.length; j++) {\r\n const curLayerInfo = _getCurrentLayerByID(\r\n currentLayer.layerInfos,\r\n currentVisibleLayers[j]\r\n );\r\n const isNotAnnotation =\r\n curLayerInfo &&\r\n !curLayerInfo.subLayerIds &&\r\n curLayerInfo.parentLayerId !== annotationID;\r\n const isInScaleRange =\r\n curLayerInfo &&\r\n (curLayerInfo.minScale === 0 || currentScale < curLayerInfo.minScale);\r\n\r\n if (isNotAnnotation && isInScaleRange) {\r\n returnResult.push(currentVisibleLayers[j]);\r\n }\r\n }\r\n\r\n return returnResult;\r\n}\r\n\r\nfunction _getCurrentLayerByID (layerInfos, layerID) {\r\n for (let i = 0; i < layerInfos.length; i++) {\r\n if (layerInfos[i].id === layerID) {\r\n return layerInfos[i];\r\n }\r\n }\r\n\r\n return null;\r\n}\r\n","import GeometryType from 'ol/geom/GeometryType';\r\nimport LayerVector from 'ol/layer/Vector';\r\nimport SourceVector from 'ol/source/Vector';\r\n\r\nimport Mediator from 'gisw/Classes/Mediator';\r\n// @ts-ignore\r\nimport auth from 'gisw/Helpers/auth';\r\nimport { HIGHLIGHT, PARCEL, POINT } from 'gisw/Helpers/StyleConstants';\r\nimport messageObserver, {\r\n messageManager\r\n} from 'gisw/Widgets/MessageManager/MessageObserver';\r\n\r\nimport toolUrl from 'src/modules/tool-url';\r\n\r\n/**\r\n * Defines handlers for all actions between eCounty widgets.\r\n *\r\n * Methods here should utilize methods provided by eCounty widgets.\r\n * If the logic of any single method becomes too large,\r\n * it may need to be refactored into methods defined\r\n * on the appropriate eCounty widget.\r\n *\r\n * ** Do not define eCounty specific modules\r\n * in Shared are used in all MagnumOpus sites **\r\n *\r\n * one string key for each \"inter-widget\" action utilized by a widget on the\r\n * eCounty site. Keys may use \"dot\" notation to emulate namespacing of actions,\r\n * e.g. \"tools.action1\".\r\n * This object is used as the parameter of the {@link Mediator#registerHandlers}\r\n * method which uses each key to define a method\r\n * on the Maestro object {@link Mediator}. One can then call the handler via\r\n * the {@link Mediator#handle} method.\r\n */\r\n\r\nexport function getHandlers () {\r\n const graphicsSource = new SourceVector();\r\n const graphicsLayer = new LayerVector({\r\n source: graphicsSource,\r\n renderOrder (featureA, featureB) {\r\n // Show features with PID ontop\r\n return +!!featureA.attributes.PID - +!!featureB.attributes.PID;\r\n }\r\n });\r\n\r\n return {\r\n loadStartUpTool () {\r\n const targetTool = toolUrl.getTool();\r\n\r\n if (targetTool !== null && Mediator.toolsManager.hasTool(targetTool)) {\r\n Mediator.handle({ name: 'openTool', args: [targetTool] });\r\n return;\r\n }\r\n\r\n if (Object.keys(Mediator.serverData.startupTools).length === 0) {\r\n return;\r\n }\r\n\r\n const hasStartupTools = Mediator.toolsManager.tabHasStartupTools();\r\n\r\n if (!auth.loggedIn && !hasStartupTools) {\r\n Mediator.login.show();\r\n } else if (!hasStartupTools) {\r\n messageObserver.broadcast({\r\n title: 'Warning',\r\n message: `Current user doesn't have access to the specified tool.`\r\n });\r\n } else {\r\n Mediator.toolsManager.bootStartupTools();\r\n }\r\n },\r\n\r\n /**\r\n * Open any main tool by clicking its domNode\r\n *\r\n * Note: This should **not** be so heavily tied to the dom\r\n * @param {FactoryTypes.ModuleNames} toolName\r\n */\r\n openTool (toolName) {\r\n const isMain = Mediator.centerMenu.toolsMain.style.display !== 'none';\r\n const toolContainer = isMain\r\n ? Mediator.centerMenu.toolsMain.firstElementChild\r\n : Mediator.centerMenu.toolsSecondary.firstElementChild;\r\n\r\n if (!toolContainer) {\r\n return;\r\n }\r\n\r\n /** @type {HTMLButtonElement} */\r\n const button = toolContainer.querySelector(\r\n `button[data-tool-name=\"${toolName}\"]`\r\n );\r\n\r\n if (button) {\r\n button.click();\r\n }\r\n },\r\n\r\n 'toolsManager.ActiveTool.Close': function () {\r\n Mediator.toolsManager.closeActiveTool(true);\r\n },\r\n\r\n /**\r\n * load individual tool domNode here\r\n * @param {*} tool\r\n * @param {FactoryTypes.ModuleNames} toolName\r\n * @param {boolean} hasContent\r\n */\r\n 'toolsManagerMenu.button.click': function (tool, toolName, hasContent) {\r\n Mediator.jstManager.jstToolEvent(toolName, 'Open', null, null, null);\r\n Mediator.toolsManager.handleAlwaysOnIdentify(toolName);\r\n\r\n // @ts-ignore\r\n if (toolName !== 'Clear_') {\r\n Mediator.leftPanel.closeAllOpened();\r\n } else {\r\n if (Mediator.AlwaysOnIdentify) {\r\n Mediator.AlwaysOnIdentify.resume();\r\n }\r\n\r\n if (Mediator.isMobile || Mediator.inMobileMode) {\r\n Mediator.gWindowManager.destroyGWindow('activeTool');\r\n\r\n if (Mediator.mobileLeftVisible) {\r\n Mediator.hideMobileLeft();\r\n }\r\n\r\n if (Mediator.mobileSearchVisible) {\r\n Mediator.hideMobileRight();\r\n }\r\n }\r\n\r\n messageManager.toolLeaveScreen();\r\n }\r\n\r\n let toolGWin = Mediator.leftPanel.getGWindow('activeTool');\r\n const mobileTool = Mediator.gWindowManager.getGWindow('activeTool');\r\n\r\n if (!hasContent) {\r\n if (\r\n (Mediator.isMobile || Mediator.inMobileMode) &&\r\n !Mediator.desktopMode\r\n ) {\r\n Mediator.hideMobileLeft();\r\n }\r\n\r\n Mediator.activeTool = toolName;\r\n\r\n if (toolGWin) {\r\n toolGWin.destroy();\r\n }\r\n\r\n return;\r\n }\r\n\r\n const toolTitleDescription = Mediator.ToolsTitleDiscription[toolName]\r\n ? Mediator.ToolsTitleDiscription[toolName]\r\n : toolName || 'Tool';\r\n\r\n if (!toolGWin && !mobileTool) {\r\n if (\r\n (Mediator.isMobile || Mediator.inMobileMode) &&\r\n !Mediator.desktopMode\r\n ) {\r\n const { gWindow } = Mediator.gWindowManager.createGWindow({\r\n title: toolTitleDescription,\r\n id: toolTitleDescription + 'Panel',\r\n key: 'activeTool',\r\n 'class': 'toolGWindow',\r\n content: tool.domNode,\r\n closeCallback: () => {\r\n Mediator.toolsManager.closeActiveTool(true);\r\n },\r\n showCloseButton: true,\r\n position: {\r\n bottom: '0',\r\n left: '0',\r\n width: '100%',\r\n maxWidth: '235px',\r\n zIndex: '1',\r\n position: 'absolute'\r\n }\r\n });\r\n\r\n document.body.appendChild(gWindow.domNode);\r\n\r\n Mediator.hideMobileLeft();\r\n\r\n return;\r\n }\r\n\r\n // Extracting `closeCallback` so that it doesn't skip\r\n // the `closeActiveTool` call\r\n /** @type {Partial} */\r\n const { closeCallback = null, ...otherParams } =\r\n tool.GWindowParams ?? {};\r\n\r\n Mediator.leftPanel.addTool({\r\n title: toolTitleDescription,\r\n id: toolTitleDescription + 'Panel',\r\n key: 'activeTool',\r\n 'class': 'toolGWindow',\r\n content: tool.domNode,\r\n closeCallback: key => {\r\n Mediator.toolsManager.closeActiveTool(true);\r\n\r\n if (closeCallback) {\r\n closeCallback(key);\r\n }\r\n },\r\n showCloseButton: true,\r\n ...otherParams\r\n });\r\n\r\n toolGWin = Mediator.leftPanel.getGWindow('activeTool');\r\n\r\n const msgBox = document.getElementById('emptyToolMessage');\r\n\r\n if (msgBox) {\r\n switch (toolTitleDescription) {\r\n case 'Zoom In':\r\n msgBox.innerHTML = 'Click and drag on the map to zoom in.';\r\n break;\r\n case 'Zoom Out':\r\n msgBox.innerHTML = 'Click and drag on the map to zoom out.';\r\n break;\r\n case 'Pan':\r\n msgBox.innerHTML = 'Click and drag on the map';\r\n msgBox.style.marginLeft = '20px';\r\n break;\r\n }\r\n }\r\n } else {\r\n Mediator.leftPanel.remove('activeTool');\r\n Mediator.gWindowManager.destroyGWindow('activeTool');\r\n\r\n if (Mediator.isMobile && !Mediator.desktopMode) {\r\n const { gWindow } = Mediator.gWindowManager.createGWindow({\r\n title: toolTitleDescription,\r\n id: toolTitleDescription + 'Panel',\r\n key: 'activeTool',\r\n 'class': 'toolGWindow',\r\n content: tool.domNode,\r\n closeCallback: () => {\r\n Mediator.toolsManager.closeActiveTool(true);\r\n },\r\n showCloseButton: true,\r\n position: {\r\n bottom: '0',\r\n left: '0',\r\n width: '100%',\r\n maxWidth: '235px',\r\n zIndex: '1',\r\n position: 'absolute'\r\n }\r\n });\r\n\r\n document.body.appendChild(gWindow.domNode);\r\n Mediator.hideMobileLeft();\r\n\r\n return;\r\n }\r\n\r\n /** @type {Partial} */\r\n const { closeCallback = null, ...otherParams } =\r\n tool.GWindowParams ?? {};\r\n\r\n Mediator.leftPanel.addTool({\r\n title: toolTitleDescription,\r\n id: toolTitleDescription + 'Panel',\r\n key: 'activeTool',\r\n 'class': 'toolGWindow',\r\n content: tool.domNode,\r\n closeCallback: key => {\r\n Mediator.toolsManager.closeActiveTool(true);\r\n\r\n if (closeCallback) {\r\n closeCallback(key);\r\n }\r\n },\r\n showCloseButton: true,\r\n ...otherParams\r\n });\r\n\r\n const msgBox = document.getElementById('emptyToolMessage');\r\n\r\n if (msgBox) {\r\n switch (toolTitleDescription) {\r\n case 'Zoom In':\r\n msgBox.innerHTML = 'Click and drag on the map to zoom in.';\r\n break;\r\n case 'Zoom Out':\r\n msgBox.innerHTML = 'Click and drag on the map to zoom out.';\r\n break;\r\n case 'Pan':\r\n msgBox.innerHTML = 'Click and drag on the map';\r\n msgBox.style.marginLeft = '20px';\r\n break;\r\n }\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * @param {object} tab\r\n * @param {string} tab.name\r\n */\r\n 'centerMenu.tab.click': function (tab) {\r\n if (\r\n !Mediator.serverData.Tabs.includes(tab.name) ||\r\n tab.name === Mediator.currentTab\r\n ) {\r\n return;\r\n }\r\n\r\n /** @type {import('gisw/Widgets/GenericSearch/Search').default} */\r\n const searchBar = Mediator.rightMenu.searchBar;\r\n\r\n // MUST set the new current tab before switching to the new tab\r\n // especially for the map extent\r\n Mediator.currentTab = tab.name;\r\n\r\n // If loading the website with a startup Tool\r\n // disable special tools from booting\r\n const hasStartupTool =\r\n Object.keys(Mediator.serverData.startupTools).length > 0;\r\n\r\n const disableSpecialBootUp =\r\n toolUrl.getTool() !== null ||\r\n Mediator.currentTab === null && hasStartupTool;\r\n\r\n // For eCountyDemo\r\n if (Mediator.serverData.entityName.toLowerCase() === 'ecountydemo') {\r\n // Check Subscription for County or Tab\r\n const countyName = Mediator.getDemoCountyName();\r\n\r\n searchBar.ac.reset(countyName);\r\n\r\n // switch to new tab's map extent\r\n // eCounty ONLY\r\n Mediator.layermanager.zoomToCurrentLayerFullExtent(true);\r\n }\r\n\r\n const toolsMenuWidget = Mediator.toolsManager.getToolsMenuButtonsForTab(\r\n tab.name\r\n );\r\n\r\n Mediator.baseMapManager.switchBaseMapForTab();\r\n\r\n if (Mediator.leftPanel.isGWindowKey('tools')) {\r\n Mediator.leftPanel.setContent('tools', toolsMenuWidget.domNode);\r\n Mediator.leftPanel.setContent(\r\n 'layers',\r\n Mediator.layermanager.getTOC(tab.name)\r\n );\r\n Mediator.leftPanel.setContent(\r\n 'basemaps',\r\n Mediator.baseMapManager.getDomNode()\r\n );\r\n\r\n Mediator.centerMenu.copyTools();\r\n }\r\n\r\n if (Mediator.helppage) {\r\n Mediator.helppage.updateHelpInfo(tab.name);\r\n }\r\n\r\n Mediator.rightMenu.clearList();\r\n searchBar.setSearchPlaceHolder();\r\n Mediator.rightMenu.populateAdvancedSearch(tab.name);\r\n\r\n Mediator.centerMenu.setSelectListValue(tab.name);\r\n\r\n // close extra windows that are open\r\n // This forces tools to call bootup when changing tabs...\r\n const toolGWin = Mediator.leftPanel.getGWindow('activeTool');\r\n\r\n if (toolGWin) {\r\n // @ts-ignore\r\n Mediator.toolsManager.buttonHandler(null, 'Clear_');\r\n } else if (Mediator.toolsManager.activeToolName) {\r\n Mediator.toolsManager.shutdownActiveTool();\r\n messageManager.toolLeaveScreen();\r\n Mediator.toolsManager.activeToolName = null;\r\n }\r\n\r\n const resultGWin = Mediator.gWindowManager.getGWindow('resultsSidePanel');\r\n\r\n if (resultGWin) {\r\n resultGWin.close();\r\n }\r\n\r\n if (disableSpecialBootUp) {\r\n return;\r\n }\r\n\r\n if (Mediator.toolsManager.hasTool('RoadsProjectManagement', tab.name)) {\r\n Mediator.handle({ name: 'openTool', args: ['RoadsProjectManagement'] });\r\n }\r\n },\r\n\r\n /**\r\n * @param {string} [gNameInput]\r\n * @param {number} [timeout]\r\n */\r\n 'gWindow.content.refresh': function (gNameInput, timeout) {\r\n let gName = gNameInput;\r\n\r\n if (!gName) {\r\n gName = 'activeTool';\r\n }\r\n\r\n if (Mediator.gWindowManager.getGWindow(gName)) {\r\n if (timeout) {\r\n Mediator.gWindowManager.getGWindow(gName).delayRefresh(timeout);\r\n } else {\r\n Mediator.gWindowManager.getGWindow(gName).refresh();\r\n }\r\n }\r\n },\r\n\r\n /**\r\n * @param {import('gisw/Widgets/GenericSearch/ResultSet').default} results\r\n * @param {boolean} zoomToGeometry\r\n * @param {boolean} [clearMap]\r\n */\r\n 'search.results.show': async function (results, zoomToGeometry, clearMap) {\r\n // check if there's actually results...'\r\n if (results.categories.length === 0) {\r\n return;\r\n }\r\n\r\n await Mediator.resultsPanel.loadResults(results, zoomToGeometry);\r\n\r\n // show the panel\r\n Mediator.rightMenu.displayResults(null, clearMap);\r\n },\r\n\r\n /**\r\n * @param {HTMLElement} results\r\n */\r\n 'results.set': function (results) {\r\n // show the panel\r\n Mediator.rightMenu.displayResults(results);\r\n },\r\n\r\n /**\r\n * @param {number} [timeout]\r\n */\r\n 'results.gWindow.refresh': function (timeout = 300) {\r\n Mediator.rightMenu.gWindowList\r\n .getGWindow('resultsPanel')\r\n .delayRefresh(timeout);\r\n },\r\n\r\n 'remove.activeTool': function () {\r\n Mediator.map.getTargetElement().style.height = window.innerHeight + 'px';\r\n Mediator.leftPanel.remove('activeTool');\r\n },\r\n\r\n 'loading.show': function () {\r\n Mediator.rightMenu.showWaitCursor();\r\n },\r\n\r\n 'loading.hide': function () {\r\n let isMapLoading = false;\r\n Mediator.map.getLayers().forEach(function (layer) {\r\n isMapLoading = isMapLoading || layer.getSource().loading;\r\n });\r\n\r\n if (!isMapLoading) {\r\n Mediator.rightMenu.hideWaitCursor();\r\n }\r\n },\r\n\r\n 'rightmenu.clearAll': function () {\r\n if (!Mediator.rightMenu) {\r\n return;\r\n }\r\n\r\n /** @type {import('gisw/Widgets/GenericSearch/Search').default} */\r\n const searchBar = Mediator.rightMenu.searchBar;\r\n\r\n Mediator.rightMenu.clearList({\r\n keepSalesSearch: true,\r\n keepPaymentSearch: true,\r\n keepInstrumentSearch: true,\r\n keepQuickSearch: true\r\n });\r\n\r\n searchBar.clearSearchInput();\r\n\r\n Mediator.ClearGraphics();\r\n },\r\n 'results.clear': function () {\r\n Mediator.rightMenu.hideResults();\r\n },\r\n\r\n /**\r\n * @param {HTMLElement} node\r\n * @param {Partial} [position]\r\n */\r\n 'results.add': function (node, position) {\r\n Mediator.rightMenu.addSubResult(node, position);\r\n },\r\n\r\n /**\r\n * @param {Array} featureArray\r\n * @param {boolean} zoomToExtent\r\n * @param {boolean} clearMap\r\n * @param {boolean} [forceZoom]\r\n */\r\n 'map.showgeometry': function (\r\n featureArray,\r\n zoomToExtent,\r\n clearMap,\r\n forceZoom\r\n ) {\r\n let hasGeometry = false;\r\n\r\n // Make sure graphics layer is on top\r\n Mediator.map.removeLayer(graphicsLayer);\r\n Mediator.map.addLayer(graphicsLayer);\r\n\r\n if (clearMap) {\r\n Mediator.ClearGraphics(true);\r\n }\r\n\r\n for (let i = 0; i < featureArray.length; i++) {\r\n const geometry = featureArray[i].getGeometry();\r\n\r\n if (geometry) {\r\n hasGeometry = true;\r\n\r\n let style;\r\n\r\n if (featureArray[i].attributes['PID'] &&\r\n geometry.getType() !== 'Point') {\r\n style = PARCEL;\r\n } else if (geometry.getType() === 'Point') {\r\n style = POINT;\r\n } else {\r\n style = HIGHLIGHT;\r\n }\r\n\r\n const olFeature = featureArray[i];\r\n olFeature.setStyle(style);\r\n graphicsSource.addFeature(olFeature);\r\n }\r\n }\r\n\r\n if (!hasGeometry) {\r\n return;\r\n }\r\n\r\n const singlePoint =\r\n featureArray.length === 1 &&\r\n featureArray[0].getGeometry().getType() === GeometryType.POINT;\r\n\r\n if (singlePoint) {\r\n /** @type {import('ol/geom/Point').default} */\r\n // @ts-ignore\r\n const geom = featureArray[0].getGeometry();\r\n\r\n if (forceZoom) {\r\n Mediator.map.getView().animate({\r\n duration: 200,\r\n center: geom.getCoordinates(),\r\n zoom: 20\r\n });\r\n } else {\r\n Mediator.map.getView().animate({\r\n duration: 200,\r\n center: geom.getCoordinates()\r\n });\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (zoomToExtent) {\r\n Mediator.map.getView().fit(graphicsSource.getExtent(), {\r\n nearest: true,\r\n duration: 200\r\n });\r\n }\r\n },\r\n\r\n 'payment.panel.show': function (searchStrings, strDate, paymentType) {\r\n Mediator.paymentPanel.loadResults(searchStrings, strDate, paymentType);\r\n },\r\n\r\n 'cart.panel.show': function () {\r\n Mediator.CartPanel.loadPanel();\r\n },\r\n\r\n 'cart.panel.addToCart': function (parcelId, typeId) {\r\n Mediator.CartPanel.addToCart(parcelId, typeId);\r\n },\r\n\r\n /**\r\n * @param {string} url\r\n */\r\n 'window.popup.open': function (url) {\r\n const newWindow = window.open(url);\r\n\r\n if (!newWindow) {\r\n messageObserver.broadcast({\r\n title: 'Pop-up Blocker Enabled',\r\n message: 'Please disable your pop-up blocker to view content.',\r\n duration: 15000\r\n });\r\n }\r\n },\r\n\r\n /**\r\n * @param {string} searchString\r\n */\r\n 'search.executeSearch': function (searchString) {\r\n /** @type {import('gisw/Widgets/GenericSearch/Search').default} */\r\n const searchBar = Mediator.rightMenu.searchBar;\r\n searchBar.executeSearch(searchString);\r\n },\r\n\r\n /**\r\n * Adds Personal Property information into the `results` parameter,\r\n * only if the `PersonalProperty` tool is available.\r\n * If the tool is unavailable, the `results` parameter remains unchanged.\r\n * @param {import('gisw/Widgets/GenericSearch/ResultSet').default} results\r\n * @param {string} searchString\r\n */\r\n 'mix.search.results.async': async function (results, searchString) {\r\n const hasPersonalProperty = Mediator.toolsManager.hasTool(\r\n 'PersonalProperty',\r\n Mediator.getCurrentTabName()\r\n );\r\n\r\n if (hasPersonalProperty) {\r\n await Mediator.toolsManager.searchPersonalProperty(\r\n results,\r\n searchString\r\n );\r\n }\r\n\r\n return results;\r\n },\r\n\r\n zoomToSTR (section, township, range) {\r\n const hasMapNav = Mediator.toolsManager.hasTool(\r\n 'MapNavigation',\r\n Mediator.getCurrentTabName()\r\n );\r\n\r\n if (hasMapNav) {\r\n Mediator.toolsManager._tools.MapNavigation.zoomToSTR(\r\n section,\r\n township,\r\n range\r\n );\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * @typedef {ReturnType} HandlerMap\r\n */\r\n\r\n/**\r\n * @typedef {keyof HandlerMap} HandlerNames\r\n */\r\n\r\n/**\r\n * @template {HandlerNames} T\r\n * @typedef {Parameters} HandlerParams\r\n */\r\n\r\nconst Handlers = { getHandlers };\r\n\r\nexport default Handlers;\r\n","import TileLayer from 'ol/layer/Tile';\r\nimport XYZ from 'ol/source/XYZ';\r\nimport OSM from 'ol/source/OSM'; // Importing OSM source\r\n\r\nimport Mediator from 'gisw/Classes/Mediator';\r\nimport NodeHash from 'gisw/Widgets/NodeHash';\r\n\r\nclass BasemapManager {\r\n /**\r\n * @param {object} config\r\n * @param {string} config.id\r\n */\r\n constructor (config) {\r\n this.id = config.id;\r\n\r\n this.tabsDefaultBasemap = Mediator.serverData.FrontEndOption\r\n .tabsDefaultBasemap\r\n ? JSON.parse(\r\n Mediator.serverData.FrontEndOption.tabsDefaultBasemap.SubOptions\r\n )\r\n : null;\r\n\r\n console.log('Calling loadLayers');\r\n this.loadLayers();\r\n this.onExtentChange = this.onExtentChange.bind(this);\r\n this.isLoadingEmptyImage = false;\r\n Mediator.map.on('moveend', this.onExtentChange);\r\n }\r\n\r\n getDomNode () {\r\n if (this.domNode && !$(this.domNode).is(':empty')) {\r\n // Reuse created domNode for each department\r\n // since they have the base maps per login\r\n return this.domNode;\r\n }\r\n\r\n const initItems = [{ key: Mediator.serverData.urls.streetLabel }].concat(\r\n Mediator.serverData.EntityAerials.map(aerial => ({ key: aerial.Label }))\r\n );\r\n\r\n const baseMapBtnsWidget = new NodeHash({\r\n id: 'BasemapsNodeHash',\r\n initItems,\r\n className: 'ThumbnailWindow',\r\n createNode\r\n });\r\n\r\n baseMapBtnsWidget.itemEventListener('click', this.buttonHandler.bind(this));\r\n\r\n this.domNode = baseMapBtnsWidget.domNode;\r\n\r\n this._toggleSelectBtnCSS(this.currentBasemap);\r\n\r\n return this.domNode;\r\n }\r\n\r\n buttonHandler (domNode, basemapName) {\r\n this._toggleSelectBtnCSS(basemapName);\r\n this.switchBaseMap(basemapName);\r\n }\r\n\r\n getCurrentBasemap () {\r\n return this.currentBasemap;\r\n }\r\n\r\n async loadLayers() {\r\n console.log('In loadLayers');\r\n /** @type {Record} */\r\n this.baseMapLayers = {};\r\n\r\n const urls = Mediator.serverData.urls;\r\n\r\n // Setup ESRI Raster Street Layer\r\n if (urls.streetLabel === 'OSM_Street') {\r\n this.baseMapLayers[urls.streetLabel] = new TileLayer({\r\n source: new OSM(),\r\n });\r\n } else {\r\n this.baseMapLayers[urls.streetLabel] = new TileLayer({\r\n source: new XYZ({\r\n crossOrigin: 'anonymous',\r\n transition: 0,\r\n url: `${urls.streetUrl}/tile/{z}/{y}/{x}?blankTile=false`,\r\n maxZoom: urls.streetMaxZoom,\r\n }),\r\n });\r\n };\r\n\r\n for (const entityAerial of Mediator.serverData.EntityAerials) {\r\n try {\r\n // Handle OpenStreetMap base layer\r\n if (entityAerial.AerialServer === 'osm') {\r\n console.log('Creating OSM TileLayer for:', entityAerial.Label);\r\n\r\n this.baseMapLayers[entityAerial.Label] = new TileLayer({\r\n source: new OSM(),\r\n });\r\n\r\n // Handle all other cases (Typically ESRI Raster Tile Service)\r\n } else {\r\n console.log('Creating TileLayer for:', entityAerial.Label);\r\n this.baseMapLayers[entityAerial.Label] = new TileLayer({\r\n source: new XYZ({\r\n crossOrigin: 'anonymous',\r\n transition: 0,\r\n url: `${combineMapUrl(\r\n entityAerial.AerialServer,\r\n entityAerial.AerialServiceName\r\n )}/tile/{z}/{y}/{x}?blankTile=false`,\r\n maxZoom: entityAerial.MaxZoom,\r\n }),\r\n });\r\n }\r\n } catch (error) {\r\n console.error('Error creating layer for:', entityAerial.Label, error);\r\n }\r\n }\r\n\r\n this.switchBaseMap(urls.streetLabel);\r\n }\r\n\r\n switchBaseMap(basemap) {\r\n console.log('Switching to basemap:', basemap);\r\n const prevBasemap = this.baseMapLayers[this.currentBasemap];\r\n\r\n if (prevBasemap) {\r\n Mediator.map.removeLayer(prevBasemap);\r\n }\r\n\r\n this.currentBasemap = basemap;\r\n\r\n const curBasemap = this.baseMapLayers[basemap];\r\n\r\n if (curBasemap) {\r\n console.log('Adding new basemap:', basemap);\r\n Mediator.map.getLayers().insertAt(0, curBasemap);\r\n } else {\r\n console.warn('No basemap found for:', basemap);\r\n }\r\n\r\n this.loadEmptyCacheImage();\r\n updateLogo(basemap);\r\n }\r\n\r\n onExtentChange () {\r\n this.loadEmptyCacheImage();\r\n }\r\n\r\n loadEmptyCacheImage() {\r\n const curLayer = this.baseMapLayers[this.currentBasemap];\r\n if (!curLayer) return;\r\n\r\n const curZoomLevel = Mediator.map.getView().getZoom();\r\n const maxZoom = 19;\r\n\r\n if (curZoomLevel > maxZoom && this.isLoadingEmptyImage === false) {\r\n this.isLoadingEmptyImage = true;\r\n Mediator.map.getView().setZoom(maxZoom);\r\n\r\n setTimeout(\r\n function () {\r\n Mediator.map.getView().setZoom(curZoomLevel);\r\n }, 50);\r\n setTimeout(\r\n function () {\r\n this.isLoadingEmptyImage = false;\r\n }.bind(this), 500);\r\n }\r\n }\r\n\r\n switchBaseMapForTab () {\r\n if (!this.tabsDefaultBasemap) {\r\n return;\r\n }\r\n\r\n const aerials = Mediator.serverData.EntityAerials;\r\n const curTabId = Mediator.getCurrentTabID();\r\n const targetId = this.tabsDefaultBasemap[curTabId];\r\n\r\n if (!targetId) {\r\n this.buttonHandler(null, Mediator.serverData.urls.streetLabel);\r\n return;\r\n }\r\n\r\n for (let i = 0; i < aerials.length; i++) {\r\n if (aerials[i].ID === targetId) {\r\n this.buttonHandler(null, aerials[i].Label);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n isExceedMaxZoom () {\r\n let tileMaxZoom =\r\n Mediator.serverData.urls.streetLabel === this.currentBasemap\r\n ? Mediator.serverData.urls.streetMaxZoom : null;\r\n\r\n tileMaxZoom = tileMaxZoom || Mediator.serverData.EntityAerials\r\n .find(a => a.Label === this.currentBasemap)?.MaxZoom;\r\n\r\n const curZoom = Mediator.map.getView().getZoom();\r\n return curZoom > tileMaxZoom;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {string} toolName\r\n */\r\n _toggleSelectBtnCSS (toolName) {\r\n $('.ThumbnailGrid > button', this.domNode).removeClass('selected');\r\n $('.ThumbnailGrid > [id=\\'' + toolName + '\\']', this.domNode).addClass(\r\n 'selected'\r\n );\r\n }\r\n}\r\n\r\nfunction createNode (param) {\r\n const thumbnailGridDiv = document.createElement('div');\r\n thumbnailGridDiv.classList.add('ThumbnailGrid');\r\n\r\n const button = document.createElement('button');\r\n button.id = param.key;\r\n button.title = param.key;\r\n button.className = 'Layer' + param.key + 'Btn';\r\n\r\n const label = document.createElement('label');\r\n label.textContent = param.key;\r\n label.title = param.key;\r\n\r\n thumbnailGridDiv.append(button, label);\r\n\r\n return thumbnailGridDiv;\r\n}\r\n\r\n/**\r\n * @param {string} mapserver\r\n * @param {string} mapservicename\r\n */\r\nfunction combineMapUrl (mapserver, mapservicename) {\r\n if (\r\n mapservicename.startsWith('http://') ||\r\n mapservicename.startsWith('https://')\r\n ) {\r\n return mapservicename;\r\n }\r\n\r\n return (\r\n 'https://' +\r\n mapserver +\r\n '.gworks.com/arcgis/rest/services/' +\r\n mapservicename +\r\n '/MapServer'\r\n );\r\n}\r\n\r\n/**\r\n * Also updates `BottomRightMenu`'s text color\r\n * @param {string} basemap\r\n */\r\nfunction updateLogo (basemap) {\r\n switch (basemap) {\r\n case 'Street':\r\n case 'Light Gray':\r\n case 'Topo':\r\n case 'Terrain':\r\n case 'ESRI_Street':\r\n $('#logoImage').attr('src', 'Content/shared/images/gWorks_md.png');\r\n\r\n if (Mediator.bottomRightMenu) {\r\n Mediator.bottomRightMenu.toggleIsLightBasemap(true);\r\n }\r\n\r\n break;\r\n case 'OSM_Street':\r\n $('#logoImage').attr('src', 'Content/shared/images/gWorks_md.png');\r\n\r\n if (Mediator.bottomRightMenu) {\r\n Mediator.bottomRightMenu.toggleIsLightBasemap(true);\r\n Mediator.bottomRightMenu.toggleOSMCredit(true);\r\n }\r\n\r\n break;\r\n default:\r\n $('#logoImage').attr('src', 'Content/shared/images/gWorks_white_md.png');\r\n\r\n if (Mediator.bottomRightMenu) {\r\n Mediator.bottomRightMenu.toggleIsLightBasemap(false);\r\n }\r\n\r\n break;\r\n }\r\n}\r\n\r\nexport default BasemapManager;\r\n","import isValid from 'date-fns/isValid';\r\nimport max from 'date-fns/max';\r\nimport { html, render } from 'lit-html';\r\nimport { toLonLat } from 'ol/proj';\r\n\r\nimport Mediator from 'gisw/Classes/Mediator';\r\nimport { getValue, setValue } from 'gisw/Helpers/storage';\r\nimport messageObserver from 'gisw/Widgets/MessageManager/MessageObserver';\r\n\r\nimport { getUpdateInformation } from './utils';\r\nimport './bottom-right-menu.less';\r\n\r\nclass BottomRightMenu {\r\n domNode = document.createElement('div');\r\n\r\n /** @private */\r\n isDecimalDegrees = true;\r\n\r\n /**\r\n * @param {object} config\r\n * @param {string} config.id\r\n */\r\n constructor (config) {\r\n this.domNode.id = config.id;\r\n this.domNode.classList.add('LightBasemap');\r\n\r\n /** @private */\r\n this.mouseCoordinates = this.domNode.appendChild(\r\n document.createElement('div')\r\n );\r\n this.mouseCoordinates.id = 'mouseCoordinates';\r\n\r\n /** @private */\r\n this.dataUpdateContainer = this.domNode.appendChild(\r\n document.createElement('div')\r\n );\r\n this.dataUpdateContainer.id = 'lastUpdatedContainer';\r\n\r\n /** @private */\r\n this.OSMCreditContainer = this.domNode.appendChild(\r\n document.createElement('a'));\r\n this.OSMCreditContainer.id = 'OSMCreditContainer';\r\n\r\n /** @private */\r\n this.latlng = this.domNode.appendChild(document.createElement('input'));\r\n this.latlng.classList.add('js-copytextarea');\r\n this.latlng.style.display = 'none';\r\n this.latlng.style.height = '1px';\r\n this.latlng.style.width = '5px';\r\n\r\n this.showCoordinates = this.showCoordinates.bind(this);\r\n\r\n if (!Mediator.isMobileDevice) {\r\n Mediator.map.on('pointermove', this.showCoordinates);\r\n }\r\n\r\n this.initializeCoordinates();\r\n this.toggleOSMCredit(true);\r\n getUpdateInformation().then(updates => {\r\n let updateMessage = '';\r\n\r\n if (updates) {\r\n const maxDate = max(\r\n updates\r\n .filter(entry => entry.updated !== '1/1/0001')\r\n .map(entry => new Date(entry.updated))\r\n .filter(entry => isValid(entry))\r\n );\r\n\r\n if (isValid(maxDate)) {\r\n updateMessage = 'Site Last Updated: ' + maxDate.toLocaleDateString();\r\n }\r\n }\r\n\r\n this.dataUpdateContainer.textContent = updateMessage;\r\n });\r\n }\r\n\r\n destroy () {\r\n Mediator.map.un('pointermove', this.showCoordinates);\r\n this.domNode.remove();\r\n }\r\n\r\n /**\r\n * @param {boolean} isLightBasemap\r\n */\r\n toggleIsLightBasemap (isLightBasemap) {\r\n this.domNode.classList.toggle('LightBasemap', isLightBasemap);\r\n this.domNode.classList.toggle('DarkBasemap', !isLightBasemap);\r\n }\r\n\r\n /**\r\n * @param {boolean} isOSMBasemap\r\n */\r\n toggleOSMCredit(isOSMBasemap) {\r\n if (isOSMBasemap) {\r\n this.OSMCreditContainer.textContent = '\\u00A9 OpenStreetMap';\r\n this.OSMCreditContainer.href = 'https://www.openstreetmap.org/copyright';\r\n this.OSMCreditContainer.target = '_blank';\r\n }\r\n }\r\n\r\n copyCoordsToClipboard () {\r\n const copyCommandSupported =\r\n document.queryCommandSupported && document.queryCommandSupported('copy');\r\n\r\n if (!copyCommandSupported) {\r\n messageObserver.broadcast({\r\n title: 'Warning',\r\n message:\r\n 'Copying latitude/longitude to clipboard ' +\r\n 'is not supported in this browser.'\r\n });\r\n return;\r\n }\r\n\r\n const { longitude, latitude } = Mediator.mapPoint;\r\n const copyText = latitude + ', ' + longitude;\r\n\r\n this.latlng.value = copyText;\r\n this.latlng.style.display = '';\r\n selectText(this.latlng);\r\n\r\n try {\r\n if (document.execCommand('copy')) {\r\n messageObserver.broadcast({\r\n title: 'Information',\r\n message: copyText + ' is copied to clipboard.'\r\n });\r\n }\r\n } catch (err) {\r\n Mediator.jstManager.jstError(\r\n 'Widget',\r\n 'BottomRightMenu',\r\n 'CopyLatLngToClipboard',\r\n err\r\n );\r\n }\r\n\r\n this.latlng.style.display = 'none';\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {import('ol/MapBrowserEvent').default} event\r\n */\r\n showCoordinates (event) {\r\n /** @private */\r\n this.mapPoint = event.coordinate;\r\n\r\n const [long, lat] = toLonLat(event.coordinate);\r\n\r\n Mediator.mapPoint = {\r\n latitude: lat.toFixed(4),\r\n longitude: long.toFixed(4)\r\n };\r\n\r\n if (this.isDecimalDegrees) {\r\n render(\r\n html`

Lat: ${lat.toFixed(6)}

\r\n

Long: ${long.toFixed(6)}

`,\r\n this.mouseCoordinates\r\n );\r\n } else {\r\n const latDMS = calculateDMS(lat);\r\n const longDMS = calculateDMS(long);\r\n\r\n render(\r\n html`

\r\n Lat: ${latDMS.degrees}° ${latDMS.minutes}'\r\n ${latDMS.seconds.toFixed(4)}\"\r\n

\r\n

\r\n Long: ${longDMS.degrees}° ${longDMS.minutes}'\r\n ${longDMS.seconds.toFixed(4)}\"\r\n

`,\r\n this.mouseCoordinates\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * Switches between degrees, minutes, seconds and decimal degrees\r\n */\r\n toggleLatLongStyle () {\r\n if (this.isDecimalDegrees) {\r\n this.showDegreesMinutesSeconds();\r\n } else {\r\n this.showDecimalDegrees();\r\n }\r\n\r\n this.showCoordinates({ coordinate: this.mapPoint });\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n showDegreesMinutesSeconds () {\r\n this.domNode.title = 'Click to toggle Decimal Degrees';\r\n this.isDecimalDegrees = false;\r\n setValue('showDegreesMinutesSeconds', true);\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n showDecimalDegrees () {\r\n this.domNode.title = 'Click to toggle Degrees, Minutes, and Seconds';\r\n this.isDecimalDegrees = true;\r\n setValue('showDegreesMinutesSeconds', false);\r\n }\r\n\r\n /**\r\n * @private\r\n */\r\n initializeCoordinates () {\r\n this.domNode.addEventListener(\r\n 'click',\r\n () => {\r\n this.toggleLatLongStyle();\r\n },\r\n { passive: true }\r\n );\r\n\r\n if (getValue('showDegreesMinutesSeconds')) {\r\n this.showDegreesMinutesSeconds();\r\n } else {\r\n this.showDecimalDegrees();\r\n }\r\n }\r\n}\r\n\r\nexport default BottomRightMenu;\r\n\r\n/**\r\n * @param {HTMLInputElement} element\r\n */\r\nfunction selectText (element) {\r\n if (/INPUT|TEXTAREA/i.test(element.tagName)) {\r\n element.focus();\r\n\r\n if (element.setSelectionRange) {\r\n element.setSelectionRange(0, element.value.length);\r\n } else {\r\n element.select();\r\n }\r\n\r\n return;\r\n }\r\n\r\n const rangeObj = document.createRange();\r\n rangeObj.selectNodeContents(element);\r\n\r\n const selection = window.getSelection();\r\n selection.removeAllRanges();\r\n selection.addRange(rangeObj);\r\n}\r\n\r\n/**\r\n * @param {number} decimalCoord\r\n */\r\nfunction calculateDMS (decimalCoord) {\r\n const degrees =\r\n decimalCoord < 0 ? Math.ceil(decimalCoord) : Math.floor(decimalCoord);\r\n\r\n let remainder = (Math.abs(decimalCoord) - Math.abs(degrees)) * 60;\r\n const minutes = Math.floor(remainder);\r\n remainder -= minutes;\r\n\r\n const seconds = remainder * 60;\r\n return { degrees, minutes, seconds };\r\n}\r\n","var api = require(\"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../../node_modules/mini-css-extract-plugin/dist/loader.js!../../node_modules/css-loader/dist/cjs.js??ref--5-2!../../node_modules/postcss-loader/src/index.js??ref--5-3!../../node_modules/less-loader/dist/cjs.js??ref--5-4!./bottom-right-menu.less\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","import lang from 'dojo/_base/lang';\r\nimport cookie from 'dojo/cookie';\r\n\r\nimport Mediator from 'gisw/Classes/Mediator';\r\nimport { html } from 'gisw/Helpers/html';\r\nimport NodeHash from 'gisw/Widgets/NodeHash';\r\n\r\n// @ts-ignore\r\nwindow.lastButtonPressed = ''; // global variable\r\n\r\nclass CenterMenu {\r\n /**\r\n * @param {object} config\r\n * @param {string} config.id\r\n * @param {string} config.display\r\n */\r\n constructor (config) {\r\n this.display = config.display;\r\n this.id = config.id;\r\n\r\n this.tabSelectList = document.createElement('select');\r\n this.tabSelectList.id = 'tabsSelect';\r\n\r\n /** @type {Record} */\r\n this.optionNameToIndex = {};\r\n /** @type {Array} */\r\n this.menuButtons = [];\r\n /** @type {Record} */\r\n this.menuBtns = {};\r\n /** @type {HTMLButtonElement} */\r\n this.selectBtn = null;\r\n\r\n /** @type {HTMLDivElement} */\r\n this.domNode = document.body.querySelector('#centerMenu');\r\n /** @private @type {HTMLDivElement} */\r\n this.countyName = document.body.querySelector('#countyName');\r\n /** @private @type {HTMLDivElement} */\r\n this.tabContainer = document.body.querySelector('#tabsInnerContainer');\r\n /** @private @type {HTMLDivElement} */\r\n this.tabSelect = document.body.querySelector('#tabSelectContainer');\r\n /** @type {HTMLDivElement} */\r\n this.toolsSecondary = document.body.querySelector(\r\n '#toolsContainerSecondary'\r\n );\r\n /** @private @type {HTMLDivElement} */\r\n this.searchContainer = document.body.querySelector('#searchContainerMain');\r\n /** @type {HTMLDivElement} */\r\n this.toolsMain = document.body.querySelector('#toolsContainerMain');\r\n /** @private @type {HTMLDivElement} */\r\n this.navToolMain = document.body.querySelector('#navigationToolMain');\r\n\r\n this.postCreate();\r\n }\r\n\r\n postCreate () {\r\n this.defaultTabs = Mediator.serverData.defaultTabs;\r\n\r\n this.tabsBtnsGridWidget = getTabMenuNodeHash(this, getInitTabsToItems());\r\n this.tabsBtnsGridWidget.itemEventListener(\r\n 'click',\r\n this.buttonHandler.bind(this),\r\n this,\r\n 300\r\n );\r\n\r\n this.setDisplayNameAndLogo();\r\n\r\n // @ts-ignore\r\n // Set in Views/Shared/Layout.cshtml\r\n window.setTabContainerWidth();\r\n\r\n window.addEventListener('resize', () => {\r\n if (Mediator.serverData.EntityNameDisplayType === 'BelowToolbar') {\r\n this.searchContainer.prepend(this.displayNameLabel);\r\n }\r\n\r\n // @ts-ignore\r\n window.setTabContainerWidth();\r\n });\r\n\r\n // Empty the tabContainer before adding new buttons\r\n this.tabContainer.innerHTML = '';\r\n\r\n for (let i = 0; i < this.menuButtons.length; i++) {\r\n const currentMenuBtn = this.menuButtons[i];\r\n\r\n if (i === 0) {\r\n currentMenuBtn.classList.add('first');\r\n }\r\n\r\n if (i === this.menuButtons.length - 1) {\r\n currentMenuBtn.classList.add('last');\r\n }\r\n\r\n this.tabContainer.appendChild(currentMenuBtn);\r\n\r\n if (currentMenuBtn.classList.contains('disabled')) {\r\n continue;\r\n }\r\n\r\n const inner = currentMenuBtn.innerHTML.replace('
', ' ').trim();\r\n\r\n this.tabSelectList.appendChild(\r\n html``.item(0)\r\n );\r\n\r\n this.optionNameToIndex[Mediator.getTabNameByLabel(inner)] = i;\r\n }\r\n\r\n this.tabSelect.appendChild(this.tabSelectList);\r\n\r\n $('.tabListItems').on('click', event => {\r\n const element = event.target;\r\n const roadsTabLink = Mediator.serverData.FrontEndOption['RoadsTabLink'];\r\n\r\n // Open the SimpleRoads site when the Roads tab is clicked\r\n if (element.id === 'RoadsBtn' &&\r\n typeof roadsTabLink !== 'undefined' &&\r\n roadsTabLink !== null\r\n ) {\r\n window.open(roadsTabLink.Value, '_blank');\r\n }\r\n\r\n if (!element.classList.contains('disabled')) {\r\n this.buttonHandler(element, element.title);\r\n }\r\n });\r\n\r\n this.tabSelectList.addEventListener('change', () => {\r\n this.buttonHandler(this.tabSelectList, this.tabSelectList.value);\r\n });\r\n }\r\n\r\n setDisplayNameAndLogo () {\r\n // use state full name\r\n const displayName = Mediator.serverData.displayName;\r\n const stateName = Mediator.serverData.StateFull;\r\n\r\n // website title is County name + State full name\r\n const siteNameDiv = document.getElementById('displayName');\r\n\r\n const isBelowToolbar =\r\n Mediator.serverData.EntityNameDisplayType === 'BelowToolbar';\r\n const currentInnerHtml = this.getDisplayName(displayName, stateName);\r\n const classNameTobeAdded = isBelowToolbar ? 'below-toolbar' : '';\r\n\r\n const parentElement = isBelowToolbar ? this.searchContainer : siteNameDiv;\r\n\r\n if (document.getElementById('displayNameLabel')) {\r\n document.getElementById('displayNameLabel').remove();\r\n }\r\n\r\n /** @private @type {HTMLDivElement} */\r\n // @ts-ignore\r\n this.displayNameLabel = html`\r\n ${currentInnerHtml}\r\n `.item(0);\r\n parentElement.prepend(this.displayNameLabel);\r\n }\r\n\r\n copyTools () {\r\n const from = Mediator.leftPanel.getGWindow('tools')?.domNode;\r\n\r\n if (!from) {\r\n return;\r\n }\r\n\r\n /** @type {NodeListOf} */\r\n const tools = from.querySelectorAll('.ThumbnailGrid');\r\n\r\n if (document.getElementById('toolsContainer')) {\r\n document.getElementById('toolsContainer').remove();\r\n }\r\n\r\n const regTools = document.createElement('div');\r\n regTools.id = 'toolsContainer';\r\n\r\n if (document.getElementById('navToolsContainer')) {\r\n document.getElementById('navToolsContainer').remove();\r\n }\r\n\r\n const navTools = document.createElement('div');\r\n navTools.id = 'navToolsContainer';\r\n this.navToolMain.appendChild(navTools);\r\n\r\n for (let i = 0; i < tools.length; i++) {\r\n let toolName = tools[i].children[0].id;\r\n toolName = toolName.substring(0, toolName.length - 3);\r\n\r\n const color = Mediator.toolsManager.getToolColor(toolName);\r\n\r\n if (color === 'blue') {\r\n navTools.appendChild(lang.clone(tools[i]));\r\n } else {\r\n regTools.appendChild(lang.clone(tools[i]));\r\n }\r\n }\r\n\r\n // Store tools in main and secondary containers.\r\n // Only showing one at a time\r\n\r\n this.toolsMain.innerHTML = '';\r\n this.toolsMain.appendChild(lang.clone(regTools));\r\n\r\n this.toolsSecondary.innerHTML = '';\r\n this.toolsSecondary.appendChild(lang.clone(regTools));\r\n }\r\n\r\n /**\r\n * @param {*} domNode\r\n * @param {string} btnNameInput\r\n */\r\n buttonHandler (domNode, btnNameInput) {\r\n let tabLabel = btnNameInput.replace('
', ' ');\r\n // @ts-ignore\r\n window.lastButtonPressed = tabLabel;\r\n\r\n // This handler fires after\r\n if (tabLabel === 'Planning/Zoning') {\r\n tabLabel = 'PlanningZoning';\r\n }\r\n\r\n if (\r\n tabLabel === 'Emergency Mgmt.' ||\r\n tabLabel === 'Emergency Management' ||\r\n tabLabel === 'Emergency Mgmt'\r\n ) {\r\n tabLabel = 'EM';\r\n }\r\n\r\n const tabName = Mediator.getTabNameByLabel(tabLabel);\r\n _toggleSelectBtnCSS(this, tabName);\r\n this.currentTabName = tabName;\r\n\r\n // Save startup_tab\r\n const expirationDate = new Date();\r\n expirationDate.setFullYear(expirationDate.getFullYear() + 1);\r\n\r\n cookie('startup_tab', tabName, { expires: expirationDate.toUTCString() });\r\n\r\n Mediator.handle({\r\n name: 'centerMenu.tab.click',\r\n args: [{ name: tabName }]\r\n });\r\n\r\n Mediator.currentTab = tabName;\r\n\r\n // If the user gets to the tab in the URL\r\n // Don't take them back there on every login/logout\r\n if (tabLabel === Mediator.serverData.tabNameInURL) {\r\n Mediator.ignoreURLTab = true;\r\n }\r\n }\r\n\r\n /**\r\n * @param {string} name\r\n */\r\n setSelectListValue (name) {\r\n this.tabSelectList.value = name;\r\n }\r\n\r\n setInitialTab () {\r\n this.buttonHandler(null, Mediator.getCurrentTabName());\r\n }\r\n\r\n /**\r\n * @param {string} displayName\r\n * @param {string} stateName\r\n */\r\n // eslint-disable-next-line class-methods-use-this\r\n getDisplayName (displayName, stateName) {\r\n if (\r\n Mediator.serverData.FrontEndOption['HideDisplayName'] ||\r\n Mediator.serverData.EntityNameDisplayType === 'None'\r\n ) {\r\n return '';\r\n }\r\n\r\n let entityDisplayName = '';\r\n\r\n if (\r\n Mediator.serverData.FrontEndOption['noBreakInDisplayName'] ||\r\n Mediator.serverData.EntityNameDisplayType === 'BelowToolbar'\r\n ) {\r\n entityDisplayName = displayName + ' ' + stateName;\r\n } else {\r\n entityDisplayName = displayName + '
' + stateName;\r\n }\r\n\r\n return entityDisplayName;\r\n }\r\n}\r\n\r\n/**\r\n * @param {CenterMenu} tw\r\n * @param {Array<{ key: string; enabled: boolean; }>} initItems\r\n */\r\nfunction getTabMenuNodeHash (tw, initItems) {\r\n const nodeHash = new NodeHash({\r\n initItems,\r\n className: 'ThumbnailWindow',\r\n createNode (param) {\r\n /** @type {HTMLButtonElement} */\r\n let button;\r\n let title = Mediator.ToolsTitleDiscription[param.key]\r\n ? Mediator.ToolsTitleDiscription[param.key]\r\n : param.key;\r\n\r\n // Get the tab label\r\n title = Mediator.serverData.TabLabel[title];\r\n\r\n if (!title) {\r\n title = param.key;\r\n }\r\n\r\n if (param.enabled) {\r\n // @ts-ignore\r\n button = html`\r\n ${title.replace(' ', '
')}\r\n `.item(0);\r\n } else {\r\n // @ts-ignore\r\n button = html`\r\n ${title}\r\n `.item(0);\r\n }\r\n\r\n tw.menuButtons.push(button);\r\n\r\n if (!tw.menuBtns) {\r\n tw.menuBtns = {};\r\n }\r\n\r\n tw.menuBtns[param.key] = button;\r\n return button;\r\n }\r\n });\r\n addGridBtnsToAttachPoints(nodeHash);\r\n tw.nodeHash = nodeHash;\r\n\r\n return nodeHash;\r\n}\r\n\r\n/**\r\n * @param {NodeHash} nodeHash\r\n */\r\nfunction addGridBtnsToAttachPoints (nodeHash) {\r\n if (!nodeHash) {\r\n return;\r\n }\r\n\r\n /** @type {NodeListOf} */\r\n const btnsGrid = nodeHash.domNode.querySelectorAll('.GridMenu');\r\n\r\n for (let i = 0; i < btnsGrid.length; i++) {\r\n nodeHash[btnsGrid[i].id] = btnsGrid[i];\r\n }\r\n}\r\n\r\nfunction getInitTabsToItems () {\r\n const tabs = Mediator.serverData.Tabs;\r\n const defaultTabs = Mediator.serverData.defaultTabs;\r\n const initItems = [];\r\n\r\n if (tabs) {\r\n for (let i = 0; i < defaultTabs.length; i++) {\r\n if (!defaultTabs[i]) {\r\n continue;\r\n }\r\n\r\n initItems.push({\r\n key: defaultTabs[i],\r\n enabled: buttonExists(defaultTabs[i], tabs)\r\n });\r\n }\r\n }\r\n\r\n return initItems;\r\n}\r\n\r\n/**\r\n * @param {string} buttonName\r\n * @param {string[]} tabs\r\n */\r\nfunction buttonExists (buttonName, tabs) {\r\n let btnName = buttonName;\r\n\r\n if (btnName === 'Emergency Management') {\r\n btnName = 'EM';\r\n }\r\n\r\n return tabs.some(tab => tab === btnName);\r\n}\r\n\r\n/**\r\n * @param {CenterMenu} tw\r\n * @param {string} toolName\r\n */\r\nfunction _toggleSelectBtnCSS (tw, toolName) {\r\n if (tw.selectBtn) {\r\n tw.selectBtn.classList.remove('selected');\r\n }\r\n\r\n tw.selectBtn = tw.menuBtns[toolName];\r\n\r\n if (tw.selectBtn) {\r\n tw.selectBtn.classList.add('selected');\r\n }\r\n}\r\n\r\nexport default CenterMenu;\r\n","import { Slider } from '@syncfusion/ej2-inputs/slider';\r\nimport { ContextMenu } from '@syncfusion/ej2-navigations/context-menu';\r\nimport { TreeView } from '@syncfusion/ej2-navigations/treeview';\r\nimport { containsCoordinate, getCenter } from 'ol/extent';\r\nimport Image from 'ol/layer/Image';\r\nimport ImageArcGISRest from 'ol/source/ImageArcGISRest';\r\n\r\nimport Mediator from 'gisw/Classes/Mediator';\r\nimport { fetchSubFeature } from 'gisw/Helpers/arcgis/feature-layer-utils';\r\n// @ts-ignore\r\nimport auth from 'gisw/Helpers/auth';\r\nimport messageObserver from 'gisw/Widgets/MessageManager/MessageObserver';\r\n\r\nimport './toc.less';\r\n\r\nclass LayersManager {\r\n /** @type {string} */\r\n token = null;\r\n\r\n /**\r\n * @param {object} config\r\n * @param {string} config.id\r\n */\r\n constructor (config) {\r\n this.id = config.id;\r\n\r\n /** @type {Record} */\r\n this.widgetItems = {};\r\n /** @type {Record} */\r\n this.tocWidgetsReplace = {};\r\n this.isFirstLoad = true;\r\n this.loadLayers();\r\n }\r\n\r\n /**\r\n * @param {number} id\r\n */\r\n async getFeatureLayerById (id) {\r\n const layer = this.getCurrentLayer();\r\n /** @type {string} */\r\n // @ts-ignore\r\n const layerUrl = layer.getSource().getUrl() + '/' + id;\r\n\r\n if (this.token === null) {\r\n this.token = await Mediator.mapLayerCredientials.getMapLayerAuthenticated(\r\n 'feature'\r\n );\r\n }\r\n\r\n return fetchSubFeature(layerUrl, this.token);\r\n }\r\n\r\n getCurrentLayer () {\r\n const curTab = Mediator.getCurrentTabName();\r\n return this.mapLayers.dynamicLayers[this.formatSub(curTab)];\r\n }\r\n\r\n getAvailableChildLayers () {\r\n const layer = this.getCurrentLayer();\r\n return this._getAvailableChildLayers(layer.treeData);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {*} data\r\n */\r\n _getAvailableChildLayers (data) {\r\n /** @type {Array} */\r\n let results = [];\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n const layerInfo = data[i];\r\n\r\n if (layerInfo.subLayerIds && layerInfo._subLayerInfos) {\r\n results = results.concat(\r\n this._getAvailableChildLayers(layerInfo._subLayerInfos)\r\n );\r\n } else {\r\n results.push(layerInfo);\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n\r\n /**\r\n * @param {string} tabName\r\n * @returns {HTMLDivElement}\r\n */\r\n getTOC (tabName) {\r\n if (!this.mapLayers.dynamicLayers[tabName]) {\r\n Mediator.jstManager.jstError(\r\n 'Widget',\r\n 'LayersManager',\r\n 'getTOC',\r\n 'Dynamic Map layer for ' + tabName + ' is not found.'\r\n );\r\n return null;\r\n }\r\n\r\n return this.loadTOC(tabName);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {string} tabName\r\n */\r\n switchLayersForTab (tabName) {\r\n const tabKey = this.formatSub(tabName);\r\n\r\n if (this.curLayer) {\r\n Mediator.map.removeLayer(this.curLayer);\r\n }\r\n\r\n this.curLayer = this.mapLayers.dynamicLayers[tabKey];\r\n Mediator.map.addLayer(this.curLayer);\r\n\r\n if (Mediator.map) {\r\n this.zoomToCurrentLayerFullExtent(this.isFirstLoad);\r\n this.isFirstLoad = false;\r\n }\r\n }\r\n\r\n removeAllSubMapLayers () {\r\n for (const layerKey in this.mapLayers.dynamicLayers) {\r\n if (\r\n this.mapLayers.dynamicLayers.hasOwnProperty(layerKey) &&\r\n layerKey.indexOf('sub') >= 0\r\n ) {\r\n this.mapLayers.dynamicLayers[layerKey] = null;\r\n }\r\n }\r\n }\r\n\r\n removeLayerFromMap (layerName) {\r\n if (!Mediator.map) {\r\n return;\r\n }\r\n\r\n const oldLayer = this.mapLayers.dynamicLayers[layerName];\r\n\r\n if (oldLayer) {\r\n Mediator.map.removeLayer(oldLayer);\r\n }\r\n }\r\n\r\n /**\r\n * @param {boolean} alwaysZoom\r\n */\r\n zoomToCurrentLayerFullExtent (alwaysZoom) {\r\n const curLayer = this.getCurrentLayer();\r\n\r\n if (curLayer && !curLayer.loaded) {\r\n curLayer.once('load', () => {\r\n this.zoomToLayer(curLayer, alwaysZoom);\r\n });\r\n } else {\r\n this.zoomToLayer(curLayer, alwaysZoom);\r\n }\r\n }\r\n\r\n /**\r\n * @param {Image} curLayer\r\n * @param {boolean} alwaysZoom\r\n */\r\n zoomToLayer (curLayer, alwaysZoom) {\r\n if (!curLayer) {\r\n return;\r\n }\r\n\r\n const view = Mediator.map.getView();\r\n const mapProjCode = view.getProjection().getCode();\r\n const layerProjCode =\r\n 'EPSG:' + curLayer.fullExtent.spatialReference.latestWkid;\r\n\r\n if (mapProjCode !== layerProjCode) {\r\n Mediator.jstManager.jstWarn(\r\n 'Tool',\r\n 'LayersManager',\r\n 'zoomToCurrentLayerFullExtent',\r\n 'Failed to zoom to an extent with different wkid than the map'\r\n );\r\n return;\r\n }\r\n\r\n const fitParams = { nearest: true };\r\n /** @type {import('ol/extent').Extent} */\r\n const layerExtent = [\r\n curLayer.fullExtent.xmin,\r\n curLayer.fullExtent.ymin,\r\n curLayer.fullExtent.xmax,\r\n curLayer.fullExtent.ymax\r\n ];\r\n const mapCentered = containsCoordinate(\r\n layerExtent,\r\n getCenter(view.calculateExtent())\r\n );\r\n\r\n if (!alwaysZoom && mapCentered) {\r\n return;\r\n }\r\n\r\n if (alwaysZoom && !this.isFirstLoad) {\r\n fitParams.duration = 200;\r\n }\r\n\r\n view.fit(layerExtent, fitParams);\r\n }\r\n\r\n loadLayers () {\r\n let layer;\r\n const tablayers = Mediator.serverData.TabLayers;\r\n const tabSublayers = Mediator.serverData.TabSubLayers;\r\n /** @type {Record} */\r\n const dynamicLayers = {};\r\n\r\n for (const tab in tablayers) {\r\n if (tablayers.hasOwnProperty(tab)) {\r\n layer = this.getDynamicMapServiceLayer(tab, tablayers[tab]);\r\n dynamicLayers[tab] = layer;\r\n }\r\n }\r\n\r\n for (const tabSub in tabSublayers) {\r\n if (tabSublayers.hasOwnProperty(tabSub)) {\r\n layer = this.getDynamicMapServiceLayer(\r\n tabSub + 'sub',\r\n tabSublayers[tabSub],\r\n true\r\n );\r\n dynamicLayers[tabSub + 'sub'] = layer;\r\n }\r\n }\r\n\r\n this.mapLayers = {\r\n dynamicLayers\r\n };\r\n }\r\n\r\n processLoginData (curTabInfo) {\r\n let layer;\r\n const curTabName = curTabInfo.TabName;\r\n const subTabName = curTabName + 'sub';\r\n\r\n if (\r\n curTabInfo.MapService !== null &&\r\n !this.mapLayers.dynamicLayers[curTabName]\r\n ) {\r\n layer = this.getDynamicMapServiceLayer(curTabName, curTabInfo.MapService);\r\n this.mapLayers.dynamicLayers[curTabName] = layer;\r\n }\r\n\r\n if (\r\n curTabInfo.SubMapService !== null &&\r\n !this.mapLayers.dynamicLayers[subTabName]\r\n ) {\r\n layer = this.getDynamicMapServiceLayer(\r\n subTabName,\r\n curTabInfo.SubMapService\r\n );\r\n this.mapLayers.dynamicLayers[subTabName] = layer;\r\n }\r\n }\r\n\r\n /**\r\n * @param {string} layerKey\r\n * @param {string} layerurl\r\n * @param {boolean} [subs]\r\n */\r\n // eslint-disable-next-line class-methods-use-this\r\n getDynamicMapServiceLayer (layerKey, layerurl, subs = false) {\r\n const isSub = subs || !!Mediator.serverData.FrontEndOption.BoltonMenk;\r\n const credential = Mediator.mapLayerCredientials.credentials?.[0];\r\n const token = isSub ? credential?.token ?? '' : '';\r\n const source = new ImageArcGISRest({\r\n crossOrigin: 'anonymous',\r\n hidpi: false,\r\n url: layerurl,\r\n ratio: 1,\r\n params: { token }\r\n });\r\n\r\n source.on('imageloadstart', () => {\r\n Mediator.handle({ name: 'loading.show' });\r\n });\r\n\r\n source.on('imageloadend', () => {\r\n Mediator.handle({ name: 'loading.hide' });\r\n });\r\n\r\n if (isSub) {\r\n source.on('imageloaderror', () => {\r\n if (Mediator.mapLayerCredientials?.isCredientialsExpired()) {\r\n Mediator.jstManager.jstWarn(\r\n 'Data',\r\n 'Mediator',\r\n 'getDynamicMapServiceLayer0',\r\n 'Sub Map layer is failed to load, crediential expired. ' +\r\n 'Attempt to re-authenticate.'\r\n );\r\n\r\n Mediator.mapLayerCredientials.getMapLayerAuthenticated('submap');\r\n } else {\r\n // when sub map layer failed to load, regualar map layer is used.\r\n const dynamicLayerKey = layerKey.replace('sub', '');\r\n\r\n this.mapLayers.dynamicLayers[layerKey] = null;\r\n this.tocWidgetsReplace[layerKey] = dynamicLayerKey;\r\n Mediator.jstManager.jstWarn(\r\n 'Data',\r\n 'Mediator',\r\n 'getDynamicMapServiceLayer1',\r\n 'Map layer \\'' +\r\n layerKey +\r\n '\\' is failed to load, and it\\'s replaced with \\'' +\r\n dynamicLayerKey +\r\n '\\''\r\n );\r\n\r\n // Refreshing the current tab.\r\n Mediator.currentTab = '';\r\n Mediator.handle({\r\n name: 'centerMenu.tab.click',\r\n args: [{ name: Mediator.getCurrentTabName() }]\r\n });\r\n }\r\n });\r\n }\r\n\r\n const layer = new Image({ source });\r\n\r\n if (isSub) {\r\n layer.set('credential', credential);\r\n }\r\n\r\n layer.setVisibleLayers = function (visibleLayers) {\r\n const params = source.getParams();\r\n params.LAYERS = 'show:' + visibleLayers.join(',');\r\n source.updateParams(params);\r\n layer.setVisible(visibleLayers.length);\r\n };\r\n\r\n return layer;\r\n }\r\n\r\n /**\r\n * @param {string} name\r\n */\r\n formatSub (name) {\r\n return auth.loggedIn && this.mapLayers.dynamicLayers[name + 'sub']\r\n ? name + 'sub'\r\n : name;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {string} btnName\r\n */\r\n loadTOC (btnName) {\r\n let btnKey = this.formatSub(btnName);\r\n btnKey = this.tocWidgetsReplace[btnKey] || btnKey;\r\n\r\n if (!this.widgetItems[btnKey]) {\r\n const container = document.createElement('div');\r\n container.id = btnKey;\r\n container.classList.add('toc');\r\n\r\n this.widgetItems[btnKey] = container;\r\n\r\n this._getLegendInfo(btnKey)\r\n .then(data => {\r\n this.switchLayersForTab(btnName);\r\n fillTOC(container, this.mapLayers.dynamicLayers[btnKey], data);\r\n })\r\n .catch(err => {\r\n messageObserver.broadcast({\r\n title: 'Error',\r\n message: 'There was an issue getting legend information.'\r\n });\r\n\r\n Mediator.jstManager.jstError(\r\n 'Widget',\r\n 'LayersManager',\r\n 'loadTOC',\r\n err ? JSON.stringify(err) : ''\r\n );\r\n });\r\n } else {\r\n this.switchLayersForTab(btnName);\r\n }\r\n\r\n return this.widgetItems[btnKey];\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {string} btnKey\r\n */\r\n async _getLegendInfo (btnKey) {\r\n const layer = this.mapLayers.dynamicLayers[btnKey];\r\n\r\n const urlTokenObj = await Mediator.mapLayerCredientials.getAuthenticatedLayerURLandToken(\r\n layer\r\n );\r\n\r\n const data = await new Promise((resolve, reject) => {\r\n $.ajax(urlTokenObj.url, {\r\n data: { f: 'json', token: urlTokenObj.token },\r\n dataType: 'json',\r\n error: err => {\r\n reject(err);\r\n },\r\n success: data => {\r\n resolve(data);\r\n }\r\n });\r\n });\r\n\r\n return this._processServiceInfo(urlTokenObj, layer, data);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {any} urlTokenObj\r\n * @param {Image} layer\r\n * @param {any} data\r\n */\r\n _processServiceInfo (urlTokenObj, layer, data) {\r\n if (data.error) {\r\n messageObserver.broadcast({\r\n title: 'Error',\r\n message:\r\n 'There was an issue getting legend information.
' +\r\n data.error.message\r\n });\r\n\r\n return Promise.reject(Error(data.error.message));\r\n }\r\n\r\n layer.layerInfos = data.layers;\r\n layer.fullExtent = data.fullExtent;\r\n layer.initialExtent = data.initialExtent;\r\n layer.defaultVisibleLayers = data.layers.reduce(function (\r\n result,\r\n layerInfo\r\n ) {\r\n if (layerInfo.defaultVisibility) {\r\n result.push(layerInfo.id);\r\n }\r\n\r\n return result;\r\n },\r\n []);\r\n\r\n return new Promise((resolve, reject) => {\r\n $.ajax(urlTokenObj.url + '/legend', {\r\n data: { f: 'json', token: urlTokenObj.token },\r\n dataType: 'json',\r\n error: err => {\r\n reject(err);\r\n },\r\n success: data => {\r\n resolve(data);\r\n }\r\n });\r\n }).then(data => this._processLegendInfo(layer, data));\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {Image} layer\r\n * @param {any} json\r\n */\r\n _processLegendInfo (layer, json) {\r\n const hiddenLayers = this._getHiddenLayers(layer);\r\n const layerLookup = layer.layerInfos.reduce((result, layerInfo) => {\r\n result[layerInfo.id] = layerInfo;\r\n return result;\r\n }, {});\r\n\r\n // Since we reuse the same layer object for creating multiple TOC\r\n // Restore the visible layers from the map serviceLayers\r\n // when making a new TOC\r\n if (!layer.defaultVisibleLayers) {\r\n layer.defaultVisibleLayers = layer.visibleLayers.slice();\r\n } else {\r\n layer.visibleLayers = layer.defaultVisibleLayers.slice();\r\n }\r\n\r\n this._AddIconData(json, layerLookup);\r\n\r\n const treeData = this._ProcessTreeData(layer, layerLookup, hiddenLayers);\r\n\r\n layer.setVisibleLayers(layer.visibleLayers);\r\n\r\n return Promise.resolve([treeData, layerLookup]);\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {Image} layer\r\n */\r\n // eslint-disable-next-line class-methods-use-this\r\n _getHiddenLayers (layer) {\r\n const hiddenLayers = [];\r\n let i;\r\n\r\n if (Mediator.serverData.entityType === 'eCity') {\r\n // Default to no access if not explicitly set yet\r\n for (i = 0; i < layer.layerInfos.length; i++) {\r\n if (!layer.layerInfos[i].subLayerIds) {\r\n hiddenLayers[layer.layerInfos[i].id] = true;\r\n }\r\n }\r\n }\r\n\r\n for (i = 0; i < Mediator.layerConfigs.length; i++) {\r\n const config = Mediator.layerConfigs[i];\r\n hiddenLayers[config.LayerID] = !config.IsVisible;\r\n }\r\n\r\n return hiddenLayers;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {*} json\r\n * @param {*} layerLookup\r\n */\r\n _AddIconData (json, layerLookup) {\r\n if (!json.layers) {\r\n return;\r\n }\r\n\r\n // attach legend Info to layer info\r\n for (let i = 0; i < json.layers.length; i++) {\r\n const legInfo = json.layers[i];\r\n const layerInfo = layerLookup[legInfo.layerId];\r\n\r\n if (legInfo.legend.length === 1) {\r\n layerInfo.icon =\r\n 'data:image/png;base64, ' + legInfo.legend[0].imageData;\r\n }\r\n\r\n if (legInfo.legend.length > 1) {\r\n layerInfo._subLayerInfos = [];\r\n\r\n for (let j = 0; j < legInfo.legend.length; j++) {\r\n const curLegInfo = legInfo.legend[j];\r\n layerInfo._subLayerInfos.push({\r\n treeId: layerInfo.id + 1 + '_' + j,\r\n name: curLegInfo.label,\r\n icon: 'data:image/png;base64, ' + curLegInfo.imageData,\r\n htmlAttributes: { 'class': 'nocheckbox' }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {Image} layer\r\n * @param {Record} layerLookup\r\n * @param {boolean[]} hiddenLayers\r\n */\r\n _ProcessTreeData (layer, layerLookup, hiddenLayers) {\r\n const treeData = [];\r\n\r\n for (let i = 0; i < layer.layerInfos.length; i++) {\r\n const layerInfo = layer.layerInfos[i];\r\n\r\n layerInfo.treeId = layerInfo.id + 1;\r\n layerInfo.isChecked = layerInfo.defaultVisibility;\r\n layerInfo.expanded = layerInfo.defaultVisibility;\r\n\r\n let parent = layerLookup[layerInfo.parentLayerId];\r\n let inactiveParent = false;\r\n\r\n while (!inactiveParent && parent) {\r\n inactiveParent = !parent.defaultVisibility;\r\n parent = layerLookup[parent.parentLayerId];\r\n }\r\n\r\n this._nestLayerInfos(layerInfo, layerLookup, hiddenLayers);\r\n\r\n // Remove parents, children with inactive parents,\r\n // and hidden layers from visible layer list\r\n if (\r\n layerInfo.subLayerIds ||\r\n inactiveParent ||\r\n hiddenLayers[layerInfo.id]\r\n ) {\r\n const visibleIndex = layer.visibleLayers.indexOf(layerInfo.id);\r\n\r\n if (visibleIndex >= 0) {\r\n layer.visibleLayers.splice(visibleIndex, 1);\r\n }\r\n }\r\n\r\n if (this._isValidTreeData(layerInfo, hiddenLayers)) {\r\n treeData.push(layerInfo);\r\n }\r\n }\r\n\r\n return treeData;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {*} layerInfo\r\n * @param {*} layerLookup\r\n * @param {*} hiddenLayers\r\n */\r\n _nestLayerInfos (layerInfo, layerLookup, hiddenLayers) {\r\n if (!layerInfo.subLayerIds) {\r\n return;\r\n }\r\n\r\n const subLayerInfos = [];\r\n\r\n for (let j = 0; j < layerInfo.subLayerIds.length; j++) {\r\n const id = layerInfo.subLayerIds[j];\r\n const subLayer = layerLookup[id];\r\n\r\n if (\r\n !hiddenLayers[id] &&\r\n this._isValidGroupLayer(subLayer, layerLookup, hiddenLayers)\r\n ) {\r\n subLayerInfos.push(subLayer);\r\n }\r\n }\r\n\r\n layerInfo._subLayerInfos = subLayerInfos;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {*} subLayer\r\n * @param {*} layerLookup\r\n * @param {*} hiddenLayers\r\n * @returns {boolean}\r\n */\r\n _isValidGroupLayer (subLayer, layerLookup, hiddenLayers) {\r\n if (!subLayer.subLayerIds) {\r\n return true;\r\n }\r\n\r\n let hasVisibleSubLayer = false;\r\n\r\n for (let i = 0; i < subLayer.subLayerIds.length; i++) {\r\n const subLayerInfo = layerLookup[subLayer.subLayerIds[i]];\r\n\r\n if (subLayerInfo.subLayerIds) {\r\n hasVisibleSubLayer =\r\n hasVisibleSubLayer ||\r\n this._isValidGroupLayer(subLayerInfo, layerLookup, hiddenLayers);\r\n } else {\r\n hasVisibleSubLayer =\r\n hasVisibleSubLayer || !hiddenLayers[subLayerInfo.id];\r\n }\r\n }\r\n\r\n return hasVisibleSubLayer;\r\n }\r\n\r\n /**\r\n * @private\r\n * @param {*} layerInfo\r\n * @param {*} hiddenLayers\r\n */\r\n _isValidTreeData (layerInfo, hiddenLayers) {\r\n return (\r\n layerInfo.parentLayerId === -1 &&\r\n (layerInfo._subLayerInfos === undefined ||\r\n layerInfo._subLayerInfos.length) &&\r\n !hiddenLayers[layerInfo.id]\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * @param {HTMLDivElement} container\r\n * @param {Image} layer\r\n * @param {any[]} results\r\n */\r\nfunction fillTOC (container, layer, results) {\r\n layer.treeData = results[0];\r\n\r\n const layerLookup = results[1];\r\n\r\n // Wait until we have treeData saved\r\n layer.loaded = true;\r\n layer.dispatchEvent('load');\r\n\r\n const tocTitle = document.createElement('div');\r\n tocTitle.classList.add('toc__title');\r\n tocTitle.textContent = Mediator.serverData.TabLabel[Mediator.currentTab];\r\n container.appendChild(tocTitle);\r\n\r\n _makeSlider(container, layer);\r\n\r\n const treeObj = _makeTreeView(container, layer, layerLookup);\r\n _makeContextMenu(container, treeObj, layer, layerLookup);\r\n}\r\n\r\n/**\r\n * @param {HTMLDivElement} container\r\n * @param {Image} layer\r\n */\r\nfunction _makeSlider (container, layer) {\r\n const sliderContainer = document.createElement('div');\r\n sliderContainer.id = container.id + '--slider';\r\n sliderContainer.style.marginLeft = '30px';\r\n container.appendChild(sliderContainer);\r\n\r\n return new Slider(\r\n {\r\n min: 0,\r\n value: layer.getOpacity(),\r\n max: 1,\r\n step: 0.01,\r\n change (args) {\r\n // @ts-ignore\r\n layer.setOpacity(args.value);\r\n },\r\n width: '175px'\r\n },\r\n sliderContainer\r\n );\r\n}\r\n\r\n/**\r\n * @param {HTMLDivElement} container\r\n * @param {Image} layer\r\n * @param {*} layerLookup\r\n */\r\nfunction _makeTreeView (container, layer, layerLookup) {\r\n const treeContainer = document.createElement('div');\r\n treeContainer.id = container.id + '--tree';\r\n container.appendChild(treeContainer);\r\n\r\n const treeObj = new TreeView(\r\n {\r\n cssClass: 'custom-treeview',\r\n fields: {\r\n dataSource: layer.treeData,\r\n id: 'treeId',\r\n text: 'name',\r\n child: '_subLayerInfos',\r\n imageUrl: 'icon'\r\n },\r\n showCheckBox: true,\r\n autoCheck: false,\r\n nodeChecked (args) {\r\n _onNodeChecked.call(this, layer, layerLookup, args);\r\n },\r\n\r\n /**\r\n * @this {TreeView}\r\n */\r\n nodeClicked (args) {\r\n if (\r\n args.event.button === 2 ||\r\n // @ts-ignore\r\n !args.event.target.classList.contains('e-fullrow') ||\r\n args.node.classList.contains('nocheckbox')\r\n ) {\r\n return;\r\n }\r\n\r\n if (this.getNodeData(args.node).isChecked === 'true') {\r\n this.uncheckAll([args.node]);\r\n } else {\r\n this.checkAll([args.node]);\r\n }\r\n },\r\n expandOn: 'None'\r\n },\r\n treeContainer\r\n );\r\n\r\n treeObj.animation.expand.duration = 200;\r\n treeObj.animation.collapse.duration = 200;\r\n\r\n return treeObj;\r\n}\r\n\r\n/**\r\n * @param {HTMLDivElement} container\r\n * @param {TreeView} treeObj\r\n * @param {Image} layer\r\n * @param {*} layerLookup\r\n */\r\nfunction _makeContextMenu (container, treeObj, layer, layerLookup) {\r\n // Prevent duplicates >:()\r\n const menuId = container.id + 'ContextMenu' + Date.now();\r\n\r\n const menuContainer = document.createElement('ul');\r\n menuContainer.id = menuId;\r\n container.appendChild(menuContainer);\r\n\r\n let selectedNode = null;\r\n\r\n return new ContextMenu(\r\n {\r\n beforeOpen: args => {\r\n const target = args.event.target;\r\n\r\n if (!(target instanceof HTMLElement)) {\r\n return;\r\n }\r\n\r\n const listItem = target.closest('.e-list-item');\r\n\r\n selectedNode = treeObj.getNodeData(listItem);\r\n },\r\n target: '#' + container.id + '--tree',\r\n items: [{ text: 'Zoom to Layer' }],\r\n select: () => {\r\n _onContextMenuSelect(selectedNode, layer, layerLookup);\r\n }\r\n },\r\n menuContainer\r\n );\r\n}\r\n\r\n/**\r\n * @param {*} selectedNode\r\n * @param {Image} layer\r\n * @param {*} layerLookup\r\n */\r\nfunction _onContextMenuSelect (selectedNode, layer, layerLookup) {\r\n const layerId = parseInt(selectedNode.id) - 1;\r\n\r\n if (layerLookup[layerId] && layerLookup[layerId].extent) {\r\n Mediator.map.getView().fit(layerLookup[layerId].extent, { duration: 200 });\r\n return;\r\n }\r\n\r\n Mediator.mapLayerCredientials\r\n .getAuthenticatedLayerURLandToken(layer)\r\n .then(urlTokenObj => {\r\n const url = urlTokenObj.url + '/' + layerId;\r\n\r\n $.ajax(url, {\r\n data: { f: 'json', token: urlTokenObj.token },\r\n dataType: 'json',\r\n success: zoomLayer => {\r\n if (zoomLayer.extent) {\r\n layerLookup[layerId].extent = [\r\n zoomLayer.extent.xmin,\r\n zoomLayer.extent.ymin,\r\n zoomLayer.extent.xmax,\r\n zoomLayer.extent.ymax\r\n ];\r\n Mediator.map\r\n .getView()\r\n .fit(layerLookup[layerId].extent, { duration: 200 });\r\n }\r\n }\r\n });\r\n });\r\n}\r\n\r\n/**\r\n * @this {TreeView} Scoped to tree view object\r\n * @param {*} layer\r\n * @param {*} layerLookup\r\n * @param {*} args\r\n */\r\nfunction _onNodeChecked (layer, layerLookup, args) {\r\n const node = args.data[0];\r\n const layerId = +node.id - 1;\r\n const layerInfo = layerLookup[layerId];\r\n const inactiveParent =\r\n this.getNode('' + (layerInfo.parentLayerId + 1)).isChecked === 'false';\r\n const isChecked = node.isChecked === 'true';\r\n\r\n // Group Layers and Layers with multiple symbologies\r\n if (layerInfo._subLayerInfos) {\r\n if (isChecked) {\r\n this.expandAll([node.id]);\r\n } else {\r\n this.collapseAll([node.id]);\r\n }\r\n }\r\n\r\n if (inactiveParent) {\r\n return;\r\n }\r\n\r\n const updatedLayerIds = _getUpdatedLayerIds.call(\r\n this,\r\n layerInfo,\r\n layerLookup\r\n );\r\n\r\n _updateVisibleLayers(layer.visibleLayers, updatedLayerIds, isChecked);\r\n\r\n layer.setVisibleLayers(layer.visibleLayers);\r\n}\r\n\r\n/**\r\n * @this {TreeView}\r\n * @param {*} layerInfo\r\n * @param {*} layerLookup\r\n */\r\nfunction _getUpdatedLayerIds (layerInfo, layerLookup) {\r\n const results = [];\r\n\r\n // Group layer\r\n if (layerInfo.subLayerIds) {\r\n const checkedNodes = this.getAllCheckedNodes();\r\n _addSubLayers(\r\n results,\r\n layerInfo.id,\r\n layerInfo.subLayerIds,\r\n checkedNodes,\r\n layerLookup\r\n );\r\n } else {\r\n results.push(layerInfo.id);\r\n }\r\n\r\n return results;\r\n}\r\n\r\nfunction _addSubLayers (\r\n results,\r\n topId,\r\n childLayerIds,\r\n checkedNodes,\r\n layerLookup\r\n) {\r\n if (!childLayerIds || !childLayerIds.length) {\r\n return;\r\n }\r\n\r\n for (let i = 0; i < childLayerIds.length; i++) {\r\n addSubLayer(results, topId, childLayerIds[i], checkedNodes, layerLookup);\r\n }\r\n}\r\n\r\nfunction addSubLayer (results, topId, childLayerId, checkedNodes, layerLookup) {\r\n const childIsChecked = checkedNodes.indexOf('' + (childLayerId + 1)) > -1;\r\n let curLayerInfo = layerLookup[childLayerId];\r\n const isParent = curLayerInfo.subLayerIds;\r\n let inactiveParent = false;\r\n\r\n while (\r\n !inactiveParent &&\r\n curLayerInfo.parentLayerId !== -1 &&\r\n curLayerInfo.parentLayerId !== topId\r\n ) {\r\n inactiveParent =\r\n checkedNodes.indexOf('' + (curLayerInfo.parentLayerId + 1)) < 0;\r\n curLayerInfo = layerLookup[curLayerInfo.parentLayerId];\r\n }\r\n\r\n if (childIsChecked && !isParent && !inactiveParent) {\r\n results.push(childLayerId);\r\n }\r\n\r\n if (!inactiveParent && isParent) {\r\n _addSubLayers(results, topId, isParent, checkedNodes, layerLookup);\r\n }\r\n}\r\n\r\nfunction _updateVisibleLayers (visibleLayers, updatedLayerIds, isChecked) {\r\n let curId;\r\n let i;\r\n\r\n if (isChecked) {\r\n for (i = 0; i < updatedLayerIds.length; i++) {\r\n curId = updatedLayerIds[i];\r\n\r\n if (visibleLayers.indexOf(curId) < 0) {\r\n visibleLayers.push(curId);\r\n }\r\n }\r\n } else {\r\n for (i = 0; i < updatedLayerIds.length; i++) {\r\n curId = updatedLayerIds[i];\r\n\r\n const curIndex = visibleLayers.indexOf(curId);\r\n\r\n if (curIndex > -1) {\r\n visibleLayers.splice(curIndex, 1);\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport default LayersManager;\r\n","var api = require(\"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n var content = require(\"!!../../node_modules/mini-css-extract-plugin/dist/loader.js!../../node_modules/css-loader/dist/cjs.js??ref--5-2!../../node_modules/postcss-loader/src/index.js??ref--5-3!../../node_modules/less-loader/dist/cjs.js??ref--5-4!./toc.less\");\n\n content = content.__esModule ? content.default : content;\n\n if (typeof content === 'string') {\n content = [[module.id, content, '']];\n }\n\nvar options = {};\n\noptions.insert = \"head\";\noptions.singleton = false;\n\nvar update = api(content, options);\n\n\n\nmodule.exports = content.locals || {};","import on from 'dojo/on';\r\nimport { html, render } from 'lit-html';\r\n\r\nimport Mediator from 'gisw/Classes/Mediator';\r\n// @ts-ignore\r\nimport auth from 'gisw/Helpers/auth';\r\nimport GWindowList from 'gisw/Widgets/GWindowList';\r\nimport PaymentSearch from 'gisw/Widgets/PaymentSearch/PaymentSearch';\r\n\r\nclass RightMenu {\r\n domNode = document.createElement('div');\r\n\r\n /**\r\n * @param {object} config\r\n * @param {string} config.id\r\n */\r\n constructor (config) {\r\n this.domNode.id = config.id;\r\n\r\n this.gWindowList = new GWindowList({ id: 'RightList', resizable: true });\r\n\r\n this.hasResultsPanel = false;\r\n this.salesSearch = null;\r\n this.instSearch = null;\r\n this.quickSearch = null;\r\n this.PaymentSearch = null;\r\n\r\n this.loadingContainer =\r\n document.getElementById('loadingContainer') ?? createLoadingContainer();\r\n\r\n // hide the loading container first\r\n this.hideWaitCursor();\r\n\r\n const helpContainer = document.getElementById('helpButtonContainer');\r\n // Empty `helpContainer`\r\n helpContainer.innerHTML = '';\r\n\r\n if (auth.siteHasLogin) {\r\n Mediator.login.placeAt(helpContainer);\r\n }\r\n\r\n if (Mediator.helppage) {\r\n Mediator.helppage.placeAt(helpContainer);\r\n }\r\n\r\n if (!Mediator.serverData.hasAdminTools) {\r\n return;\r\n }\r\n\r\n if (Mediator.toolsManager.hasAdminTools()) {\r\n createAdminButton(helpContainer);\r\n } else if (Mediator.currentUser && Mediator.currentUser !== '') {\r\n createProfileButton(helpContainer);\r\n }\r\n }\r\n\r\n async lazyLoad () {\r\n const buttonContainer = document.getElementById('loginButtonContainer');\r\n\r\n this.searchBar = await Mediator.Factory.Create({\r\n name: 'GenericSearchBar',\r\n params: { id: 'searchBar' }\r\n });\r\n\r\n buttonContainer.append(this.searchBar.domNode, this.gWindowList.domNode);\r\n }\r\n\r\n destroy () {\r\n this.gWindowList.destroy();\r\n\r\n if (this.searchBar) {\r\n this.searchBar.destroy();\r\n }\r\n\r\n if (this.salesSearch) {\r\n this.salesSearch.destroy();\r\n }\r\n\r\n if (this.instSearch) {\r\n this.instSearch.destroy();\r\n }\r\n\r\n if (this.quickSearch) {\r\n this.quickSearch.destroy();\r\n }\r\n }\r\n\r\n /**\r\n * @param {object} [options]\r\n * @param {boolean} [options.keepInstrumentSearch]\r\n * @param {boolean} [options.keepSalesSearch]\r\n * @param {boolean} [options.keepPaymentSearch]\r\n * @param {boolean} [options.keepQuickSearch]\r\n */\r\n clearList (options = {}) {\r\n this.gWindowList.remove('resultsPanel');\r\n this.hasResultsPanel = false;\r\n\r\n this.gWindowList.remove('resultsSidePanel');\r\n\r\n if (!options.keepInstrumentSearch) {\r\n this.gWindowList.remove('instrumentSearch');\r\n }\r\n\r\n if (!options.keepSalesSearch) {\r\n this.gWindowList.remove('salesSearch');\r\n }\r\n\r\n if (!options.keepPaymentSearch) {\r\n this.gWindowList.remove('PaymentSearch');\r\n }\r\n\r\n if (!options.keepQuickSearch) {\r\n this.gWindowList.remove('quickSearch');\r\n }\r\n }\r\n\r\n /**\r\n * @param {HTMLElement} [node]\r\n * @param {boolean} [clearMap]\r\n */\r\n displayResults (node, clearMap = true) {\r\n this.gWindowList.remove('resultsSidePanel');\r\n\r\n // Added to fix \"empty\" looking display panel when performing\r\n // very rapid search or identify\r\n if (this.hasResultsPanel) {\r\n this.gWindowList.remove('resultsPanel');\r\n this.hasResultsPanel = false;\r\n }\r\n\r\n // We passed in a node we want to put in the results slot\r\n if (!node) {\r\n /** @type {HTMLElement} */\r\n let resultNode;\r\n const results = Mediator.resultsPanel.results;\r\n\r\n if (results && results.numResults() === 1) {\r\n resultNode = Mediator.resultsPanel.sidePanel.domNode;\r\n\r\n const layerName = results.categories[0];\r\n const result = results.results[layerName][0];\r\n result.layername = layerName;\r\n Mediator.resultsPanel.sidePanel.setResult(result).then(() => {\r\n this.gWindowList.refresh();\r\n });\r\n } else if (results === null) {\r\n resultNode = Mediator.resultsPanel.sidePanel.domNode;\r\n } else {\r\n resultNode = Mediator.resultsPanel.domNode;\r\n }\r\n\r\n // highlight all features and display results panel when done\r\n Mediator.resultsPanel.showAllOnMap(clearMap, () => {\r\n // changing !this.hasResultsPanel to true here\r\n // also fix the search result toggle issue.\r\n if (!this.hasResultsPanel) {\r\n this.gWindowList.remove('resultsPanel');\r\n\r\n if (Mediator.inMobileMode) {\r\n if (!Mediator.mobileSearchVisible) {\r\n Mediator.showMobileRight();\r\n }\r\n\r\n this.gWindowList.add([\r\n {\r\n id: 'resultsPanel',\r\n key: 'resultsPanel',\r\n title: 'Results',\r\n 'class': 'toolGWindow ResultsPanelGWindow',\r\n content: resultNode,\r\n showCloseButton: false\r\n }\r\n ]);\r\n } else {\r\n this.gWindowList.add([\r\n {\r\n id: 'resultsPanel',\r\n key: 'resultsPanel',\r\n title: 'Results',\r\n 'class': 'toolGWindow ResultsPanelGWindow',\r\n content: resultNode,\r\n showCloseButton: false\r\n }\r\n ]);\r\n }\r\n\r\n this.hasResultsPanel = true;\r\n } else {\r\n /** @type {import('gisw/Widgets/GWindow').default} */\r\n const resultsPanel = this.gWindowList.getGWindow('resultsPanel');\r\n\r\n if (Mediator.inMobileMode) {\r\n if (!Mediator.mobileSearchVisible) {\r\n Mediator.showMobileRight();\r\n }\r\n }\r\n\r\n resultsPanel.setContent(resultNode);\r\n }\r\n\r\n /** @type {import('gisw/Widgets/GWindow').default} */\r\n const resultsPanel = this.gWindowList.getGWindow('resultsPanel');\r\n\r\n this.gWindowList.toggleKey('resultsPanel');\r\n resultsPanel.refresh();\r\n });\r\n } else {\r\n if (!this.hasResultsPanel) {\r\n if (Mediator.isMobile) {\r\n if (!Mediator.mobileSearchVisible) {\r\n Mediator.showMobileRight();\r\n }\r\n\r\n this.gWindowList.add([\r\n {\r\n id: 'resultsPanel',\r\n key: 'resultsPanel',\r\n title: 'Results',\r\n 'class': 'toolGWindow ResultsPanelGWindow',\r\n content: node,\r\n showCloseButton: false\r\n }\r\n ]);\r\n } else {\r\n this.gWindowList.add([\r\n {\r\n id: 'resultsPanel',\r\n key: 'resultsPanel',\r\n title: 'Results',\r\n 'class': 'toolGWindow ResultsPanelGWindow',\r\n content: node,\r\n showCloseButton: false\r\n }\r\n ]);\r\n }\r\n\r\n this.hasResultsPanel = true;\r\n } else {\r\n this.gWindowList.getGWindow('resultsPanel').setContent(node);\r\n }\r\n\r\n this.gWindowList.toggleKey('resultsPanel');\r\n this.gWindowList.getGWindow('resultsPanel').refresh();\r\n }\r\n }\r\n\r\n hideResults () {\r\n /** @type {import('gisw/Widgets/GWindow').default} */\r\n const resultsSidePanel = this.gWindowList.getGWindow('resultsSidePanel');\r\n\r\n if (resultsSidePanel) {\r\n this.gWindowList.remove('resultsSidePanel', { preventDestruction: true });\r\n resultsSidePanel.isMinimized = true;\r\n }\r\n\r\n return this.gWindowList.closeAllOpened();\r\n }\r\n\r\n /**\r\n * @param {HTMLElement} node\r\n * @param {Partial} [positionInput]\r\n * @param {boolean} [keepOpen]\r\n */\r\n addSubResult (node, positionInput = {}, keepOpen = false) {\r\n /** @type {import('gisw/Widgets/GWindow').default} */\r\n const gwin = this.gWindowList.getGWindow('resultsSidePanel');\r\n\r\n if (!gwin) {\r\n if (!keepOpen) {\r\n this.gWindowList.closeAllOpened();\r\n }\r\n\r\n if (Mediator.inMobileMode) {\r\n if (!Mediator.mobileSearchVisible) {\r\n Mediator.showMobileRight();\r\n }\r\n\r\n this.gWindowList.add([\r\n {\r\n id: 'resultsSidePanel',\r\n key: 'resultsSidePanel',\r\n title: 'Details',\r\n 'class': 'toolGWindow ResultsPanelGWindow',\r\n content: node,\r\n showCloseButton: true,\r\n autoResize: true\r\n }\r\n ]);\r\n } else {\r\n this.gWindowList.add([\r\n {\r\n id: 'resultsSidePanel',\r\n key: 'resultsSidePanel',\r\n title: 'Details',\r\n 'class': 'toolGWindow ResultsPanelGWindow',\r\n content: node,\r\n showCloseButton: true\r\n }\r\n ]);\r\n }\r\n\r\n this.gWindowList.toggleKey('resultsSidePanel');\r\n setTimeout(function () {\r\n if (document.getElementById('Parcel Information')) {\r\n document.getElementById('Parcel Information').click();\r\n }\r\n }, 500);\r\n } else {\r\n this.gWindowList.closeAllOpened();\r\n gwin.setContent(node);\r\n this.gWindowList.toggleKey('resultsSidePanel');\r\n }\r\n }\r\n\r\n /**\r\n * Show loading text and icon\r\n */\r\n showWaitCursor () {\r\n this.loadingContainer.style.visibility = 'visible';\r\n }\r\n\r\n /**\r\n * Hide loading text and icon\r\n */\r\n hideWaitCursor () {\r\n this.loadingContainer.style.visibility = 'hidden';\r\n }\r\n\r\n /**\r\n * @param {string} curTab\r\n */\r\n async populateAdvancedSearch (curTab) {\r\n const tabTools = Mediator.serverData.TabTools[curTab];\r\n this.searchBar.clearSearchOptions();\r\n\r\n let hasAdvancedSearch = false;\r\n\r\n for (const tool of tabTools) {\r\n if (tool.Name === 'InstrumentSearch') {\r\n if (this.instSearch === null) {\r\n // Lazy loads the InstrumentSearch class\r\n this.instSearch = await Mediator.Factory.Create({\r\n name: 'InstrumentSearch',\r\n params: {}\r\n });\r\n }\r\n\r\n if (this.instSearch.isLoaded) {\r\n this.createInstrumentSearch();\r\n } else {\r\n on.once(this.instSearch, 'load', () => {\r\n this.createInstrumentSearch();\r\n });\r\n }\r\n\r\n hasAdvancedSearch = true;\r\n }\r\n\r\n if (tool.Name === 'SalesSearch') {\r\n if (this.salesSearch === null) {\r\n this.salesSearch = await Mediator.Factory.Create({\r\n name: 'SalesSearch',\r\n params: {}\r\n });\r\n }\r\n\r\n this.gWindowList.add([\r\n {\r\n id: 'salesSearch',\r\n key: 'salesSearch',\r\n title: 'Sales Search',\r\n content: this.salesSearch.domNode\r\n }\r\n ]);\r\n\r\n this.gWindowList.getGWindow('salesSearch').domNode.style.display =\r\n 'none';\r\n this.searchBar.addSearchOption({\r\n value: 'salesSearch',\r\n display: 'Sales Search'\r\n });\r\n\r\n hasAdvancedSearch = true;\r\n }\r\n\r\n if (tool.Name === 'PaymentSearch') {\r\n if (this.PaymentSearch === null) {\r\n this.PaymentSearch = new PaymentSearch();\r\n }\r\n\r\n this.PaymentSearch.isWindowOpen = false;\r\n\r\n this.gWindowList.add([\r\n {\r\n id: 'PaymentSearch',\r\n key: 'PaymentSearch',\r\n title: 'Payment Search',\r\n content: this.PaymentSearch.getDomNode()\r\n }\r\n ]);\r\n\r\n const node = this.gWindowList.getGWindow('PaymentSearch').domNode;\r\n node.style.display = 'none';\r\n\r\n if (\r\n !Mediator.toolsManager.hasTool(\r\n 'PersonalProperty',\r\n Mediator.getCurrentTabName()\r\n )\r\n ) {\r\n $('#SelectedPaymentType', node).find('option[value=2]').remove();\r\n }\r\n\r\n this.searchBar.addSearchOption({\r\n value: 'PaymentSearch',\r\n display: 'Payment Search',\r\n className: 'standard-search-button'\r\n });\r\n\r\n hasAdvancedSearch = true;\r\n\r\n $('#SubmitPaymentSearch').on('click', () => {\r\n this.PaymentSearch.onSubmitPaymentSearch();\r\n });\r\n }\r\n\r\n if (tool.Name === 'TaxCart') {\r\n const cartButton = document.createElement('button');\r\n cartButton.id = 'PaymentCartBtn';\r\n cartButton.classList.add('standard-search-button');\r\n cartButton.type = 'button';\r\n\r\n cartButton.addEventListener(\r\n 'click',\r\n () => {\r\n Mediator.handle({ name: 'cart.panel.show' });\r\n },\r\n { passive: true }\r\n );\r\n\r\n render(\r\n html`\r\n
$0.00
`,\r\n cartButton\r\n );\r\n\r\n this.searchBar.searchOptions.prepend(cartButton);\r\n }\r\n\r\n if (tool.Name.toString().toLowerCase() === 'quicksearch') {\r\n if (this.quickSearch === null) {\r\n this.quickSearch = await Mediator.Factory.Create({\r\n name: 'QuickSearch',\r\n params: {}\r\n });\r\n }\r\n\r\n this.gWindowList.add([\r\n {\r\n id: 'quickSearch',\r\n key: 'quickSearch',\r\n title: 'Quick Search',\r\n content: this.quickSearch.domNode\r\n }\r\n ]);\r\n\r\n const quickSearchGWindow = this.gWindowList.getGWindow('quickSearch');\r\n\r\n quickSearchGWindow.domNode.style.display = 'none';\r\n quickSearchGWindow.domNode.addEventListener(\r\n 'toggle',\r\n /** @param {CustomEvent} event */\r\n event => {\r\n if (event.detail.show) {\r\n // Reboot quickSearch when opening it again\r\n this.quickSearch.bootUp();\r\n }\r\n }\r\n );\r\n\r\n this.searchBar.addSearchOption({\r\n value: 'quickSearch',\r\n display: 'Quick Search'\r\n });\r\n\r\n hasAdvancedSearch = true;\r\n }\r\n }\r\n\r\n const hasReportBuilder = Mediator.toolsManager.hasTool(\r\n 'ReportBuilder',\r\n Mediator.getCurrentTabName()\r\n );\r\n\r\n if (hasReportBuilder) {\r\n const searchOptionBtn = this.searchBar.addSearchOption({\r\n value: 'reportBuilder',\r\n display: 'Report Builder'\r\n });\r\n $(searchOptionBtn).on('click', () => {\r\n Mediator.toolsManager.buttonHandler(null, 'ReportBuilder', null);\r\n });\r\n\r\n hasAdvancedSearch = true;\r\n }\r\n\r\n this.searchBar.domNode.className = hasAdvancedSearch\r\n ? 'advanced'\r\n : 'simple';\r\n }\r\n\r\n createInstrumentSearch () {\r\n this.gWindowList.add([\r\n {\r\n id: 'instrumentSearch',\r\n key: 'instrumentSearch',\r\n title: 'Instrument Search',\r\n content: this.instSearch.domNode\r\n }\r\n ]);\r\n\r\n this.searchBar.addSearchOption({\r\n value: 'instrumentSearch',\r\n display: 'Instrument Search'\r\n });\r\n\r\n this.searchBar.showSearchOption(\r\n this.gWindowList.getGWindow('instrumentSearch')\r\n );\r\n }\r\n}\r\n\r\nfunction createLoadingContainer () {\r\n const loadingContainer = document.createElement('div');\r\n loadingContainer.id = 'loadingContainer';\r\n\r\n render(\r\n html`
\r\n

Loading

`,\r\n loadingContainer\r\n );\r\n\r\n document.getElementById('loadingContainerMain').appendChild(loadingContainer);\r\n\r\n return loadingContainer;\r\n}\r\n\r\n/**\r\n * Insert psuedo-link in the `domNode`\r\n * @param {HTMLElement} domNode\r\n */\r\nfunction createAdminButton (domNode) {\r\n const button = document.createElement('button');\r\n\r\n button.id = 'adminButton';\r\n button.classList.add('help-container-button');\r\n button.type = 'button';\r\n button.textContent = 'Admin Page';\r\n\r\n button.addEventListener('click', () => {\r\n window.open(\r\n location.origin + location.pathname + 'Admin/' + location.search,\r\n '_blank'\r\n );\r\n });\r\n\r\n domNode.appendChild(button);\r\n}\r\n\r\n/**\r\n * @param {HTMLElement} domNode\r\n */\r\nfunction createProfileButton (domNode) {\r\n const button = document.createElement('button');\r\n button.id = 'profileButton';\r\n button.type = 'button';\r\n button.style.textIndent = '0px';\r\n button.textContent = 'Profile';\r\n\r\n button.addEventListener('click', () => {\r\n window.open(location.origin + location.pathname + 'Profile/', '_blank');\r\n });\r\n\r\n domNode.appendChild(button);\r\n}\r\n\r\nexport default RightMenu;\r\n","import Mediator from 'gisw/Classes/Mediator';\r\nimport parseHtml from 'gisw/Helpers/html';\r\nimport messageObserver from 'gisw/Widgets/MessageManager/MessageObserver';\r\n\r\nimport SearchUtility from '../GenericSearch/SearchUtility';\r\n\r\nclass PaymentSearch {\r\n isWindowOpen = false;\r\n\r\n /** @type {HTMLDivElement} */\r\n parentDom = null;\r\n\r\n constructor (config) {\r\n Object.assign(this, config);\r\n\r\n this.searchUtil = new SearchUtility();\r\n\r\n if (\r\n Mediator.toolsManager.hasTool(\r\n 'PersonalProperty',\r\n Mediator.getCurrentTabName()\r\n )\r\n ) {\r\n Mediator.toolsManager.bootUpPersonalProperty();\r\n }\r\n\r\n $.ajax({\r\n async: false,\r\n type: 'GET',\r\n url: 'PaymentSearch',\r\n success: data => {\r\n // @ts-ignore\r\n this.parentDom =\r\n typeof data === 'string' ? parseHtml(data).item(0) : data;\r\n }\r\n });\r\n }\r\n\r\n onSubmitPaymentSearch () {\r\n Mediator.handle({ name: 'loading.show' });\r\n\r\n const searchedType = $('#SelectedPaymentType').val();\r\n\r\n $.ajax({\r\n async: false,\r\n type: 'POST',\r\n url: 'PaymentSearch',\r\n data: $('#PaymentSearchForm').serialize(),\r\n success: data => {\r\n this.onSearchSuccess(data, searchedType);\r\n }\r\n });\r\n }\r\n\r\n onSearchSuccess (data, searchedType) {\r\n let results;\r\n\r\n if (searchedType === '1') {\r\n results = this.searchUtil.resultSetFromPids(data);\r\n } else {\r\n results = this.searchUtil.addMapping(data, null);\r\n }\r\n\r\n if (results.isEmpty()) {\r\n messageObserver.broadcast({\r\n title: 'No Results',\r\n message: 'Nothing matched your search criteria.'\r\n });\r\n return;\r\n }\r\n\r\n Mediator.handle({ name: 'results.clear', args: [] });\r\n\r\n Mediator.handle({ name: 'search.results.show', args: [results, true] });\r\n }\r\n\r\n getDomNode () {\r\n return this.parentDom;\r\n }\r\n}\r\n\r\nexport default PaymentSearch;\r\n","import domClass from 'dojo/dom-class';\r\nimport forIn from 'lodash/forIn';\r\n\r\nimport Mediator from 'gisw/Classes/Mediator';\r\n// @ts-ignore\r\nimport type from 'gisw/Helpers/type';\r\nimport messageObserver from 'gisw/Widgets/MessageManager/MessageObserver';\r\nimport NodeHash from 'gisw/Widgets/NodeHash';\r\n\r\nimport toolUrl from 'src/modules/tool-url';\r\nimport updateCheck from 'src/update-check';\r\n\r\n/**\r\n * The following methods and objects configure how tools are shown.\r\n */\r\nconst DONT_SHOW_SET = new Set([\r\n 'SALESSEARCH',\r\n 'PAYMENTSEARCH',\r\n 'TAXCART',\r\n 'INSTRUMENTSEARCH',\r\n 'QUICKSEARCH',\r\n 'MEDIAMANAGEMENT',\r\n 'ALWAYSONIDENTIFY',\r\n 'STREETVIEW'\r\n]);\r\n\r\n/**\r\n * Insert all tools that will need to\r\n * shutdown the AlwaysOnIdentify tool\r\n * @type {Set}\r\n */\r\nconst PAUSE_ALWAYS_ON_ID = new Set([\r\n 'Buffer',\r\n 'Draw',\r\n 'Measure',\r\n 'Landuse',\r\n 'Identify',\r\n 'ActivityManagement'\r\n]);\r\n\r\n/**\r\n * @typedef {'blue' | 'green' | 'purple' | 'red'} ToolColor\r\n */\r\n\r\n/** @type {Array} */\r\nconst COLOR_KEYS = ['blue', 'green', 'purple', 'red'];\r\n\r\n/** @type {Map} */\r\nconst COLOR_MAP = new Map([\r\n ['ADDRESS', 'red'],\r\n ['BUFFER', 'red'],\r\n ['BOOKMARK', 'blue'],\r\n ['BOOKMARKPUBLIC', 'blue'],\r\n ['BULKIMAGEUPLOADER', 'green'],\r\n ['DRAW', 'purple'],\r\n ['IDENTIFY', 'green'],\r\n ['LANDUSE', 'red'],\r\n ['MAPNAVIGATION', 'green'],\r\n ['MEASURE', 'purple'],\r\n ['PICTOMETRY', 'green'],\r\n ['PLUME', 'red'],\r\n ['PRINT', 'purple'],\r\n ['EDITOR', 'green'],\r\n ['ZOOM_IN', 'blue'],\r\n ['ZOOM_OUT', 'blue'],\r\n ['ZOOM_TO_PREVIOUS_EXTENT', 'blue'],\r\n ['ZOOM_TO_NEXT_EXTENT', 'blue'],\r\n ['FULL_EXTENT', 'blue'],\r\n ['CLEAR_', 'red'],\r\n ['PAN', 'blue'],\r\n ['DMAT', 'red'],\r\n ['CLEAR', 'red'],\r\n ['PHOTO', 'green'],\r\n ['SUBSCRIPTION', 'red'],\r\n ['CURRENT_LOCATION', 'blue']\r\n]);\r\n\r\nconst NO_CONTENT_SET = new Set([\r\n 'ACTIVITYMANAGEMENT',\r\n 'ZOOM_IN',\r\n 'ZOOM_OUT',\r\n 'FULL_EXTENT',\r\n 'ZOOM_TO_PREVIOUS_EXTENT',\r\n 'ZOOM_TO_NEXT_EXTENT',\r\n 'CLEAR_',\r\n 'PAN',\r\n 'IDENTIFY',\r\n 'PHOTO',\r\n 'CLEAR',\r\n 'BULKIMAGEUPLOADER',\r\n 'SUBSCRIPTION',\r\n 'CURRENT_LOCATION',\r\n 'REPORTBUILDER'\r\n]);\r\n\r\nconst ATOMIC_OP_SET = new Set([\r\n 'ZOOM_IN',\r\n 'ZOOM_OUT',\r\n 'ZOOM_TO_PREVIOUS_EXTENT',\r\n 'ZOOM_TO_NEXT_EXTENT',\r\n 'FULL_EXTENT',\r\n 'FEATUREDB',\r\n 'CURRENT_LOCATION'\r\n]);\r\n\r\nclass ToolsManager {\r\n /**\r\n * @param {object} config\r\n * @param {string} config.id\r\n */\r\n constructor (config) {\r\n this.id = config.id;\r\n\r\n this._tabTools = Mediator.serverData.TabTools ?? {};\r\n\r\n this.selectBtn = null;\r\n this.nextActiveToolName = null;\r\n this.isSelfClose = null;\r\n\r\n /** @type {Record} */\r\n this.menuBtns = {};\r\n\r\n /** @type {Partial} */\r\n this._tools = {};\r\n /** @type {FactoryTypes.ModuleNames} */\r\n this.activeToolName = null;\r\n\r\n this._nodeHashByTab = _initialAllToolMenuButton(this);\r\n }\r\n\r\n loadMapNavigation () {\r\n this.getToolWidgetAsync('MapNavigation').then(mapNavigation => {\r\n this._tools.MapNavigation = mapNavigation;\r\n });\r\n }\r\n\r\n /**\r\n * @param {string} tabName\r\n */\r\n getToolsMenuButtonsForTab (tabName) {\r\n return _getToolsMenuButtonsForTab(this, tabName);\r\n }\r\n\r\n /**\r\n * @param {FactoryTypes.ModuleNames} toolName\r\n */\r\n // eslint-disable-next-line class-methods-use-this\r\n isMapNavTool (toolName) {\r\n return Mediator.MapNavExtraTools.includes(toolName);\r\n }\r\n\r\n tabHasStartupTools () {\r\n const startupTools = Mediator.serverData.startupTools;\r\n const toolNames = Object.keys(startupTools);\r\n\r\n return toolNames.some(\r\n name => name.toLowerCase() === 'search' || this.hasTool(name)\r\n );\r\n }\r\n\r\n bootStartupTools () {\r\n const startupTools = Mediator.serverData.startupTools;\r\n const toolNames = Object.keys(startupTools);\r\n\r\n for (let i = 0; i < toolNames.length; i++) {\r\n const name = toolNames[i];\r\n const input = startupTools[name];\r\n\r\n if (name === 'search') {\r\n /** @type {import('gisw/Widgets/GenericSearch/Search').default} */\r\n const searcher = Mediator.rightMenu.searchBar;\r\n searcher.txtSearch.value = input;\r\n searcher.executeSearch(input);\r\n } else if (this.hasTool(name)) {\r\n this.getToolWidgetAsync(name).then(widget => {\r\n this.activateTool(name, input, widget);\r\n });\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @param {FactoryTypes.ModuleNames} name\r\n * @param {*} input\r\n * @param {*} widget\r\n */\r\n activateTool (name, input, widget) {\r\n _toggleSelectBtnCSS(this, name, { target: $('#' + name + 'Btn')[0] });\r\n\r\n Mediator.handle({\r\n name: 'toolsManagerMenu.button.click',\r\n args: [widget, name, hasContent(name)]\r\n });\r\n\r\n this.bootUpSpecialTool(name, input);\r\n }\r\n\r\n /**\r\n * @param {FactoryTypes.ModuleNames} toolName\r\n */\r\n bootUpTool (toolName) {\r\n if (this.isMapNavTool(toolName)) {\r\n _bootUpMapNavTool(this, toolName);\r\n } else {\r\n this._callToolMethod(toolName, 'bootUp');\r\n }\r\n }\r\n\r\n /**\r\n * @param {FactoryTypes.ModuleNames} toolName\r\n * @param {*} arg\r\n */\r\n bootUpSpecialTool (toolName, arg) {\r\n this.activeToolName = toolName;\r\n this._callToolMethodSpecial(toolName, 'bootUp', [arg, false]);\r\n }\r\n\r\n bootUpActiveTool () {\r\n this.bootUpTool(this.activeToolName);\r\n }\r\n\r\n /**\r\n * @param {*} arg\r\n */\r\n bootUpSpecialActiveTool (arg) {\r\n this.bootUpSpecialTool(this.activeToolName, arg);\r\n }\r\n\r\n /**\r\n * @param {FactoryTypes.ModuleNames} toolName\r\n */\r\n shutdownTool (toolName) {\r\n if (this.isMapNavTool(toolName)) {\r\n if (this._tools.MapNavigation?.navToolbar) {\r\n this._tools.MapNavigation.navToolbar.deactivate();\r\n }\r\n } else {\r\n this._callToolMethod(toolName, 'shutdown');\r\n }\r\n }\r\n\r\n shutdownActiveTool () {\r\n if (Mediator.AlwaysOnIdentify) {\r\n Mediator.AlwaysOnIdentify.resume();\r\n }\r\n\r\n const activeTool = Mediator.leftPanel.getGWindow('activeTool');\r\n\r\n if (activeTool) {\r\n activeTool.destroy();\r\n }\r\n\r\n this.shutdownTool(this.activeToolName);\r\n }\r\n\r\n closeActiveTool (isSelfClose = false) {\r\n this.isSelfClose = isSelfClose;\r\n this.shutdownActiveTool();\r\n this.activeToolName = null;\r\n this.activeTool = null;\r\n this.isSelfClose = false;\r\n }\r\n\r\n /**\r\n * @template {FactoryTypes.ModuleNames} T\r\n * @param {T} toolName\r\n */\r\n getToolWidgetAsync (toolName) {\r\n if (this._tools[toolName]) {\r\n return Promise.resolve(this._tools[toolName]);\r\n } else {\r\n return Mediator.Factory.Create({\r\n name: toolName,\r\n params: {\r\n map: Mediator.map,\r\n _widgetName: toolName\r\n }\r\n }).then(widget => {\r\n if (widget.startup) {\r\n widget.startup();\r\n }\r\n\r\n widget.id = toolName;\r\n this._tools[toolName] = widget;\r\n\r\n return widget;\r\n });\r\n }\r\n }\r\n\r\n getToolColor (toolName) {\r\n return getToolColor(toolName);\r\n }\r\n\r\n /**\r\n * @template {FactoryTypes.ModuleNames} T\r\n * @param {*} domNode\r\n * @param {T} toolName\r\n * @param {*} [e]\r\n */\r\n buttonHandler (domNode, toolName, e) {\r\n if (this.activeToolName === toolName) {\r\n return;\r\n }\r\n\r\n if (this.activeToolName !== null) {\r\n // Remove tool from URL when using another tool\r\n toolUrl.clear();\r\n }\r\n\r\n _toggleSelectBtnCSS(this, toolName, e);\r\n\r\n this.getToolWidgetAsync(toolName)\r\n .then(widget => {\r\n this.nextActiveToolName = toolName;\r\n this._tools[toolName] = widget;\r\n\r\n if (isAtomicOpTool(toolName)) {\r\n this.bootUpTool(toolName);\r\n return;\r\n }\r\n\r\n this.shutdownActiveTool();\r\n\r\n Mediator.handle({\r\n name: 'toolsManagerMenu.button.click',\r\n args: [widget, toolName, hasContent(toolName)]\r\n });\r\n\r\n this.activeToolName = toolName;\r\n this.activeTool = widget;\r\n this.bootUpActiveTool();\r\n\r\n // When next active tool becomes the current active tool\r\n this.nextActiveToolName = null;\r\n })\r\n .catch(err => {\r\n Mediator.jstManager.jstWarn(\r\n 'Tool',\r\n 'ToolsManager',\r\n 'buttonHandler',\r\n `Could not load \"${toolName}\" bundle. Checking for update.` +\r\n `\\n${err.message}\\n${err.stack}`\r\n );\r\n updateCheck();\r\n });\r\n }\r\n\r\n /**\r\n * This method is for when we want to bootUp with an argument\r\n * @param {FactoryTypes.ModuleNames} toolName\r\n * @param {any} arg\r\n */\r\n bootUpSpecial (toolName, arg) {\r\n _toggleSelectBtnCSS(this, toolName);\r\n\r\n return this.getToolWidgetAsync(toolName).then(widget => {\r\n this._tools[toolName] = widget;\r\n\r\n if (isAtomicOpTool(toolName)) {\r\n this.bootUpTool(toolName);\r\n return;\r\n }\r\n\r\n this.shutdownActiveTool();\r\n\r\n Mediator.handle({\r\n name: 'toolsManagerMenu.button.click',\r\n args: [widget, toolName, hasContent(toolName)]\r\n });\r\n\r\n this.activeToolName = toolName;\r\n this.activeTool = widget;\r\n this.bootUpSpecialActiveTool(arg);\r\n });\r\n }\r\n\r\n destroy () {\r\n for (const item in this._tools) {\r\n if (this._tools.hasOwnProperty(item)) {\r\n Mediator.destroyWidget(this._tools[item]);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * @param {FactoryTypes.ModuleNames} toolName\r\n * @param {string} method\r\n */\r\n _callToolMethod (toolName, method) {\r\n const tool = this._tools[toolName || '__NOOP__'];\r\n\r\n if (tool?.[method]) {\r\n tool[method]();\r\n }\r\n }\r\n\r\n /**\r\n * @param {FactoryTypes.ModuleNames} toolName\r\n * @param {string} method\r\n * @param {any} arg\r\n */\r\n _callToolMethodSpecial (toolName, method, arg) {\r\n const tool = this._tools[toolName || '__NOOP__'];\r\n\r\n if (tool?.[method]) {\r\n tool[method](arg);\r\n }\r\n }\r\n\r\n /**\r\n * @param {string} toolName\r\n * @param {string} [tabNameInput]\r\n */\r\n hasTool (toolName, tabNameInput) {\r\n const tabName = tabNameInput ?? Mediator.getCurrentTabName();\r\n\r\n if (!this._tabTools[tabName]) {\r\n return false;\r\n }\r\n\r\n for (let i = 0; i < this._tabTools[tabName].length; i++) {\r\n if (this._tabTools[tabName][i].Name === toolName) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n hasAdminTools () {\r\n const tabNames = Object.keys(this._tabTools);\r\n\r\n for (let j = 0; j < tabNames.length; j++) {\r\n const currentTabTools = this._tabTools[tabNames[j]];\r\n\r\n for (let i = 0; i < currentTabTools.length; i++) {\r\n if (currentTabTools[i].Name.indexOf('Admin_') >= 0) {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * @param {FactoryTypes.ModuleNames} toolName\r\n */\r\n handleAlwaysOnIdentify (toolName) {\r\n if (PAUSE_ALWAYS_ON_ID.has(toolName)) {\r\n if (Mediator.AlwaysOnIdentify) {\r\n Mediator.AlwaysOnIdentify.pause();\r\n }\r\n }\r\n }\r\n\r\n bootUpPersonalProperty () {\r\n if (this._tools.PersonalProperty) {\r\n return Promise.resolve(this._tools.PersonalProperty);\r\n }\r\n\r\n return this.getToolWidgetAsync('PersonalProperty');\r\n }\r\n\r\n /**\r\n * @param {import('gisw/Widgets/GenericSearch/ResultSet').default} results\r\n * @param {string} searchString\r\n */\r\n searchPersonalProperty (results, searchString) {\r\n return new Promise(resolve => {\r\n this.bootUpPersonalProperty().then(widget => {\r\n widget\r\n .mixPersonalPropertyData(results, searchString)\r\n .then(mixedResults => {\r\n resolve(mixedResults);\r\n });\r\n });\r\n });\r\n }\r\n}\r\n\r\nToolsManager.count = 0;\r\n\r\n/**\r\n * @param {ToolsManager} toolsManager\r\n * @param {string} toolName\r\n */\r\nfunction _bootUpMapNavTool (toolsManager, toolName) {\r\n const mnt = toolsManager._tools.MapNavigation;\r\n const map = Mediator.map;\r\n\r\n switch (toolName) {\r\n case 'Zoom_In':\r\n mnt.zoomIn();\r\n break;\r\n case 'Zoom_Out':\r\n mnt.zoomOut();\r\n break;\r\n case 'Pan':\r\n messageObserver.broadcast({\r\n title: 'Tool Hint - Pan',\r\n message: 'Click and drag the map to move',\r\n toolName: 'Pan'\r\n });\r\n break;\r\n case 'Full_Extent':\r\n Mediator.layermanager.zoomToCurrentLayerFullExtent(true);\r\n break;\r\n case 'Current_Location':\r\n mnt.toggleGeolocationTracking();\r\n break;\r\n case 'Zoom_To_Previous_Extent':\r\n if (map.get('previousExtents').length === 0) {\r\n messageObserver.broadcast({\r\n title: 'Message',\r\n message: 'No previous extent'\r\n });\r\n } else {\r\n _zoomAndTrack(map, map.get('previousExtents'), map.get('nextExtents'));\r\n }\r\n\r\n break;\r\n case 'Zoom_To_Next_Extent':\r\n if (map.get('nextExtents').length === 0) {\r\n messageObserver.broadcast({\r\n title: 'Message',\r\n message: 'No next extent'\r\n });\r\n } else {\r\n _zoomAndTrack(map, map.get('nextExtents'), map.get('previousExtents'));\r\n }\r\n\r\n break;\r\n case 'Clear_':\r\n Mediator.ClearGraphics(true, true);\r\n mnt.stopGeolocationTracking();\r\n\r\n Mediator.handle({ name: 'rightmenu.clearAll' });\r\n Mediator.handle({ name: 'remove.activeTool' });\r\n\r\n toolsManager.activeToolName = null;\r\n break;\r\n }\r\n}\r\n\r\n/**\r\n * @param {import('ol/Map').default} map\r\n * @param {Array} getArray\r\n * @param {Array} addArray\r\n */\r\nfunction _zoomAndTrack (map, getArray, addArray) {\r\n const extent = getArray.pop();\r\n\r\n map.set('skipMoveEnd', true);\r\n\r\n addArray.push(map.get('currentExtent'));\r\n\r\n map.set('currentExtent', extent);\r\n\r\n map.getView().fit(extent, { duration: 200, nearest: true });\r\n}\r\n\r\n/**\r\n * @param {ToolsManager} that\r\n */\r\nfunction _initialAllToolMenuButton (that) {\r\n /** @type {Record>} */\r\n const nodeHashes = {};\r\n const tabTools = that._tabTools;\r\n\r\n forIn(tabTools, function (tools, tab) {\r\n nodeHashes[tab] = getNodeHash(that, _getInitItemsForTab(tools));\r\n\r\n if (nodeHashes[tab].domNode) {\r\n nodeHashes[tab].domNode.id = tab + 'ToolsMenuPanel';\r\n }\r\n\r\n nodeHashes[tab].itemEventListener('click', that.buttonHandler.bind(that));\r\n });\r\n\r\n return nodeHashes;\r\n}\r\n\r\n/**\r\n * @param {Array} tools\r\n */\r\nfunction _getInitItemsForTab (tools) {\r\n const initItems = [];\r\n\r\n /** @type {Record>} */\r\n const colorGroups = type.groupBy(tools, tool => {\r\n const option = Mediator.serverData.FrontEndOption.UserSpecificTool;\r\n\r\n if (option && tool.Name === option.Value) {\r\n const certifiedUsers = JSON.parse(option.SubOptions);\r\n tool.ShowButton = !!certifiedUsers[Mediator.currentUser];\r\n }\r\n\r\n if (tool.ShowButton === true) {\r\n return getToolColor(tool.Name);\r\n } else {\r\n return null;\r\n }\r\n });\r\n\r\n for (const color of COLOR_KEYS) {\r\n if (!colorGroups.hasOwnProperty(color)) {\r\n continue;\r\n }\r\n\r\n const nextItems = colorGroups[color]\r\n .sort(_alphabeticalish)\r\n .filter(tool => !isHiddenTool(tool.Name))\r\n .map(tool => ({ key: tool.Name }));\r\n\r\n initItems.push(...nextItems.sort(_alphabeticalish));\r\n }\r\n\r\n return initItems;\r\n}\r\n\r\n/**\r\n * @param {ToolsManager} tw\r\n * @param {string} toolName\r\n * @param {*} [e]\r\n */\r\nfunction _toggleSelectBtnCSS (tw, toolName, e) {\r\n if (!e?.target || isAtomicOpTool(toolName)) {\r\n return;\r\n }\r\n\r\n if (tw.selectBtn) {\r\n domClass.remove(tw.selectBtn, 'selected');\r\n }\r\n\r\n let target = e.target;\r\n\r\n while (target && target.tagName !== 'BUTTON') {\r\n target = target.parentNode;\r\n }\r\n\r\n if (target) {\r\n domClass.add(target, 'selected');\r\n tw.selectBtn = target;\r\n }\r\n}\r\n\r\n/**\r\n * @param {ToolsManager} tw\r\n * @param {string} tabName\r\n */\r\nfunction _getToolsMenuButtonsForTab (tw, tabName) {\r\n const curTabTools = tw._nodeHashByTab[tabName];\r\n\r\n if (curTabTools) {\r\n return curTabTools;\r\n } else {\r\n Mediator.jstManager.jstError(\r\n 'Tool',\r\n 'ToolsManager',\r\n '_getToolsMenuButtonsForTab',\r\n 'No tools avaible for ' + tabName + ' tab.'\r\n );\r\n messageObserver.broadcast({\r\n title: 'Warning',\r\n message: 'No tools avaible for ' + tabName + ' tab.'\r\n });\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * @param {ToolsManager} tw\r\n * @param {Array<{ key: string; }>} initItems\r\n */\r\nfunction getNodeHash (tw, initItems) {\r\n const nodeHash = new NodeHash({\r\n initItems,\r\n className: 'ThumbnailWindow',\r\n createNode (param) {\r\n const title = Mediator.ToolsTitleDiscription[param.key] || param.key;\r\n\r\n const container = document.createElement('div');\r\n container.classList.add('ThumbnailGrid');\r\n\r\n const button = document.createElement('button');\r\n button.id = param.key + 'Btn';\r\n button.title = title;\r\n button.className = 'GridMenu ' + param.key + 'Btn';\r\n button.setAttribute('data-tool-name', param.key);\r\n\r\n // Temporary way of making glyphicon for small tool\r\n // will need to scale better\r\n const icon = document.createElement('span');\r\n icon.setAttribute('aria-hidden', 'true');\r\n\r\n switch (param.key) {\r\n case 'TMRM':\r\n icon.classList.add('glyphicon', 'glyphicon-phone');\r\n break;\r\n case 'BRatio':\r\n icon.classList.add('glyphicon', 'glyphicon-bold');\r\n break;\r\n }\r\n\r\n button.appendChild(icon);\r\n\r\n const label = document.createElement('label');\r\n label.innerHTML = title;\r\n label.title = title;\r\n\r\n container.append(button, label);\r\n\r\n if (!tw.menuBtns) {\r\n tw.menuBtns = {};\r\n }\r\n\r\n tw.menuBtns[param.key] = button;\r\n\r\n return container;\r\n }\r\n });\r\n\r\n return nodeHash;\r\n}\r\n\r\n/**\r\n * @param {string} toolName\r\n */\r\nfunction isHiddenTool (toolName) {\r\n return DONT_SHOW_SET.has(toolName.toUpperCase());\r\n}\r\n\r\n/**\r\n * @param {string} toolName\r\n */\r\nfunction hasContent (toolName) {\r\n return !NO_CONTENT_SET.has(toolName.toUpperCase());\r\n}\r\n\r\n/**\r\n * @param {string} toolName\r\n */\r\nfunction isAtomicOpTool (toolName) {\r\n return ATOMIC_OP_SET.has(toolName.toUpperCase());\r\n}\r\n\r\n/**\r\n * @param {string} toolName\r\n */\r\nfunction getToolColor (toolName) {\r\n return COLOR_MAP.get(toolName.toUpperCase()) || 'green';\r\n}\r\n\r\n/**\r\n * 'Clear' always appears last in red color group.\r\n */\r\nconst clearRegExp = new RegExp('clear_?', 'i');\r\nconst locationRegExp = new RegExp('Current_Location', 'i');\r\n\r\nfunction _alphabeticalish (t1, t2) {\r\n const key = t1.key ? 'key' : 'Name';\r\n\r\n const a = t1[key].toLowerCase();\r\n const b = t2[key].toLowerCase();\r\n\r\n if (locationRegExp.test(a)) {\r\n return 1;\r\n }\r\n\r\n if (locationRegExp.test(b)) {\r\n return -1;\r\n }\r\n\r\n if (\r\n clearRegExp.test(b) ||\r\n b === 'zoom_to_next_extent' && a === 'zoom_to_previous_extent' ||\r\n a < b\r\n ) {\r\n return -1;\r\n } else if (\r\n clearRegExp.test(a) ||\r\n a === 'zoom_to_next_extent' && b === 'zoom_to_previous_extent' ||\r\n a > b\r\n ) {\r\n return 1;\r\n } else {\r\n return 0;\r\n }\r\n}\r\n\r\nexport default ToolsManager;\r\n","import 'ol/ol.css';\r\nimport OLMap from 'ol/Map';\r\nimport { fromLonLat } from 'ol/proj';\r\nimport View from 'ol/View';\r\n\r\nimport Mediator from 'gisw/Classes/Mediator';\r\n// @ts-ignore\r\nimport auth from 'gisw/Helpers/auth';\r\nimport MapLayerCredientials from 'gisw/Helpers/MapLayerCredientials';\r\nimport { getValue } from 'gisw/Helpers/storage';\r\nimport GWindowList from 'gisw/Widgets/GWindowList';\r\nimport GWindowManager from 'gisw/Widgets/GWindowManager';\r\nimport screenSizeWarning from 'gisw/Widgets/MessageManager/screenSizeWarning';\r\n\r\nimport updateCheck from 'src/update-check';\r\n\r\nimport Data from './Data';\r\nimport { getHandlers } from './Handlers';\r\nimport BaseMapManager from './Widgets/BasemapManager';\r\nimport BottomRightMenu from './Widgets/BottomRightMenu';\r\nimport CenterMenu from './Widgets/CenterMenu';\r\nimport LayersManager from './Widgets/LayersManager';\r\nimport RightMenu from './Widgets/RightMenu';\r\nimport ToolsManager from './Widgets/ToolsManager';\r\n\r\n/**\r\n * @module eCounty/Main\r\n *\r\n * @description\r\n * This module contains _ALL_ initialization logic for eCounty sites. This\r\n * excludes any js that is generated by the server; see\r\n * Views/eCounty/Index.cshtml.\r\n */\r\ndefine([], function () {\r\n 'use strict';\r\n\r\n const mobileLeftContainer = 'mobile-left-container';\r\n const mobileRightContainer = 'mobile-right-container';\r\n\r\n return {\r\n /**\r\n * @param {object} config\r\n * @param {object} config.serverData\r\n */\r\n async init (config) {\r\n Mediator.constructor({ serverData: config.serverData });\r\n await _init();\r\n\r\n // Start watching for updates\r\n updateCheck();\r\n }\r\n };\r\n\r\n /**\r\n * @function _init\r\n * @private\r\n * @memberof module:eCounty/Main\r\n * @description\r\n * the main entry point for eCounty sites. Prior to the execution of\r\n * this function, the {@link Mediator} instance has been created and\r\n * site specific data has been added by the server;\r\n * see `Views/eCounty/Index.cshtml`.\r\n * Note that the {@link Mediator#store} method automatically calls\r\n * the `startup` method when storing a widget.\r\n */\r\n async function _init () {\r\n // @ts-ignore\r\n window.console.errorOld = window.console.error;\r\n\r\n window.console.error = function (text, ...others) {\r\n // @ts-ignore\r\n window.console.errorOld(text, ...others);\r\n\r\n if (text?.message && text?.stack) {\r\n Mediator.jstManager.jstError(\r\n 'Console Error with stack',\r\n text.message,\r\n null,\r\n text.stack,\r\n null,\r\n null\r\n );\r\n } else {\r\n Mediator.jstManager.jstError(\r\n 'Console Error',\r\n '',\r\n null,\r\n text,\r\n null,\r\n null\r\n );\r\n }\r\n\r\n // Temporary until dojo-webpack-plugin is removed\r\n // Immediately check for updates on ChunkLoadErrors\r\n if (/^ChunkLoadError/i.test(text?.name || text)) {\r\n updateCheck();\r\n }\r\n };\r\n\r\n window.onerror = function (message, url, line, col, error) {\r\n const errorStack = error?.stack;\r\n Mediator.jstManager.jstError(\r\n 'Global Error',\r\n message,\r\n null,\r\n error ? JSON.stringify(error) : '',\r\n null,\r\n null\r\n );\r\n return false;\r\n };\r\n\r\n // Work around until this issue is fixed\r\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1072475\r\n (function ($) {\r\n $.fn.mSort = function (callback) {\r\n const children = this.children().sort(callback);\r\n\r\n for (let j = 0; j < this.length; j++) {\r\n for (let i = 0; i < children.length; i++) {\r\n this[j].appendChild(children[i]);\r\n }\r\n }\r\n\r\n this.find('optgroup').each(function (_, group) {\r\n const children = $(group).children().sort(callback);\r\n\r\n for (let i = 0; i < children.length; i++) {\r\n group.appendChild(children[i]);\r\n }\r\n });\r\n\r\n return this;\r\n };\r\n })(jQuery);\r\n\r\n $.ajaxSetup({ cache: false });\r\n\r\n Mediator.mapLayerCredientials = new MapLayerCredientials();\r\n window.addEventListener('keydown', function (e) {\r\n // ctrl key + g pressed, check for streetView tool\r\n if (e.ctrlKey && e.keyCode === 71) {\r\n if (\r\n Mediator.mapPoint &&\r\n Mediator.toolsManager.hasTool(\r\n 'StreetView',\r\n Mediator.getCurrentTabName()\r\n )\r\n ) {\r\n if (Mediator.serverData) {\r\n Mediator.jstManager.jstToolEvent(\r\n 'StreetView',\r\n 'Shortcut Used',\r\n 'Street View',\r\n Mediator.mapPoint.latitude,\r\n Mediator.mapPoint.longitude\r\n );\r\n } else {\r\n Mediator.jstManager.jstError(\r\n 'StreetView',\r\n 'Shortcut Used',\r\n 'Street View',\r\n 'Mediator.serverData not defined',\r\n Mediator.mapPoint.latitude,\r\n Mediator.mapPoint.longitude\r\n );\r\n }\r\n\r\n e.stopPropagation();\r\n\r\n const streetViewURL =\r\n 'https://maps.google.com/maps?q=&layer=c&cbll=' +\r\n Mediator.mapPoint.latitude +\r\n ',' +\r\n Mediator.mapPoint.longitude;\r\n window.open(streetViewURL);\r\n }\r\n // ctrl key + l pressed, check for streetView tool\r\n } else if (e.ctrlKey && e.keyCode === 76) {\r\n Mediator.bottomRightMenu.copyCoordsToClipboard();\r\n }\r\n });\r\n\r\n // Use this module/method to define 'global' data/methods on Mediator\r\n // in addition to the widgets loaded below.\r\n Data.preProcess();\r\n\r\n Mediator.destroyWidgets = () => {\r\n _destroyWidgets();\r\n };\r\n\r\n /* initializes auth module */\r\n Mediator.store('login', await _loadLoginPanel(), false);\r\n\r\n // Show login screen when there's no tab to show.\r\n const showLoginPage =\r\n (auth.siteLoginRequired || auth.permissionRequiredForTab) &&\r\n (!auth.loggedIn || Mediator.serverData.Tabs.length === 0);\r\n\r\n if (showLoginPage) {\r\n Mediator.login.show();\r\n } else {\r\n await _LoginInit();\r\n }\r\n\r\n if (auth.loggedIn) {\r\n Mediator.initChurnZero();\r\n }\r\n }\r\n\r\n /**\r\n * @param {*} [loginInfo]\r\n */\r\n async function _LoginInit (loginInfo = null) {\r\n try {\r\n await Mediator.mapLayerCredientials.getMapLayerAuthenticated('submap');\r\n } catch (error) {\r\n Mediator.jstManager.jstError('Widget', 'Main', '_LoginInit', error);\r\n }\r\n\r\n if (Mediator.toolsManager) {\r\n Mediator.toolsManager.closeActiveTool(true);\r\n }\r\n\r\n if (Mediator.hasWidgetsToDelete()) {\r\n _destroyWidgets();\r\n }\r\n\r\n if (loginInfo) {\r\n // user has logged in, update this info\r\n Mediator._processLoginData(loginInfo);\r\n }\r\n\r\n Mediator.currentTab = null;\r\n\r\n await _reloadWidgets();\r\n\r\n Mediator.ClearGraphics(true, true);\r\n }\r\n\r\n async function _reloadWidgets () {\r\n const showDisclaimer = needsDisclaimer();\r\n const reloaded = Mediator.map ? true : false;\r\n Mediator.startupWidgetsIds = _getCurRegisteredWidgetsIds();\r\n\r\n if (\r\n showDisclaimer &&\r\n (!Mediator.helppage || Mediator.helppage.isDestroyed)\r\n ) {\r\n Mediator.store('helppage', await _loadDisclaimer());\r\n\r\n if (reloaded || Mediator.serverData.FrontEndOption.NoDisclaimer) {\r\n Mediator.helppage.hide();\r\n }\r\n }\r\n\r\n if (Mediator.helppage) {\r\n Mediator.helppage.initTabContainers();\r\n }\r\n\r\n /**\r\n * Tools that have methods which need the map/layers to be loaded should\r\n * be created here, and their methods can be called in the callback below.\r\n */\r\n Mediator.store('toolsManager', _loadToolManager());\r\n\r\n if (!reloaded) {\r\n Mediator.map = _loadMap();\r\n\r\n _bootUpAlwaysOnIdentify();\r\n Mediator.store('baseMapManager', _loadBaseMapManager(), false);\r\n Mediator.store('layermanager', _loadLayersManager(), false);\r\n }\r\n\r\n // Some counties have departments that\r\n // only show up after user logs in\r\n Mediator.centerMenu = new CenterMenu({\r\n id: 'centerMenu',\r\n display: 'all'\r\n });\r\n\r\n const [rightMenu, resultsPanel, payment] = await Promise.all([\r\n _loadRightMenu(),\r\n _loadResultsPanel(),\r\n _loadPayment()\r\n ]);\r\n\r\n Mediator.store('bottomRightMenu', _loadBottomRightMenu());\r\n Mediator.store('rightMenu', rightMenu);\r\n Mediator.store('resultsPanel', resultsPanel);\r\n Mediator.store('paymentPanel', payment);\r\n\r\n Mediator.store('CartPanel', await _loadCart());\r\n Mediator.store('leftPanel', _loadLeftPanel());\r\n Mediator.store('gWindowManager', _loadGWindowManager());\r\n\r\n Mediator.registerHandlers(getHandlers());\r\n\r\n Data.postProcess();\r\n\r\n if (Mediator.login?.returnPageIndex) {\r\n Mediator.login.returnPageIndex = null;\r\n }\r\n\r\n Mediator.currentToolGroup = null;\r\n\r\n if (Mediator.isMobile || Mediator.inMobileMode) {\r\n setupMobile();\r\n }\r\n\r\n if (\r\n window.innerWidth < 1024 &&\r\n !Mediator.isMobileDevice &&\r\n Mediator.showTabletOption\r\n ) {\r\n addTabletMode();\r\n } else {\r\n removeTabletMode();\r\n }\r\n\r\n Mediator.hideMobileLeft = hideMobileLeft;\r\n Mediator.hideMobileRight = hideMobileRight;\r\n Mediator.showMobileRight = showMobileRight;\r\n Mediator.showMobileLeft = showMobileLeft;\r\n\r\n if (\r\n (Mediator.showDesktopMessage || Mediator.showDesktopWarning) &&\r\n !Mediator.inMobileMode\r\n ) {\r\n showDesktopMessage();\r\n }\r\n\r\n // Adjusts positioning of disclaimer on rotation\r\n window.addEventListener('resize', function () {\r\n // don't need to refresh, this causes errors in the top panel\r\n if (!Mediator.isMobile) {\r\n if (Mediator.inMobileMode && !Mediator.tabletMode) {\r\n revertToDesktop();\r\n }\r\n } else {\r\n if (\r\n !Mediator.inMobileMode &&\r\n (!Mediator.desktopMode || window.innerWidth <= 750)\r\n ) {\r\n setupMobile();\r\n }\r\n }\r\n\r\n Mediator.showDesktopMessage = false;\r\n\r\n if (\r\n window.innerWidth < 1024 &&\r\n !Mediator.isMobileDevice &&\r\n Mediator.showTabletOption\r\n ) {\r\n addTabletMode();\r\n Mediator.showDesktopMessage = true;\r\n } else {\r\n removeTabletMode();\r\n }\r\n\r\n if (Mediator.showDesktopMessage) {\r\n showDesktopMessage();\r\n }\r\n\r\n if (window.innerWidth >= 1024) {\r\n $('#ScreenSizeWarningModal').modal('hide');\r\n }\r\n });\r\n\r\n Mediator.toolsManager.loadMapNavigation();\r\n Mediator.handle({ name: 'loadStartUpTool', args: [] });\r\n }\r\n\r\n function addTabletMode () {\r\n if (document.getElementById('tabletModeButton') || Mediator.inMobileMode) {\r\n return;\r\n }\r\n\r\n // Move loading container into secondary container\r\n const loading = document.getElementById('loadingContainer');\r\n\r\n if (loading) {\r\n document.getElementById('loadingContainerSecondary').appendChild(loading);\r\n }\r\n\r\n const tabletModeButton = document.createElement('button');\r\n tabletModeButton.textContent = 'Mobile Mode';\r\n tabletModeButton.id = 'tabletModeButton';\r\n tabletModeButton.classList.add('help-container-button');\r\n\r\n const helpButtonContainer = document.getElementById('helpButtonContainer');\r\n helpButtonContainer.insertBefore(\r\n tabletModeButton,\r\n helpButtonContainer.firstChild\r\n );\r\n\r\n tabletModeButton.addEventListener('click', function () {\r\n Mediator.tabletMode = true;\r\n Mediator.inMobileMode = true;\r\n Mediator.desktopMode = false;\r\n Mediator.showDesktopOption = true;\r\n setupMobile();\r\n });\r\n }\r\n\r\n function removeTabletMode () {\r\n const tabletModeButton = document.getElementById('tabletModeButton');\r\n\r\n if (!tabletModeButton) {\r\n return;\r\n }\r\n\r\n // Move loading container into main container\r\n const loading = document.getElementById('loadingContainer');\r\n const loadingContainer = document.getElementById('loadingContainerMain');\r\n\r\n if (loading) {\r\n loadingContainer.appendChild(loading);\r\n }\r\n\r\n const loginContainer = document.getElementById('loginButtonContainer');\r\n loginContainer.insertBefore(loadingContainer, loginContainer.firstChild);\r\n\r\n tabletModeButton.remove();\r\n }\r\n\r\n function setupMobile () {\r\n const curEntityDisplayName = Mediator.serverData.displayName.toString();\r\n Mediator.inMobileMode = true;\r\n\r\n if (Mediator.showDesktopMessage && !Mediator.isMobileDevice) {\r\n showDesktopMessage();\r\n }\r\n\r\n if (Mediator.helppage) {\r\n Mediator.helppage.showDesktopTabs(false);\r\n }\r\n\r\n // Move loading container into main container\r\n const loading = document.getElementById('loadingContainer');\r\n const loadingMain = document.getElementById('loadingContainerMain');\r\n\r\n if (loading) {\r\n loadingMain.appendChild(loading);\r\n }\r\n\r\n document.body.appendChild(loadingMain);\r\n\r\n loadingMain.classList.add('mobileMode');\r\n\r\n Mediator.centerMenu.domNode.classList.add('mobile');\r\n\r\n const helpTabContainer = document.getElementById('helpTabsContainer');\r\n\r\n if (helpTabContainer) {\r\n helpTabContainer.classList.add('mobile');\r\n }\r\n\r\n const tabletModeButton = document.getElementById('tabletModeButton');\r\n\r\n if (tabletModeButton) {\r\n tabletModeButton.remove();\r\n }\r\n\r\n document.getElementById('logo').style.visibility = 'hidden';\r\n document.getElementById('BottomRightMenu').style.visibility = 'hidden';\r\n\r\n let mobileLeft = document.getElementById(mobileLeftContainer);\r\n\r\n if (!mobileLeft) {\r\n mobileLeft = document.createElement('div');\r\n mobileLeft.id = mobileLeftContainer;\r\n mobileLeft.classList.add('mobilePanel');\r\n document.body.appendChild(mobileLeft);\r\n }\r\n\r\n const helpButtons = document.getElementById('helpButtonContainer');\r\n\r\n while (mobileLeft.firstChild) {\r\n mobileLeft.removeChild(mobileLeft.firstChild);\r\n }\r\n\r\n mobileLeft.appendChild(helpButtons);\r\n mobileLeft.appendChild(Mediator.centerMenu.tabSelectList);\r\n mobileLeft.appendChild(Mediator.leftPanel.domNode);\r\n\r\n if (!document.getElementById('mobileCountyName')) {\r\n // Normal display name based on display name and full state name\r\n const curMobileDisplayName =\r\n curEntityDisplayName + '
' + Mediator.serverData.StateFull;\r\n\r\n const mobileCountyName = document.createElement('div');\r\n mobileCountyName.innerHTML = curMobileDisplayName;\r\n mobileCountyName.id = 'mobileCountyName';\r\n\r\n mobileLeft.insertBefore(\r\n mobileCountyName,\r\n mobileLeft.firstChild.nextSibling\r\n );\r\n }\r\n\r\n let mobileRight = document.getElementById(mobileRightContainer);\r\n\r\n if (!mobileRight) {\r\n mobileRight = document.createElement('div');\r\n mobileRight.id = mobileRightContainer;\r\n mobileRight.classList.add('mobilePanel');\r\n document.body.appendChild(mobileRight);\r\n }\r\n\r\n const searchBar = document.getElementById('loginButtonContainer');\r\n\r\n while (mobileRight.firstChild) {\r\n mobileRight.removeChild(mobileRight.firstChild);\r\n }\r\n\r\n const max = Number.parseInt(getComputedStyle(mobileRight)['maxWidth']);\r\n const sw = window.innerWidth > max ? -1 * max : -1 * window.innerWidth;\r\n\r\n mobileRight.appendChild(searchBar);\r\n mobileRight.style.right = sw + 'px';\r\n\r\n let toolsButton = document.getElementById('toolsButton');\r\n\r\n if (!toolsButton) {\r\n toolsButton = document.createElement('button');\r\n toolsButton.id = 'toolsButton';\r\n document.body.appendChild(toolsButton);\r\n }\r\n\r\n let hideButton = document.getElementById('hideToolsButton');\r\n\r\n if (!hideButton) {\r\n hideButton = document.createElement('button');\r\n hideButton.id = 'hideToolsButton';\r\n mobileLeft.insertBefore(hideButton, mobileLeft.firstChild);\r\n }\r\n\r\n let clearButton = document.getElementById('searchClearButton');\r\n\r\n if (!clearButton) {\r\n clearButton = document.createElement('button');\r\n clearButton.id = 'searchClearButton';\r\n document.body.appendChild(clearButton);\r\n }\r\n\r\n let mobileSearchButton = document.getElementById('mobileSearchButton');\r\n\r\n if (!mobileSearchButton) {\r\n mobileSearchButton = document.createElement('button');\r\n mobileSearchButton.id = 'mobileSearchButton';\r\n document.body.appendChild(mobileSearchButton);\r\n }\r\n\r\n let searchHideButton = document.getElementById('hideSearchButton');\r\n\r\n if (!searchHideButton) {\r\n searchHideButton = document.createElement('button');\r\n searchHideButton.textContent = 'Hide';\r\n searchHideButton.id = 'hideSearchButton';\r\n mobileRight.insertBefore(searchHideButton, mobileRight.firstChild);\r\n }\r\n\r\n if (!Mediator.mobileLeftVisible) {\r\n toolsButton.style.visibility = 'visible';\r\n }\r\n\r\n toolsButton.addEventListener('click', function () {\r\n showMobileLeft();\r\n });\r\n\r\n hideButton.addEventListener('click', function () {\r\n hideMobileLeft(Mediator);\r\n });\r\n\r\n clearButton.addEventListener('click', function () {\r\n // @ts-ignore\r\n Mediator.toolsManager.buttonHandler(null, 'Clear_');\r\n });\r\n\r\n mobileSearchButton.addEventListener('click', function () {\r\n if (!Mediator.mobileSearchVisible) {\r\n showMobileRight();\r\n }\r\n });\r\n\r\n searchHideButton.addEventListener('click', function () {\r\n hideMobileRight();\r\n });\r\n\r\n if (Mediator.showDesktopOption) {\r\n let desktopButton = document.getElementById('desktopModeButton');\r\n\r\n if (!desktopButton) {\r\n desktopButton = document.createElement('button');\r\n desktopButton.textContent = 'Desktop Mode';\r\n desktopButton.id = 'desktopModeButton';\r\n document.body.appendChild(desktopButton);\r\n }\r\n\r\n desktopButton.addEventListener('click', function () {\r\n Mediator.desktopMode = true;\r\n Mediator.tabletMode = false;\r\n Mediator.inMobileMode = false;\r\n revertToDesktop();\r\n });\r\n }\r\n }\r\n\r\n function revertToDesktop () {\r\n // @ts-ignore\r\n // Set in Views/Shared/Layout.cshtml\r\n window.setTabContainerWidth();\r\n\r\n Mediator.inMobileMode = false;\r\n\r\n if (Mediator.helppage) {\r\n Mediator.helppage.showDesktopTabs(true);\r\n }\r\n\r\n Mediator.centerMenu.domNode.classList.remove('mobile');\r\n\r\n const helpTabContainer = document.getElementById('helpTabsContainer');\r\n\r\n if (helpTabContainer) {\r\n helpTabContainer.classList.remove('mobile');\r\n }\r\n\r\n document.getElementById('logo').style.visibility = 'visible';\r\n document.getElementById('BottomRightMenu').style.visibility = 'visible';\r\n\r\n const desktopMobileButton = document.getElementById('desktopModeButton');\r\n\r\n if (desktopMobileButton) {\r\n desktopMobileButton.remove();\r\n }\r\n\r\n if (Mediator.serverData.EntityNameDisplayType === 'BelowToolbar') {\r\n const searchContainerMain = document.getElementById(\r\n 'searchContainerMain'\r\n );\r\n const displayNameLabel = document.getElementById('displayNameLabel');\r\n\r\n searchContainerMain.insertBefore(\r\n displayNameLabel,\r\n searchContainerMain.firstChild\r\n );\r\n\r\n displayNameLabel.parentNode.insertBefore(\r\n document.getElementById('loginButtonContainer'),\r\n displayNameLabel.nextSibling\r\n );\r\n } else {\r\n const toolsContainerMain = document.getElementById('toolsContainerMain');\r\n toolsContainerMain.parentNode.insertBefore(\r\n document.getElementById('loginButtonContainer'),\r\n toolsContainerMain.nextSibling\r\n );\r\n }\r\n\r\n document\r\n .getElementById('tabSelectContainer')\r\n .appendChild(Mediator.centerMenu.tabSelectList);\r\n\r\n document.body.appendChild(document.getElementById('left-panel'));\r\n\r\n document\r\n .getElementById('countyTabsContainer')\r\n .appendChild(document.getElementById('helpButtonContainer'));\r\n\r\n document.getElementById(mobileLeftContainer).remove();\r\n document.getElementById(mobileRightContainer).remove();\r\n document.getElementById('toolsButton').remove();\r\n document.getElementById('mobileSearchButton').remove();\r\n document.getElementById('searchClearButton').remove();\r\n\r\n document\r\n .getElementById('loadingContainerMain')\r\n .classList.remove('mobileMode');\r\n\r\n if (Mediator.showTabletOption) {\r\n addTabletMode();\r\n }\r\n\r\n if (window.innerWidth >= 1024 && Mediator.showTabletOption) {\r\n Mediator.showTabletOption = false;\r\n removeTabletMode();\r\n }\r\n }\r\n\r\n function hideMobileLeft (_unused, hideTools = false) {\r\n Mediator.mobileLeftVisible = false;\r\n\r\n const mobileLeft = document.getElementById(mobileLeftContainer);\r\n const w =\r\n (Number.parseInt(getComputedStyle(mobileLeft)['maxWidth']) + 15) * -1;\r\n\r\n if (mobileLeft) {\r\n mobileLeft.style.webkitTransform = getTranslate(w);\r\n mobileLeft.style.transform = getTranslate(w);\r\n }\r\n\r\n document.getElementById('toolsButton').style.visibility = 'hidden';\r\n\r\n if (!hideTools) {\r\n setTimeout(function () {\r\n document.getElementById('toolsButton').style.visibility = 'visible';\r\n }, 100);\r\n }\r\n }\r\n\r\n function showMobileLeft () {\r\n Mediator.mobileLeftVisible = true;\r\n\r\n if (Mediator.mobileSearchVisible) {\r\n hideMobileRight();\r\n }\r\n\r\n const mobileLeft = document.getElementById(mobileLeftContainer);\r\n const w = Number.parseInt(getComputedStyle(mobileLeft)['width']);\r\n\r\n if (mobileLeft) {\r\n mobileLeft.style.webkitTransform = getTranslate(w);\r\n mobileLeft.style.transform = getTranslate(w);\r\n }\r\n\r\n document.getElementById('toolsButton').style.visibility = 'hidden';\r\n }\r\n\r\n function hideMobileRight () {\r\n if (document.getElementById('desktopModeButton')) {\r\n document.getElementById('desktopModeButton').style.visibility = 'visible';\r\n }\r\n\r\n Mediator.mobileSearchVisible = false;\r\n document.getElementById('toolsButton').style.visibility = 'visible';\r\n\r\n const mobileRight = document.getElementById(mobileRightContainer);\r\n\r\n const w = window.innerWidth > 407 ? 407 : window.innerWidth;\r\n\r\n if (mobileRight) {\r\n mobileRight.style.webkitTransform = getTranslate(w);\r\n mobileRight.style.transform = getTranslate(w);\r\n }\r\n\r\n document.getElementById('mobileSearchButton').style.visibility = 'visible';\r\n }\r\n\r\n function showMobileRight () {\r\n if (document.getElementById('desktopModeButton')) {\r\n document.getElementById('desktopModeButton').style.visibility = 'hidden';\r\n }\r\n\r\n if (Mediator.mobileLeftVisible) {\r\n hideMobileLeft(Mediator, true);\r\n }\r\n\r\n Mediator.mobileSearchVisible = true;\r\n\r\n const mobileRight = document.getElementById(mobileRightContainer);\r\n const w = window.innerWidth > 407 ? -407 : -1 * window.innerWidth;\r\n document.getElementById('toolsButton').style.visibility = 'hidden';\r\n\r\n if (mobileRight) {\r\n mobileRight.style.webkitTransform = getTranslate(w);\r\n mobileRight.style.transform = getTranslate(w);\r\n }\r\n\r\n document.getElementById('mobileSearchButton').style.visibility = 'hidden';\r\n }\r\n\r\n function getTranslate (w) {\r\n return 'translateX(' + w.toString() + 'px)';\r\n }\r\n\r\n function showDesktopMessage () {\r\n // checks if warning is disabled\r\n if (\r\n getValue('disableSizeWarning') ||\r\n window.location.host === 'localhost'\r\n ) {\r\n return;\r\n }\r\n\r\n if (Mediator.desktopMessageTimer) {\r\n clearTimeout(Mediator.desktopMessageTimer);\r\n }\r\n\r\n const constants = {\r\n screenSizeWarning:\r\n 'Based on the size of your current browser window, ' +\r\n 'you may benefit by using the mobile version of the website. ' +\r\n 'To enable the mobile version, ' +\r\n 'click the \\'Mobile Layout\\' button on your screen. ' +\r\n 'To revert back to the desktop layout, ' +\r\n 'click the \\'Desktop Mode\\' button.',\r\n\r\n screenSizeMessage:\r\n 'Based on the size of your current window, ' +\r\n 'you are seeing the mobile version ' +\r\n 'of the site which is designed to accommodate smaller screens. ' +\r\n 'In the event you are using a desktop window that has been minimized,' +\r\n ' you may view the desktop version of the site ' +\r\n 'by maximizing the size of your window.'\r\n };\r\n\r\n Mediator.desktopMessageTimer = setTimeout(() => {\r\n if (Mediator.showDesktopWarning) {\r\n // if true create first warning (tablet)\r\n screenSizeWarning(constants.screenSizeWarning);\r\n } else {\r\n // else create second warning (mobile)\r\n screenSizeWarning(constants.screenSizeMessage);\r\n }\r\n\r\n Mediator.showDesktopWarning = false;\r\n Mediator.showDesktopMessage = false;\r\n }, 600);\r\n }\r\n\r\n function _destroyWidgets () {\r\n Mediator.gWindowManager.closeAllWindows();\r\n Mediator.destroyStoredWidgets();\r\n\r\n const curWidgetsIds = _getCurRegisteredWidgetsIds();\r\n\r\n for (let i = 0, len = curWidgetsIds.length; i < len; i++) {\r\n const curWidget = curWidgetsIds[i];\r\n const curDijit = dijit.registry.byId(curWidget);\r\n\r\n if (Mediator.startupWidgetsIds.indexOf(curWidget) < 0 && curDijit) {\r\n Mediator.destroyWidget(curDijit);\r\n }\r\n }\r\n }\r\n\r\n function needsDisclaimer () {\r\n if (!Mediator.disclaimer && Mediator.serverData.HelpBoxInfos.length > 0) {\r\n for (let i = 0; i < Mediator.serverData.HelpBoxInfos.length; i++) {\r\n if (Mediator.serverData.HelpBoxInfos[i].Title === 'Disclaimer') {\r\n return true;\r\n }\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n function _loadGWindowManager () {\r\n const gWinManager = new GWindowManager();\r\n document.body.appendChild(gWinManager.domNode);\r\n return gWinManager;\r\n }\r\n\r\n function _loadMap () {\r\n const view = new View({\r\n // constrainResolution true causes issue on Apple computers\r\n constrainResolution: false,\r\n center: fromLonLat([-99, 42]),\r\n zoom: 6\r\n });\r\n\r\n view.set('getScale', function () {\r\n const standardScales = [\r\n 591657527.591555,\r\n 295828763.795777,\r\n 147914381.897889,\r\n 73957190.948944,\r\n 36978595.474472,\r\n 18489297.737236,\r\n 9244648.868618,\r\n 4622324.434309,\r\n 2311162.217155,\r\n 1155581.108577,\r\n 577790.554289,\r\n 288895.277144,\r\n 144447.638572,\r\n 72223.819286,\r\n 36111.909643,\r\n 18055.954822,\r\n 9027.977411,\r\n 4513.988705,\r\n 2256.994353,\r\n 1128.497176,\r\n 564.248588,\r\n 282.124294,\r\n 141.062147,\r\n 70.5310735\r\n ];\r\n\r\n const scaleAtZoom = standardScales[view.getZoom()];\r\n\r\n if (scaleAtZoom) {\r\n return scaleAtZoom;\r\n }\r\n\r\n const inchesPerMeter = 39.37;\r\n const dpi = 96;\r\n\r\n return inchesPerMeter * dpi * view.getResolution();\r\n });\r\n\r\n const map = new OLMap({\r\n target: 'map',\r\n view,\r\n controls: []\r\n });\r\n\r\n map.set('previousExtents', []);\r\n map.set('nextExtents', []);\r\n\r\n map.on('moveend', function () {\r\n const previousExtents = map.get('previousExtents');\r\n const currentExtent = map.get('currentExtent');\r\n\r\n if (map.get('skipMoveEnd')) {\r\n map.set('skipMoveEnd', false);\r\n return;\r\n }\r\n\r\n map.set('nextExtents', []);\r\n\r\n if (previousExtents.length === 10) {\r\n previousExtents.pop();\r\n }\r\n\r\n if (currentExtent) {\r\n previousExtents.push(currentExtent);\r\n }\r\n\r\n map.set('currentExtent', map.getView().calculateExtent());\r\n });\r\n\r\n return map;\r\n }\r\n\r\n function _bootUpAlwaysOnIdentify () {\r\n if (\r\n !Mediator.toolsManager.hasTool(\r\n 'AlwaysOnIdentify',\r\n Mediator.getCurrentTabName()\r\n )\r\n ) {\r\n return;\r\n }\r\n\r\n Mediator.toolsManager\r\n .getToolWidgetAsync('AlwaysOnIdentify')\r\n .then(function (widget) {\r\n widget.bootUp();\r\n Mediator.AlwaysOnIdentify = widget;\r\n });\r\n }\r\n\r\n /**\r\n * Creates RightMenu and asynchronously loads the SearchBar\r\n */\r\n async function _loadRightMenu () {\r\n const rightMenu = new RightMenu({ id: 'rightMenu' });\r\n document.body.appendChild(rightMenu.domNode);\r\n\r\n await rightMenu.lazyLoad();\r\n\r\n return rightMenu;\r\n }\r\n\r\n function _loadLeftPanel () {\r\n const leftPanel = new GWindowList({\r\n id: 'left-panel',\r\n initGWindows: [\r\n {\r\n key: 'tools',\r\n title: 'Tools',\r\n id: 'toolsWindow',\r\n content: document.createElement('div')\r\n },\r\n {\r\n key: 'layers',\r\n title: 'Layers',\r\n id: 'layersContainer',\r\n content: document.createElement('div')\r\n },\r\n {\r\n key: 'basemaps',\r\n title: 'Basemaps',\r\n id: 'basemapContainer',\r\n content: document.createElement('div')\r\n }\r\n ]\r\n });\r\n\r\n document.body.appendChild(leftPanel.domNode);\r\n\r\n return leftPanel;\r\n }\r\n\r\n function _loadLayersManager () {\r\n return new LayersManager({ id: 'LayersManager' });\r\n }\r\n\r\n function _loadBaseMapManager () {\r\n return new BaseMapManager({ id: 'BaseMapManager' });\r\n }\r\n\r\n function _loadToolManager () {\r\n return new ToolsManager({ id: 'ToolsManager' });\r\n }\r\n\r\n function _loadDisclaimer () {\r\n return Mediator.Factory.Create({ name: 'HelpPage', params: null });\r\n }\r\n\r\n function _loadBottomRightMenu () {\r\n const bottomRightMenu = new BottomRightMenu({ id: 'BottomRightMenu' });\r\n document.body.appendChild(bottomRightMenu.domNode);\r\n return bottomRightMenu;\r\n }\r\n\r\n function _loadLoginPanel () {\r\n const div = document.createElement('div');\r\n document.body.appendChild(div);\r\n return Mediator.Factory.Create({\r\n name: 'LoginPage',\r\n node: div,\r\n params: { id: 'loginpage', loginInit: _LoginInit }\r\n });\r\n }\r\n\r\n function _loadResultsPanel () {\r\n return Mediator.Factory.Create({ name: 'ResultsPanel', params: null });\r\n }\r\n\r\n // For payment panel\r\n function _loadPayment () {\r\n return Mediator.Factory.Create({\r\n name: 'PaymentPanel',\r\n params: { id: 'paymentPanel' },\r\n node: document.createElement('div')\r\n });\r\n }\r\n\r\n function _loadCart () {\r\n return Mediator.Factory.Create({\r\n name: 'CartPanel',\r\n node: document.createElement('div'),\r\n params: { id: 'CartPanel' }\r\n });\r\n }\r\n\r\n function _getCurRegisteredWidgetsIds () {\r\n return dijit.registry.toArray().map(d => d.id);\r\n }\r\n});\r\n"],"sourceRoot":""}