{"version":3,"sources":["utils/localStorage/layouts.js","utils/widgets/getLayouts.js","components/wrappers/withConfig.js","components/elem/Toast.js","components/wrappers/APIRequestContext.js","components/wrappers/CurrentDashboardContext.js","utils/dateFormatting.js","utils/constants/date/dateOptions.js","components/wrappers/DateContext.js","components/wrappers/DashboardContext.js","components/elem/LoadingSpinner.js","components/elem/landing-page/DashboardLink.js","utils/user/permissions.js","components/wrappers/UserContext.js","components/elem/landing-page/particleConfig.js","components/elem/user/LogoutButton.js","components/elem/user/ManageUsersButton.js","components/elem/landing-page/AdminLink.js","components/elem/landing-page/LandingPageNav.js","components/elem/landing-page/LandingPageWrapper.js","components/features/landing-page/LandingPage.js","components/features/admin/AdminTable.js","components/features/admin/Breadcrumb.js","components/elem/admin/AdminLayout.js","components/features/admin/AdminDashboard.js","components/elem/Tooltip.js","components/elem/form/TextInput.js","components/features/admin/dashboard/CreateForm.js","components/features/admin/dashboard/CreateDashboard.js","components/features/admin/dashboard/EditForm.js","components/features/admin/dashboard/EditTable.js","components/features/admin/dashboard/EditDashboard.js","components/elem/form/Select.js","components/elem/form/Checkbox.js","components/elem/form/NumberInput.js","components/features/admin/page/CreatePageForm.js","components/features/admin/page/CreatePage.js","components/features/admin/page/EditPageForm.js","components/features/admin/page/EditPageTable.js","components/features/admin/page/EditPage.js","components/elem/Header.js","components/features/navigation/Links.js","components/features/navigation/BackButton.js","components/features/navigation/SideNav.js","components/elem/date/BarComponent.js","components/elem/LayoutEditorToggle.js","components/elem/TopBarDropdown.js","components/elem/TopBar.js","components/elem/date/DateOptions.js","components/elem/date/DateSelector.js","components/wrappers/WidgetDataContext.js","components/elem/select/Select.js","components/elem/widgets/shared/GroupBySelector.js","components/elem/widgets/shared/MaximizeButton.js","components/elem/widgets/shared/LegendButton.js","utils/constants/widgets/exportableWidgetTypes.js","utils/constants/widgets/exportTransforms.js","components/elem/widgets/shared/ExportButton.js","components/elem/widgets/NoDataComponent.js","utils/widgets/contentStyle.js","components/elem/widgets/WidgetWrapper.js","utils/numberFormatting.js","components/elem/widgets/number/Number.js","utils/valueFormatting.js","components/elem/widgets/grid/Cell.js","utils/constants/widgets/stringFields.js","components/elem/widgets/grid/Grid.js","utils/widgets/getHiddenColumns.js","utils/colors/chartPalette.js","components/wrappers/ColorContext.js","components/elem/widgets/bar/BarChart.js","components/elem/widgets/line/LineChart.js","components/elem/widgets/map/Tooltip.js","components/elem/widgets/map/mapConfig.js","components/elem/widgets/map/theme-map/styleFunctions.js","components/elem/widgets/map/theme-map/MapLegend.js","components/elem/widgets/map/theme-map/FeatureContext.js","components/elem/widgets/map/theme-map/Map.js","components/elem/widgets/map/theme-map/ThemeMap.js","components/elem/widgets/map/feature-map/styleFunctions.js","components/elem/widgets/map/feature-map/getLayers.js","components/elem/widgets/map/MapContext.js","components/elem/widgets/map/feature-map/MapLegend.js","components/elem/widgets/map/feature-map/FeatureMap.js","utils/widgets/map/3d/config.js","components/elem/widgets/map/3d-map/Shapes.js","components/elem/widgets/map/3d-map/utils.js","components/elem/widgets/map/3d-map/TooltipContext.js","components/elem/widgets/map/3d-map/Scene.js","components/elem/widgets/map/3d-map/MapLegend.js","components/elem/widgets/map/3d-map/ThreeDimensionalMap.js","components/elem/widgets/pie/PieChart.js","components/elem/widgets/form/Form.js","components/elem/widgets/scatter/CustomTooltip.js","components/elem/widgets/scatter/ScatterChart.js","components/elem/widgets/text/Text.js","components/elem/widgets/Widget.js","components/elem/widgets/Widgets.js","components/features/panel/DashboardPanel.js","components/features/admin/DeleteItem.js","components/elem/admin/SelectWidgetTypes.js","components/elem/admin/SelectDatabases.js","components/elem/form/MultiSelect.js","components/features/admin/widget/PreviewQueryTable.js","components/features/admin/widget/CreateWidgetForm.js","components/features/admin/widget/CreateWidget.js","components/features/admin/widget/EditWidgetForm.js","components/features/admin/widget/EditWidget.js","components/features/admin/widget/PageLayoutEditor.js","components/features/errors/particleConfig.js","components/features/errors/ErrorFallback.js","components/features/errors/ErrorBoundary.js","components/features/errors/PageNotFound.js","utils/constants/urls.js","components/features/user/CallbackComponent.js","components/features/user/LoginPage.js","components/features/user/RestrictedAccess.js","App.js","index.js"],"names":["getLayout","pageId","a","localForage","getItem","then","cachedLayout","json","JSON","parse","cols","lg","sm","breakpoints","widgets","Object","keys","reduce","acc","key","layout","map","widget","idx","x","X","y","Y","w","Width","h","Height","i","WidgetId","withConfig","WrappedComponent","state","config","window","$config","CONFIGURED_URLS","changePassword","REACT_APP_OIDC_CHANGE_PASSWORD_URL","newRegistration","REACT_APP_OIDC_REGISTRATION_URL","manageUsers","REACT_APP_USER_MANAGEMENT_URL","this","props","React","Component","Toast","DISPLAY_TOASTS","ToastLogic","level","message","toastConfig","className","toast","success","console","log","error","info","defaultOptions","cache","headers","CacheControl","APIRequestContext","createContext","APIRequestContextProvider","children","userManager","useAuth","authenticatedFetch","useCallback","endpoint","options","getUser","u","fetchOptions","authorizationHeader","Authorization","access_token","method","fetch","res","status","Provider","value","CurrentDashboardContext","useContext","useState","currentDashboard","setCurrentDashboard","pageLoading","setPageLoading","widgetGroups","setWidgetGroups","currentWidgetGroup","setCurrentWidgetGroup","editingLayout","setLayoutEditingState","layoutState","setLayoutState","location","useLocation","useParams","dashboardName","currentPage","pageName","detailKey","widgetId","expandedWidgetId","setExpandedWidgetId","sharedPageKey","setSharedPageKey","sharedPageId","setSharedPageId","newObject","setNewObject","API_URL","defaultDateLabel","useMemo","DefaultDateRange","useEffect","response","ok","text","Error","data","Pages","catch","e","finally","length","matchingWidgetGroup","find","widgetGroup","PageId","Number","Location","SharedKey","Widgets","dbLayout","getLayouts","userLayout","updateLayout","DashboardId","initialLayoutState","setInitialLayoutState","startLayoutEdit","saveLayoutState","setItem","stringify","saveLayout","cancelLayoutEdit","resetLayoutState","removeItem","clearLayout","dateToString","date","dayjs","format","toString","stringToDate","toDate","constructDateQueryString","minDate","maxDate","dateFrom","dateTo","Date","add","subtract","encodeURIComponent","join","extend","quarterOfYear","currentDate","lastYearEnd","startOf","lastYearStart","twoYearsAgoStart","fiveYearsAgoStart","tenYearsAgoStart","currentYearStart","quarterStart","lastQuarterStart","lastQuarterEnd","endOf","thirtyDaysAgo","ninetyDaysAgo","oneYearAgo","dateOptionsColumnOne","label","dateRangeString","dateOptionsColumnTwo","allDateOptions","DateContext","DateContextProvider","selectorVisible","toggleSelectorVisible","defaultDate","setDate","dateQueryString","setDateQueryString","dateRangeLabel","setDateRangeLabel","newDateString","DashboardContext","dashboards","setDashboards","loading","setLoading","Spinner","size","LoadingSpinner","dashboard","to","DashboardName","DashboardDescription","getRoles","RegExp","user","profile","role","roles","Array","isArray","checkRole","includes","hasAccessToAdmin","UserContext","AppUserContextProvider","loadingUser","client","setRoles","setUser","idleTime","setIdleTime","resetIdleTime","document","addEventListener","removeEventListener","checkIdleState","now","diff","signoutRedirect","interval","setInterval","clearInterval","UserContextProvider","settings","authority","REACT_APP_OIDC_AUTHORITY","client_id","REACT_APP_OIDC_CLIENT_ID","client_secret","REACT_APP_OIDC_CLIENT_SECRET","redirect_uri","REACT_APP_OIDC_CLIENT_REDIRECT_URI","silent_redirect_uri","REACT_APP_OIDC_CLIENT_SILENT_REDIRECT_URI","response_type","REACT_APP_OIDC_RESPONSE_TYPE","scope","REACT_APP_OIDC_SCOPE","post_logout_redirect_uri","REACT_APP_OIDC_POST_LOGOUT_REDIRECT_URI","automaticSilentRenew","UserManager","autoSignIn","background","backgroundMask","cover","color","opacity","enable","detectRetina","fpsLimit","infection","cure","delay","infections","stages","interactivity","detectsOn","events","onClick","mode","onDiv","elementId","onHover","parallax","force","smooth","resize","modes","bubble","distance","duration","connect","links","radius","grab","push","quantity","remove","repulse","speed","slow","factor","particles","collisions","animation","sync","blink","consent","shadow","blur","triangles","width","warp","move","attract","rotate","direction","noise","random","minimumValue","horizontal","offset","vertical","outMode","straight","trail","fillColor","vibrate","number","density","area","limit","shape","character","fill","close","font","style","weight","char","image","height","replaceColor","src","images","polygon","sides","star","type","destroy","startValue","stroke","twinkle","lines","frequency","pauseOnBlur","LogoutButton","ManageUsersButton","target","rel","href","LandingPageNav","AdminLink","LandingPageWrapper","params","particleConfig","LandingPage","zIndex","DashboardLink","Cell","name","description","pathname","dashboardProps","id","deleteProps","itemType","columns","Header","accessor","cell","row","original","tableData","useTable","getTableProps","getTableBodyProps","headerGroups","rows","prepareRow","headerGroup","getHeaderGroupProps","column","getHeaderProps","render","getRowProps","cells","getCellProps","dashRegex","match","pageRegex","widgRegex","aria-label","exact","activeClassName","textTransform","AdminLayout","title","Breadcrumb","AdminDashboard","AdminTable","Tooltip","extraClass","stayOpen","place","delayHide","effect","html","DefaultTooltip","IconTooltip","register","registerParams","onChange","helper","example","active","errors","defaultValue","data-tip","data-for","ref","closeForm","useForm","handleSubmit","createDashboard","newDashboard","body","onSubmit","replace","trim","trimData","required","maxLength","pattern","CreateDashboard","setName","setState","editing","setEditing","formClass","textClass","editDashboard","PUT","handleChange","event","ManageCell","EditTable","pages","setData","page","PageName","createColumns","initialState","pageIndex","pageSize","useSortBy","usePagination","canPreviousPage","canNextPage","pageOptions","nextPage","previousPage","getSortByToggleProps","isSorted","isSortedDesc","disabled","EditDashboard","withRouter","history","edited","setEdited","pageProps","control","initialValue","rules","placeholder","as","classNamePrefix","menuPlacement","isDisabled","Checkbox","defaultChecked","dashboardId","pageIds","unregister","setId","parentId","setParentId","visible","setVisible","hiddenClass","createPage","POST","ParentPageId","DetailKey","Seq","NumberInput","checked","Select","CreatePage","setPageId","filter","indexOf","lastIndexOf","defaultSelect","option","editPage","editedPage","Icon","ApplyDateFilter","EditPageTable","widgetProps","WidgetName","EditPage","edit","APP_TITLE","isActive","tooltipId","backTarget","Links","BackButton","DateDisplayComponent","setIsActive","aria-haspopup","aria-controls","aria-hidden","IS_PUBLIC","TopBarDropdown","LayoutEditorToggle","setMinDate","setMaxDate","DatePickerComponent","innerWidth","setWidth","selected","formattedDate","dateFormat","showYearDropdown","showMonthDropdown","yearDropdownItemNumber","scrollableYearDropdown","scrollableMonthDropdown","autoComplete","inline","popperModifiers","enabled","preventOverflow","escapeWithReference","boundariesElement","selectedDateRangeLabel","setSelectedDateRangeLabel","selectedDate","setSelectedDate","updateDateSelection","field","custom","bind","DateOptions","WidgetDataContext","widgetName","widgetType","WidgetType","GroupBy","datectx","widgetData","setWidgetData","showLegend","setShowLegend","AbortController","abortController","setAbortController","groupByOptions","split","activeGroupBy","setGroupBy","fetchWidget","abort","groupByClause","dateClause","detailKeyClause","signal","widgetIcon","getIconFromWidgetType","selectStyles","provided","minHeight","maxHeight","container","indicatorsContainer","valueContainer","padding","menu","clearIndicator","dropdownIndicator","inputProps","autoCorrect","spellCheck","styles","groupBy","currentValue","setExpandedWidget","setTimeout","expanded","top","show","setShow","transforms","item","curr","parsed","ReactHtmlParser","csvString","constructDownloadName","exportPrefix","applyDateFilter","downloadName","minDateString","maxDateString","dateString","exporting","setExporting","fetchExportPrefix","url","downloadData","parser","Parser","csvTransforms","csv","Data","ValueLabel","saveAs","Blob","exportableWidgetTypes","allowsOverflow","icon","widgetHasData","ExportButton","MaximizeButton","GroupBySelector","LegendButton","NoDataComponent","compactFormat","Intl","NumberFormat","notation","compactDisplay","longFormat","maximumFractionDigits","formatNumber","Value","getValue","transform","node","index","attribs","convertNodeToElement","formatValue","isNaN","isValid","DefaultColumnFilter","filterValue","preFilteredRows","setFilter","count","undefined","valueLabel","sharedKey","exampleRow","col","stringFields","Filter","valueColumn","parseColumns","defaultColumn","minWidth","maxWidth","useFilters","useFlexLayout","defaultHeight","disableWidth","totalCount","components","Table","TableBody","forwardRef","TableRow","fixedHeaderContent","fontSize","itemContent","getHiddenColumns","WidgetOptions","hiddenColumns","heatMap","qualitative","ColorContext","getNextColor","getColorMapArray","series","colorMap","groupName","seriesName","ColorContextProvider","setColorMap","getAssociatedColor","groupKey","matchingSeries","nullSeries","updateColorMap","groupSeries","updatedColorMap","associatedColorMap","associatedSeries","seriesWithoutColorMaps","deepEqual","CustomTooltip","payload","total","d","b","values","dataKey","percent","backgroundColor","border","whiteSpace","CustomLegend","activeIndex","setActiveIndex","hiddenState","updateHiddenState","textAlign","display","marginRight","viewBox","version","verticalAlign","textDecoration","textDecorationColor","highlight","margin","right","left","bottom","sanitizedData","getTime","uniqueGroups","Set","sort","chartData","dateEntry","setHiddenState","containerRef","useRef","current","offsetWidth","containerWidth","setContainerWidth","guessWidth","Math","min","numMonths","max","p","stacks","stackId","GroupID","RevealBarProps","Rectangle","colors","Bars","Bar","hide","isAnimationActive","ResponsiveContainer","debounce","BarChart","CartesianGrid","strokeDasharray","XAxis","domain","tickFormatter","unixTime","Label","position","YAxis","angle","content","Legend","wrapperStyle","overflowX","overflowY","alignItems","Brush","endIndex","travellerWidth","legendPayload","bold","setBold","legend","setLegend","referenceData","reference","getReferenceLineData","preparedData","groupKeys","getSeriesFromData","dataMax","entry","dataMin","Infinity","Lines","dot","strokeWidth","activeDot","r","References","ReferenceLine","LineChart","previousState","allowDataOverflow","formatter","labelFormatter","itemStyle","getTooltipPositionProps","pixel","mapWidth","bottomPixel","horizontalProps","pixelY","topDelta","bottomDelta","tooltipHeight","exceedsBottomEdge","verticalProps","feature","tooltipData","tooltipRef","featureRef","setDisplay","onmouseenter","onmouseleave","createLabel","element","tooltip","div","createElement","setAttribute","ReactDOM","zoomControls","extent","ZoomToExtent","tipLabel","displayPopup","setTooltipState","getEventPixel","originalEvent","currentTarget","scrollWidth","clientHeight","styleProps","previousFeature","get","set","forEachFeatureAtPixel","layer","prevState","getDataIntervalFromRange","range","numBins","heatMapStyles","_","Style","Fill","Stroke","defaultCountyStyle","themeMapStyleFunction","dataRange","legendData","NaN","ceil","getLegendDataFromRange","legendItem","FeatureContext","SOURCE_PROJECTION","MAP","sourceProjection","features","setFeatures","featureFilename","FeatureFiles","findIndex","getFeatureFilepathAssociatedWithGroupBy","f","GeoJSON","dataProjection","featureProjection","readFeatures","getTooltipDataFromFeature","tooltipState","INITIAL_ZOOM_LEVEL","CENTER_LAT_LNG","mapRef","setMap","popupKey","setPopupKey","setDataRange","Map","controls","interactions","defaultInteractions","mouseWheelZoom","layers","TileLayer","source","OSM","view","View","projection","center","zoom","initialExtent","getView","calculateExtent","getControls","getArray","setSize","clientWidth","updateSize","forEach","featureName","featureData","toLowerCase","colorKey","getHeatMapColorKeyFromRange","vectorSource","VectorSource","vectorLayer","VectorLayer","addLayer","on","unByKey","MapLegend","defaultStyle","strokeColor","getLegendDataFromLayers","layerFeatures","getSource","getFeatures","geometryType","getGeometry","getType","layerName","getFeatureValue","fieldName","selectedStyle","Circle","renderStyles","featureMapStyleFunction","featureType","getOrCreateRenderStyles","WKT","getMinimumLayerExtent","fit","layerExtent","getExtent","minMaxExtent","minLat","minLon","maxLat","maxLon","getLayers","styleOptions","LayerName","readFeature","s","MapContext","MapContextProvider","legendFunction","legendState","setLegendState","toggleLayerVisibility","updatedLegendState","borderRadius","FeatureMap","mapHeightRef","eventKeys","setEventKeys","selectControl","getVisible","mapBrowserEvent","coordinates","flatCoordinates","targetPixel","getPixelFromCoordinate","pixel1","tolerance","pixel2","pixel3","pixel4","point1","getCoordinateFromPixel","point2","point3","point4","Polygon","newFilterData","intersectsExtent","clear","getSelectControl","removeInteraction","eventKey","addInteraction","getSize","FeatureMapWrapper","setLayers","meshProps","rotation","PI","castShadow","meshBasicMaterialProps","side","DoubleSide","attach","transparent","depthTest","orbitControlsProps","rotateSpeed","screenSpacePanning","maxPolarAngle","scale","z","Mesh","centerPoint","shouldInteract","useFrame","isControlled","scene","userData","SceneContext","updateTooltipState","tooltipContext","geometry","featureStyles","styleData","styleObj","vertices","generateMeshFromPointCloud","geometryRef","useUpdate","setFromPoints","Meshes","onPointerEnter","eventObject","nativeEvent","offsetX","offsetY","onPointerLeave","material","Color","vectors","pt","Vector2","Shape","Top","Bottom","abs","args","steps","depth","bevelEnabled","Line","layerStyle","camera","featureStyle","sections","lastZValue","Vector3","v1","v2","subVectors","ArrowHelper","clone","normalize","addVectors","multiplyScalar","getColor","c","lineWidth","meshes","quaternion","meshGroup","gl","layerData","layerType","allCoords","totalLineStrings","centerCoords","lookAt","applyAxisAngle","ShapeComponent","getShapeComponent","parsedData","scaledCoords","planeRepresentation","delaunay","triangulate","numTriangles","TooltipContext","TooltipContextProvider","MapControls","TrackballControls","OrbitControls","ConvexGeometry","Controls","controlsRef","lightRef","compassRef","update","toArray","getAzimuthalAngle","intensity","domElement","Renderer","useThree","dispatchEvent","Event","concurrent","onCreated","setClearColor","setLayerData","stringifiedOptions","transformedData","additionalData","wellknown","pointData","allPointLayerNames","layerOptions","layerNameField","nameField","pointsToMesh","associatedData","geometryData","Type","associatedStyle","layerIdx","prepareData","alt","Scene","Consumer","resetStateField","displayState","renderActiveShape","cx","cy","innerRadius","outerRadius","startAngle","endAngle","dy","textAnchor","Sector","activeLegendIndex","toggleDisplayState","getLegendValue","fontWeight","Chart","hidden","createInitialState","setDisplayState","unique","newDisplayState","onShowLegendChange","some","resetHiddenField","displayGroups","localeCompare","PieChart","Pie","nameKey","valueKey","labelLine","activeShape","noNullData","fieldData","formattedLabel","round","Scatters","Scatter","lineType","line","ComposedChart","TextWidget","textRef","WidgetComponent","Grid","ScatterChart","ThemeMap","Form","ThreeDimensionalMap","getWidgetComponentFromWidgetType","WidgetWrapper","ResponsiveGridLayout","WidthProvider","Responsive","Widget","layouts","rowHeight","isResizable","isDraggable","onLayoutChange","allLayouts","redirect","setRedirect","widgetTypes","setWidgetTypes","widgetOptions","databases","setDatabases","databaseOptions","isMulti","DropdownIndicator","PreviewQueryTable","array","obj","k","back","dateFilter","setType","query","setQuery","string","setString","preview","setPreview","AggregateFunction","AggregateColumn","ApplyFiltersToBaseQuery","DetailKeyValue","NumRows","handleSelectChange","handleMultiChange","replaceAll","onBlur","queryString","validate","MultiSelect","previewQuery","TargetDatabase","QueryString","CreateWidget","setWidgetId","object","functionOptions","initialFunction","editWidget","editedWidget","responseText","Description","Query","setWidget","setInitialState","pageLayout","ErrorFallback","errorMessage","ErrorBoundary","hasError","errorKey","slice","PageNotFound","urls","home","userCallback","login","t","clearTimeout","LoginPage","signinRedirect","RestrictedAccess","allowedRoles","hasAccess","setHasAccess","USE_AUTHENTICATION","checkClientAccess","Fragment","path","CallbackComponent","TopBar","DateSelector","SideNav","DashboardPanel","component","StrictMode","App","getElementById"],"mappings":"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","file":"static/js/main.e50f8c8f.chunk.js","sourcesContent":["import localForage from 'localforage'\r\nconst getLayout = async (pageId) => {\r\n return localForage.getItem(`layout:${pageId}`).then((cachedLayout) => {\r\n if (cachedLayout) {\r\n const json = JSON.parse(cachedLayout)\r\n if (json) {\r\n return json\r\n }\r\n }\r\n return\r\n })\r\n}\r\n\r\nconst saveLayout = (pageId, layout) => {\r\n localForage.setItem(`layout:${pageId}`, JSON.stringify(layout))\r\n}\r\n\r\nconst clearLayout = (pageId) => {\r\n localForage.removeItem(`layout:${pageId}`)\r\n}\r\n\r\nexport { getLayout, saveLayout, clearLayout }","const cols = { lg: 12, sm: 1 }\r\nconst breakpoints = { lg: 600, sm: 0 }\r\nconst rowHeight = 150\r\nconst smallWidgetHeight = 2\r\n\r\nexport default (widgets) => {\r\n if (!widgets){\r\n return {}\r\n }\r\n const layoutKeys = Object.keys(breakpoints) // [lg, md, sm, xs, xxs]\r\n return layoutKeys.reduce((acc, key) => {\r\n const layout = widgets.map((widget, idx) => {\r\n const { X: x, Y: y, Width: w, Height: h, WidgetId: i } = widget // get the positioning data from widget\r\n if (key === 'lg') {\r\n // use the positioning data to\r\n // place widgets if we're on a large enough\r\n // screen\r\n return { i: `widget-${i}`, x, y, w, h }\r\n } else {\r\n // if we're on a small screen, just make\r\n // all widgets on a separate row\r\n return { i: `widget-${i}`, x: 0, y: idx * smallWidgetHeight, w: 1, h: smallWidgetHeight }\r\n }\r\n })\r\n return {\r\n ...acc,\r\n [key]: layout,\r\n }\r\n }, {})\r\n}\r\n\r\nexport { cols, breakpoints, rowHeight }\r\n","import React from 'react'\r\n\r\nconst defaultAPIURL = '/api/api'\r\n\r\nconst withConfig = WrappedComponent => {\r\n return class extends React.Component {\r\n state = {\r\n config: {\r\n \"API_URL\": defaultAPIURL,\r\n ...window.$config,\r\n CONFIGURED_URLS: {\r\n changePassword: `${window.$config.REACT_APP_OIDC_CHANGE_PASSWORD_URL}`,\r\n newRegistration: `${window.$config.REACT_APP_OIDC_REGISTRATION_URL}`,\r\n manageUsers: `${window.$config.REACT_APP_USER_MANAGEMENT_URL}`,\r\n }\r\n }\r\n }\r\n \r\n render() {\r\n return (\r\n \r\n )\r\n }\r\n }\r\n}\r\n\r\nexport default withConfig\r\n","import React from 'react'\r\nimport { toast, ToastContainer } from 'react-toastify'\r\n\r\nimport withConfig from '../wrappers/withConfig'\r\n\r\nconst Toast = withConfig(({config}) => {\r\n const { DISPLAY_TOASTS } = config\r\n const displayToasts = !!DISPLAY_TOASTS\r\n if (!displayToasts) {\r\n return null\r\n } else {\r\n return \r\n }\r\n})\r\n\r\nconst ToastLogic = ({ level, message}) => {\r\n const toastConfig = {\r\n className: 'toast',\r\n }\r\n switch (level) {\r\n case 'success':\r\n toast.success(message, toastConfig)\r\n console.log(`%c${message}`, 'color: green;')\r\n break;\r\n case 'error':\r\n toast.error(message, toastConfig)\r\n console.log(`%c${message}`, 'color: red;')\r\n break;\r\n case 'info':\r\n toast.info(message, toastConfig)\r\n console.log(`%c${message}`, 'color: blue;')\r\n break;\r\n default:\r\n toast.info(message, toastConfig)\r\n console.log(`%c${message}`, 'color: blue;')\r\n }\r\n}\r\n\r\nexport default ToastLogic\r\n\r\nexport { ToastLogic , Toast }\r\n","import React, { createContext, useCallback } from 'react'\r\nimport { useAuth } from 'oidc-react'\r\nimport toast from '../elem/Toast'\r\n\r\nconst defaultOptions = {\r\n cache: 'default',\r\n headers: {\r\n CacheControl: 'max-age=3600'\r\n }\r\n}\r\n\r\nconst APIRequestContext = createContext(null)\r\n\r\nconst APIRequestContextProvider = ({ children }) => {\r\n const { userManager } = useAuth()\r\n\r\n const authenticatedFetch = useCallback(async (endpoint, options) => {\r\n const u = await userManager.getUser()\r\n let fetchOptions = {}\r\n const authorizationHeader = u ? {\r\n Authorization: `Bearer ${u.access_token}`,\r\n } : {}\r\n if (options) {\r\n fetchOptions = {\r\n ...defaultOptions,\r\n ...options,\r\n headers: {\r\n ...defaultOptions.headers,\r\n ...options.headers,\r\n ...authorizationHeader\r\n },\r\n }\r\n } else {\r\n fetchOptions = {\r\n method: 'GET',\r\n ...defaultOptions,\r\n headers: {\r\n ...defaultOptions.headers,\r\n ...authorizationHeader\r\n },\r\n }\r\n }\r\n return fetch(endpoint, fetchOptions).then(res => {\r\n if (res.status === 401) {\r\n toast({\r\n level: 'error',\r\n message:\r\n 'Authentication Error: The server responded with status code 401. Please ensure the application is correctly configured for authentication via IdentityServer',\r\n })\r\n }\r\n return res\r\n })\r\n }, [userManager])\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\nexport { APIRequestContext }\r\nexport default APIRequestContextProvider\r\n","import React, { createContext, useState, useEffect, useMemo, useCallback, useContext } from 'react'\r\nimport { useLocation, useParams } from 'react-router-dom'\r\nimport { getLayout, saveLayout, clearLayout } from '../../utils/localStorage/layouts'\r\nimport getLayouts from '../../utils/widgets/getLayouts'\r\nimport toast from '../elem/Toast'\r\nimport { APIRequestContext } from './APIRequestContext'\r\nimport withConfig from './withConfig'\r\n\r\nconst CurrentDashboardContext = createContext(null)\r\n\r\nconst CurrentDashboardContextProvider = ({ config, children }) => {\r\n const { authenticatedFetch } = useContext(APIRequestContext)\r\n const [currentDashboard, setCurrentDashboard] = useState(null)\r\n const [pageLoading, setPageLoading] = useState(true)\r\n const [widgetGroups, setWidgetGroups] = useState([])\r\n const [currentWidgetGroup, setCurrentWidgetGroup] = useState({})\r\n const [editingLayout, setLayoutEditingState] = useState(false)\r\n const [layoutState, setLayoutState] = useState({})\r\n const location = useLocation()\r\n const {\r\n dashboardName,\r\n pageName: currentPage,\r\n detailKey,\r\n pageId,\r\n widgetId\r\n } = useParams()\r\n const [expandedWidgetId, setExpandedWidgetId] = useState(null)\r\n const [sharedPageKey, setSharedPageKey] = useState(null)\r\n const [sharedPageId, setSharedPageId] = useState(null)\r\n const [newObject, setNewObject] = useState(null)\r\n const { API_URL } = config // api url configured in public/config..js\r\n\r\n const defaultDateLabel = useMemo(() => currentWidgetGroup && currentWidgetGroup.DefaultDateRange ? currentWidgetGroup.DefaultDateRange : 'Last Year', [currentWidgetGroup])\r\n\r\n useEffect(() => {\r\n setPageLoading(true)\r\n authenticatedFetch(`${API_URL}/dashboard/${dashboardName}`)\r\n .then(async (response) => {\r\n if (response.ok) {\r\n return response.json()\r\n } else {\r\n const error = await response.text()\r\n throw new Error(error)\r\n }\r\n })\r\n .then((response) => {\r\n const data = response.data\r\n setCurrentDashboard(data)\r\n const { Pages: widgetGroups } = data\r\n setWidgetGroups(widgetGroups)\r\n })\r\n .catch((e) => {\r\n toast({\r\n level: 'error',\r\n message:\r\n 'Widget Groups: ' +\r\n (e.message\r\n ? e.message\r\n : 'Unable to connect to the server. Please try again later.'),\r\n })\r\n })\r\n .finally(() => setPageLoading(false))\r\n }, [API_URL, dashboardName, newObject])\r\n\r\n\r\n\r\n useEffect(() => {\r\n if (widgetGroups.length) {\r\n if (pageId) {\r\n const matchingWidgetGroup = widgetGroups.find(widgetGroup => widgetGroup.PageId === Number(pageId))\r\n setCurrentWidgetGroup(matchingWidgetGroup)\r\n } else {\r\n const location = currentPage ? `/${currentPage}` : widgetGroups[0].Location\r\n const matchingWidgetGroup = widgetGroups.find(\r\n (widgetGroup) => widgetGroup.Location === location\r\n )\r\n setCurrentWidgetGroup(matchingWidgetGroup)\r\n }\r\n }\r\n }, [location, widgetGroups, currentPage, detailKey, pageId])\r\n\r\n \r\n // update shared key (if exists) and \r\n // set shared page id to null on\r\n // when the currentWidgetGroup changes\r\n useEffect(() => {\r\n const updateLayout = async () => {\r\n setLayoutEditingState(false)\r\n if (currentWidgetGroup) {\r\n setSharedPageKey(currentWidgetGroup.SharedKey)\r\n setSharedPageId(null)\r\n }\r\n if(currentWidgetGroup && currentWidgetGroup.Widgets){\r\n const dbLayout = getLayouts(currentWidgetGroup.Widgets)\r\n const userLayout = await getLayout(currentWidgetGroup.PageId)\r\n if (userLayout) {\r\n setLayoutState(userLayout)\r\n } else {\r\n setLayoutState(dbLayout)\r\n }\r\n }\r\n }\r\n updateLayout()\r\n }, [currentWidgetGroup])\r\n\r\n useEffect(() => {\r\n if(currentDashboard && !currentDashboard.DashboardId){\r\n throw new Error(\"Dashboard Not Found\")\r\n }\r\n }, [currentDashboard, location])\r\n\r\n const [ initialLayoutState, setInitialLayoutState ] = useState(layoutState)\r\n\r\n const startLayoutEdit = useCallback(() => {\r\n setInitialLayoutState(layoutState)\r\n setLayoutEditingState(true)\r\n }, [setLayoutEditingState, setInitialLayoutState, layoutState])\r\n\r\n const saveLayoutState = useCallback(() => {\r\n const { PageId } = currentWidgetGroup\r\n setLayoutEditingState(false)\r\n saveLayout(PageId, layoutState)\r\n }, [currentWidgetGroup, layoutState])\r\n\r\n const cancelLayoutEdit = useCallback(() => {\r\n setLayoutEditingState(false)\r\n setLayoutState(initialLayoutState)\r\n }, [initialLayoutState, setLayoutState, setLayoutEditingState])\r\n\r\n const resetLayoutState = useCallback(() => {\r\n const { PageId, Widgets } = currentWidgetGroup\r\n const dbLayout = getLayouts(Widgets)\r\n clearLayout(PageId)\r\n setLayoutState(dbLayout)\r\n setLayoutEditingState(false)\r\n }, [currentWidgetGroup])\r\n \r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\nexport { CurrentDashboardContext }\r\nexport default withConfig(CurrentDashboardContextProvider)\r\n","import dayjs from 'dayjs'\r\n\r\nconst format = \"MM/DD/YYYY\"\r\nconst withMinuteFormat = \"MM/DD/YYYY HH:mm:ss\"\r\n\r\nconst dateToString = date => date ? dayjs(date).format(format).toString() : null\r\nconst stringToDate = date => date ? dayjs(date).toDate() : null\r\n\r\nconst constructDateQueryString = (minDate, maxDate) => {\r\n let dateFrom = null\r\n let dateTo = null\r\n\r\n // if both date components are null, return\r\n // an empty string\r\n if (!minDate && !maxDate) {\r\n return \"\"\r\n }\r\n\r\n // if there is a minDate and no maxDate,\r\n // just send dateFrom = minDate\r\n if (minDate && !maxDate) {\r\n dateFrom = minDate\r\n }\r\n\r\n // if there is a maxDate and no minDate,\r\n // just send dateTo = maxDate\r\n if (maxDate && !minDate) {\r\n dateTo = maxDate\r\n }\r\n\r\n if (minDate && maxDate) {\r\n dateFrom = new Date(minDate) < new Date(maxDate) ? minDate : maxDate\r\n dateTo = new Date(minDate) < new Date(maxDate) ? maxDate : minDate\r\n }\r\n\r\n // make the time to the end of the day on dateto\r\n dateTo = dayjs(maxDate).add(1, 'day').subtract(1, 'second').format(withMinuteFormat).toString()\r\n\r\n const dateFromQuery = dateFrom ? `dateFrom=${encodeURIComponent(dateFrom)}` : ''\r\n const dateToQuery = dateTo ? `dateTo=${encodeURIComponent(dateTo)}` : ''\r\n\r\n return [dateFromQuery, dateToQuery].join('&')\r\n} \r\n\r\nexport { dateToString, stringToDate, constructDateQueryString }","import dayjs from 'dayjs'\r\nimport quarterOfYear from 'dayjs/plugin/quarterOfYear'\r\nimport { dateToString } from '../../dateFormatting'\r\ndayjs.extend(quarterOfYear)\r\n\r\nconst currentDate = dateToString(dayjs().toDate())\r\nconst lastYearEnd = dateToString(dayjs().startOf('year').subtract(1, 'day').toDate())\r\nconst lastYearStart = dateToString(dayjs().startOf('year').subtract(1, 'year').toDate())\r\nconst twoYearsAgoStart = dateToString(dayjs().startOf('year').subtract(2, 'year').toDate())\r\nconst fiveYearsAgoStart = dateToString(dayjs().startOf('year').subtract(5, 'year').toDate())\r\nconst tenYearsAgoStart = dateToString(dayjs().startOf('year').subtract(10, 'year').toDate())\r\nconst currentYearStart = dateToString(dayjs().startOf('year').toDate())\r\nconst quarterStart = dateToString(dayjs().startOf('quarter').toDate())\r\nconst lastQuarterStart = dateToString(dayjs().subtract(1, 'quarter').startOf('quarter').toDate())\r\nconst lastQuarterEnd = dateToString(dayjs().subtract(1, 'quarter').endOf('quarter').toDate())\r\nconst thirtyDaysAgo = dateToString(dayjs().subtract(30, 'day').toDate())\r\nconst ninetyDaysAgo = dateToString(dayjs().subtract(90, 'day').toDate())\r\nconst oneYearAgo = dateToString(dayjs().subtract(365, 'day').toDate())\r\n\r\n\r\nconst dateOptionsColumnOne = [\r\n {\r\n minDate: lastYearStart,\r\n maxDate: lastYearEnd,\r\n label: `Last Year`,\r\n dateRangeString: `(${lastYearStart} - ${lastYearEnd})`,\r\n },\r\n {\r\n minDate: twoYearsAgoStart,\r\n maxDate: lastYearEnd,\r\n label: `Last 2 Years`,\r\n dateRangeString: `(${twoYearsAgoStart} - ${lastYearEnd})`,\r\n },\r\n {\r\n minDate: fiveYearsAgoStart,\r\n maxDate: lastYearEnd,\r\n label: `Last 5 Years`,\r\n dateRangeString: `(${fiveYearsAgoStart} - ${lastYearEnd})`,\r\n },\r\n {\r\n minDate: tenYearsAgoStart,\r\n maxDate: lastYearEnd,\r\n label: `Last 10 Years`,\r\n dateRangeString: `(${tenYearsAgoStart} - ${lastYearEnd})`,\r\n },\r\n {\r\n minDate: currentYearStart,\r\n maxDate: currentDate,\r\n label: `Year to Date`,\r\n dateRangeString: `(${currentYearStart} - ${currentDate})`,\r\n },\r\n {\r\n minDate: null,\r\n maxDate: currentDate,\r\n label: `All Time`,\r\n },\r\n]\r\n\r\nconst dateOptionsColumnTwo = [\r\n {\r\n minDate: quarterStart,\r\n maxDate: currentDate,\r\n label: `This Quarter`,\r\n dateRangeString: `(${quarterStart} - ${currentDate})`,\r\n },\r\n {\r\n minDate: lastQuarterStart,\r\n maxDate: lastQuarterEnd,\r\n label: `Last Quarter`,\r\n dateRangeString: `(${lastQuarterStart} - ${lastQuarterEnd})`,\r\n },\r\n {\r\n minDate: thirtyDaysAgo,\r\n maxDate: currentDate,\r\n label: `Last 30 Days`,\r\n dateRangeString: `(${thirtyDaysAgo} - ${currentDate})`,\r\n },\r\n {\r\n minDate: ninetyDaysAgo,\r\n maxDate: currentDate,\r\n label: `Last 90 Days`,\r\n dateRangeString: `(${ninetyDaysAgo} - ${currentDate})`,\r\n },\r\n {\r\n minDate: oneYearAgo,\r\n maxDate: currentDate,\r\n label: `Last 365 Days`,\r\n dateRangeString: `(${oneYearAgo} - ${currentDate})`,\r\n },\r\n]\r\n\r\nconst allDateOptions = [...dateOptionsColumnOne, ...dateOptionsColumnTwo]\r\n\r\nexport { allDateOptions, dateOptionsColumnOne, dateOptionsColumnTwo }","import React, { createContext, useState, useEffect, useContext, useMemo } from 'react'\r\n\r\nimport {\r\n constructDateQueryString,\r\n} from '../../utils/dateFormatting'\r\nimport { CurrentDashboardContext } from './CurrentDashboardContext'\r\nimport { allDateOptions } from '../../utils/constants/date/dateOptions'\r\n\r\nconst DateContext = createContext(null)\r\n\r\nconst DateContextProvider = ({ children }) => {\r\n const { defaultDateLabel } = useContext(CurrentDashboardContext) \r\n const [selectorVisible, toggleSelectorVisible] = useState(false)\r\n const defaultDate = useMemo(() => allDateOptions.find(x => x.label === defaultDateLabel), [defaultDateLabel])\r\n const [date, setDate] = useState({\r\n minDate: defaultDate.minDate,\r\n maxDate: defaultDate.maxDate\r\n })\r\n\r\n const [dateQueryString, setDateQueryString] = useState(\r\n constructDateQueryString(date.minDate, date.maxDate)\r\n )\r\n\r\n const [dateRangeLabel, setDateRangeLabel] = useState(defaultDateLabel) // default date range is last year\r\n\r\n // update the date + date range on updates to defaultDateLabel (coincides with page changes to non-null default date range values)\r\n useEffect(() => {\r\n setDate(defaultDate)\r\n setDateQueryString(constructDateQueryString(defaultDate.minDate, defaultDate.maxDate))\r\n }, [defaultDate])\r\n useEffect(() => setDateRangeLabel(defaultDateLabel), [defaultDateLabel])\r\n \r\n // on date changes, construct the date\r\n // query parameter clause that gets appended to\r\n // widget fetch urls\r\n useEffect(() => {\r\n const newDateString = constructDateQueryString(\r\n date.minDate,\r\n date.maxDate\r\n )\r\n setDateQueryString(newDateString)\r\n }, [date])\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\nexport { DateContext }\r\nexport default DateContextProvider\r\n","import React, { createContext, useState, useEffect, useContext } from 'react'\r\nimport { useLocation } from 'react-router-dom'\r\nimport withConfig from './withConfig'\r\nimport toast from '../elem/Toast'\r\nimport { APIRequestContext } from './APIRequestContext'\r\n\r\nconst DashboardContext = createContext(null)\r\n\r\nconst DashboardContextProvider = ({ config, children }) => {\r\n const { API_URL } = config\r\n const { authenticatedFetch } = useContext(APIRequestContext)\r\n const [dashboards, setDashboards] = useState([])\r\n const location = useLocation()\r\n const [loading, setLoading] = useState(true)\r\n\r\n useEffect(() => {\r\n setLoading(true) // set the loading to true\r\n authenticatedFetch(`${API_URL}/dashboard`)\r\n .then(async (response) => {\r\n if (response.ok) {\r\n return response.json()\r\n } else {\r\n const error = await response.text()\r\n throw new Error(error)\r\n }\r\n })\r\n .then((response) => {\r\n setDashboards(response.dashboards)\r\n })\r\n .catch((e) => {\r\n toast({\r\n level: 'error',\r\n message:\r\n 'Dashboard Landing Page:' +\r\n (e.message\r\n ? e.message\r\n : 'Unable to connect to the server'),\r\n })\r\n })\r\n .finally(() => {\r\n setLoading(false)\r\n })\r\n }, [API_URL, location])\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\nexport { DashboardContext }\r\nexport default withConfig(DashboardContextProvider)\r\n","import React from 'react'\r\nimport { IconContext } from 'react-icons'\r\nimport { FaSpinner } from 'react-icons/fa'\r\n\r\nconst Spinner = ({ size }) => {\r\n return (\r\n
\r\n \r\n \r\n \r\n
\r\n )\r\n}\r\nconst LoadingSpinner = () => \r\n\r\nexport default LoadingSpinner\r\n\r\nexport { Spinner }\r\n","import React from 'react'\r\nimport { Link } from 'react-router-dom'\r\n\r\nexport default ({dashboard}) => (\r\n
\r\n \r\n
\r\n
\r\n {dashboard.DashboardName} \r\n
\r\n
\r\n {dashboard.DashboardDescription}\r\n
\r\n
\r\n \r\n
\r\n)","const submitterRegex = new RegExp('Submitter_([A-Za-z]+)')\r\n\r\nconst getRoles = user => {\r\n if (user && user.profile && user.profile.role) {\r\n const roles = user.profile.role\r\n if (Array.isArray(roles)) {\r\n return roles.join(',')\r\n } else {\r\n return roles\r\n }\r\n } else {\r\n return ''\r\n }\r\n}\r\n\r\nconst checkRole = (role, roles) => {\r\n if (roles && role) {\r\n return roles.includes(role)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nconst getAgencyCode = (roles) => {\r\n if (roles && isSubmissionRole(roles)) {\r\n const submitterRole = roles.match(submitterRegex)\r\n if (submitterRole && submitterRole.length === 2) {\r\n return submitterRole[1]\r\n }\r\n return submitterRole\r\n } else {\r\n return null\r\n }\r\n}\r\n\r\nconst isSubmissionRole = roles => {\r\n if (roles) {\r\n return !!roles.includes('Submitter')\r\n }\r\n return false\r\n}\r\n\r\nconst isReviewerRole = roles => {\r\n if (roles) {\r\n return !!roles.includes('Form_Reviewer')\r\n }\r\n return false\r\n}\r\n\r\nconst hasPrintAccess = roles => {\r\n if (roles) {\r\n return !!roles.includes('Print')\r\n }\r\n return false\r\n}\r\n\r\n\r\nconst hasAccessToManageSampleResults = roles =>\r\n checkRole('Industry', roles) ||\r\n checkRole('DataEntry', roles) ||\r\n checkRole('Form_Reviewer', roles) ||\r\n isSubmissionRole(roles)\r\n\r\nconst hasAccessToAdmin = roles => checkRole('Administrator', roles)\r\n\r\nconst hasAccessToAgency = roles => checkRole('Agency', roles)\r\n\r\nconst hasAccessToPWS = roles => checkRole(\"PWSAccess\", roles)\r\n\r\nexport {\r\n getRoles,\r\n checkRole,\r\n hasAccessToManageSampleResults,\r\n hasAccessToAdmin,\r\n hasAccessToAgency,\r\n getAgencyCode,\r\n isReviewerRole,\r\n hasAccessToPWS,\r\n hasPrintAccess\r\n}\r\n","import React, { useEffect, createContext, useState, useCallback } from 'react'\r\nimport { AuthProvider, useAuth, UserManager } from 'oidc-react'\r\n\r\nimport { getRoles } from '../../utils/user/permissions'\r\nimport withConfig from '../wrappers/withConfig'\r\nimport dayjs from 'dayjs'\r\n// import settings from '../../utils/constants/userSettings'\r\n\r\nconst UserContext = createContext(null)\r\n\r\nconst AppUserContextProvider = withConfig(({ loadingUser, children }) => {\r\n // const { userManager: client, userData: user } = useAuth()\r\n const { userManager: client } = useAuth()\r\n const [roles, setRoles] = useState(\"\")\r\n const [ user, setUser ] = useState(null)\r\n \r\n const [idleTime, setIdleTime] = useState(dayjs().add(60, 'minute'))\r\n \r\n const resetIdleTime = () => {\r\n setIdleTime(dayjs().add(60, 'minute'))\r\n }\r\n\r\n // on app load, set the idle time onClick updater on the document\r\n useEffect(() => {\r\n document.addEventListener('click', resetIdleTime)\r\n return () => {\r\n document.removeEventListener('click', resetIdleTime)\r\n }\r\n }, [])\r\n\r\n const checkIdleState = useCallback(async () => {\r\n const now = dayjs()\r\n const idleTimeRemaining = idleTime.diff(now, 'minute')\r\n if (idleTimeRemaining < 1) {\r\n await client.signoutRedirect()\r\n }\r\n }, [user, client, idleTime])\r\n\r\n // look at the idle state and logout when idle time is less than 1 minute\r\n useEffect(() => {\r\n // check every 3 seconds\r\n const interval = setInterval(() => {\r\n checkIdleState()\r\n }, 3000)\r\n // clear the interval when the user changes or the page is refreshed\r\n return () => {\r\n clearInterval(interval)\r\n }\r\n }, [checkIdleState])\r\n\r\n // when the user changes, update roles list\r\n useEffect(() => {\r\n setRoles(getRoles(user))\r\n }, [user])\r\n\r\n useEffect(() => {\r\n const getUser = async () => {\r\n try {\r\n const u = await client.getUser()\r\n setUser(u)\r\n } catch (e) {\r\n console.log('UserContext: Error getting user -- ', e)\r\n }\r\n }\r\n if (client) {\r\n getUser()\r\n }\r\n }, [client])\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n})\r\n\r\nconst UserContextProvider = withConfig(({ config, children }) => {\r\n \r\n const settings = {\r\n authority: config.REACT_APP_OIDC_AUTHORITY,\r\n client_id: config.REACT_APP_OIDC_CLIENT_ID,\r\n client_secret: config.REACT_APP_OIDC_CLIENT_SECRET,\r\n redirect_uri: config.REACT_APP_OIDC_CLIENT_REDIRECT_URI,\r\n silent_redirect_uri: config.REACT_APP_OIDC_CLIENT_SILENT_REDIRECT_URI,\r\n response_type: config.REACT_APP_OIDC_RESPONSE_TYPE,\r\n scope: config.REACT_APP_OIDC_SCOPE,\r\n post_logout_redirect_uri: config.REACT_APP_OIDC_POST_LOGOUT_REDIRECT_URI,\r\n automaticSilentRenew: true\r\n // loadUserInfo: true\r\n }\r\n \r\n const userManager = new UserManager(settings)\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n})\r\n\r\nexport { UserContext }\r\nexport default UserContextProvider\r\n","export default {\r\n background: {},\r\n backgroundMask: {\r\n cover: {\r\n color: {\r\n value: '#fff',\r\n },\r\n opacity: 1,\r\n },\r\n enable: false,\r\n },\r\n detectRetina: true,\r\n fpsLimit: 30,\r\n infection: {\r\n cure: false,\r\n delay: 0,\r\n enable: false,\r\n infections: 0,\r\n stages: [],\r\n },\r\n interactivity: {\r\n detectsOn: 'canvas',\r\n events: {\r\n onClick: {\r\n enable: false,\r\n mode: 'push',\r\n },\r\n onDiv: {\r\n elementId: '',\r\n enable: false,\r\n mode: [],\r\n },\r\n onHover: {\r\n enable: false,\r\n mode: 'repulse',\r\n parallax: {\r\n enable: false,\r\n force: 60,\r\n smooth: 10,\r\n },\r\n },\r\n resize: true,\r\n },\r\n modes: {\r\n bubble: {\r\n distance: 400,\r\n duration: 2,\r\n opacity: 0.8,\r\n size: 40,\r\n },\r\n connect: {\r\n distance: 80,\r\n links: {\r\n opacity: 0.5,\r\n },\r\n radius: 60,\r\n },\r\n grab: {\r\n distance: 400,\r\n links: {\r\n opacity: 1,\r\n },\r\n },\r\n push: {\r\n quantity: 4,\r\n },\r\n remove: {\r\n quantity: 2,\r\n },\r\n repulse: {\r\n distance: 200,\r\n duration: 0.4,\r\n speed: 1,\r\n },\r\n slow: {\r\n factor: 3,\r\n radius: 200,\r\n },\r\n },\r\n },\r\n particles: {\r\n collisions: {\r\n enable: false,\r\n mode: 'bounce',\r\n },\r\n color: {\r\n value: 'rgb(51, 51, 51)',\r\n animation: {\r\n enable: false,\r\n speed: 1,\r\n sync: true,\r\n },\r\n },\r\n links: {\r\n blink: false,\r\n color: {\r\n value: 'rgb(51, 51, 51)',\r\n },\r\n consent: false,\r\n distance: 150,\r\n enable: true,\r\n opacity: 0.4,\r\n shadow: {\r\n blur: 5,\r\n color: {\r\n value: 'lime',\r\n },\r\n enable: false,\r\n },\r\n triangles: {\r\n enable: false,\r\n },\r\n width: 1,\r\n warp: false,\r\n },\r\n move: {\r\n attract: {\r\n enable: false,\r\n rotate: {\r\n x: 600,\r\n y: 1200,\r\n },\r\n },\r\n direction: 'none',\r\n enable: true,\r\n noise: {\r\n delay: {\r\n random: {\r\n enable: false,\r\n minimumValue: 0,\r\n },\r\n value: 0,\r\n },\r\n enable: false,\r\n factor: {\r\n horizontal: {\r\n value: 50,\r\n offset: 0,\r\n },\r\n vertical: {\r\n value: 10,\r\n offset: 40000,\r\n },\r\n },\r\n },\r\n outMode: 'out',\r\n random: false,\r\n speed: 2,\r\n straight: false,\r\n trail: {\r\n enable: false,\r\n length: 10,\r\n fillColor: {\r\n value: '#000000',\r\n },\r\n },\r\n vibrate: false,\r\n warp: false,\r\n },\r\n number: {\r\n density: {\r\n enable: true,\r\n area: 800,\r\n factor: 1000,\r\n },\r\n limit: 0,\r\n value: 80,\r\n },\r\n opacity: {\r\n animation: {\r\n enable: false,\r\n minimumValue: 0.1,\r\n speed: 1,\r\n sync: false,\r\n },\r\n random: {\r\n enable: false,\r\n minimumValue: 1,\r\n },\r\n value: 0.5,\r\n },\r\n rotate: {\r\n animation: {\r\n enable: false,\r\n speed: 0,\r\n sync: false,\r\n },\r\n direction: 'clockwise',\r\n random: false,\r\n value: 0,\r\n },\r\n shadow: {\r\n blur: 0,\r\n color: {\r\n value: '#000000',\r\n },\r\n enable: false,\r\n offset: {\r\n x: 0,\r\n y: 0,\r\n },\r\n },\r\n shape: {\r\n options: {\r\n character: {\r\n fill: true,\r\n close: true,\r\n font: 'Verdana',\r\n style: '',\r\n value: '*',\r\n weight: '400',\r\n },\r\n char: {\r\n fill: true,\r\n close: true,\r\n font: 'Verdana',\r\n style: '',\r\n value: '*',\r\n weight: '400',\r\n },\r\n image: {\r\n fill: true,\r\n close: true,\r\n height: 100,\r\n replaceColor: false,\r\n src:\r\n 'https://cdn.matteobruni.it/images/particles/github.svg',\r\n width: 100,\r\n },\r\n images: {\r\n fill: true,\r\n close: true,\r\n height: 100,\r\n replaceColor: false,\r\n src:\r\n 'https://cdn.matteobruni.it/images/particles/github.svg',\r\n width: 100,\r\n },\r\n polygon: {\r\n fill: true,\r\n close: true,\r\n sides: 5,\r\n },\r\n star: {\r\n fill: true,\r\n close: true,\r\n sides: 5,\r\n },\r\n },\r\n type: 'circle',\r\n },\r\n size: {\r\n animation: {\r\n destroy: 'none',\r\n enable: false,\r\n minimumValue: 0.1,\r\n speed: 40,\r\n startValue: 'max',\r\n sync: false,\r\n },\r\n random: {\r\n enable: true,\r\n minimumValue: 1,\r\n },\r\n value: 5,\r\n },\r\n stroke: {\r\n color: {\r\n value: '#000000',\r\n },\r\n width: 0,\r\n opacity: 1,\r\n },\r\n twinkle: {\r\n lines: {\r\n enable: false,\r\n frequency: 0.05,\r\n opacity: 1,\r\n },\r\n particles: {\r\n enable: false,\r\n frequency: 0.05,\r\n opacity: 1,\r\n },\r\n },\r\n },\r\n pauseOnBlur: true,\r\n}\r\n","import React, { useContext } from 'react'\r\nimport { UserContext } from '../../wrappers/UserContext'\r\n\r\nconst LogoutButton = () => {\r\n const { client } = useContext(UserContext)\r\n return (\r\n
\r\n Logout\r\n
\r\n )\r\n}\r\n\r\nexport default LogoutButton","import React from 'react'\r\nimport withConfig from '../../wrappers/withConfig'\r\n\r\nconst ManageUsersButton = withConfig(({config}) => {\r\n const { CONFIGURED_URLS } = config\r\n return (\r\n
\r\n \r\n Manage Users\r\n \r\n
\r\n )\r\n})\r\n\r\nexport default ManageUsersButton","import React from 'react'\r\nimport { FaCogs } from 'react-icons/fa'\r\nimport { Link } from 'react-router-dom'\r\n\r\nexport default () => {\r\n return (\r\n
\r\n \r\n \r\n \r\n
\r\n )\r\n}\r\n","import React, { useContext } from 'react'\r\nimport { hasAccessToAdmin } from '../../../utils/user/permissions'\r\nimport { UserContext } from '../../wrappers/UserContext'\r\nimport LogoutButton from '../user/LogoutButton'\r\nimport ManageUsersButton from '../user/ManageUsersButton'\r\nimport AdminLink from './AdminLink'\r\n\r\nconst LandingPageNav = () => {\r\n const { roles } = useContext(UserContext)\r\n return (\r\n
\r\n
\r\n {hasAccessToAdmin(roles) ? (\r\n
\r\n \r\n
\r\n ) : null}\r\n {hasAccessToAdmin(roles) ? (\r\n
\r\n \r\n
\r\n ) : null}\r\n
\r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default LandingPageNav\r\n","import React, { useContext } from 'react'\r\nimport Particles from 'react-particles-js'\r\nimport { UserContext } from '../../wrappers/UserContext'\r\nimport particleConfig from './particleConfig'\r\nimport LandingPageNav from './LandingPageNav'\r\n\r\nconst LandingPageWrapper = ({children}) => {\r\n const { user } = useContext(UserContext)\r\n return (\r\n <>\r\n \r\n {user && }\r\n
\r\n
\r\n
\r\n
\r\n Director Dashboard\r\n
\r\n
\r\n
\r\n {children}\r\n
\r\n
\r\n
\r\n \r\n )\r\n}\r\n\r\nexport default LandingPageWrapper\r\n","import React, { useContext } from 'react'\r\nimport { DashboardContext } from '../../wrappers/DashboardContext'\r\nimport LoadingSpinner from '../../elem/LoadingSpinner'\r\nimport DashboardLink from '../../elem/landing-page/DashboardLink'\r\nimport LandingPageWrapper from '../../elem/landing-page/LandingPageWrapper'\r\n\r\nconst LandingPage = () => {\r\n const { loading, dashboards } = useContext(DashboardContext)\r\n\r\n if (loading || !dashboards) {\r\n return \r\n }\r\n\r\n return (\r\n \r\n
\r\n My Dashboards:\r\n
\r\n
\r\n {dashboards.map((dashboard, idx) => {\r\n return \r\n })}\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default LandingPage\r\n","import React, { useContext, useMemo } from 'react'\r\nimport { useTable } from 'react-table'\r\nimport LoadingSpinner from '../../elem/LoadingSpinner'\r\nimport { FaEdit, FaTrashAlt } from 'react-icons/fa'\r\nimport { Link } from 'react-router-dom'\r\nimport { DashboardContext } from '../../wrappers/DashboardContext'\r\n\r\nconst Cell = ({ value, name, description }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst createColumns = () => [\r\n { Header: 'Dashboard Name', accessor: 'DashboardName', Cell: ({cell, row}) => (\r\n \r\n {row.original.DashboardName}\r\n \r\n )},\r\n { Header: 'Description', accessor: 'DashboardDescription' },\r\n {\r\n Header: 'Manage',\r\n accessor: 'DashboardId',\r\n Cell: ({ cell, row }) => (\r\n \r\n ),\r\n },\r\n]\r\n\r\nexport default () => {\r\n const { loading, dashboards } = useContext(DashboardContext)\r\n const data = dashboards ? dashboards : null\r\n\r\n if (loading || !dashboards) {\r\n return \r\n }\r\n\r\n const columns = useMemo(() => createColumns(), [])\r\n\r\n const tableData = useMemo(() => data, [data])\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups,\r\n rows,\r\n prepareRow,\r\n } = useTable({ columns, data: tableData })\r\n\r\n return (\r\n
\r\n \r\n \r\n {headerGroups.map((headerGroup) => (\r\n \r\n {headerGroup.headers.map((column) => (\r\n \r\n {column.render('Header')}\r\n \r\n ))}\r\n \r\n ))}\r\n \r\n \r\n {rows.map((row) => {\r\n prepareRow(row)\r\n return (\r\n \r\n {row.cells.map((cell) => {\r\n return (\r\n \r\n {cell.render('Cell')}\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 React from 'react'\r\nimport { NavLink, useLocation } from 'react-router-dom'\r\n\r\nexport default () => {\r\n const location = useLocation()\r\n const dashRegex = location.pathname.match(/dashboard\\/([\\w\\s-]*)\\/?/)\r\n const pageRegex = location.pathname.match(/page\\/([\\w\\s-]*)\\/?/)\r\n const widgRegex = location.pathname.match(/widget\\/([\\w\\s-]*)\\/?/)\r\n\r\n const dashboardName = dashRegex && dashRegex[1] ? dashRegex[1] : null\r\n const pageId = pageRegex && pageRegex[1] ? pageRegex[1] : null\r\n const widgetId = widgRegex && widgRegex[1] ? widgRegex[1] : null\r\n\r\n return (\r\n \r\n )\r\n}\r\n","import React from 'react'\r\nimport Breadcrumb from '../../features/admin/Breadcrumb'\r\n\r\nconst AdminLayout = ({ title, children }) => (\r\n
\r\n \r\n
\r\n

{title}

\r\n
\r\n
{children}
\r\n
\r\n)\r\nexport default AdminLayout","import React from 'react'\r\nimport AdminTable from './AdminTable'\r\nimport { Link } from 'react-router-dom'\r\nimport { FaPlus } from 'react-icons/fa'\r\nimport AdminLayout from '../../elem/admin/AdminLayout'\r\nconst AdminDashboard = () => {\r\n return (\r\n <>\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n \r\n )\r\n}\r\n\r\nexport default AdminDashboard\r\n","import React from 'react'\r\nimport ReactTooltip from 'react-tooltip'\r\n\r\nconst Tooltip = ({id, extraClass, stayOpen, place }) => {\r\n return \r\n}\r\n\r\nconst DefaultTooltip = ({id, className, place}) => (\r\n \r\n)\r\n\r\nconst IconTooltip = ({id, place}) => (\r\n \r\n)\r\n\r\nexport default DefaultTooltip\r\n\r\nexport { DefaultTooltip, IconTooltip, Tooltip }","import React from 'react'\r\nimport { FaInfoCircle } from 'react-icons/fa'\r\nimport { DefaultTooltip as Tooltip } from '../Tooltip'\r\n\r\nexport default ({\r\n label,\r\n name,\r\n register,\r\n registerParams,\r\n onChange,\r\n helper,\r\n example,\r\n value,\r\n active,\r\n errors,\r\n defaultValue,\r\n className,\r\n}) => {\r\n const text = !value ? defaultValue : value\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {active !== false && helper && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n {active === false ? (\r\n

{text}

\r\n ) : (\r\n \r\n )}\r\n
\r\n \r\n
\r\n
\r\n
\r\n\r\n

\r\n {errors[name] ? errors[name].message : null}\r\n {errors[name] && errors[name].type === 'validate'\r\n ? 'Must be valid JSON'\r\n : null}\r\n

\r\n
\r\n )\r\n}\r\n","import React, { useContext } from 'react'\r\nimport toast from '../../../elem/Toast'\r\nimport Input from '../../../elem/form/TextInput'\r\nimport { useForm } from 'react-hook-form'\r\nimport withConfig from '../../../wrappers/withConfig'\r\nimport { APIRequestContext } from '../../../wrappers/APIRequestContext'\r\n\r\nconst CreateForm = ({ config, closeForm }) => {\r\n const { authenticatedFetch } = useContext(APIRequestContext)\r\n const { register, handleSubmit, errors } = useForm()\r\n const { API_URL } = config\r\n\r\n const POST = (newDashboard) => {\r\n return {\r\n method: 'POST',\r\n mode: 'cors',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Access-Control-Allow-Origin': '*',\r\n 'Access-Control-Allow-Headers':\r\n 'Access-Control-Allow-Origin, X-Requested-With, Content-Type, Accept',\r\n },\r\n body: JSON.stringify(newDashboard),\r\n }\r\n }\r\n\r\n const createDashboard = (dashboard) => {\r\n authenticatedFetch(`${API_URL}/admin/dashboard/create`, POST(dashboard))\r\n .then(async (response) => {\r\n if (response.ok) {\r\n return response.json()\r\n } else {\r\n const error = await response.text()\r\n throw new Error(error)\r\n }\r\n })\r\n .catch((e) => {\r\n toast({\r\n level: 'error',\r\n message:\r\n 'Create Dashboard:' +\r\n (e.message ? e.message : 'Dashboard create failed'),\r\n })\r\n })\r\n .finally(() => {\r\n closeForm(dashboard.DashboardName)\r\n })\r\n }\r\n\r\n const trimData = (data) => {\r\n Object.keys(data).map((key) => typeof data[key] === \"string\" ? data[key] = data[key].replace(/\\s\\s+/g, ' ').trim() : data[key])\r\n return data\r\n }\r\n\r\n\r\n const onSubmit = (data) => {\r\n createDashboard(trimData(data))\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default withConfig(CreateForm)\r\n","import React, { useState } from 'react'\r\nimport CreateForm from './CreateForm'\r\nimport { Redirect } from 'react-router-dom'\r\nimport AdminLayout from '../../../elem/admin/AdminLayout'\r\n\r\nconst CreateDashboard = () => {\r\n const [name, setName] = useState(null) \r\n \r\n const closeForm = (name) => {\r\n setName(name)\r\n }\r\n\r\n if (name) {\r\n return (\r\n \r\n )\r\n }\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default CreateDashboard\r\n","import React, { useState, useEffect, useContext } from 'react'\r\nimport toast from '../../../elem/Toast'\r\nimport { useForm } from 'react-hook-form'\r\nimport { FaEdit, FaCheckCircle, FaTimesCircle } from 'react-icons/fa'\r\nimport Input from '../../../elem/form/TextInput'\r\nimport withConfig from '../../../wrappers/withConfig'\r\nimport { APIRequestContext } from '../../../wrappers/APIRequestContext'\r\n\r\nconst EditForm = ({ config, dashboard, closeForm }) => {\r\n const [state, setState] = useState(dashboard)\r\n const { authenticatedFetch } = useContext(APIRequestContext)\r\n const { register, handleSubmit, errors } = useForm()\r\n const [editing, setEditing] = useState(false)\r\n const formClass = editing ? 'button is-info is-small' : 'hidden'\r\n const textClass = editing ? 'hidden' : 'button is-info is-small'\r\n const { API_URL } = config\r\n\r\n useEffect(() => {\r\n setState(dashboard)\r\n }, [dashboard]) \r\n\r\n\r\n const PUT = (dashboard) => {\r\n return {\r\n method: 'PUT',\r\n mode: 'cors',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Access-Control-Allow-Origin': '*',\r\n 'Access-Control-Allow-Headers':\r\n 'Access-Control-Allow-Origin, X-Requested-With, Content-Type, Accept',\r\n },\r\n body: JSON.stringify(dashboard),\r\n }\r\n }\r\n\r\n const editDashboard = (dashboard) => {\r\n\r\n authenticatedFetch(\r\n `${API_URL}/admin/dashboard/edit/${dashboard.DashboardId}`,\r\n PUT(dashboard)\r\n )\r\n .then(async (response) => {\r\n if (response.ok) {\r\n return \r\n } else {\r\n const error = await response.text()\r\n throw new Error(error)\r\n }\r\n })\r\n .catch((e) => {\r\n toast({\r\n level: 'error',\r\n message:\r\n 'Edit Dashboard:' +\r\n (e.message ? e.message : 'Dashboard edit failed'),\r\n })\r\n })\r\n .finally(() => {\r\n setState(dashboard)\r\n closeForm(dashboard.DashboardName)\r\n setEditing(false)\r\n })\r\n }\r\n\r\n const handleChange = (event) => {\r\n setState({\r\n ...state,\r\n [event.target.name]: event.target.value,\r\n })\r\n }\r\n const handleClick = () => {\r\n setState(dashboard)\r\n setEditing(false)\r\n }\r\n\r\n const trimData = (data) => {\r\n Object.keys(data).map((key) => typeof data[key] === \"string\" ? data[key] = data[key].replace(/\\s\\s+/g, ' ').trim() : data[key])\r\n return data\r\n }\r\n \r\n const onSubmit = (data) => {\r\n editDashboard({...dashboard, ...trimData(data)})\r\n }\r\n\r\n return (\r\n <>\r\n
\r\n
\r\n setEditing(true)}\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}\r\n\r\nexport default withConfig(EditForm)\r\n","import React, { useMemo, useEffect, useState } from 'react'\r\nimport { useTable, useSortBy, usePagination } from 'react-table'\r\nimport { FaEdit, FaTrashAlt, FaAngleUp, FaAngleDown } from 'react-icons/fa'\r\nimport { Link } from 'react-router-dom'\r\n\r\n\r\nconst ManageCell = ({ value, dashboardName, name }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst createColumns = (name) => [\r\n { Header: 'Page Id', accessor: 'PageId' },\r\n { Header: 'Page Name', accessor: 'PageName' },\r\n { Header: 'URL', accessor: 'Location' },\r\n {\r\n Header: 'Number of Widgets',\r\n accessor: 'Widgets'\r\n },\r\n {\r\n Header: 'Manage',\r\n accessor: 'PageId',\r\n id: '5',\r\n Cell: ({ cell, row }) => (\r\n \r\n ),\r\n },\r\n]\r\n\r\nconst EditTable = ({ pages, name }) => {\r\n\r\n const [data, setData] = useState([])\r\n\r\n useEffect(() => { \r\n name ? setData(pages.map((page) => ({...page, DashboardName: name}))) : setData(pages)\r\n }, [name, pages]) \r\n\r\n const columns = useMemo(() => createColumns(name), [name])\r\n const tableData = useMemo(() => data, [data])\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups,\r\n prepareRow,\r\n page,\r\n canPreviousPage,\r\n canNextPage,\r\n pageOptions,\r\n nextPage,\r\n previousPage,\r\n state: { pageIndex },\r\n } = useTable(\r\n {\r\n columns,\r\n data: tableData,\r\n initialState: { pageIndex: 0, pageSize: 5 },\r\n },\r\n useSortBy,\r\n usePagination\r\n )\r\n\r\n return (\r\n
\r\n

Dashboard Pages

\r\n \r\n \r\n {headerGroups.map((headerGroup) => (\r\n \r\n {headerGroup.headers.map((column) => (\r\n \r\n {column.render('Header')}\r\n \r\n {column.isSorted\r\n ? column.isSortedDesc\r\n ? \r\n : \r\n : ''}\r\n \r\n \r\n ))}\r\n \r\n ))}\r\n \r\n \r\n {page.map((row, i) => {\r\n prepareRow(row)\r\n return (\r\n \r\n {row.cells.map((cell) => {\r\n return (\r\n \r\n {cell.render('Cell')}\r\n \r\n )\r\n })}\r\n \r\n )\r\n })}\r\n \r\n \r\n
\r\n previousPage()}\r\n disabled={!canPreviousPage}\r\n >\r\n {'<'}\r\n {' '}\r\n \r\n Page{' '}\r\n \r\n {pageIndex + 1} of {pageOptions.length}\r\n {' '}\r\n \r\n {' '}\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default EditTable\r\n","import React, { useContext, useEffect, useState } from 'react'\r\nimport EditForm from './EditForm'\r\nimport EditTable from './EditTable'\r\nimport { Link, withRouter } from 'react-router-dom'\r\nimport { FaPlus } from 'react-icons/fa'\r\nimport { CurrentDashboardContext } from '../../../wrappers/CurrentDashboardContext'\r\nimport AdminLayout from '../../../elem/admin/AdminLayout'\r\n\r\nconst EditDashboard = withRouter(({ history }) => {\r\n const { widgetGroups, currentDashboard, setNewObject } = useContext(\r\n CurrentDashboardContext\r\n )\r\n const [edited, setEdited] = useState(null)\r\n\r\n useEffect(() => {\r\n if (history && edited) {\r\n history.replace(`/admin/dashboard/${edited}`)\r\n setEdited(false)\r\n }\r\n }, [edited, history])\r\n\r\n const closeForm = (name) => {\r\n setEdited(name)\r\n setNewObject(name)\r\n }\r\n\r\n if (!currentDashboard) {\r\n return null\r\n }\r\n\r\n const pages = widgetGroups.map((page)=> ({...page, Widgets: page.Widgets.length}))\r\n\r\n return (\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\nexport default EditDashboard\r\n","import React from 'react'\r\nimport ReactSelect from 'react-select'\r\nimport { Controller } from 'react-hook-form'\r\nimport { FaInfoCircle } from 'react-icons/fa'\r\nimport { DefaultTooltip as Tooltip } from '../Tooltip'\r\n\r\nexport default ({\r\n options,\r\n onChange,\r\n control,\r\n initialValue,\r\n name,\r\n disabled,\r\n label,\r\n helper,\r\n rules,\r\n errors,\r\n className,\r\n placeholder,\r\n value,\r\n}) => {\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {helper && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n \r\n }\r\n name={name}\r\n control={control}\r\n defaultValue={\r\n initialValue ? initialValue : null\r\n }\r\n key={`my_unique_select_key__${JSON.stringify(\r\n value\r\n )}`}\r\n value={value}\r\n rules={rules}\r\n onChange={onChange}\r\n />\r\n \r\n
\r\n
\r\n
\r\n
\r\n
\r\n

\r\n {errors && errors[name] ? errors[name].message : null}\r\n

\r\n
\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\nimport { FaInfoCircle } from 'react-icons/fa'\r\nimport { DefaultTooltip as Tooltip } from '../Tooltip'\r\n\r\nconst Checkbox = ({\r\n name,\r\n label,\r\n onChange,\r\n helper,\r\n example,\r\n defaultChecked,\r\n disabled,\r\n register,\r\n className,\r\n}) => {\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n
\r\n {helper && (\r\n ${example ? `
${example}` : ''}`}\r\n data-for={name}\r\n className=\"icon is-size-7 is-left\"\r\n >\r\n \r\n \r\n \r\n )}\r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default Checkbox\r\n","import React from 'react'\r\nimport { FaInfoCircle } from 'react-icons/fa'\r\nimport { DefaultTooltip as Tooltip } from '../Tooltip'\r\n\r\nexport default ({\r\n label,\r\n name,\r\n register,\r\n registerParams,\r\n onChange,\r\n helper,\r\n example,\r\n value,\r\n active,\r\n errors,\r\n defaultValue,\r\n className,\r\n}) => {\r\n const text = !value ? defaultValue : value\r\n\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {active === false ? (\r\n

{text}

\r\n ) : (\r\n \r\n )}\r\n
\r\n
\r\n
\r\n\r\n

\r\n {errors && errors[name] ? errors[name].message : null}\r\n

\r\n
\r\n )\r\n}","import React, { useState, useEffect, useContext } from 'react'\r\nimport toast from '../../../elem/Toast'\r\nimport { useForm } from 'react-hook-form'\r\nimport Select from '../../../elem/form/Select'\r\nimport Input from '../../../elem/form/TextInput'\r\nimport Checkbox from '../../../elem/form/Checkbox'\r\nimport NumberInput from '../../../elem/form/NumberInput'\r\nimport withConfig from '../../../wrappers/withConfig'\r\nimport { APIRequestContext } from '../../../wrappers/APIRequestContext'\r\n\r\nconst CreatePageForm = ({ config, closeForm, dashboardId, pageIds }) => {\r\n const { authenticatedFetch } = useContext(APIRequestContext)\r\n const { register, handleSubmit, control, errors, unregister } = useForm()\r\n const {API_URL} = config\r\n const [id, setId] = useState(null)\r\n const [parentId, setParentId] = useState(null)\r\n const [visible, setVisible] = useState(false)\r\n const hiddenClass = visible ? null : 'hidden'\r\n const options = pageIds.map((x) => ({ label: x.name, value: x.id }))\r\n \r\n if (id) {\r\n closeForm(id)\r\n }\r\n \r\n useEffect(() => {\r\n if(!visible) {\r\n unregister([\"ParentPageId\", \"SharedKey\", \"DetailKey\"]) \r\n }\r\n }, [visible, unregister])\r\n \r\n const POST = (page) => {\r\n return {\r\n method: 'POST',\r\n mode: 'cors',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Access-Control-Allow-Origin': '*',\r\n 'Access-Control-Allow-Headers':\r\n 'Access-Control-Allow-Origin, X-Requested-With, Content-Type, Accept',\r\n },\r\n body: JSON.stringify(page),\r\n }\r\n }\r\n \r\n const createPage = (page) => {\r\n \r\n authenticatedFetch(`${API_URL}/admin/page/create`, POST(page))\r\n .then(async (response) => {\r\n if (response.ok) {\r\n return response.json()\r\n } else {\r\n const error = await response.text()\r\n throw new Error(error)\r\n }\r\n })\r\n .then((response) => {\r\n setId(response)\r\n })\r\n .catch((e) => {\r\n toast({\r\n level: 'error',\r\n message:\r\n 'Create Page:' +\r\n (e.message ? e.message : 'Page create failed'),\r\n })\r\n })\r\n }\r\n\r\n const handleSelectChange = (event) => {\r\n setParentId(event[0].value)\r\n return event\r\n }\r\n \r\n\r\n const trimData = (data) => {\r\n Object.keys(data).map((key) => typeof data[key] === \"string\" ? data[key] = data[key].replace(/\\s\\s+/g, ' ').trim() : data[key])\r\n return data\r\n }\r\n\r\n const onSubmit = (data) => {\r\n !visible ? delete data.ParentPageId && delete data.SharedKey && delete data.DetailKey: data.ParentPageId = data.ParentPageId.value\r\n createPage({ ...trimData(data), DashboardId: dashboardId, Seq: Number(data.Seq), ParentPageId: parentId })\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n solid font awesome icon`}\r\n example=\"address-book\"\r\n />\r\n \r\n setVisible(event.target.checked)}\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\nexport default withConfig(CreatePageForm)\r\n","import React, { useState, useContext } from 'react'\r\nimport CreatePageForm from './CreatePageForm'\r\nimport { Redirect } from 'react-router-dom'\r\nimport AdminLayout from '../../../elem/admin/AdminLayout'\r\nimport {CurrentDashboardContext} from '../../../wrappers/CurrentDashboardContext'\r\n\r\nconst CreatePage = () => {\r\n const { widgetGroups, currentDashboard, setNewObject } = useContext(CurrentDashboardContext)\r\n const [pageId, setPageId] = useState(null)\r\n\r\n if (!currentDashboard) {\r\n return null\r\n }\r\n const pages = widgetGroups\r\n .filter(\r\n (widget) =>\r\n widgetGroups.indexOf(widget.PageId) === widgetGroups.lastIndexOf(widget.PageId)\r\n )\r\n .map((widget) => ({\r\n name: widget.PageName,\r\n id: widget.PageId,\r\n }))\r\n \r\n const closeForm = (response) => {\r\n setPageId(response)\r\n }\r\n \r\n if (pageId) {\r\n setNewObject(pageId)\r\n return (\r\n \r\n )\r\n }\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default CreatePage\r\n","import React, { useState, useEffect, useContext } from 'react'\r\nimport toast from '../../../elem/Toast'\r\nimport { useForm } from 'react-hook-form'\r\nimport { FaEdit, FaCheckCircle, FaTimesCircle } from 'react-icons/fa'\r\nimport Input from '../../../elem/form/TextInput'\r\nimport Checkbox from '../../../elem/form/Checkbox'\r\nimport Select from '../../../elem/form/Select'\r\nimport NumberInput from '../../../elem/form/NumberInput'\r\nimport withConfig from '../../../wrappers/withConfig'\r\nimport { APIRequestContext } from '../../../wrappers/APIRequestContext'\r\n\r\nconst EditPageForm = ({ config, page, pages, closeForm }) => {\r\n const { authenticatedFetch } = useContext(APIRequestContext)\r\n const { register, handleSubmit, control, errors, unregister } = useForm()\r\n const [editing, setEditing] = useState(false)\r\n const [state, setState] = useState(page)\r\n const options = pages.map((x) => ({ label: x.name, value: x.id }))\r\n const defaultSelect = options.filter(\r\n (option) => option.value === state.ParentPageId\r\n )[0]\r\n const [parentId, setParentId] = useState(null)\r\n const [visible, setVisible] = useState(page.ParentPageId)\r\n const hiddenClass = visible ? null : 'hidden'\r\n const { API_URL } = config\r\n\r\n useEffect(() => {\r\n if (!visible) {\r\n unregister(['ParentPageId', 'SharedKey', 'DetailKey'])\r\n }\r\n }, [visible, unregister])\r\n\r\n const PUT = (page) => {\r\n return {\r\n method: 'PUT',\r\n mode: 'cors',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Access-Control-Allow-Origin': '*',\r\n 'Access-Control-Allow-Headers':\r\n 'Access-Control-Allow-Origin, X-Requested-With, Content-Type, Accept',\r\n },\r\n body: JSON.stringify(page),\r\n }\r\n }\r\n\r\n const editPage = (editedPage) => {\r\n authenticatedFetch(\r\n `${API_URL}/admin/page/edit/${editedPage.PageId}`,\r\n PUT(editedPage)\r\n )\r\n .then(async (response) => {\r\n if (response.ok) {\r\n return\r\n } else {\r\n const error = await response.text()\r\n throw new Error(error)\r\n }\r\n })\r\n .catch((e) => {\r\n toast({\r\n level: 'error',\r\n message:\r\n 'Edit Dashboard:' +\r\n (e.message ? e.message : 'Dashboard edit failed'),\r\n })\r\n })\r\n .then(() => {\r\n setEditing(false)\r\n setState(editedPage)\r\n closeForm(editedPage)\r\n })\r\n }\r\n\r\n const handleChange = (event) => {\r\n setState({\r\n ...state,\r\n [event.target.name]: event.target.value,\r\n })\r\n }\r\n\r\n const handleSelectChange = (event) => {\r\n setParentId(event[0].value)\r\n return event\r\n }\r\n const handleClick = () => {\r\n setState(page)\r\n setEditing(false)\r\n }\r\n\r\n const trimData = (data) => {\r\n Object.keys(data).map((key) =>\r\n typeof data[key] === 'string'\r\n ? (data[key] = data[key].replace(/\\s\\s+/g, ' ').trim())\r\n : data[key]\r\n )\r\n return data\r\n }\r\n\r\n const onSubmit = (data) => {\r\n !visible\r\n ? delete data.ParentPageId && delete data.SharedKey && (data.DetailKey = \"\")\r\n : (data.ParentPageId = parentId)\r\n\r\n editPage({\r\n ...trimData(data),\r\n PageId: page.PageId,\r\n Seq: Number(data.Seq),\r\n })\r\n }\r\n\r\n let formClass = editing ? 'button is-info is-small' : 'hidden'\r\n let textClass = editing ? 'hidden' : 'button is-info is-small'\r\n\r\n return (\r\n
\r\n
\r\n setEditing(true)}\r\n className={textClass}\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 setVisible(event.target.checked)}\r\n disabled={!editing}\r\n defaultChecked={state.ParentPageId}\r\n />\r\n
\r\n \r\n
\r\n {errors.ParentPageId\r\n ? errors.ParentPageId.message\r\n : null}\r\n
\r\n \r\n \r\n
\r\n \r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default withConfig(EditPageForm)\r\n","import React, { useMemo } from 'react'\r\nimport { useTable, useSortBy, usePagination } from 'react-table'\r\nimport { Link } from 'react-router-dom'\r\nimport { FaEdit, FaTrashAlt, FaAngleUp, FaAngleDown } from 'react-icons/fa'\r\n\r\n\r\nconst EditPageTable = ({ widgets }) => {\r\n\r\n const ManageCell = ({ value, pageId, name, dashboardName }) => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n }\r\n const createColumns = () => [\r\n { Header: 'Widget Id', accessor: 'WidgetId' },\r\n { Header: 'Widget Name', accessor: 'WidgetName' },\r\n { Header: 'Widget Type', accessor: 'WidgetType' },\r\n {\r\n Header: 'Manage',\r\n accessor: 'WidgetId',\r\n id: '5',\r\n Cell: ({ cell, row }) => (\r\n \r\n ),\r\n },\r\n ]\r\n\r\n const data = widgets\r\n const columns = useMemo(() => createColumns(), [])\r\n const tableData = useMemo(() => data, [data])\r\n\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups,\r\n prepareRow,\r\n page,\r\n canPreviousPage,\r\n canNextPage,\r\n pageOptions,\r\n nextPage,\r\n previousPage,\r\n state: { pageIndex },\r\n } = useTable(\r\n {\r\n columns,\r\n data: tableData,\r\n initialState: { pageIndex: 0, pageSize: 5 },\r\n },\r\n useSortBy,\r\n usePagination\r\n )\r\n\r\n return (\r\n
\r\n

Page Widgets

\r\n \r\n \r\n {headerGroups.map((headerGroup) => (\r\n \r\n {headerGroup.headers.map((column) => (\r\n \r\n {column.render('Header')}\r\n \r\n {column.isSorted\r\n ? column.isSortedDesc\r\n ? \r\n : \r\n : ''}\r\n \r\n \r\n ))}\r\n \r\n ))}\r\n \r\n \r\n {page.map((row, i) => {\r\n prepareRow(row)\r\n return (\r\n \r\n {row.cells.map((cell) => {\r\n return (\r\n \r\n {cell.render('Cell')}\r\n \r\n )\r\n })}\r\n \r\n )\r\n })}\r\n \r\n \r\n
\r\n previousPage()}\r\n disabled={!canPreviousPage}\r\n >\r\n {'<'}\r\n {' '}\r\n \r\n Page{' '}\r\n \r\n {pageIndex + 1} of {pageOptions.length}\r\n {' '}\r\n \r\n {' '}\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default EditPageTable\r\n","import React, { useContext, useState } from 'react'\r\nimport EditPageForm from './EditPageForm'\r\nimport EditPageTable from './EditPageTable'\r\nimport { Link } from 'react-router-dom'\r\nimport { CurrentDashboardContext } from '../../../wrappers/CurrentDashboardContext'\r\nimport AdminLayout from '../../../elem/admin/AdminLayout'\r\nimport { FaPlus } from 'react-icons/fa'\r\n\r\nconst EditPage = () => {\r\n const {\r\n widgetGroups,\r\n currentWidgetGroup,\r\n currentDashboard,\r\n pageId,\r\n setNewObject,\r\n } = useContext(CurrentDashboardContext)\r\n const id = Number(pageId)\r\n const [edited, setEdited] = useState(false)\r\n\r\n if (!currentDashboard || !pageId || !Object.keys(currentWidgetGroup).length || Number(pageId) !== currentWidgetGroup.PageId) {\r\n return null\r\n }\r\n\r\n const page = currentWidgetGroup\r\n const pages = widgetGroups\r\n .filter(\r\n (widget) =>\r\n widgetGroups.indexOf(widget.PageId) ===\r\n widgetGroups.lastIndexOf(widget.PageId)\r\n )\r\n .map((widget) => ({ name: widget.PageName, id: widget.PageId }))\r\n .filter((widget) => widget.id !== id)\r\n\r\n const closeForm = (edit) => {\r\n setEdited(edit)\r\n }\r\n\r\n if (edited) {\r\n setNewObject(edited)\r\n }\r\n\r\n return (\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\nexport default EditPage\r\n","import React from 'react'\r\nimport { Helmet , HelmetProvider } from 'react-helmet-async'\r\nimport withConfig from '../wrappers/withConfig'\r\n\r\nconst Header = ({ config }) => {\r\n const { APP_TITLE } = config\r\n return (\r\n \r\n \r\n {APP_TITLE}\r\n \r\n \r\n )\r\n}\r\n\r\nexport default withConfig(Header)","import React, { useContext } from 'react'\r\nimport { Link } from 'react-router-dom'\r\n\r\nimport { CurrentDashboardContext } from '../../wrappers/CurrentDashboardContext'\r\nimport { IconTooltip as Tooltip } from '../../elem/Tooltip'\r\n\r\nexport default () => {\r\n const { currentWidgetGroup, widgetGroups } = useContext(CurrentDashboardContext)\r\n return (\r\n
\r\n {widgetGroups.filter(target => !target.ParentPageId).map((target, idx) => {\r\n const isActive = target.Location === currentWidgetGroup.Location || target.PageId === currentWidgetGroup.ParentPageId\r\n const tooltipId = `nav-${target.PageId}`\r\n return (\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 React, { useContext } from 'react'\r\nimport { Link } from 'react-router-dom'\r\nimport { FaArrowLeft } from 'react-icons/fa'\r\n\r\nimport { CurrentDashboardContext } from '../../wrappers/CurrentDashboardContext'\r\nimport { IconTooltip as Tooltip } from '../../elem/Tooltip'\r\n\r\nexport default () => {\r\n const { currentWidgetGroup, widgetGroups } = useContext(CurrentDashboardContext)\r\n const backTarget = currentWidgetGroup.ParentPageId ? widgetGroups.find(x => x.PageId === currentWidgetGroup.ParentPageId) : {Location: '', PageName: 'Dashboard List', DashboardName: ''}\r\n return (\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n )\r\n}\r\n","import React from 'react'\r\n\r\nimport Links from './Links'\r\nimport BackButton from './BackButton'\r\n\r\nexport default () => (\r\n \r\n)\r\n","import React, { useContext } from 'react'\r\nimport { DateContext } from '../../wrappers/DateContext'\r\nimport { FaCalendar, FaTimes } from 'react-icons/fa'\r\n\r\nconst DateDisplayComponent = ({ dateRangeLabel, date }) => {\r\n if (dateRangeLabel !== 'Custom') {\r\n return
{dateRangeLabel}
\r\n } else {\r\n return (\r\n <>\r\n {date.minDate ? (\r\n
\r\n
From:
\r\n {date.minDate}\r\n
\r\n ) : null}\r\n {date.maxDate ? (\r\n
\r\n
To:
\r\n {date.maxDate}\r\n
\r\n ) : null}\r\n \r\n )\r\n }\r\n}\r\nexport default () => {\r\n const {\r\n date,\r\n selectorVisible,\r\n toggleSelectorVisible,\r\n dateRangeLabel,\r\n } = useContext(DateContext)\r\n\r\n return (\r\n toggleSelectorVisible(!selectorVisible)}\r\n >\r\n
\r\n {selectorVisible ? : }\r\n
\r\n \r\n \r\n )\r\n}\r\n","import React, { useContext } from 'react'\r\nimport { FaGripHorizontal, FaSave, FaSyncAlt, FaTimes } from 'react-icons/fa'\r\nimport { CurrentDashboardContext } from '../wrappers/CurrentDashboardContext'\r\n\r\nexport default () => {\r\n const {\r\n editingLayout,\r\n saveLayoutState,\r\n startLayoutEdit,\r\n cancelLayoutEdit,\r\n resetLayoutState\r\n } = useContext(CurrentDashboardContext)\r\n\r\n return (\r\n
\r\n {\r\n editingLayout ? saveLayoutState() : startLayoutEdit()\r\n }}\r\n >\r\n {editingLayout ? : }\r\n
\r\n {`${editingLayout ? 'Save' : 'Edit'} Layout`}\r\n
\r\n {/* */}\r\n
\r\n {editingLayout && (\r\n <>\r\n {\r\n resetLayoutState()\r\n }}\r\n >\r\n \r\n
\r\n {`Reset Layout`}\r\n
\r\n {/* */}\r\n \r\n {\r\n cancelLayoutEdit()\r\n }}\r\n >\r\n \r\n
\r\n {`Cancel`}\r\n
\r\n {/* */}\r\n \r\n \r\n )}\r\n \r\n )\r\n}\r\n","import React, { useContext, useState } from 'react'\r\nimport { Link } from 'react-router-dom'\r\nimport { CurrentDashboardContext } from '../wrappers/CurrentDashboardContext'\r\n\r\nexport default ({ name }) => {\r\n const { currentWidgetGroup, widgetGroups } = useContext(\r\n CurrentDashboardContext\r\n )\r\n\r\n const [isActive, setIsActive] = useState(false)\r\n\r\n\r\n return (\r\n
\r\n
\r\n setIsActive(!isActive)}\r\n >\r\n {name}\r\n \r\n \r\n \r\n

\r\n
\r\n
\r\n
\r\n {widgetGroups\r\n .filter((target) => !target.ParentPageId)\r\n .map((target, idx) => {\r\n const active =\r\n target.Location ===\r\n currentWidgetGroup.Location ||\r\n target.PageId ===\r\n currentWidgetGroup.ParentPageId\r\n return (\r\n setIsActive(!isActive)}\r\n >\r\n {target.PageName}\r\n \r\n )\r\n })}\r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import React, { useContext } from 'react'\r\nimport { CurrentDashboardContext } from '../wrappers/CurrentDashboardContext'\r\nimport DateBarComponent from './date/BarComponent'\r\nimport LayoutEditorToggle from './LayoutEditorToggle'\r\nimport { Helmet, HelmetProvider } from 'react-helmet-async'\r\nimport TopBarDropdown from './TopBarDropdown'\r\nimport withConfig from '../wrappers/withConfig'\r\nimport { UserContext } from '../wrappers/UserContext'\r\nimport { hasAccessToAdmin } from '../../utils/user/permissions'\r\nimport AdminLink from './landing-page/AdminLink'\r\nimport LogoutButton from './user/LogoutButton'\r\nimport ManageUsersButton from './user/ManageUsersButton'\r\n\r\nexport default withConfig(({ config }) => {\r\n const {\r\n currentWidgetGroup: { PageName },\r\n dashboardName,\r\n pageLoading,\r\n } = useContext(CurrentDashboardContext)\r\n const { user, roles } = useContext(UserContext)\r\n const { IS_PUBLIC } = config\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n {dashboardName} {!IS_PUBLIC ? `Director ` : ''}Dashboard\r\n \r\n \r\n \r\n
\r\n
\r\n

{dashboardName}

\r\n {!pageLoading &&

- {PageName}

}\r\n
\r\n \r\n
\r\n
\r\n
\r\n \r\n \r\n {user && (\r\n
\r\n {hasAccessToAdmin(roles) ? : null}\r\n {hasAccessToAdmin(roles) ? : null}\r\n \r\n
\r\n )}\r\n
\r\n
\r\n
\r\n )\r\n})\r\n","import React from 'react'\r\n\r\nimport { dateOptionsColumnOne, dateOptionsColumnTwo } from '../../../utils/constants/date/dateOptions'\r\n\r\nexport default ({\r\n setMinDate,\r\n setMaxDate,\r\n dateRangeLabel,\r\n setDateRangeLabel,\r\n}) => {\r\n const onClick = (option) => {\r\n const { minDate, maxDate, label } = option\r\n setMinDate(minDate)\r\n setMaxDate(maxDate)\r\n setDateRangeLabel(label)\r\n }\r\n return (\r\n
\r\n
\r\n
\r\n {dateOptionsColumnOne.map((option, idx) => (\r\n onClick(option)}\r\n >\r\n
\r\n {option.label}\r\n
\r\n
\r\n {option.dateRangeString}\r\n
\r\n
\r\n ))}\r\n
\r\n
\r\n {dateOptionsColumnTwo.map((option, idx) => (\r\n onClick(option)}\r\n >\r\n
\r\n {option.label}\r\n
\r\n
\r\n {option.dateRangeString}\r\n
\r\n
\r\n ))}\r\n
\r\n \r\n \r\n )\r\n}\r\n","import React, { useContext, useEffect, useState } from 'react'\r\nimport DatePicker from 'react-datepicker'\r\n\r\nimport { DateContext } from '../../wrappers/DateContext'\r\n\r\nimport DateOptions from './DateOptions'\r\nimport { dateToString, stringToDate } from '../../../utils/dateFormatting'\r\n\r\n\r\nconst DatePickerComponent = ({ setDate, date }) => {\r\n const [width, setWidth] = useState(window.innerWidth)\r\n\r\n const listener = () => {\r\n setWidth(window.innerWidth)\r\n }\r\n\r\n window.addEventListener('resize', listener);\r\n\r\n return (\r\n {\r\n const formattedDate = dateToString(value)\r\n setDate(formattedDate, true)\r\n return value\r\n }}\r\n dateFormat=\"MM/dd/yyyy\"\r\n showYearDropdown\r\n showMonthDropdown\r\n yearDropdownItemNumber={150}\r\n scrollableYearDropdown\r\n scrollableMonthDropdown\r\n autoComplete=\"off\"\r\n inline={width > 769 ? true : false}\r\n popperModifiers={{\r\n offset: {\r\n enabled: true,\r\n },\r\n preventOverflow: {\r\n enabled: true,\r\n escapeWithReference: false,\r\n boundariesElement: \"viewport\"\r\n }\r\n }}\r\n />\r\n )\r\n}\r\n\r\nexport default () => {\r\n const {\r\n selectorVisible,\r\n toggleSelectorVisible,\r\n date,\r\n setDate,\r\n dateRangeLabel,\r\n setDateRangeLabel,\r\n } = useContext(DateContext)\r\n\r\n const [selectedDateRangeLabel, setSelectedDateRangeLabel] = useState(\r\n dateRangeLabel\r\n )\r\n const [selectedDate, setSelectedDate] = useState({\r\n minDate: date.minDate,\r\n maxDate: date.maxDate,\r\n })\r\n\r\n\r\n useEffect(() => {\r\n setSelectedDateRangeLabel(dateRangeLabel)\r\n }, [dateRangeLabel])\r\n\r\n useEffect(() => {\r\n setSelectedDate({minDate: date.minDate, maxDate: date.maxDate})\r\n }, [date])\r\n\r\n const updateDateSelection = (field, value, custom) => {\r\n if (custom) {\r\n setSelectedDateRangeLabel('Custom')\r\n }\r\n setSelectedDate((state) => ({\r\n ...state,\r\n [field]: value,\r\n }))\r\n }\r\n\r\n const applyDateSelection = () => {\r\n setDate(selectedDate)\r\n setDateRangeLabel(selectedDateRangeLabel)\r\n toggleSelectorVisible(false)\r\n }\r\n\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
Start Date:
\r\n
\r\n \r\n
\r\n
\r\n
\r\n
End Date:
\r\n
\r\n \r\n
\r\n
\r\n \r\n applyDateSelection()}\r\n >\r\n Apply\r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import React, { createContext, useState, useEffect, useContext } from 'react'\r\n\r\nimport toast from '../elem/Toast'\r\nimport withConfig from './withConfig'\r\nimport { DateContext } from './DateContext'\r\nimport { CurrentDashboardContext } from './CurrentDashboardContext'\r\nimport { FaChartPie, FaChartBar, FaHashtag, FaRegMap, FaCube, FaClipboardList, FaChartLine, FaTable, FaMap, FaComment} from 'react-icons/fa'\r\nimport { MdTrendingUp } from 'react-icons/md'\r\nimport { APIRequestContext } from './APIRequestContext'\r\n\r\nconst WidgetDataContext = createContext(null)\r\n\r\nconst WidgetDataContextProvider = ({ config, widget, children }) => {\r\n const {\r\n WidgetId: widgetId,\r\n WidgetName: widgetName,\r\n WidgetType: widgetType,\r\n GroupBy\r\n } = widget\r\n\r\n const datectx = useContext(DateContext)\r\n const { authenticatedFetch } = useContext(APIRequestContext)\r\n const { detailKey, currentWidgetGroup } = useContext(CurrentDashboardContext)\r\n const [widgetData, setWidgetData] = useState(null)\r\n const [loading, setLoading] = useState(true)\r\n const [showLegend, setShowLegend] = useState(true)\r\n const [ abortController, setAbortController ] = useState(new AbortController())\r\n const { API_URL } = config // api url configured in public/config..js\r\n \r\n // group by\r\n const groupByOptions = GroupBy ? GroupBy.split('|') : []\r\n const [activeGroupBy, setGroupBy] = useState(groupByOptions.length ? groupByOptions[0] : null)\r\n const dateQueryString = datectx ? datectx.dateQueryString : null\r\n\r\n const fetchWidget = () => {\r\n const abort = new AbortController()\r\n setAbortController(abort)\r\n setLoading(true)\r\n const groupByClause = activeGroupBy\r\n ? `groupBy=${encodeURIComponent(activeGroupBy)}`\r\n : ''\r\n const dateClause = dateQueryString ? `&${dateQueryString}` : ''\r\n const detailKeyClause = detailKey ? `&detailKey=${detailKey}` : ''\r\n authenticatedFetch(`${API_URL}/widget/${widgetId}?${groupByClause}${dateClause}${detailKeyClause}`, {signal: abort.signal})\r\n .then(async (response) => {\r\n if (response.ok) {\r\n return response.json()\r\n } else {\r\n const error = await response.text()\r\n throw new Error(error)\r\n }\r\n })\r\n .then((response) => {\r\n setWidgetData(response.data)\r\n setLoading(false)\r\n })\r\n .catch((e) => {\r\n if (e.name !== 'AbortError') {\r\n toast({\r\n level: 'error',\r\n message:\r\n 'Widget: ' +\r\n (e.message\r\n ? e.message\r\n : 'Unable to connect to the server. Please try again later.'),\r\n })\r\n setLoading(false)\r\n }\r\n })\r\n }\r\n\r\n // fetch the data associated w/ the widget\r\n useEffect(() => {\r\n if (widgetId) {\r\n if (currentWidgetGroup.DetailKey) {\r\n // if (detailKey) {\r\n abortController.abort()\r\n fetchWidget()\r\n // }\r\n } else {\r\n abortController.abort()\r\n fetchWidget()\r\n }\r\n }\r\n }, [widgetId, API_URL, activeGroupBy, dateQueryString, currentWidgetGroup, detailKey])\r\n\r\n if (!widget) {\r\n return null\r\n }\r\n\r\n //setIcon\r\n const getIconFromWidgetType = (type) => {\r\n switch (type) {\r\n case 'Number':\r\n return \r\n case 'Grid':\r\n return \r\n case 'BarChart':\r\n return \r\n case 'LineChart':\r\n return \r\n case 'ScatterChart':\r\n return \r\n case 'ThemeMap':\r\n return \r\n case 'PieChart':\r\n return \r\n case 'Form':\r\n return \r\n case '2DFeatureMap':\r\n return \r\n case '3DFeatureMap':\r\n return \r\n case 'Text':\r\n return \r\n default:\r\n return 'div'\r\n }\r\n }\r\n\r\n const widgetIcon = getIconFromWidgetType(widgetType)\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\nexport { WidgetDataContext }\r\nexport default withConfig(WidgetDataContextProvider)\r\n","import React from 'react'\r\nimport ReactSelect from 'react-select'\r\nconst selectStyles = {\r\n control: (provided) => ({\r\n ...provided,\r\n minHeight: '1em',\r\n maxHeight: '2em'\r\n }),\r\n container: (provided) => ({\r\n ...provided,\r\n minHeight: '1em',\r\n }),\r\n indicatorsContainer: (provided) => ({\r\n ...provided,\r\n height: '2em',\r\n }),\r\n valueContainer: (provided) => ({\r\n ...provided,\r\n minHeight: '1em',\r\n maxHeight: '2em',\r\n padding: '0px 0px 0px 1px',\r\n width: '2em'\r\n }),\r\n menu: (provided) => ({\r\n ...provided,\r\n zIndex: 3,\r\n }),\r\n clearIndicator: (provided) => ({\r\n ...provided,\r\n padding: '2px',\r\n }),\r\n dropdownIndicator: (provided) => ({\r\n ...provided,\r\n padding: '1px',\r\n width: '1.5em'\r\n }),\r\n}\r\n\r\nexport default ({ options, value, defaultValue, onChange, disabled }) => (\r\n \r\n)\r\n","import React, { useContext } from 'react'\r\n\r\nimport { WidgetDataContext } from '../../../wrappers/WidgetDataContext'\r\nimport Select from '../../select/Select'\r\n\r\nexport default () => {\r\n const { widgetData, activeGroupBy, setGroupBy } = useContext(\r\n WidgetDataContext\r\n )\r\n const groupBy = widgetData ? widgetData.GroupBy : null\r\n if (!groupBy || !groupBy.length > 1) {\r\n return null\r\n }\r\n // split the groupBy field (eg Form Type|Form Status) into separate values\r\n // (eg ['Form Type', 'Form Status'])\r\n const options = groupBy.split('|').map((x) => ({ label: x, value: x }))\r\n \r\n // if there is only one option, do not show the dropdown\r\n if (options.length === 1) {\r\n return null\r\n }\r\n \r\n const currentValue = !!activeGroupBy\r\n ? options.find((option) => option.value === activeGroupBy)\r\n : options[0]\r\n return (\r\n
\r\n {/*
By
*/}\r\n
\r\n setGroupBy(value)}\r\n />\r\n
\r\n
\r\n )\r\n}\r\n","import React, { useContext } from 'react'\r\nimport { FaExpandArrowsAlt, FaCompressArrowsAlt } from 'react-icons/fa'\r\n\r\nimport { DefaultTooltip as Tooltip } from '../../Tooltip'\r\nimport { WidgetDataContext } from '../../../wrappers/WidgetDataContext'\r\nimport { CurrentDashboardContext } from '../../../wrappers/CurrentDashboardContext'\r\n\r\nexport default () => {\r\n const { widgetData: widget, setLoading } = useContext(WidgetDataContext)\r\n const { expandedWidgetId, setExpandedWidgetId } = useContext(\r\n CurrentDashboardContext\r\n )\r\n\r\n const setExpandedWidget = (widgetId) => {\r\n setLoading(true)\r\n setExpandedWidgetId(widgetId)\r\n setTimeout(() => {\r\n setLoading(false)\r\n }, 200)\r\n }\r\n\r\n if (!widget) {\r\n return null\r\n }\r\n\r\n const expanded = expandedWidgetId === widget.WidgetId\r\n const tooltipId = `expand-${widget.WidgetId}`\r\n return (\r\n
\r\n {expanded ? (\r\n setExpandedWidget(null)}\r\n style={{zIndex: 10 }}\r\n >\r\n \r\n
\r\n ) : (\r\n setExpandedWidget(widget.WidgetId)}\r\n >\r\n \r\n \r\n )}\r\n \r\n \r\n )\r\n}\r\n","import React, { useContext, useState } from 'react'\r\nimport { WidgetDataContext } from '../../../wrappers/WidgetDataContext'\r\n\r\nexport default () => {\r\n const { widgetData: widget, showLegend, setShowLegend } = useContext(\r\n WidgetDataContext\r\n )\r\n const [show, setShow] = useState(false)\r\n\r\n if (!widget) {\r\n return null\r\n }\r\n\r\n if (widget && widget.WidgetType.match(/Grid|Form|Number|Text/)) {\r\n return null\r\n }\r\n\r\n const handleClick = () => {\r\n setShow(!show)\r\n show ? setShowLegend('all') : setShowLegend('none')\r\n }\r\n\r\n return (\r\n
\r\n
\r\n {!showLegend ? (\r\n setShowLegend(true)}\r\n >\r\n Show Legend\r\n
\r\n ) : (\r\n setShowLegend(false)}\r\n >\r\n Hide Legend\r\n
\r\n )}\r\n \r\n {widget.WidgetType !== 'ThemeMap' ? (\r\n
\r\n {showLegend ? (\r\n
\r\n {show ? 'Select All' : 'Deselect All'}\r\n
\r\n ) : null}\r\n
\r\n ) : null}\r\n \r\n )\r\n}\r\n","export default [\r\n '2DFeatureMap',\r\n '3DFeatureMap',\r\n 'BarChart',\r\n 'Form',\r\n 'Grid',\r\n 'LineChart',\r\n 'ScatterChart',\r\n 'PieChart',\r\n 'ThemeMap'\r\n]","import ReactHtmlParser from 'react-html-parser'\r\nconst linkToHref = item => {\r\n const transformed = Object.keys(item).reduce((acc, curr) => {\r\n const value = item[curr]\r\n if (typeof value === 'string' && value.includes('')) {\r\n // parse links and set to the csv syntax for hyperlinks\r\n try {\r\n const parsed = ReactHtmlParser(value)\r\n const csvString = `=HYPERLINK(\"${parsed[0].props.href}\",\"${parsed[0].props.children[0]}\")`\r\n return {\r\n ...acc,\r\n [curr]: csvString\r\n }\r\n } catch (e) {\r\n // when failing to parse the link, juts default to the og value\r\n return {\r\n ...acc,\r\n [curr]: value\r\n }\r\n }\r\n } else {\r\n // let all values that are not strings with tags pass through uneffected\r\n return {\r\n ...acc,\r\n [curr]: value\r\n }\r\n }\r\n }, {})\r\n return transformed \r\n}\r\nconst transforms = [linkToHref]\r\nexport default transforms","import React, { useCallback, useContext, useState } from 'react'\r\nimport { IconContext } from 'react-icons'\r\nimport { FaDownload, FaSpinner } from 'react-icons/fa'\r\nimport { Parser } from 'json2csv'\r\nimport { saveAs } from 'file-saver'\r\n\r\nimport { WidgetDataContext } from '../../../wrappers/WidgetDataContext'\r\nimport { DefaultTooltip as Tooltip } from '../../Tooltip'\r\nimport exportableWidgetTypes from '../../../../utils/constants/widgets/exportableWidgetTypes'\r\nimport csvTransforms from '../../../../utils/constants/widgets/exportTransforms'\r\nimport { DateContext } from '../../../wrappers/DateContext'\r\nimport dayjs from 'dayjs'\r\nimport withConfig from '../../../wrappers/withConfig'\r\nimport { CurrentDashboardContext } from '../../../wrappers/CurrentDashboardContext'\r\nimport { APIRequestContext } from '../../../wrappers/APIRequestContext'\r\n\r\nconst constructDownloadName = (widget, date, exportPrefix, page) => {\r\n let applyDateFilter = page ? page.ApplyDateFilter : true\r\n let downloadName = exportPrefix\r\n ? `${exportPrefix}_${widget.WidgetName}`\r\n : `${widget.PageName}_${widget.WidgetName}`\r\n if (applyDateFilter) {\r\n if (!date.minDate) {\r\n const maxDateString = dayjs(date.maxDate).format('YYYYMMDD').toString()\r\n downloadName += `_Ending_${maxDateString}`\r\n } else {\r\n const minDateString = dayjs(date.minDate).format('YYYYMMDD').toString()\r\n const maxDateString = dayjs(date.maxDate).format('YYYYMMDD').toString()\r\n \r\n downloadName += `_${minDateString}-${maxDateString}`\r\n }\r\n }\r\n const dateString = dayjs(Date.now()).format('YYYYMMDD')\r\n downloadName += `_Generated_${dateString}`\r\n return downloadName\r\n}\r\n\r\nexport default withConfig(({ config }) => {\r\n const { widgetData: widget } = useContext(WidgetDataContext)\r\n const { detailKey, currentWidgetGroup } = useContext(CurrentDashboardContext)\r\n const { authenticatedFetch } = useContext(APIRequestContext)\r\n const { API_URL } = config\r\n const { date } = useContext(DateContext)\r\n const [exporting, setExporting] = useState(false)\r\n\r\n const fetchExportPrefix = useCallback(async () => {\r\n try {\r\n var url = widget.DetailKey\r\n ? `${API_URL}/widget/exportPrefix/${widget.WidgetId}?id=${detailKey}`\r\n : `${API_URL}/widget/exportPrefix/${widget.WidgetId}`\r\n return await authenticatedFetch(url)\r\n .then(async (response) => {\r\n if (response.ok) {\r\n return await response.text()\r\n } else {\r\n const error = await response.text()\r\n throw new Error(error)\r\n }\r\n })\r\n .then((response) => {\r\n return response\r\n })\r\n } catch (e) {\r\n return null\r\n }\r\n }, [widget, detailKey, API_URL])\r\n\r\n const downloadData = useCallback(async () => {\r\n if (!exporting) {\r\n setExporting(true)\r\n var exportPrefix = await fetchExportPrefix()\r\n try {\r\n const parser = new Parser({\r\n transforms: csvTransforms\r\n })\r\n // convert the data to .csv\r\n let csv = parser.parse(widget.Data)\r\n\r\n // update the Value label field, if exists\r\n if (widget.ValueLabel) {\r\n csv = csv.replace('\"Value\"', `\"${widget.ValueLabel}\"`)\r\n }\r\n const downloadName = `${constructDownloadName(\r\n widget,\r\n date,\r\n exportPrefix,\r\n currentWidgetGroup\r\n )}.csv`\r\n saveAs(new Blob([csv], { type: 'text/csv' }), downloadName)\r\n } catch (e) {\r\n console.log('csv export error:', e)\r\n }\r\n setExporting(false)\r\n }\r\n }, [widget, date, exporting, fetchExportPrefix, currentWidgetGroup])\r\n\r\n // if there is no widget or no data, do not render this button\r\n if (!(widget && widget.Data && widget.Data.length)) {\r\n return null\r\n }\r\n\r\n // if the widget is not a supported exportable type,\r\n // then do not render this button\r\n if (!exportableWidgetTypes.includes(widget.WidgetType)) {\r\n return null\r\n }\r\n\r\n const tooltipId = `download-${widget.WidgetId}`\r\n return (\r\n \r\n {!exporting ? (\r\n downloadData()}\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 React from 'react'\r\n\r\nexport default () => (\r\n
\r\n
\r\n No Data\r\n
\r\n
\r\n)","const allowsOverflow = widget => {\r\n const widgetType = widget && widget.WidgetType ? widget.WidgetType : null\r\n switch (widgetType) {\r\n case \"BarChart\":\r\n return false\r\n case \"LineChart\":\r\n return false\r\n case \"ScatterChart\":\r\n return false\r\n case \"PieChart\":\r\n return false\r\n default:\r\n return true\r\n }\r\n}\r\n\r\nexport { allowsOverflow }","import React, { useContext } from 'react'\r\nimport { WidgetDataContext } from '../../wrappers/WidgetDataContext'\r\nimport LoadingSpinner from '../LoadingSpinner'\r\nimport GroupBySelector from './shared/GroupBySelector'\r\nimport MaximizeButton from './shared/MaximizeButton'\r\nimport LegendButton from './shared/LegendButton'\r\nimport ExportButton from './shared/ExportButton'\r\nimport NoDataComponent from './NoDataComponent'\r\nimport { allowsOverflow } from '../../../utils/widgets/contentStyle'\r\n\r\nexport default ({ children }) => {\r\n const {\r\n widgetName: name,\r\n widgetIcon: icon,\r\n loading,\r\n widgetData: widget,\r\n } = useContext(WidgetDataContext)\r\n const widgetHasData = widget && widget.Data && widget.Data.length\r\n return (\r\n
\r\n
\r\n
\r\n
\r\n
{icon}
\r\n
{name}
\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 {loading ? (\r\n \r\n ) : widgetHasData ? (\r\n children\r\n ) : (\r\n \r\n )}\r\n
\r\n
\r\n )\r\n}\r\n","const compactFormat = new Intl.NumberFormat('en-US', { notation: \"compact\", compactDisplay: \"short\" })\r\nconst longFormat = new Intl.NumberFormat('en-US', { maximumFractionDigits: 2})\r\n\r\nconst formatNumber = (value, type) => {\r\n if (type === 'compact') {\r\n return compactFormat.format(value)\r\n } else {\r\n return longFormat.format(value)\r\n }\r\n}\r\n\r\nexport { formatNumber }","import React, { useContext } from 'react'\r\nimport { WidgetDataContext } from '../../../wrappers/WidgetDataContext'\r\nimport NoDataComponent from '../NoDataComponent'\r\nimport { formatNumber } from '../../../../utils/numberFormatting'\r\n\r\nconst getValue = data => {\r\n if (data && data && data.length && data[0].Value) {\r\n return formatNumber(data[0].Value)\r\n } else {\r\n return \r\n }\r\n}\r\n\r\nexport default () => {\r\n const { widgetData: widget } = useContext(WidgetDataContext)\r\n const data = widget ? widget.Data : null\r\n const value = getValue(data)\r\n return (\r\n
\r\n
\r\n
\r\n {value}\r\n
\r\n
\r\n
\r\n )\r\n}\r\n","import React from 'react'\r\nimport ReactHtmlParser, { convertNodeToElement } from 'react-html-parser'\r\nimport { Link } from 'react-router-dom'\r\nimport dayjs from 'dayjs'\r\n\r\nimport { formatNumber } from './numberFormatting'\r\n\r\nconst transform = (node, index) => {\r\n if (node.name === 'a') {\r\n if (\r\n node.attribs.href.includes('http') ||\r\n node.attribs.href.includes('www') || node.attribs.href.includes('javascript')\r\n ) {\r\n return convertNodeToElement(node, index, transform)\r\n } else {\r\n return {convertNodeToElement(node, index, transform)}\r\n }\r\n } else {\r\n return convertNodeToElement(node, index, transform)\r\n }\r\n}\r\n\r\nconst formatValue = (value) => {\r\n if (typeof value !== 'undefined' && value !== null) {\r\n if (isNaN(value)) {\r\n if (dayjs(value).isValid()) {\r\n return dayjs(value).format('YYYY/MM/DD').toString()\r\n } else {\r\n return ReactHtmlParser(value, {transform})\r\n }\r\n } else {\r\n return formatNumber(value)\r\n }\r\n } else {\r\n return 'NULL'\r\n }\r\n}\r\n\r\nexport default formatValue\r\n","import React from 'react'\r\n\r\nimport formatValue from '../../../../utils/valueFormatting'\r\n\r\nexport default ({value, type}) => (\r\n
{type === 'string' ? value : formatValue(value)}
\r\n)","export default [\r\n 'ID',\r\n 'Name',\r\n 'API 14',\r\n 'OperatorKey',\r\n 'Operator Number',\r\n 'API No',\r\n 'Well Name',\r\n 'Incident',\r\n 'Postal Code',\r\n 'Lease',\r\n \"Well Type\",\r\n \"Producing Geological Formation\",\r\n \"Surface Managing Entity\",\r\n \"Subsurface Managing Entity\",\r\n \"Tribe\",\r\n \"Pre-Plugging Methane Emissions (grams/hr)\",\r\n \"Post-Plugging Methane Emissions (grams/hr)\",\r\n \"Methane Measurement Method\",\r\n \"Habitat Restored (acres)\",\r\n \"Restoration Endpoint\",\r\n \"Surface Water Contamination Indicators\",\r\n \"Surface Water Remediation Method\",\r\n \"Groundwater Contamination Indicators\",\r\n \"Groundwater Remediation Method\",\r\n \"Community Impact\",\r\n \"Community Impact Indicators\",\r\n \"Witness Name & Certification\",\r\n \"Result\",\r\n \"Place Value\",\r\n \"Package Name\",\r\n \"Plugged Year-Month\",\r\n 'Field',\r\n \"Date Restoration Complete\",\r\n \"Surface Water Remediation Completion Date\",\r\n \"Groundwater Remediation Completion Date\",\r\n \"Witness Date\",\r\n \"Tribal\"\r\n]","import React, {\r\n useContext,\r\n useMemo,\r\n useCallback\r\n} from 'react'\r\nimport { useTable, useSortBy, useFlexLayout, useFilters } from 'react-table'\r\nimport AutoSizer from 'react-virtualized-auto-sizer'\r\nimport { TableVirtuoso } from 'react-virtuoso'\r\nimport { WidgetDataContext } from '../../../wrappers/WidgetDataContext'\r\nimport Cell from './Cell'\r\nimport { CurrentDashboardContext } from '../../../wrappers/CurrentDashboardContext'\r\nimport { FaChevronUp, FaChevronDown } from 'react-icons/fa'\r\nimport stringFields from '../../../../utils/constants/widgets/stringFields'\r\n\r\n// Define a default UI for filtering\r\nfunction DefaultColumnFilter({\r\n column: { filterValue, preFilteredRows, setFilter },\r\n }) {\r\n const count = preFilteredRows.length\r\n \r\n return (\r\n {\r\n setFilter(e.target.value || undefined) // Set undefined to remove the filter entirely\r\n }}\r\n className=\"input is-small\"\r\n placeholder={`Search ${count} records...`}\r\n />\r\n )\r\n }\r\n\r\nconst parseColumns = (data, valueLabel, sharedKey) => {\r\n const exampleRow = data[0] // get the first row of the data to extract cols from\r\n const columns = Object.keys(exampleRow)\r\n .filter((col) => col !== 'Value') // remove the value column, we'll add next w/ proper label\r\n .filter((col) => (sharedKey ? col !== sharedKey : true)) // if there is a shared key, we don't want it to display in the grid\r\n .map((col) => ({\r\n Header: () => ,\r\n accessor: col,\r\n Cell: ({ cell }) => (\r\n \r\n ),\r\n Filter: DefaultColumnFilter\r\n \r\n })) // map column name => {Header: , accessor: } format\r\n\r\n // all values must be in the 'Value' field of the returned data\r\n if (Object.keys(exampleRow).find((col) => col === 'Value')) {\r\n const valueColumn = {\r\n Header: () => (\r\n \r\n ),\r\n accessor: 'Value',\r\n Cell: ({ cell }) => ,\r\n Filter: DefaultColumnFilter\r\n }\r\n return [...columns, valueColumn]\r\n } else {\r\n return columns\r\n }\r\n}\r\n\r\n\r\nexport default () => {\r\n const { sharedPageKey, sharedPageId, setSharedPageId } = useContext(\r\n CurrentDashboardContext\r\n )\r\n const { widgetData: widget } = useContext(WidgetDataContext)\r\n const data = widget ? widget.Data : null\r\n const detailKey = widget ? widget.DetailKey : null\r\n const columns = useMemo(\r\n () => parseColumns(data, widget.ValueLabel, widget.SharedKey),\r\n [data, widget.ValueLabel, widget.SharedKey]\r\n )\r\n\r\n const tableData = useMemo(() => data, [data])\r\n const defaultColumn = React.useMemo(\r\n () => ({\r\n minWidth: 30, // minWidth is only used as a limit for resizing\r\n width: 100, // width is used for both the flex-basis and flex-grow\r\n maxWidth: 300, // maxWidth is only used as a limit for resizing\r\n }),\r\n []\r\n )\r\n\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups,\r\n rows,\r\n prepareRow,\r\n } = useTable(\r\n { columns, data: tableData, defaultColumn },\r\n useFilters,\r\n useSortBy,\r\n useFlexLayout\r\n )\r\n\r\n\r\n const onClick = useCallback(\r\n (row) =>\r\n sharedPageKey &&\r\n detailKey !== sharedPageKey &&\r\n setSharedPageId(row.original[sharedPageKey]),\r\n [sharedPageKey, setSharedPageId, detailKey]\r\n )\r\n\r\n return (\r\n
\r\n \r\n {({ height }) => {\r\n return (\r\n\r\n ,\r\n TableBody: React.forwardRef(({ style, ...props }, ref) => ),\r\n TableRow: (props) => {\r\n const index = props['data-index']\r\n const row = rows[index]\r\n return (\r\n onClick(row)}\r\n className={`tr ${\r\n sharedPageKey &&\r\n sharedPageId === row.original[sharedPageKey]\r\n ? 'active'\r\n : ''\r\n } ${sharedPageKey ? 'pointer' : ''}`}\r\n />\r\n )}\r\n }}\r\n fixedHeaderContent={() => {\r\n return headerGroups.map((headerGroup) => (\r\n \r\n {headerGroup.headers.map((column) => (\r\n \r\n
\r\n
\r\n \r\n {column.render('Header')}\r\n \r\n {column.isSorted ? (\r\n column.isSortedDesc ? (\r\n \r\n ) : (\r\n \r\n )\r\n ) : (\r\n ''\r\n )}\r\n \r\n \r\n
\r\n {/*
{column.canFilter ? column.render('Filter') : null}
*/}\r\n
\r\n \r\n ))}\r\n
\r\n ))\r\n }}\r\n itemContent={(index) => {\r\n const row = rows[index]\r\n prepareRow(row)\r\n return row.cells.map((cell) => )\r\n }}\r\n />\r\n )\r\n }}\r\n \r\n \r\n )\r\n}\r\n","const getHiddenColumns = (widget) => {\r\n const options = widget.WidgetOptions\r\n if (options && options !== '') {\r\n try {\r\n const config = JSON.parse(options)\r\n if (config.hiddenColumns) {\r\n return config.hiddenColumns\r\n }\r\n } catch {}\r\n return\r\n }\r\n return []\r\n}\r\n\r\nexport default getHiddenColumns","// palette obtained from ColorBrewer: https://colorbrewer2.org/#type=qualitative&scheme=Paired&n=12\r\n// and mixed with material design palette https://www.materialpalette.com/colors\r\nconst qualitative = [\r\n '#1f78b4', // blue\r\n '#33a02c', // green\r\n '#fdbf6f', // creme\r\n '#a6cee3', // light blue\r\n '#ff7f00', // orange\r\n '#b2df8a', // light green\r\n '#b15928', // light brown\r\n '#cab2d6', // lavender\r\n '#6a3d9a', // purple\r\n '#3f51b5', // indigo 500\r\n '#009688', // teal 500\r\n '#ab47bc', // purple 400\r\n '#f44336', // red 500\r\n '#90a4ae', // blue grey 300\r\n '#673ab7', // deep purple 500\r\n '#00bcd4', // cyan 500\r\n '#e91e63', // pink 500\r\n '#aeea00', // lime green A700\r\n '#ffc107', // amber 500\r\n '#ff5722', // deep orange 500\r\n //additional colors added\r\n '#880e4f', //dark purple\r\n '#f48fb1', // light pink\r\n '#1b5e20', //dark green\r\n '#ffab40', // med orange\r\n '#b71c1c', //dark red\r\n]\r\n\r\n// palette obtained from ColorBrewer: https://colorbrewer2.org/#type=sequential&scheme=Reds&n=6\r\nconst heatMap = [\r\n '#fee5d9',\r\n '#fcbba1',\r\n '#fc9272',\r\n '#fb6a4a',\r\n '#de2d26',\r\n '#a50f15',\r\n]\r\nexport default qualitative\r\nexport { qualitative, heatMap }\r\n","import React, { useState, useEffect, createContext, useCallback } from 'react'\r\nimport deepEqual from 'deep-equal'\r\nimport qualitative from '../../utils/colors/chartPalette'\r\n\r\nconst ColorContext = createContext(null)\r\n\r\nconst getNextColor = (idx) => qualitative[idx % qualitative.length]\r\nconst getColorMapArray = (series, colorMap, groupName) =>\r\n series.map((seriesName, idx) => ({\r\n series: seriesName,\r\n color: getNextColor(\r\n colorMap[groupName] ? colorMap[groupName].length + idx : idx\r\n ),\r\n }))\r\n\r\nconst ColorContextProvider = ({ children }) => {\r\n const [colorMap, setColorMap] = useState(null)\r\n const getAssociatedColor = useCallback(\r\n (seriesName, groupKey) => {\r\n if (groupKey && colorMap && colorMap[groupKey]) {\r\n const matchingSeries = colorMap[groupKey].find(x => x.series === seriesName)\r\n if (matchingSeries) {\r\n return matchingSeries ? matchingSeries.color : null\r\n }\r\n } else {\r\n if (colorMap && colorMap[null]) {\r\n const nullSeries = colorMap[null].find(x => x.series === seriesName)\r\n return nullSeries ? nullSeries.color : null\r\n }\r\n }\r\n },\r\n [colorMap]\r\n )\r\n\r\n const updateColorMap = useCallback(\r\n (groupName, groupSeries) => {\r\n if (colorMap) {\r\n let updatedColorMap = colorMap\r\n // find the associated color map that is tied to the groupName we have\r\n const associatedColorMap =\r\n colorMap && colorMap[groupName] ? colorMap[groupName] : null\r\n if (associatedColorMap) {\r\n const associatedSeries = associatedColorMap.map(\r\n (x) => x.series\r\n )\r\n const seriesWithoutColorMaps = groupSeries.filter(\r\n (x) => !associatedSeries.includes(x)\r\n )\r\n updatedColorMap = {\r\n ...colorMap,\r\n [groupName]: [\r\n ...colorMap[groupName],\r\n ...getColorMapArray(\r\n seriesWithoutColorMaps,\r\n colorMap,\r\n groupName\r\n ),\r\n ],\r\n }\r\n } else {\r\n updatedColorMap = {\r\n ...colorMap,\r\n [groupName]: getColorMapArray(\r\n groupSeries,\r\n colorMap,\r\n groupName\r\n ),\r\n }\r\n }\r\n if (!deepEqual(updatedColorMap, colorMap)) {\r\n setColorMap(updatedColorMap)\r\n }\r\n } else {\r\n const updatedColorMap = {\r\n [groupName]: getColorMapArray(groupSeries, {}, groupName),\r\n }\r\n setColorMap(updatedColorMap)\r\n }\r\n },\r\n [colorMap, setColorMap]\r\n )\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\nexport { ColorContext }\r\nexport default ColorContextProvider\r\n","import React, { useContext, useState, useEffect, useCallback, useMemo, useRef } from 'react'\r\nimport {\r\n BarChart,\r\n Bar,\r\n XAxis,\r\n YAxis,\r\n Label,\r\n CartesianGrid,\r\n Tooltip,\r\n Legend,\r\n ResponsiveContainer,\r\n Rectangle,\r\n Brush\r\n} from 'recharts'\r\nimport dayjs from 'dayjs'\r\n\r\nimport { WidgetDataContext } from '../../../wrappers/WidgetDataContext'\r\n\r\nimport { formatNumber } from '../../../../utils/numberFormatting'\r\nimport { dateToString } from '../../../../utils/dateFormatting'\r\nimport getHiddenColumns from '../../../../utils/widgets/getHiddenColumns'\r\nimport { ColorContext } from '../../../wrappers/ColorContext'\r\n\r\n\r\nconst MAX_TICKS = 150\r\n\r\nconst CustomTooltip = ({ payload }) => {\r\n const label = payload?.[0]?.payload.Date\r\n const total = payload.map((d) => d['value']).reduce((a, b) => a + b, 0)\r\n\r\n const values = payload.map((item) => ({\r\n value: item.value,\r\n color: item.fill,\r\n name: item.dataKey,\r\n percent: formatNumber((item.value / total) * 100),\r\n }))\r\n return (\r\n \r\n 10 ? 'is-size-7' : 'is-size-6'\r\n }`}\r\n >\r\n {label ? dateToString(label) : 'Null'}:{' '}\r\n {values.map((value, index) => (\r\n \r\n \r\n {value.name}:\r\n \r\n \r\n {formatNumber(value.value)} ({value.percent}%)\r\n \r\n \r\n ))}\r\n \r\n \r\n )\r\n}\r\n\r\nconst CustomLegend = ({\r\n payload,\r\n activeIndex,\r\n setActiveIndex,\r\n hiddenState,\r\n updateHiddenState,\r\n}) => {\r\n const highlight = (name, color) => {\r\n if (!hiddenState[name]) {\r\n color !== activeIndex ? setActiveIndex(color) : setActiveIndex(null)\r\n }\r\n }\r\n\r\n const fillColor = (name) => {\r\n const color = !hiddenState[name]\r\n ? payload.filter((item) => item.dataKey === name)[0].color\r\n : 'rgb(204, 204, 204)'\r\n return color\r\n }\r\n\r\n return (\r\n
    \r\n {payload.map((item, index) => (\r\n \r\n updateHiddenState(item, index)}\r\n >\r\n \r\n \r\n highlight(item.value, item.color)}\r\n >\r\n {item.value}\r\n \r\n \r\n ))}\r\n
\r\n )\r\n}\r\n\r\nexport default () => {\r\n const { widgetData: widget, showLegend } = useContext(WidgetDataContext)\r\n const { updateColorMap, colorMap, getAssociatedColor } = useContext(ColorContext)\r\n const data = useMemo(() => widget ? widget.Data : null, [widget])\r\n const [activeIndex, setActiveIndex] = useState(null)\r\n const margin = useMemo(() => ({\r\n top: 20,\r\n right: 30,\r\n left: 10,\r\n bottom: 20,\r\n }), [])\r\n\r\n const hiddenColumns = useMemo(() => getHiddenColumns(widget), [widget])\r\n\r\n const sanitizedData = useMemo(() => data\r\n .filter((d) => !!d.Date) // remove data w/out dates\r\n .map((d) => ({\r\n ...d,\r\n Date: dayjs(d.Date).toDate().getTime(),\r\n })) // transform dates to MM/DD/YYYY format\r\n , [data])\r\n\r\n // get the column name key for grouping, eg in { Date: , Value: , District: }\r\n // groupKey == 'District'\r\n // also filter out hidden columns\r\n const groupKey = useMemo(() => Object.keys(sanitizedData[0])\r\n .filter(x => !hiddenColumns.includes(x))\r\n .find(\r\n (x) => !(x.includes('Date') || x.includes('Value'))\r\n ), [sanitizedData, hiddenColumns])\r\n\r\n // get a list of all unique groups that are present in the data\r\n // and sort alphabetically\r\n const uniqueGroups = useMemo(() => [\r\n ...new Set(sanitizedData.map((x) => x[groupKey])),\r\n ].sort(), [sanitizedData, groupKey])\r\n\r\n // aggregate bar chart data using unique dates. eg\r\n // [{Date: date1, District: 1, Value: 100}, {Date: date1, District: 2, Value: 200}]\r\n // turns into [{Date: date1, \"1\": 100, \"2\": 200}]\r\n const chartData = useMemo(() => [...new Set(sanitizedData.map((d) => d.Date))].map(\r\n (date) => {\r\n const dateEntry = { Date: date }\r\n return sanitizedData\r\n .filter((x) => x.Date === date) // get entries associated w/ the current date\r\n .reduce((acc, curr) => {\r\n const groupName = `${curr[groupKey]}`\r\n const value = curr['Value']\r\n return {\r\n ...acc,\r\n [groupName]: value,\r\n }\r\n }, dateEntry)\r\n }\r\n ), [sanitizedData, groupKey])\r\n\r\n // create state to track hidden prop for each individual bar series\r\n const [hiddenState, setHiddenState] = useState(\r\n uniqueGroups.reduce((acc, curr) => ({ ...acc, [curr]: false }), {})\r\n )\r\n\r\n const updateHiddenState = useCallback((e) => {\r\n setHiddenState({\r\n ...hiddenState,\r\n [e.dataKey]: !hiddenState[e.dataKey],\r\n })\r\n }, [hiddenState, setHiddenState])\r\n\r\n useEffect(() => {\r\n updateColorMap(groupKey, uniqueGroups)\r\n }, [uniqueGroups, groupKey])\r\n\r\n useEffect(() => {\r\n if (showLegend === 'all' && Object.values(hiddenState).includes(true)) {\r\n setHiddenState(\r\n uniqueGroups.reduce(\r\n (acc, curr) => ({ ...acc, [curr]: false }),\r\n {}\r\n )\r\n )\r\n }\r\n if (\r\n showLegend === 'none' &&\r\n Object.values(hiddenState).includes(false)\r\n ) {\r\n setHiddenState(\r\n uniqueGroups.reduce(\r\n (acc, curr) => ({ ...acc, [curr]: true }),\r\n {}\r\n )\r\n )\r\n }\r\n }, [showLegend, uniqueGroups])\r\n\r\n const containerRef = useRef({current: {current: {offsetWidth: null}}})\r\n\r\n const [containerWidth, setContainerWidth] = useState(0)\r\n\r\n useEffect(() => {\r\n if (containerRef && containerRef.current && containerRef.current.current) {\r\n const guessWidth = containerRef.current.current.offsetWidth - margin.left - margin.right - 40\r\n setContainerWidth(guessWidth)\r\n }\r\n }, [margin.left, margin.right, containerRef.current.current])\r\n\r\n // create state to track bar width for x axis padding\r\n const padding = useMemo(() => {\r\n const minDate = dayjs(Math.min(...chartData.map(x => x.Date)))\r\n const maxDate = dayjs(Math.max(...chartData.map(x => x.Date)))\r\n const numMonths = maxDate.diff(minDate, \"month\") + 1\r\n const p = (containerWidth / numMonths ) / 2\r\n return {\r\n left: p,\r\n right: p\r\n }\r\n }, [chartData, containerWidth])\r\n\r\n // tie each groupname to a groupid, if exists. otherwise,\r\n // default to \"shared\"\r\n const stacks = useMemo(() => uniqueGroups.reduce((acc, groupName) => {\r\n const exampleRow = data.find(x => x[groupKey] === groupName)\r\n let stackId = 'shared' // default stack id\r\n\r\n // get the stack id of the group in the query, if it exists\r\n if (exampleRow && typeof exampleRow.GroupID !== 'undefined') {\r\n stackId = exampleRow.GroupID\r\n }\r\n return {\r\n ...acc,\r\n [groupName]: stackId\r\n }\r\n }, {}), [uniqueGroups, data, groupKey])\r\n \r\n const RevealBarProps = useCallback((props) => {\r\n return props.fill === activeIndex ? (\r\n \r\n ) : (\r\n \r\n )\r\n }, [activeIndex])\r\n\r\n const colors = useMemo(\r\n () =>\r\n uniqueGroups.reduce((acc, curr, idx) => {\r\n return {\r\n ...acc,\r\n [curr]: getAssociatedColor(curr, groupKey),\r\n }\r\n }, {}),\r\n [uniqueGroups, groupKey, colorMap]\r\n )\r\n\r\n // generate a bar component for each group\r\n const Bars = useMemo(() => uniqueGroups.map((groupName, idx) => (\r\n \r\n )), [hiddenState, activeIndex, uniqueGroups, colors, stacks])\r\n\r\n return (\r\n \r\n \r\n \r\n dateToString(unixTime)}\r\n padding={padding}\r\n >\r\n \r\n \r\n formatNumber(value, 'compact')}\r\n >\r\n \r\n \r\n \r\n }\r\n />\r\n \r\n }\r\n verticalAlign=\"top\"\r\n wrapperStyle={{\r\n display: showLegend ? '' : 'none',\r\n top: 1,\r\n left: 0,\r\n overflowX: 'hidden',\r\n overflowY: 'scroll',\r\n alignItems: 'center',\r\n width: '100%',\r\n }}\r\n />\r\n {Bars}\r\n {chartData && chartData.length > MAX_TICKS && dateToString(unixTime)}/> }\r\n \r\n \r\n )\r\n}\r\n","import React, { useContext, useEffect, useState, useMemo } from 'react'\r\nimport {\r\n LineChart,\r\n Line,\r\n XAxis,\r\n YAxis,\r\n Label,\r\n CartesianGrid,\r\n Tooltip,\r\n Legend,\r\n ResponsiveContainer,\r\n ReferenceLine,\r\n Brush\r\n} from 'recharts'\r\nimport dayjs from 'dayjs'\r\n\r\nimport { WidgetDataContext } from '../../../wrappers/WidgetDataContext'\r\n\r\nimport { formatNumber } from '../../../../utils/numberFormatting'\r\nimport { dateToString } from '../../../../utils/dateFormatting'\r\nimport getHiddenColumns from '../../../../utils/widgets/getHiddenColumns'\r\nimport { ColorContext } from '../../../wrappers/ColorContext'\r\n\r\nconst MAX_TICKS = 150\r\n\r\nconst CustomLegend = ({ legendPayload, bold, setBold, updateHiddenState }) => {\r\n return (\r\n
    \r\n {legendPayload.map((item, index) => (\r\n \r\n updateHiddenState(item, index)}\r\n >\r\n \r\n \r\n \r\n bold && bold === item.value\r\n ? setBold(null)\r\n : setBold(item.value)\r\n }\r\n >\r\n {item.value}\r\n \r\n \r\n ))}\r\n
\r\n )\r\n}\r\n\r\nconst getSeriesFromData = (data, hiddenColumns) => {\r\n // if there is not a 'Value' column, then the series\r\n // values are stored in a column for each series name\r\n const seriesAreDistinctColumns =\r\n typeof Object.keys(data[0]).find((x) => x.includes('Value')) ===\r\n 'undefined'\r\n\r\n if (seriesAreDistinctColumns) {\r\n // get the line chart series names, eg in { Date: , Series A: , Series B: }\r\n // => groupKeys == ['Series A', 'Series B']\r\n \r\n // filter out Date and any hiddenColumns\r\n const groupKeys = data.reduce(\r\n (acc, curr) => [\r\n ...acc,\r\n ...Object.keys(curr).filter((x) => !x.includes('Date')).filter(x => !hiddenColumns.includes(x)),\r\n ],\r\n []\r\n )\r\n\r\n // get a list of all unique groups that are present in the data\r\n // => ['Series A', 'Series B']\r\n const uniqueGroups = [...new Set([...groupKeys])].sort()\r\n\r\n // return data + group names\r\n return [data, uniqueGroups, null]\r\n } else {\r\n // otherwise, the group key is just the column that is not Value or Date\r\n // eg data[0] = {'Value': 0, 'Date': '12/12/12', 'Form Type': 'Wow'}\r\n // => groupKey = 'Form Type'\r\n const groupKey = Object.keys(data[0]).find(\r\n (x) => !(x.includes('Date') || x.includes('Value')) && !(hiddenColumns.includes(x))\r\n )\r\n\r\n // get the set of all unique values in the column specified by groupKey\r\n const uniqueGroups = [...new Set(data.map((x) => x[groupKey]))].sort()\r\n\r\n // aggregate line chart data using unique dates. eg\r\n // [{Date: date1, District: 1, Value: 100}, {Date: date1, District: 2, Value: 200}]\r\n // turns into [{Date: date1, \"1\": 100, \"2\": 200}]\r\n const chartData = [...new Set(data.map((d) => d.Date))].sort().map((date) => {\r\n const dateEntry = { Date: date }\r\n return data\r\n .filter((x) => x.Date === date) // get entries associated w/ the current date\r\n .reduce((acc, curr) => {\r\n const groupName = curr[groupKey]\r\n const value = curr['Value']\r\n return {\r\n ...acc,\r\n [groupName]: value,\r\n }\r\n }, dateEntry)\r\n }).sort((a, b) => a.Date - b.Date)\r\n\r\n return [chartData, uniqueGroups, groupKey]\r\n }\r\n}\r\n\r\nconst getReferenceLineData = options => {\r\n if (options) {\r\n try {\r\n const config = JSON.parse(options)\r\n const referenceData = config.reference ? config.reference : null\r\n return referenceData\r\n } catch (e) {\r\n }\r\n }\r\n}\r\nexport default () => {\r\n const { widgetData: widget, showLegend } = useContext(WidgetDataContext)\r\n const { colorMap, updateColorMap, getAssociatedColor } = useContext(ColorContext)\r\n const data = useMemo(() => widget ? widget.Data : null, [widget])\r\n const options = useMemo(() => widget ? widget.WidgetOptions : null, [widget])\r\n const [legend, setLegend] = useState([])\r\n\r\n const referenceData = useMemo(() => getReferenceLineData(options), [options])\r\n const preparedData = useMemo(() => data\r\n .filter((d) => !!d.Date) // remove data w/out dates\r\n .map((d) => ({\r\n ...d,\r\n Date: dayjs(d.Date).toDate().getTime(),\r\n })) // transform dates to MM/DD/YYYY format\r\n , [data])\r\n\r\n const hiddenColumns = useMemo(() => getHiddenColumns(widget), [widget])\r\n const [chartData, uniqueGroups, groupKey] = useMemo(() => getSeriesFromData(preparedData, hiddenColumns), [preparedData, hiddenColumns])\r\n\r\n // create state to track hidden prop for each individual line\r\n const [hiddenState, setHiddenState] = useState(\r\n uniqueGroups.reduce((acc, curr) => ({ ...acc, [curr]: false }), {})\r\n )\r\n const [bold, setBold] = useState(null)\r\n\r\n useEffect(() => {\r\n updateColorMap(groupKey, uniqueGroups)\r\n }, [uniqueGroups, groupKey])\r\n\r\n \r\n useEffect(() => {\r\n setLegend(\r\n uniqueGroups.map((groupName, idx) => ({\r\n color: !hiddenState[groupName]\r\n ? getAssociatedColor(groupName, groupKey)\r\n : 'rgb(204, 204, 204)',\r\n type: 'line',\r\n dataKey: groupName,\r\n value: groupName,\r\n hide: hiddenState[groupName] ? true : false,\r\n })\r\n ))\r\n }, [hiddenState, colorMap])\r\n\r\n useEffect(() => {\r\n if (showLegend === 'all' && Object.values(hiddenState).includes(true)) {\r\n setHiddenState(\r\n uniqueGroups.reduce(\r\n (acc, curr) => ({ ...acc, [curr]: false }),\r\n {}\r\n )\r\n )\r\n }\r\n if (\r\n showLegend === 'none' &&\r\n Object.values(hiddenState).includes(false)\r\n ) {\r\n setHiddenState(\r\n uniqueGroups.reduce(\r\n (acc, curr) => ({ ...acc, [curr]: true }),\r\n {}\r\n )\r\n )\r\n }\r\n }, [showLegend])\r\n\r\n const colors = useMemo(\r\n () =>\r\n uniqueGroups.reduce((acc, curr, idx) => {\r\n return {\r\n ...acc,\r\n [curr]: getAssociatedColor(curr, groupKey),\r\n }\r\n }, {}),\r\n [uniqueGroups, groupKey, colorMap]\r\n )\r\n\r\n const updateHiddenState = (e) => {\r\n setHiddenState((previousState) => ({\r\n ...previousState,\r\n [e.dataKey]: !previousState[e.dataKey],\r\n }))\r\n }\r\n\r\n // const delay = 500\r\n // let click = 0\r\n\r\n // const handleClicks = (e) => {\r\n // console.log(e, \"event\")\r\n // click > 2 ? (click = 0) : click++\r\n // setTimeout(() => {\r\n // if (click === 1) {\r\n // updateHiddenState(e)\r\n // click = 0\r\n // }\r\n // if (click === 2) {\r\n // bold && bold === e.dataKey ? setBold(null) : setBold(e.dataKey)\r\n // click = 0\r\n // }\r\n // }, delay)\r\n // }\r\n\r\n const dataMax = useMemo(() => Math.max(\r\n ...chartData.map((entry) =>\r\n Math.max(\r\n ...Object.keys(entry).map((key) =>\r\n key !== 'Date' && !hiddenState[key] ? entry[key] : 0\r\n )\r\n )\r\n )\r\n ), [chartData, hiddenState])\r\n\r\n const dataMin = useMemo(() => Math.min(\r\n ...chartData.map((entry) =>\r\n Math.min(\r\n ...Object.keys(entry).map((key) =>\r\n key !== 'Date' && !hiddenState[key] ? entry[key] : Infinity\r\n )\r\n )\r\n )\r\n ), [chartData, hiddenState])\r\n\r\n // generate a line component for each\r\n // individual line\r\n const Lines = useMemo(() => uniqueGroups.map((groupName, idx) => (\r\n \r\n )), [uniqueGroups, hiddenState, colors, bold])\r\n\r\n const References = useMemo(() => uniqueGroups.map((groupName, idx) => {\r\n const hasReference = referenceData ? !!referenceData[groupName] : false\r\n if (!hasReference) {\r\n return null\r\n }\r\n return (\r\n \r\n )\r\n }\r\n ), [uniqueGroups, referenceData, hiddenState, colors, bold])\r\n\r\n return (\r\n \r\n \r\n \r\n }\r\n verticalAlign=\"top\"\r\n wrapperStyle={{\r\n display: showLegend ? Object.keys(legend).length ? 'block' : 'none' : 'none',\r\n top: 1,\r\n left: 0,\r\n overflowX: 'hidden',\r\n overflowY: 'scroll',\r\n alignItems: 'center',\r\n width: '100%',\r\n }}\r\n />\r\n \r\n dateToString(unixTime)}\r\n >\r\n \r\n \r\n formatNumber(value, 'compact')}\r\n domain={[dataMin, dataMax]}\r\n allowDataOverflow={true}\r\n >\r\n \r\n \r\n formatNumber(value)}\r\n labelFormatter={(label) => dateToString(label)}\r\n isAnimationActive={false}\r\n wrapperStyle={\r\n Object.values(hiddenState).filter((x) => x === false)\r\n .length > 10\r\n ? { fontSize: '.75rem' }\r\n : { fontSize: '1rem' }\r\n }\r\n itemStyle={{ padding: '0px' }}\r\n />\r\n {Lines}\r\n {References}\r\n {chartData && chartData.length > MAX_TICKS && dateToString(unixTime)}/> }\r\n \r\n \r\n )\r\n}\r\n","import React, { useState, useEffect, useRef } from 'react'\r\n\r\nconst getTooltipPositionProps = (pixel, mapWidth, bottomPixel) => {\r\n // horizontal edge detection\r\n const tooltipWidth = 200\r\n const pixelX = pixel[0]\r\n const tooltipRightPxValue = pixelX + tooltipWidth\r\n const exceedsRightEdge = tooltipRightPxValue > mapWidth\r\n const horizontalProps = exceedsRightEdge\r\n ? { right: mapWidth - pixel[0] + 'px' }\r\n : { left: pixel[0] + 'px' }\r\n\r\n // vertical edge detection\r\n const tooltipHeight = 100\r\n const tooltipYTopOffset = 50\r\n const tooltipYBottomOffset = tooltipHeight - tooltipYTopOffset\r\n const pixelY = pixel[1]\r\n \r\n // top edge\r\n const topDelta = pixelY - tooltipYTopOffset\r\n const exceedsTopEdge = topDelta < 0\r\n\r\n // bottom edge\r\n const bottomDelta = pixelY - 10 + tooltipYBottomOffset - bottomPixel\r\n const exceedsBottomEdge = bottomDelta > 0\r\n \r\n const verticalProps = exceedsTopEdge\r\n ? { top: pixel[1] - (tooltipYTopOffset + topDelta) + 10 + 'px' }\r\n : exceedsBottomEdge ? \r\n { top: pixel[1] - tooltipYTopOffset - bottomDelta } \r\n : { top: pixel[1] - tooltipYTopOffset + 'px' }\r\n\r\n const styleProps = {\r\n ...horizontalProps,\r\n ...verticalProps,\r\n }\r\n return styleProps\r\n}\r\n\r\nexport default ({ left, top, right, bottom, feature, tooltipData }) => {\r\n const tooltipRef = useRef(null)\r\n const featureRef = useRef(feature)\r\n // display logic \r\n const [display, setDisplay] = useState('none')\r\n\r\n // when a new feature is highlighted,\r\n // set display block\r\n useEffect(() => {\r\n if (feature) {\r\n setDisplay('block')\r\n featureRef.current = feature\r\n }\r\n else {\r\n setDisplay('none')\r\n featureRef.current = null\r\n }\r\n }, [feature])\r\n\r\n // when the tooltip loads,\r\n // setup mouseenter and mouseleave\r\n // functions to ensure mouseover\r\n // prevents tooltip from hiding\r\n useEffect(() => {\r\n if (tooltipRef.current) {\r\n tooltipRef.current.onmouseenter = () => setDisplay('block')\r\n tooltipRef.current.onmouseleave = () => { \r\n if (!featureRef.current) {\r\n setDisplay('none')\r\n }}\r\n }\r\n }, [featureRef])\r\n\r\n if (!tooltipData || !tooltipData.length) {\r\n return null\r\n }\r\n\r\n return (\r\n \r\n
\r\n {tooltipData.filter(x => x.field !== \"PKey\").map((d, idx) => (\r\n
\r\n
\r\n {`${d.field} :`}\r\n
\r\n
\r\n {`${d.value}`}\r\n
\r\n
\r\n ))}\r\n
\r\n \r\n )\r\n}\r\n\r\nexport { getTooltipPositionProps }","import React from 'react'\r\nimport ReactDOM from 'react-dom'\r\nimport VectorLayer from 'ol/layer/Vector'\r\nimport Vector from 'ol/source/Vector'\r\nimport { Select } from 'ol/interaction'\r\nimport { ZoomToExtent } from 'ol/control'\r\nimport Polygon from 'ol/geom/Polygon'\r\n\r\nimport { FaGlobe } from 'react-icons/fa'\r\nimport { IconTooltip } from '../../Tooltip'\r\nimport { getTooltipPositionProps } from './Tooltip'\r\n\r\nconst createLabel = (element, name, tooltip) => {\r\n const div = document.createElement('div')\r\n div.setAttribute('class', 'zoomToExtentDiv')\r\n if (name && tooltip) {\r\n div.setAttribute('data-for', name)\r\n div.setAttribute('data-tip', tooltip)\r\n }\r\n ReactDOM.render(element, div)\r\n return div\r\n}\r\n\r\nconst getLayers = () => {\r\n return {\r\n polygon: new VectorLayer({\r\n source: new Vector(),\r\n title: 'Polygon',\r\n visible: false,\r\n }),\r\n }\r\n}\r\n\r\nconst zoomControls = (extent) => {\r\n return [\r\n new ZoomToExtent({\r\n extent,\r\n label: createLabel(\r\n <>\r\n \r\n \r\n ,\r\n 'zoom-to-extent',\r\n 'Zoom to Full Extent'\r\n ),\r\n tipLabel: '',\r\n className: 'ol-zoom-extent zoomToExtentWrapper',\r\n })\r\n ]\r\n}\r\n\r\nconst getSelectControl = () => {\r\n const control = new Select()\r\n\r\n const on = (source, sharedPageKey, setSharedPageId, layer) => {\r\n const mouseDownKey = control.on('select', function(e) {\r\n var tolerance = 10\r\n // if the layer is not visible, pass this selection over\r\n if (!layer.getVisible()) {\r\n return\r\n }\r\n \r\n if (e.selected.length) {\r\n const map = e.mapBrowserEvent.map\r\n const coordinates = e.selected[0].getGeometry().flatCoordinates\r\n const targetPixel = map.getPixelFromCoordinate(coordinates)\r\n\r\n const pixel1 = [\r\n targetPixel[0] - tolerance / 2,\r\n targetPixel[1] - tolerance / 2,\r\n ]\r\n const pixel2 = [\r\n targetPixel[0] - tolerance / 2,\r\n targetPixel[1] + tolerance / 2,\r\n ]\r\n const pixel3 = [\r\n targetPixel[0] + tolerance / 2,\r\n targetPixel[1] + tolerance / 2,\r\n ]\r\n const pixel4 = [\r\n targetPixel[0] + tolerance / 2,\r\n targetPixel[1] - tolerance / 2,\r\n ]\r\n\r\n const point1 = map.getCoordinateFromPixel(pixel1)\r\n const point2 = map.getCoordinateFromPixel(pixel2)\r\n const point3 = map.getCoordinateFromPixel(pixel3)\r\n const point4 = map.getCoordinateFromPixel(pixel4)\r\n\r\n const polygon = new Polygon([[point1, point2, point3, point4]])\r\n const newFilterData = source\r\n .getFeatures()\r\n .filter(feature => \r\n polygon.intersectsExtent(\r\n feature.getGeometry().getExtent()\r\n )\r\n )\r\n\r\n if (newFilterData && newFilterData.length && sharedPageKey) {\r\n const sharedPageId = newFilterData[0].get(sharedPageKey)\r\n if (sharedPageId) {\r\n setSharedPageId(sharedPageId)\r\n }\r\n e.target.getFeatures().clear()\r\n }\r\n }\r\n })\r\n const keys = [mouseDownKey]\r\n return keys\r\n }\r\n\r\n return {\r\n on,\r\n control\r\n }\r\n}\r\n\r\n\r\nconst displayPopup = async (e, map, setTooltipState) => {\r\n const pixel = map.getEventPixel(e.originalEvent)\r\n const mapWidth = e.originalEvent.currentTarget.scrollWidth\r\n const bottomPixel = e.originalEvent.currentTarget.clientHeight \r\n const styleProps = getTooltipPositionProps(pixel, mapWidth, bottomPixel)\r\n\r\n // unhighlight the previous feature\r\n const previousFeature = map.get('currentFeature')\r\n if (previousFeature) {\r\n previousFeature.set('highlighted', 0)\r\n }\r\n\r\n const feature = map.forEachFeatureAtPixel(pixel, function(feature, layer) {\r\n return feature\r\n })\r\n\r\n if (feature) {\r\n // highlight the new feature\r\n feature.set('highlighted', 1)\r\n map.set('currentFeature', feature)\r\n setTooltipState({\r\n ...styleProps,\r\n feature\r\n })\r\n } else {\r\n setTooltipState(prevState => ({\r\n ...prevState,\r\n feature: null,\r\n }))\r\n }\r\n}\r\nexport { getLayers, zoomControls, displayPopup, getSelectControl }\r\n","import { Fill, Stroke, Style } from 'ol/style'\r\nimport { heatMap } from '../../../../../utils/colors/chartPalette'\r\n\r\nconst getDataIntervalFromRange = (range, numBins) => {\r\n const [dataMin, dataMax] = range\r\n const diff = dataMax - dataMin\r\n const interval = diff / numBins\r\n return interval\r\n}\r\n\r\nconst getHeatMapColorKeyFromRange = (value, range) => {\r\n // if value is 0,\r\n // return undefined to give the transparent\r\n // color in themeMapStyleFunction\r\n if (value === 0) {\r\n return undefined\r\n }\r\n const [dataMin] = range\r\n const interval = getDataIntervalFromRange(range, heatMap.length)\r\n const colorKey = heatMap\r\n .map((_, idx) => dataMin + (idx + 1) * interval)\r\n .findIndex(x => x + 1> value)\r\n return colorKey\r\n}\r\n\r\nconst getLegendDataFromRange = range => {\r\n const [dataMin] = range\r\n const interval = getDataIntervalFromRange(range, heatMap.length)\r\n if (interval === NaN || interval === 0 ) {\r\n return [{\r\n color: heatMap[0],\r\n dataMin: 0,\r\n dataMax: 0\r\n }]\r\n }\r\n \r\n return heatMap.map((_, idx) => {\r\n return {\r\n color: heatMap[idx],\r\n dataMin: Math.ceil(dataMin + (idx * interval)),\r\n dataMax: Math.ceil(dataMin + ((idx + 1) * interval))\r\n }\r\n })\r\n}\r\n\r\nconst heatMapStyles = heatMap.map((_, idx) => idx).reduce((acc, current) => {\r\n const color = heatMap[current]\r\n return {\r\n ...acc,\r\n [current]: new Style({\r\n fill: new Fill({\r\n color,\r\n }),\r\n stroke: new Stroke({\r\n color: 'black',\r\n width: 1\r\n }),\r\n })\r\n }\r\n}, {})\r\n\r\nconst defaultCountyStyle = new Style({\r\n fill: new Fill({\r\n color: 'rgba(255, 255, 255, 0)'\r\n }),\r\n stroke: new Stroke({\r\n color: 'black',\r\n width: 1\r\n })\r\n})\r\n\r\nconst themeMapStyleFunction = (feature) => {\r\n const colorKey = feature.get('ColorKey')\r\n if (typeof colorKey !== 'undefined') {\r\n return heatMapStyles[feature.get('ColorKey')]\r\n } else {\r\n return defaultCountyStyle\r\n }\r\n}\r\n\r\nexport { themeMapStyleFunction, getHeatMapColorKeyFromRange, getLegendDataFromRange }","import React, {useContext} from 'react'\r\nimport { getLegendDataFromRange } from './styleFunctions'\r\nimport { formatNumber } from '../../../../../utils/numberFormatting'\r\nimport { WidgetDataContext } from '../../../../wrappers/WidgetDataContext'\r\n\r\n\r\nexport default ({dataRange}) => {\r\n const { showLegend } = useContext(WidgetDataContext)\r\n const legendData = getLegendDataFromRange(dataRange)\r\n return (\r\n
\r\n {legendData.map((legendItem, idx) => (\r\n
\r\n
\r\n \r\n
\r\n
\r\n {`${formatNumber(legendItem.dataMin, 'compact')} - ${formatNumber(legendItem.dataMax, 'compact')}`}\r\n
\r\n
\r\n ))}\r\n
\r\n )\r\n}\r\n","import React, { createContext, useState, useEffect, useContext } from 'react'\r\nimport GeoJSON from 'ol/format/GeoJSON'\r\n\r\nimport toast from '../../../Toast'\r\nimport { WidgetDataContext } from '../../../../wrappers/WidgetDataContext'\r\nimport { CurrentDashboardContext } from '../../../../wrappers/CurrentDashboardContext'\r\nimport { APIRequestContext } from '../../../../wrappers/APIRequestContext'\r\nimport withConfig from '../../../../wrappers/withConfig'\r\n\r\nconst FeatureContext = createContext(null)\r\n\r\nconst getFeatureFilepathAssociatedWithGroupBy = (widget, activeGroupBy) => {\r\n const groupByOptions = widget.GroupBy.split('|')\r\n const filenameOptions = widget.FeatureFiles.split('|')\r\n const activeIndex = groupByOptions.findIndex(\r\n (groupBy) => groupBy === activeGroupBy\r\n )\r\n const activeFilename = filenameOptions[activeIndex]\r\n return activeFilename\r\n}\r\n\r\nconst FeatureContextProvider = ({ config, children }) => {\r\n // get the map widget data\r\n const { widgetData: widget, activeGroupBy } = useContext(WidgetDataContext)\r\n const { dashboardName } = useContext(CurrentDashboardContext)\r\n const { authenticatedFetch } = useContext(APIRequestContext)\r\n const { MAP: mapConfig } = config\r\n const { SOURCE_PROJECTION } = mapConfig[dashboardName]\r\n const targetProjection = 'EPSG:4326'\r\n const sourceProjection = SOURCE_PROJECTION ? SOURCE_PROJECTION : targetProjection\r\n const [features, setFeatures] = useState([])\r\n\r\n useEffect(() => {\r\n // get the file name we are going to fetch from\r\n // the /public directory\r\n const featureFilename = getFeatureFilepathAssociatedWithGroupBy(\r\n widget,\r\n activeGroupBy\r\n )\r\n\r\n // fetch the file contents\r\n authenticatedFetch(`/${featureFilename}`)\r\n .then(async (response) => {\r\n if (response.ok) {\r\n return response.json()\r\n } else {\r\n const error = await response.text()\r\n throw new Error(error)\r\n }\r\n })\r\n .then((response) => {\r\n const f = new GeoJSON({\r\n dataProjection: sourceProjection,\r\n featureProjection: targetProjection\r\n }).readFeatures(response)\r\n setFeatures(f)\r\n })\r\n .catch((e) => {\r\n toast({\r\n level: 'error',\r\n message: `Map Feature File: No file found at ${featureFilename}`,\r\n })\r\n })\r\n }, [activeGroupBy, widget])\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\nexport { FeatureContext }\r\nexport default withConfig(FeatureContextProvider)\r\n","import React, { useEffect, useRef, useContext, useState } from 'react'\r\nimport Map from 'ol/Map'\r\nimport { defaults as defaultInteractions } from 'ol/interaction'\r\nimport View from 'ol/View'\r\nimport TileLayer from 'ol/layer/Tile'\r\nimport OSM from 'ol/source/OSM'\r\nimport VectorSource from 'ol/source/Vector'\r\nimport VectorLayer from 'ol/layer/Vector'\r\nimport { unByKey } from 'ol/Observable'\r\n\r\nimport withConfig from '../../../../wrappers/withConfig'\r\nimport { WidgetDataContext } from '../../../../wrappers/WidgetDataContext'\r\n\r\nimport {\r\n displayPopup, zoomControls,\r\n} from '../mapConfig'\r\nimport {\r\n themeMapStyleFunction,\r\n getHeatMapColorKeyFromRange,\r\n} from './styleFunctions'\r\nimport MapTooltip from '../Tooltip'\r\nimport MapLegend from './MapLegend'\r\nimport { FeatureContext } from './FeatureContext'\r\nimport { CurrentDashboardContext } from '../../../../wrappers/CurrentDashboardContext'\r\nimport { formatNumber } from '../../../../../utils/numberFormatting'\r\nimport { ZoomToExtent } from 'ol/control'\r\n\r\nconst getTooltipDataFromFeature = (tooltipState, widget, activeGroupBy) => {\r\n if (tooltipState) {\r\n const { feature } = tooltipState\r\n return [{\r\n field: activeGroupBy,\r\n value: feature && feature.get('FeatureName')\r\n }, {\r\n field: widget ? widget.ValueLabel : null,\r\n value: feature && formatNumber(feature.get('Value'))\r\n }]\r\n }\r\n return []\r\n}\r\n\r\nconst ThemeMap = ({ config }) => {\r\n // load context\r\n const {\r\n loading,\r\n widgetData: widget,\r\n activeGroupBy,\r\n } = useContext(WidgetDataContext)\r\n const { dashboardName, expandedWidgetId } = useContext(CurrentDashboardContext)\r\n const { features } = useContext(FeatureContext)\r\n\r\n // get map config associated w/ the dashboard name\r\n const { MAP: mapConfig } = config\r\n const { INITIAL_ZOOM_LEVEL, CENTER_LAT_LNG } = mapConfig[dashboardName]\r\n\r\n\r\n // create internal state + refs\r\n const mapRef = useRef(null)\r\n const [map, setMap] = useState(null)\r\n const [popupKey, setPopupKey] = useState(null)\r\n const [tooltipState, setTooltipState] = useState(null)\r\n const [dataRange, setDataRange] = useState([])\r\n\r\n // on load, set up the map\r\n useEffect(() => {\r\n const map = new Map({\r\n target: mapRef.current,\r\n // controls: zoomControls(ZOOM_TO_EXTENT),\r\n controls: zoomControls(null),\r\n interactions: defaultInteractions({ mouseWheelZoom: false }),\r\n layers: [\r\n new TileLayer({\r\n source: new OSM(),\r\n }),\r\n ],\r\n view: new View({\r\n projection: 'EPSG:4326',\r\n center: CENTER_LAT_LNG,\r\n zoom: INITIAL_ZOOM_LEVEL,\r\n }),\r\n })\r\n\r\n // set initial extent to that of the view\r\n const initialExtent = map.getView().calculateExtent()\r\n map.getControls().getArray().find(x => x instanceof ZoomToExtent).extent = initialExtent\r\n\r\n setMap(map)\r\n }, [ CENTER_LAT_LNG, INITIAL_ZOOM_LEVEL, /*ZOOM_TO_EXTENT*/])\r\n\r\n // update size on load finish + expanded change\r\n useEffect(() => {\r\n if (map && mapRef) {\r\n map.setSize(mapRef.current.clientWidth, mapRef.current.clientHeight)\r\n map.updateSize()\r\n }\r\n }, [loading, map, mapRef, expandedWidgetId])\r\n\r\n // draw the counties vector layer,\r\n // and style according to the data\r\n // for each county\r\n useEffect(() => {\r\n if (widget && widget.Data && map && activeGroupBy && features) {\r\n const data = widget.Data.filter((x) => !!x[activeGroupBy]) // get data + filter out null counties\r\n const values = data.map((x) => x.Value)\r\n const range = [Math.min(...values), Math.max(...values)]\r\n setDataRange(range) // set data range for use by the map legend\r\n features.forEach((feature) => {\r\n const featureName = feature.get('FeatureName')\r\n const featureData = data.find(\r\n (d) =>\r\n `${d[activeGroupBy]}`.toLowerCase() === `${featureName}`.toLowerCase()\r\n || Number(d[activeGroupBy]) === Number(featureName)\r\n )\r\n if (featureData) {\r\n feature.set('Value', featureData.Value)\r\n } else {\r\n feature.set('Value', 0)\r\n }\r\n const colorKey = getHeatMapColorKeyFromRange(\r\n feature.get('Value'),\r\n range\r\n )\r\n feature.set('ColorKey', colorKey)\r\n })\r\n const vectorSource = new VectorSource({\r\n features: features,\r\n })\r\n const vectorLayer = new VectorLayer({\r\n source: vectorSource,\r\n style: themeMapStyleFunction,\r\n })\r\n map.addLayer(vectorLayer)\r\n }\r\n }, [widget, map, activeGroupBy, features])\r\n\r\n // add tooltip event listeners when map loads\r\n useEffect(() => {\r\n if (map) {\r\n if (!popupKey) {\r\n const key = map.on('pointermove', (e) =>\r\n displayPopup(e, map, setTooltipState)\r\n )\r\n setPopupKey(key)\r\n }\r\n } else {\r\n if (popupKey) {\r\n unByKey(popupKey)\r\n setPopupKey(null)\r\n }\r\n }\r\n }, [map, popupKey])\r\n\r\n if (loading) {\r\n return null\r\n }\r\n\r\n return (\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n )\r\n}\r\n\r\nexport default withConfig(ThemeMap)","import React from 'react'\r\n\r\nimport Map from './Map'\r\nimport FeatureContextProvider from './FeatureContext'\r\n\r\nexport default () => {\r\n return (\r\n <>\r\n \r\n \r\n \r\n \r\n )\r\n}","import { Style, Fill, Stroke, Circle} from 'ol/style'\r\n\r\nconst defaultStyle = {\r\n fillColor: 'rgba(0, 0, 255, 0.1)',\r\n strokeColor: 'rgba(0, 0, 255, 0.5)',\r\n strokeWidth: 2\r\n}\r\n\r\nconst getLegendDataFromLayers = layers => {\r\n return layers.map(layer => {\r\n const layerFeatures = layer.getSource().getFeatures()\r\n const geometryType = (layerFeatures && layerFeatures.length) ? layerFeatures[0].getGeometry().getType() : null\r\n const style = JSON.parse(layer.get('style'))\r\n const layerName = layer.get('name')\r\n return {\r\n layerName,\r\n geometryType,\r\n fillColor: style.fillColor ? style.fillColor : null,\r\n strokeColor: style.strokeColor ? style.strokeColor : null,\r\n visible: true\r\n }\r\n })\r\n}\r\n\r\nconst getFeatureValue = (feature, fieldName) => feature.get(fieldName) ? feature.get(fieldName) : defaultStyle[fieldName]\r\n\r\nconst selectedStyle = new Style({\r\n image: new Circle({\r\n radius: 6,\r\n fill: new Fill({\r\n color: '#ADD8E6'\r\n }),\r\n stroke: new Stroke({\r\n color: 'white'\r\n })\r\n }),\r\n zIndex: 4\r\n})\r\n\r\nconst renderStyles = {}\r\n\r\nconst getOrCreateRenderStyles = (feature, layerName, renderStyles) => {\r\n if (typeof renderStyles[layerName] === 'undefined') {\r\n const featureType = feature.getGeometry().getType()\r\n const fillColor = getFeatureValue(feature, 'fillColor')\r\n const strokeColor = getFeatureValue(feature, 'strokeColor')\r\n const strokeWidth = getFeatureValue(feature, 'strokeWidth')\r\n switch (featureType) {\r\n case \"Polygon\":\r\n renderStyles[layerName] = new Style({\r\n fill: new Fill({\r\n color: fillColor\r\n }),\r\n stroke: new Stroke({\r\n color: strokeColor,\r\n width: strokeWidth\r\n })\r\n })\r\n break\r\n case \"Point\":\r\n renderStyles[layerName] = new Style({\r\n image: new Circle({\r\n radius: 3,\r\n fill: new Fill({\r\n color: fillColor\r\n }),\r\n stroke: new Stroke({\r\n color: strokeColor, \r\n width: strokeWidth\r\n })\r\n })\r\n })\r\n break\r\n default:\r\n renderStyles[layerName] = undefined\r\n }\r\n }\r\n return renderStyles[layerName]\r\n \r\n}\r\n\r\nconst featureMapStyleFunction = (layerName) => (feature) => {\r\n const selected = feature.get('selected')\r\n\r\n if (selected) {\r\n return selectedStyle\r\n }\r\n const renderStyle = getOrCreateRenderStyles(feature, layerName, renderStyles)\r\n return renderStyle\r\n}\r\n\r\nexport { featureMapStyleFunction, getLegendDataFromLayers }","import WKT from 'ol/format/WKT'\r\nimport { Vector as VectorLayer} from 'ol/layer'\r\nimport {Vector as VectorSource} from 'ol/source'\r\nimport { getArea } from 'ol/extent'\r\n\r\nimport { featureMapStyleFunction } from './styleFunctions'\r\n\r\nconst format = new WKT()\r\n\r\nconst getMinimumLayerExtent = layers => {\r\n let fit = null\r\n layers.map(layer => {\r\n const layerExtent = layer.getSource().getExtent()\r\n if (fit) {\r\n // // if the layerExtent is bigger than the\r\n // // existing fit, make it the new fit target\r\n // if (getArea(fit) < getArea(layerExtent)) {\r\n // fit = layerExtent\r\n // }\r\n\r\n // more sophisticated version: compare all elements of the fit and take the max / min of each\r\n const minMaxExtent = {\r\n minLat: layerExtent[0] < fit[0] ? layerExtent[0] : fit[0],\r\n minLon: layerExtent[1] < fit[1] ? layerExtent[1] : fit[1],\r\n maxLat: layerExtent[2] > fit[2] ? layerExtent[2] : fit[2],\r\n maxLon: layerExtent[3] > fit[3] ? layerExtent[3] : fit[3]\r\n }\r\n fit = [minMaxExtent.minLat, minMaxExtent.minLon, minMaxExtent.maxLat, minMaxExtent.maxLon]\r\n } else {\r\n fit = layerExtent\r\n }\r\n return null\r\n })\r\n return fit\r\n}\r\n\r\nconst getLayers = (data, options, sharedKey) => {\r\n // map the data received for a 2d feature map\r\n // in the form:\r\n // [{\"Key\": , LayerName: , Data: , WKT: }, ...]\r\n // and options in the form\r\n // [{layerName: , style: }, ...]\r\n // and transform into openmap layers that align with the data\r\n const { layers: styleOptions} = JSON.parse(options)\r\n\r\n const layerNames = [...new Set(data.map(layer => layer.LayerName))]\r\n const layers = layerNames.map(layerName => {\r\n const { style } = styleOptions.find(x => x.layerName === layerName)\r\n const associatedFeatures = data.filter(x => x.LayerName === layerName)\r\n const features = associatedFeatures.map(f => {\r\n // create feature from wkt\r\n const feature = format.readFeature(f.WKT)\r\n\r\n // add the sharedKey field for page interactions\r\n if (sharedKey) {\r\n feature.set(sharedKey, f[sharedKey])\r\n }\r\n\r\n // tie associated data to the wkt feature\r\n const featureData = JSON.parse(f.Data)\r\n feature.set('data', featureData)\r\n\r\n // tie style to feature\r\n Object.keys(style).map(s => {\r\n return feature.set(s, style[s])\r\n })\r\n\r\n return feature\r\n })\r\n const layer = new VectorLayer({\r\n source: new VectorSource({\r\n features\r\n }),\r\n style: featureMapStyleFunction(layerName),\r\n zIndex: style.zIndex ? style.zIndex : null\r\n })\r\n layer.set('name', layerName)\r\n layer.set('style', JSON.stringify(style))\r\n return layer\r\n })\r\n return layers\r\n}\r\n\r\nexport { getMinimumLayerExtent }\r\nexport default getLayers","import React, { createContext, useContext, useEffect, useState } from 'react'\r\nimport { WidgetDataContext } from '../../../wrappers/WidgetDataContext'\r\n\r\nconst MapContext = createContext(null)\r\n\r\nconst MapContextProvider = ({ data, legendFunction, children }) => {\r\n const [legendState, setLegendState] = useState([])\r\n const {showLegend} = useContext(WidgetDataContext)\r\n\r\n useEffect(() => setLegendState(legendFunction(data)), [data, legendFunction])\r\n\r\n // when the legend is clicked, toggle visibility for the layer\r\n // associated with the legend item\r\n const toggleLayerVisibility = (layerName) => {\r\n const updatedLegendState = legendState.map((legendItem) => ({\r\n ...legendItem,\r\n visible:\r\n legendItem.layerName === layerName\r\n ? !legendItem.visible\r\n : legendItem.visible,\r\n }))\r\n setLegendState(updatedLegendState)\r\n }\r\n\r\n useEffect(()=> {\r\n if(showLegend === \"all\"){\r\n setLegendState(legendState.map((item) => ({...item, visible: true})))\r\n }\r\n if(showLegend === \"none\"){\r\n setLegendState(legendState.map((item) => ({...item, visible: false})))\r\n }\r\n \r\n }, [showLegend])\r\n \r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\nexport { MapContext }\r\nexport default MapContextProvider\r\n","import React, { useContext } from 'react'\r\nimport { MapContext } from '../MapContext'\r\nimport { WidgetDataContext } from '../../../../wrappers/WidgetDataContext'\r\n\r\nexport default () => {\r\n const { showLegend } = useContext(WidgetDataContext)\r\n const { legendState: legendData, toggleLayerVisibility } = useContext(\r\n MapContext\r\n )\r\n return (\r\n
\r\n {legendData.map((legendItem, idx) => {\r\n const visible = legendItem.visible\r\n const backgroundColor = visible ? legendItem.fillColor : 'white'\r\n return (\r\n \r\n toggleLayerVisibility(legendItem.layerName)\r\n }\r\n >\r\n
\r\n \r\n
\r\n
\r\n {legendItem.layerName}\r\n
\r\n
\r\n )\r\n })}\r\n \r\n )\r\n}\r\n","import React, { useContext, useRef, useState, useEffect } from 'react'\r\nimport Map from 'ol/Map'\r\n// import { defaults as defaultInteractions } from 'ol/interaction'\r\nimport View from 'ol/View'\r\nimport TileLayer from 'ol/layer/Tile'\r\nimport OSM from 'ol/source/OSM'\r\nimport { unByKey } from 'ol/Observable'\r\nimport { ZoomToExtent } from 'ol/control'\r\n\r\nimport getLayers, { getMinimumLayerExtent } from './getLayers'\r\n\r\nimport withConfig from '../../../../wrappers/withConfig'\r\nimport { WidgetDataContext } from '../../../../wrappers/WidgetDataContext'\r\nimport { CurrentDashboardContext } from '../../../../wrappers/CurrentDashboardContext'\r\nimport MapContextProvider, { MapContext } from '../MapContext'\r\nimport { displayPopup, getSelectControl, zoomControls } from '../mapConfig'\r\nimport MapTooltip from '../Tooltip'\r\nimport MapLegend from './MapLegend'\r\nimport { getLegendDataFromLayers } from './styleFunctions'\r\n\r\nconst getTooltipDataFromFeature = (tooltipState) => {\r\n if (tooltipState) {\r\n const { feature } = tooltipState\r\n const data = feature ? feature.get('data') : []\r\n if (data) {\r\n return Object.keys(data).map(d => ({\r\n field: d,\r\n value: data[d]\r\n }))\r\n }\r\n }\r\n return []\r\n}\r\n\r\nconst FeatureMap = withConfig(({ config, loading, layers }) => {\r\n const { dashboardName, expandedWidgetId, sharedPageKey, sharedPageId, setSharedPageId } = useContext(CurrentDashboardContext)\r\n const { legendState } = useContext(MapContext)\r\n\r\n // get map config associated w/ the dashboard name\r\n const { MAP: mapConfig } = config\r\n const { INITIAL_ZOOM_LEVEL, CENTER_LAT_LNG } = mapConfig[dashboardName]\r\n \r\n\r\n // create internal state + refs\r\n const mapRef = useRef(null)\r\n const mapHeightRef = useRef(null)\r\n const [map, setMap] = useState(null)\r\n const [popupKey, setPopupKey] = useState(null)\r\n const [eventKeys, setEventKeys] = useState([])\r\n const [tooltipState, setTooltipState] = useState(null)\r\n const selectControl = getSelectControl()\r\n\r\n // on load, set up the map\r\n useEffect(() => {\r\n const map = new Map({\r\n target: mapRef.current,\r\n controls: zoomControls(null),\r\n // interactions: defaultInteractions({ mouseWheelZoom: false }),\r\n layers: [\r\n new TileLayer({\r\n source: new OSM(),\r\n }),\r\n ],\r\n view: new View({\r\n projection: 'EPSG:4326',\r\n center: CENTER_LAT_LNG,\r\n zoom: INITIAL_ZOOM_LEVEL\r\n })\r\n })\r\n\r\n // set initial extent to that of the view\r\n const initialExtent = map.getView().calculateExtent()\r\n map.getControls().getArray().find(x => x instanceof ZoomToExtent).extent = initialExtent\r\n setMap(map)\r\n }, [ \r\n CENTER_LAT_LNG, \r\n INITIAL_ZOOM_LEVEL\r\n ])\r\n\r\n useEffect(() => {\r\n if (map && mapRef) {\r\n map.setSize(mapRef.current.clientWidth, mapRef.current.clientHeight)\r\n map.updateSize()\r\n }\r\n }, [loading, map, mapRef, expandedWidgetId])\r\n\r\n // add tooltip event listeners when map loads\r\n useEffect(() => {\r\n if (map) {\r\n if (!popupKey) {\r\n const key = map.on('pointermove', (e) =>\r\n displayPopup(e, map, setTooltipState)\r\n )\r\n setPopupKey(key)\r\n }\r\n } else {\r\n if (popupKey) {\r\n unByKey(popupKey)\r\n setPopupKey(null)\r\n }\r\n }\r\n }, [map, popupKey])\r\n \r\n // on layers update, add layers to map\r\n // and set the extent to the largest of the layers\r\n useEffect(() => {\r\n if (layers.length && map) {\r\n // remove existing select interactions\r\n map.removeInteraction(selectControl.control)\r\n if (eventKeys.length) {\r\n eventKeys.forEach(eventKey => unByKey(eventKey))\r\n }\r\n\r\n // add select interactions to each layer\r\n map.addInteraction(selectControl.control)\r\n const keys = layers.reduce((acc, layer) => {\r\n const source = layer.getSource()\r\n const eventKey = selectControl.on(source, sharedPageKey, setSharedPageId, layer)\r\n return [...acc, ...eventKey]\r\n }, [])\r\n setEventKeys(keys)\r\n \r\n // add layers\r\n layers.map(layer => {\r\n map.addLayer(layer)\r\n return null\r\n })\r\n // set view to minimum extent that\r\n // fits all the data\r\n const fit = getMinimumLayerExtent(layers)\r\n map.getView().fit(fit, { size: map.getSize(), padding: [10, 10, 10, 10]})\r\n // set the zoom to extent toggle to the right size\r\n map.getControls().getArray().find(x => x instanceof ZoomToExtent ).extent = map.getView().calculateExtent()\r\n }\r\n }, [map, layers, setSharedPageId, sharedPageKey])\r\n\r\n // zoom to new feature when selected from table\r\n useEffect(() => {\r\n // remove all previously selected features\r\n layers.map(layer => layer.getSource().getFeatures().forEach(feature => feature.set('selected', 0)))\r\n if (sharedPageKey && sharedPageId) {\r\n\r\n // add new selection to feature layer\r\n layers.map(layer => layer.getSource().getFeatures().forEach(feature => {\r\n const featureSharedId = feature.get(sharedPageKey)\r\n\r\n if (featureSharedId === sharedPageId) {\r\n // set the selected value to true\r\n feature.set('selected', 1)\r\n \r\n // thl 2021.12.12 - remove \"zoom to feature\" on click\r\n // // and zoom to fit the map around the selected feature\r\n // const featurePoint = feature.getGeometry()\r\n // map.getView().fit(featurePoint, {padding: [10, 10, 10, 10], duration: 500, maxZoom: 15})\r\n }\r\n return null\r\n }))\r\n map.render() \r\n }\r\n }, [ map, layers, sharedPageKey, sharedPageId])\r\n\r\n \r\n useEffect(() => {\r\n if (map && legendState.length) {\r\n // set visibility when legendState changes\r\n map.getLayers().getArray()\r\n .filter(x => !!x.get('name')) // filter out layers without names\r\n .forEach(x => {\r\n x.setVisible(legendState.find(y => y.layerName === x.get('name')).visible)\r\n })\r\n }\r\n }, [legendState, map])\r\n\r\n // when the legend comes in, recalculate the extent\r\n useEffect(() => {\r\n if (map && layers && mapRef) {\r\n if (mapHeightRef.current !== mapRef.current?.clientHeight) {\r\n mapHeightRef.current = mapRef.current.clientHeight\r\n map.setSize(mapRef.current.clientWidth, mapRef.current.clientHeight)\r\n map.updateSize()\r\n // set view to minimum extent that\r\n // fits all the data\r\n const fit = getMinimumLayerExtent(layers)\r\n map.getView().fit(fit, { size: map.getSize(), padding: [10, 10, 10, 10]})\r\n // set the zoom to extent toggle to the right size\r\n map.getControls().getArray().find(x => x instanceof ZoomToExtent ).extent = map.getView().calculateExtent()\r\n }\r\n }\r\n }, [map, layers, legendState, mapRef.current?.clientHeight])\r\n\r\n if (loading) {\r\n return null\r\n }\r\n\r\n return (\r\n
\r\n \r\n
\r\n
\r\n \r\n
\r\n \r\n )\r\n})\r\n\r\nconst FeatureMapWrapper = () => {\r\n const {\r\n loading,\r\n widgetData: widget,\r\n } = useContext(WidgetDataContext)\r\n const [layers, setLayers] = useState([])\r\n\r\n useEffect(() => {\r\n if (widget && widget.Data) {\r\n const {Data: data, WidgetOptions: options, SharedKey: sharedKey} = widget\r\n setLayers(getLayers(data, options, sharedKey))\r\n }\r\n }, [widget])\r\n \r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default FeatureMapWrapper","\r\nimport { DoubleSide } from \"three\"\r\n\r\nconst meshProps = {\r\n rotation: [-Math.PI / 2, 0, 0],\r\n castShadow: false\r\n}\r\n\r\nconst meshBasicMaterialProps = {\r\n side: DoubleSide, \r\n attach: \"material\", \r\n transparent: true,\r\n depthTest: false\r\n}\r\n\r\nconst orbitControlsProps = {\r\n // enableDamping: true,\r\n // dampingFactor: 0.05,\r\n rotateSpeed: 0.35,\r\n screenSpacePanning: true,\r\n maxPolarAngle: Math.PI / 2\r\n}\r\n\r\nconst scale = { x: 1250, y: 1250, z: 1 / 500 }\r\n\r\nexport { scale, meshProps, meshBasicMaterialProps, orbitControlsProps }","import React, { useRef, useMemo, useContext, useCallback } from 'react'\r\nimport { useFrame, useUpdate } from 'react-three-fiber'\r\nimport { Vector3, Color, Shape, Vector2, ArrowHelper, Vector4 } from 'three'\r\nimport { SceneContext } from './Scene'\r\nimport { generateMeshFromPointCloud } from './utils'\r\nimport { meshBasicMaterialProps, meshProps, scale } from '../../../../../utils/widgets/map/3d/config'\r\n\r\nconst Mesh = ({feature, centerPoint, style}) => {\r\n const shouldInteract = useRef(true)\r\n\r\n useFrame((state) => {\r\n const isControlled = state.scene.userData?.isControlled\r\n shouldInteract.current = !isControlled\r\n })\r\n\r\n const {\r\n tooltipContext: { updateTooltipState },\r\n legendState,\r\n } = useContext(SceneContext)\r\n const { geometry, styleData: featureStyles } = feature\r\n const { coordinates } = geometry\r\n\r\n const styleObj = useMemo(() => ({\r\n ...featureStyles,\r\n ...style,\r\n }), [featureStyles, style])\r\n\r\n const vertices = useMemo(() => {\r\n return generateMeshFromPointCloud(coordinates[0], centerPoint, scale)\r\n }, [coordinates, centerPoint])\r\n\r\n const visible = useMemo(() => legendState.find(\r\n (legendItem) => legendItem.layerName === feature.layerName\r\n ).visible, [legendState, feature])\r\n\r\n const geometryRef = useUpdate(geometry => {\r\n geometry.setFromPoints(vertices)\r\n }, [visible])\r\n\r\n const Meshes = useMemo(() =>\r\n {\r\n if (shouldInteract.current) {\r\n const data = e.eventObject.userData\r\n const event = e.nativeEvent\r\n const {\r\n offsetX,\r\n offsetY,\r\n target,\r\n } = event\r\n updateTooltipState({\r\n data,\r\n target: {\r\n offsetX,\r\n offsetY,\r\n scrollWidth: target.scrollWidth,\r\n clientHeight:\r\n target.clientHeight,\r\n },\r\n })\r\n }\r\n }}\r\n onPointerLeave={(e) => {\r\n if (shouldInteract.current) {\r\n e.eventObject.material.color = new Color(\r\n styleObj.color ? styleObj.color : 'red'\r\n )\r\n if (visible) {\r\n updateTooltipState(null)\r\n }\r\n }\r\n }}\r\n >\r\n \r\n \r\n \r\n , [shouldInteract, styleObj, updateTooltipState, feature])\r\n\r\n return (\r\n visible && (\r\n Meshes\r\n )\r\n )\r\n}\r\n\r\nconst Polygon = ({ feature, centerPoint, style }) => {\r\n const { legendState } = useContext(SceneContext)\r\n const geometryRef = useRef()\r\n const { geometry } = feature\r\n const { coordinates } = geometry\r\n\r\n const shape = useMemo(() => {\r\n const vectors = coordinates\r\n ? coordinates[0].reduce((acc, pt) => {\r\n if (pt.length > 1) {\r\n return [\r\n ...acc,\r\n new Vector2(\r\n (pt[0] - centerPoint.x) * scale.x,\r\n (pt[1] - centerPoint.y) * scale.y\r\n ),\r\n ]\r\n }\r\n return acc\r\n }, [])\r\n : []\r\n return new Shape(vectors)\r\n }, [coordinates, centerPoint])\r\n\r\n if (!(feature.data && feature.data.Top && feature.data.Bottom)) {\r\n return null\r\n }\r\n\r\n // calculate height as the bottom - top\r\n const height = - Math.abs((feature.data.Top - feature.data.Bottom)) * scale.z\r\n\r\n // scale top\r\n const top = feature.data.Top * scale.z\r\n \r\n const visible = legendState.find(\r\n (legendItem) => legendItem.layerName === feature.layerName\r\n ).visible\r\n\r\n return (\r\n visible && (\r\n \r\n \r\n \r\n \r\n )\r\n )\r\n}\r\n\r\nconst Line = ({ feature, centerPoint, style: layerStyle, camera }) => {\r\n const shouldInteract = useRef(true)\r\n useFrame((state) => {\r\n const isControlled = state.scene.userData?.isControlled\r\n shouldInteract.current = !isControlled\r\n })\r\n const {\r\n tooltipContext: { updateTooltipState },\r\n sharedPageKey,\r\n sharedPageId,\r\n setSharedPageId,\r\n legendState,\r\n } = useContext(SceneContext)\r\n const { geometry, styleData: featureStyle } = feature\r\n const { coordinates } = geometry\r\n\r\n const style = useMemo(() => ({ ...layerStyle, ...featureStyle }), [layerStyle, featureStyle])\r\n\r\n const sections = useMemo(() => {\r\n let lastZValue = 0\r\n const vectors = coordinates.map((pt, idx) => {\r\n if (pt.length > 2) {\r\n return new Vector3(\r\n (pt[0] - centerPoint.x) * scale.x,\r\n (pt[1] - centerPoint.y) * scale.y,\r\n (pt[2] - centerPoint.z) * scale.z\r\n )\r\n } else {\r\n // TODO: fix on sql side\r\n // if 2 pt wellbore, and there is no last z coordinate,\r\n // get the z value of the last pt\r\n if (idx > 0 && coordinates[idx - 1].length > 2) {\r\n lastZValue = coordinates[idx - 1][2] - centerPoint.z\r\n }\r\n return new Vector3(\r\n (pt[0] - centerPoint.x) * scale.x,\r\n (pt[1] - centerPoint.y) * scale.y,\r\n lastZValue * scale.z\r\n )\r\n }\r\n })\r\n const lineSegments = vectors.reduce((acc, curr, idx) => {\r\n if (idx <= vectors.length - 2) {\r\n const v1 = vectors[idx]\r\n const v2 = vectors[idx + 1]\r\n return [\r\n ...acc,\r\n {\r\n v1,\r\n v2,\r\n },\r\n ]\r\n } else {\r\n return acc\r\n }\r\n }, [])\r\n\r\n const cylinders = lineSegments.map(({ v1, v2 }) => {\r\n const direction = new Vector3().subVectors(v2, v1)\r\n const arrow = new ArrowHelper(direction.clone().normalize(), v1)\r\n const rotation = arrow.rotation.clone()\r\n const position = new Vector3().addVectors(\r\n v1,\r\n direction.clone().multiplyScalar(0.5)\r\n )\r\n return {\r\n direction,\r\n rotation,\r\n position,\r\n }\r\n })\r\n return cylinders\r\n }, [coordinates, centerPoint])\r\n\r\n const getColor = useCallback((f, s) => {\r\n const c = new Color(s.color ? s.color : 'red')\r\n if (sharedPageKey && sharedPageId) {\r\n if (sharedPageId === f[sharedPageKey])\r\n return new Color('#ADD8E6')\r\n }\r\n return c\r\n }, [sharedPageKey, sharedPageId])\r\n\r\n const lineWidth = useMemo(() => style.width ? style.width * 0.02 : 0.1, [style])\r\n\r\n const material = useMemo(() => {\r\n return (\r\n \r\n )}, [getColor, feature, style])\r\n\r\n const visible = useMemo(() => legendState.find(\r\n (legendItem) => legendItem.layerName === feature.layerName\r\n ).visible, [legendState, feature])\r\n\r\n const meshes = useMemo(() => {\r\n return sections.map(\r\n (\r\n { direction, rotation, quaternion, position },\r\n idx\r\n ) => (\r\n {\r\n if (shouldInteract.current) {\r\n const data = e.eventObject.userData\r\n const event = e.nativeEvent\r\n const {\r\n offsetX,\r\n offsetY,\r\n target,\r\n } = event\r\n e.eventObject.material.color = new Color(\r\n 'black'\r\n )\r\n updateTooltipState({\r\n data,\r\n target: {\r\n offsetX,\r\n offsetY,\r\n scrollWidth: target.scrollWidth,\r\n clientHeight:\r\n target.clientHeight,\r\n },\r\n })\r\n }\r\n }}\r\n onPointerLeave={(e) => {\r\n if (shouldInteract.current) {\r\n e.eventObject.material.color = new Color(\r\n style.color ? style.color : 'red'\r\n )\r\n if (visible) {\r\n updateTooltipState(null)\r\n }\r\n }\r\n }}\r\n onClick={() => {\r\n if (sharedPageKey) {\r\n setSharedPageId(feature[sharedPageKey])\r\n }\r\n }}\r\n rotation={[rotation.x, rotation.y, rotation.z]}\r\n quaternion={quaternion}\r\n position={position}\r\n name={feature.layerName}\r\n >\r\n \r\n {material}\r\n \r\n )\r\n )\r\n }\r\n , [material, sharedPageKey, setSharedPageId, shouldInteract, lineWidth, sections, feature, style.color])\r\n\r\n const meshGroup = useMemo(() => \r\n \r\n {meshes}\r\n \r\n , [meshes])\r\n\r\n return (\r\n <>\r\n {material && sections && visible && (\r\n meshGroup\r\n )}\r\n \r\n )\r\n}\r\n\r\nexport { Polygon, Line, Mesh }\r\n","import React from 'react'\r\nimport wellknown from 'wellknown'\r\nimport { Vector3 } from 'three'\r\nimport delaunay from 'delaunay-fast'\r\n\r\nimport colors from '../../../../../utils/colors/chartPalette'\r\nimport { Line, Polygon, Mesh } from './Shapes'\r\n\r\nconst getShapeComponent = layerType => {\r\n switch (layerType) {\r\n case 'LineString':\r\n return Line\r\n case 'Polygon':\r\n return Polygon\r\n case 'Mesh':\r\n return Mesh\r\n default:\r\n return \r\n }\r\n}\r\n\r\nconst prepareData = (data, options, sharedPageKey) => {\r\n // parse the wkt returned w/ each 3d feature\r\n const transformedData = data.filter(d => !!d.WKT).map(d => {\r\n let additionalData = {}\r\n try {\r\n additionalData = JSON.parse(d.Data)\r\n } catch (e) {\r\n console.log('unable to parse feature data from point:', d)\r\n }\r\n return {...d, geometry: wellknown.parse(d.WKT), data: additionalData}\r\n })\r\n\r\n // point data needs to be constructed into a polygon \r\n const pointData = transformedData.filter(x => x.geometry.type === 'Point')\r\n const allPointLayerNames = pointData.map(x => {\r\n const layerOptions = options.find(option => option.layerName === x.LayerName)\r\n const layerNameField = layerOptions ? layerOptions.nameField : null\r\n return x.data[layerNameField]\r\n })\r\n const pointLayerNames = [...new Set(allPointLayerNames)]\r\n\r\n const pointsToMesh = pointLayerNames.reduce((acc, layerName, idx) => {\r\n const associatedData = pointData.filter(x => {\r\n const layerOptions = options.find(option => option.layerName === x.LayerName)\r\n const layerNameField = layerOptions ? layerOptions.nameField : null\r\n return x.data[layerNameField] === layerName\r\n })\r\n const geometryData = {\r\n type: 'Mesh',\r\n coordinates: [associatedData.map(x => x.geometry.coordinates)]\r\n }\r\n const exampleRow = associatedData[0]\r\n const layerOptions = options.find(option => option.layerName === exampleRow.LayerName)\r\n const layerNameField = layerOptions ? layerOptions.nameField : null\r\n return [\r\n ...acc,\r\n {\r\n LayerName: exampleRow.LayerName,\r\n geometry: geometryData,\r\n data: {\r\n Type: exampleRow.LayerName,\r\n [layerNameField]: layerName,\r\n style: {\r\n color: colors[idx % colors.length] \r\n }\r\n },\r\n [sharedPageKey]: exampleRow[sharedPageKey],\r\n }\r\n ]\r\n }, [])\r\n\r\n const parsedData = [\r\n ...transformedData.filter(x => x.geometry.type !== 'Point'),\r\n ...pointsToMesh\r\n ]\r\n\r\n // get the unique layernames as a set from the data\r\n const layerNames = [...new Set(parsedData.map(x => x.LayerName))]\r\n\r\n // collect metadata + associated feature set for each layer\r\n const layerData = layerNames.map((layerName, idx) => {\r\n const associatedData = parsedData.filter(x => x.LayerName === layerName)\r\n const associatedStyle = options.find(x => x.layerName === layerName)\r\n const exampleRow = associatedData[0]\r\n return {\r\n layerName: exampleRow.LayerName,\r\n layerType: exampleRow.geometry.type,\r\n layerIdx: idx,\r\n data: associatedData,\r\n [sharedPageKey]: sharedPageKey ? exampleRow[sharedPageKey] : null,\r\n style: associatedStyle ? associatedStyle.style : null\r\n }\r\n })\r\n return layerData\r\n}\r\n\r\nconst getFeatures = (camera, gl, layerData, setTooltipState) => {\r\n // obtain the camera positioning:\r\n // this is the vector representing the top of the UIC permit well and extended a bit\r\n let centerPoint = new Vector3(0, 0, 0)\r\n if (layerData.find(x => x.layerType === 'LineString')) {\r\n const allCoords = layerData\r\n .filter(x => x.layerType === 'LineString')\r\n .reduce((acc, d) => {\r\n return [...acc, ...d.data.map(pt => {\r\n return pt.geometry.coordinates[0]\r\n })]\r\n }, [])\r\n const totalLineStrings = allCoords.length\r\n const centerCoords = allCoords.reduce((acc, curr) => {\r\n return [\r\n acc[0] + (curr[0] / totalLineStrings),\r\n acc[1] + (curr[1] / totalLineStrings),\r\n acc[2] + (curr[2] ? curr[2] / totalLineStrings : 0)\r\n ]\r\n }, [0, 0, 0])\r\n centerPoint = new Vector3(...centerCoords)\r\n const lookAt = camera.position.applyAxisAngle(new Vector3(1, 0, 0), -Math.PI / 2).multiplyScalar(1.5)\r\n camera.position.set(lookAt.x, lookAt.y, lookAt.z)\r\n }\r\n\r\n // tie the layerData to three.js components\r\n const features = layerData.reduce((acc, layer) => {\r\n \r\n // get the component based on wkt layer type (eg polygon, linestring, point)\r\n const ShapeComponent = getShapeComponent(layer.layerType)\r\n\r\n if (typeof ShapeComponent === 'undefined') {\r\n return acc\r\n } else {\r\n const layerFeatures = layer.data.map((feature, idx) => {\r\n\r\n // parse the feature.Data field\r\n // into json, if it exists\r\n let parsedData = {}\r\n let tooltipData = {}\r\n let styleData = {}\r\n if (feature.data) {\r\n try {\r\n parsedData = feature.data\r\n // remove the style object from the parsed data, if it exists\r\n tooltipData = Object.keys(parsedData).reduce((acc, curr) => {\r\n if (curr !== \"style\") {\r\n return { ...acc, [curr]: parsedData[curr]}\r\n }\r\n return acc\r\n }, {})\r\n\r\n // extract the style object if it exists\r\n styleData = parsedData.style ? parsedData.style : {}\r\n } catch (e) {\r\n console.log('unable to parse feature data from feature:', feature)\r\n }\r\n }\r\n\r\n // add attributes to the feature\r\n feature.tooltipData = tooltipData\r\n feature.styleData = styleData\r\n feature.layerName = layer.layerName\r\n feature.layerType = layer.layerType\r\n\r\n // return a react component that matches wkt type,\r\n // with props\r\n return React.createElement(ShapeComponent, {\r\n ...layer,\r\n feature,\r\n key: `${layer.layerName}-${layer.layerType}-${idx}`,\r\n centerPoint,\r\n camera,\r\n gl,\r\n setTooltipState\r\n })\r\n })\r\n return [...acc, ...layerFeatures ]\r\n }\r\n }, [])\r\n return features\r\n}\r\n\r\n\r\nconst getLegendDataFromLayers = (layerData) => {\r\n return layerData.map(layer => {\r\n const { layerName, style } = layer\r\n return {\r\n layerName,\r\n fillColor: style && style.color ? style.color : 'rgb(55,55,55)',\r\n strokeColor: style && style.color ? style.color : 'rgb(55,55,55)',\r\n visible: true\r\n }\r\n })\r\n}\r\n\r\nconst generateMeshFromPointCloud = (coordinates, centerPoint, scale) => {\r\n const scaledCoords = coordinates.map(pt => ([\r\n (pt[0] - centerPoint.x) * scale.x,\r\n (pt[1] - centerPoint.y) * scale.y,\r\n (pt[2] - centerPoint.z) * scale.z\r\n ]))\r\n\r\n // lop off the 3d aspect of the point\r\n const planeRepresentation = scaledCoords.map(pt => ([\r\n pt[0], pt[1]\r\n ]))\r\n\r\n\r\n // convert the plane representation to delaunay triangle \r\n // representation\r\n const cells = delaunay.triangulate(planeRepresentation)\r\n\r\n // create triangles from the cells\r\n const numTriangles = cells.length ? cells.length / 3 : 0\r\n \r\n let triangles = []\r\n for (let i = 0; i < numTriangles; i++) {\r\n triangles.push(new Vector3(...scaledCoords[cells[(i*3)]]))\r\n triangles.push(new Vector3(...scaledCoords[cells[(i*3) + 1]]))\r\n triangles.push(new Vector3(...scaledCoords[cells[(i*3) + 2]]))\r\n }\r\n\r\n return triangles\r\n}\r\n\r\nexport { getFeatures, getShapeComponent, prepareData, getLegendDataFromLayers, generateMeshFromPointCloud }","import React, { useState, createContext } from 'react'\r\nimport { getTooltipPositionProps } from '../Tooltip'\r\n\r\nconst TooltipContext = createContext(null)\r\n\r\nconst TooltipContextProvider = ({children}) => {\r\n const [tooltipState, setTooltipState] = useState(null)\r\n\r\n const updateTooltipState = (tooltipData) => {\r\n if (tooltipData) {\r\n const { data, target } = tooltipData\r\n const pixel = [target.offsetX, target.offsetY]\r\n const styleProps = getTooltipPositionProps(pixel, target.scrollWidth, target.clientHeight)\r\n\r\n setTooltipState({\r\n data,\r\n feature: {},\r\n ...styleProps\r\n })\r\n } else {\r\n setTooltipState(prevState => ({\r\n ...prevState,\r\n data: {}\r\n }))\r\n }\r\n }\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\nexport { TooltipContext }\r\nexport default TooltipContextProvider","import React, { useEffect, useState, useContext, createContext, useRef, useMemo } from 'react'\r\nimport { Canvas, extend, useThree, useFrame } from 'react-three-fiber'\r\nimport { Color } from 'three'\r\nimport { MapControls, OrbitControls } from 'three/examples/jsm/controls/OrbitControls'\r\nimport { ConvexGeometry } from 'three/examples/jsm/geometries/ConvexGeometry'\r\nimport { TrackballControls } from 'three/examples/jsm/controls/TrackballControls'\r\n\r\nimport { getFeatures } from './utils'\r\nimport { TooltipContext } from './TooltipContext'\r\nimport { CurrentDashboardContext } from '../../../../wrappers/CurrentDashboardContext'\r\nimport { MapContext } from '../MapContext'\r\nimport { orbitControlsProps } from '../../../../../utils/widgets/map/3d/config'\r\n\r\nconst SceneContext = createContext(null)\r\n\r\nextend({\r\n MapControls,\r\n TrackballControls,\r\n OrbitControls,\r\n ConvexGeometry,\r\n})\r\n\r\nconst Controls = ({ camera, gl }) => {\r\n const isControlled = useRef(false)\r\n const controlsRef = useRef(null)\r\n const lightRef = useRef(null)\r\n const { compassRef, tooltipContext: {updateTooltipState} } = useContext(SceneContext)\r\n\r\n useFrame((state) => {\r\n // update isControlled flag on the scene - determines whether interactions should happen\r\n // (such as tooltip display / hide) when the controls are \r\n // updating the camera position\r\n state.scene.userData.isControlled = isControlled.current\r\n controlsRef.current.update()\r\n lightRef.current.position.set(...state.camera.position.clone().multiplyScalar(2).toArray())\r\n \r\n // apply transformation to compass based on azimuthal angle of camera\r\n // compassRef.current.style.transform = 'rotateX(' + controlsRef.current.getPolarAngle() + 'rad) rotateZ(' + controlsRef.current.getAzimuthalAngle() + 'rad)'\r\n compassRef.current.style.transform = 'rotate(' + controlsRef.current.getAzimuthalAngle() + 'rad)'\r\n })\r\n\r\n useEffect(() => {\r\n if (controlsRef.current) {\r\n controlsRef.current.addEventListener('start', () => {\r\n isControlled.current = true\r\n updateTooltipState(null)\r\n })\r\n controlsRef.current.addEventListener('end', () => {\r\n isControlled.current = false\r\n })\r\n }\r\n }, [controlsRef, isControlled])\r\n\r\n return (\r\n <>\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst Renderer = ({ data }) => {\r\n const { camera, gl } = useThree()\r\n const { expandedWidgetId } = useContext(SceneContext)\r\n const [features, setFeatures] = useState([])\r\n \r\n // set the features based on layer data\r\n useEffect(() => {\r\n const features = getFeatures(camera, gl, data)\r\n setFeatures(features)\r\n }, [camera, gl, data])\r\n\r\n // manually fire a resize event for when the\r\n // canvas size changes: see https://github.com/react-spring/react-three-fiber/issues/350\r\n // for tracking of this issue\r\n useEffect(() => {\r\n setTimeout(() => window.dispatchEvent(new Event('resize')), 200)\r\n }, [expandedWidgetId])\r\n\r\n const objects = useMemo(() => (\r\n <>\r\n \r\n {features}\r\n \r\n \r\n \r\n ), [features, camera, gl])\r\n\r\n return objects\r\n}\r\n\r\nexport default ({ data, compassRef }) => {\r\n const tooltipContext = useContext(TooltipContext) \r\n const { expandedWidgetId, sharedPageId, sharedPageKey, setSharedPageId } = useContext(CurrentDashboardContext)\r\n const { legendState } = useContext(MapContext)\r\n\r\n return (\r\n {\r\n gl.setClearColor(new Color('#0f0f0f'))\r\n }}\r\n >\r\n \r\n \r\n \r\n \r\n \r\n\r\n )\r\n}\r\nexport { SceneContext }\r\n","import React, { useContext } from 'react'\r\n\r\nimport { MapContext } from '../MapContext'\r\nimport { WidgetDataContext } from '../../../../wrappers/WidgetDataContext'\r\n\r\nexport default () => {\r\n const { showLegend } = useContext(WidgetDataContext)\r\n const { legendState, toggleLayerVisibility } = useContext(MapContext)\r\n\r\n return (\r\n
\r\n {legendState.map((legendItem, idx) => {\r\n const backgroundColor = legendItem.visible\r\n ? legendItem.fillColor\r\n : 'white'\r\n const border = legendItem.visible\r\n ? legendItem.strokeColor\r\n ? `solid 1px ${legendItem.strokeColor}`\r\n : null\r\n : 'solid 1px black'\r\n const borderRadius = legendItem.visible\r\n ? legendItem.geometryType === 'LineString'\r\n ? '10px'\r\n : null\r\n : '0px'\r\n\r\n return (\r\n \r\n toggleLayerVisibility(legendItem.layerName)\r\n }\r\n >\r\n
\r\n \r\n
\r\n
\r\n {legendItem.layerName}\r\n
\r\n
\r\n )\r\n })}\r\n \r\n )\r\n}\r\n","import React, { useContext, useState, useRef, useEffect } from 'react'\r\n\r\nimport { WidgetDataContext } from '../../../../wrappers/WidgetDataContext'\r\nimport Scene from './Scene'\r\nimport { prepareData } from './utils'\r\nimport MapLegend from './MapLegend'\r\nimport MapTooltip from '../Tooltip'\r\nimport TooltipContextProvider, { TooltipContext } from './TooltipContext'\r\nimport { CurrentDashboardContext } from '../../../../wrappers/CurrentDashboardContext'\r\nimport MapContextProvider from '../MapContext'\r\nimport { getLegendDataFromLayers } from './utils'\r\n\r\nconst getTooltipDataFromFeature = (tooltipState) => {\r\n if (tooltipState) {\r\n const { data } = tooltipState\r\n return Object.keys(data).map(fieldName => (\r\n {\r\n field: fieldName,\r\n value: data[fieldName]\r\n }\r\n ))\r\n }\r\n return []\r\n}\r\n\r\nexport default () => {\r\n const { sharedPageKey } = useContext(CurrentDashboardContext)\r\n const { loading, widgetData: widget } = useContext(WidgetDataContext)\r\n const mapRef = useRef(null)\r\n const compassRef = useRef(null)\r\n const [layerData, setLayerData] = useState([])\r\n\r\n useEffect(() => {\r\n if (widget && widget.Data) {\r\n // obtain layer data + stringified options object from\r\n // the widget\r\n const { Data: data, WidgetOptions: stringifiedOptions } = widget\r\n\r\n // parse the options object and get the \"layers\" field\r\n let parsedOptions = stringifiedOptions\r\n ? JSON.parse(stringifiedOptions)\r\n : { layers: [] }\r\n const { layers: options } = parsedOptions\r\n\r\n // prepare data - turns into shape\r\n // [{layerName: , layerType: , data: , style: }, ...]\r\n const layerData = prepareData(data, options, sharedPageKey)\r\n setLayerData(layerData)\r\n }\r\n }, [widget, sharedPageKey])\r\n\r\n if (loading) {\r\n return null\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n
\r\n {'3d\r\n \r\n \r\n \r\n
\r\n \r\n {({ tooltipState }) => (\r\n \r\n )}\r\n \r\n \r\n
\r\n \r\n \r\n )\r\n}\r\n","import React, {\r\n useContext,\r\n useEffect,\r\n useState,\r\n useMemo,\r\n useCallback,\r\n} from 'react'\r\nimport {\r\n PieChart,\r\n Pie,\r\n Legend,\r\n Cell,\r\n Sector,\r\n Tooltip,\r\n ResponsiveContainer,\r\n} from 'recharts'\r\n\r\nimport { WidgetDataContext } from '../../../wrappers/WidgetDataContext'\r\n\r\nimport { formatNumber } from '../../../../utils/numberFormatting'\r\nimport { ColorContext } from '../../../wrappers/ColorContext'\r\n\r\nconst createInitialState = (uniqueGroups) =>\r\n uniqueGroups.reduce(\r\n (acc, curr) => ({\r\n ...acc,\r\n [curr]: { hidden: false, highlight: false },\r\n }),\r\n {}\r\n )\r\n\r\nconst resetStateField = (displayState, field, state) =>\r\n Object.keys(displayState).reduce(\r\n (acc, curr) => ({\r\n ...acc,\r\n [curr]: { ...displayState[curr], [field]: state },\r\n }),\r\n {}\r\n )\r\n\r\nconst renderActiveShape = (props) => {\r\n const {\r\n cx,\r\n cy,\r\n innerRadius,\r\n outerRadius,\r\n startAngle,\r\n endAngle,\r\n fill,\r\n payload,\r\n } = props\r\n return (\r\n \r\n \r\n {payload.name}\r\n \r\n \r\n \r\n \r\n )\r\n}\r\n\r\nconst CustomTooltip = ({ payload, data, groupKey }) => {\r\n const label = payload?.[0]?.payload[groupKey]\r\n const value = payload?.[0]?.payload['Value']\r\n const total = data.map((d) => d['Value']).reduce((a, b) => a + b, 0)\r\n const percent = formatNumber((value / total) * 100)\r\n return (\r\n \r\n \r\n {label ? label : 'Null'}:{' '}\r\n {formatNumber(payload?.[0]?.payload?.Value)} ({percent}%)\r\n \r\n \r\n )\r\n}\r\n\r\nconst CustomLegend = ({\r\n legendPayload,\r\n payload,\r\n activeLegendIndex,\r\n toggleDisplayState,\r\n}) => {\r\n const getLegendValue = useCallback(\r\n (name) => {\r\n const value = payload.find((x) => x.value === name)?.payload\r\n ?.percent\r\n if (value) {\r\n return formatNumber(value * 100)\r\n } else {\r\n return null\r\n }\r\n },\r\n [payload, legendPayload]\r\n )\r\n\r\n return (\r\n
    \r\n {legendPayload.map((item, index) => (\r\n \r\n toggleDisplayState(item, 'hidden')}\r\n >\r\n \r\n \r\n \r\n toggleDisplayState(item, 'highlight', true)\r\n }\r\n >\r\n {item.value}\r\n {activeLegendIndex === index\r\n ? `(${getLegendValue(item.value)}%)`\r\n : null}\r\n \r\n \r\n ))}\r\n
\r\n )\r\n}\r\n\r\nconst Chart = ({ data, showLegend }) => {\r\n const { colorMap, updateColorMap, getAssociatedColor } = useContext(ColorContext)\r\n // get the column name key for grouping, eg in { Value: , District: }\r\n // groupKey == 'District'\r\n const groupKey = useMemo(\r\n () => Object.keys(data[0]).find((x) => !x.includes('Value')),\r\n [data]\r\n )\r\n\r\n // get a list of all unique groups that are present in the data\r\n // and sort alphabetically\r\n const uniqueGroups = useMemo(\r\n () =>\r\n [...new Set(data.map((x) => x[groupKey]))]\r\n .sort()\r\n .map((x) => (x === null ? (x = '') : x)),\r\n [data, groupKey]\r\n )\r\n\r\n const [displayState, setDisplayState] = useState(\r\n createInitialState(uniqueGroups)\r\n )\r\n\r\n const toggleDisplayState = useCallback(\r\n (e, field, unique) => {\r\n // if only one can be selected at a time,\r\n // then we want to update state so that\r\n // all other values are false\r\n if (unique && !displayState[e.value][field]) {\r\n const newDisplayState = resetStateField(\r\n displayState,\r\n field,\r\n false\r\n )\r\n setDisplayState({\r\n ...newDisplayState,\r\n [e.value]: {\r\n ...newDisplayState[e.value],\r\n [field]: true,\r\n },\r\n })\r\n } else {\r\n // if we are hiding a pie slice,\r\n // and it is the currently highlighted slice,\r\n // we want to remove the highlight state on that slice\r\n if (field === 'hidden' && displayState[e.value].highlight) {\r\n setDisplayState({\r\n ...displayState,\r\n [e.value]: {\r\n highlight: false,\r\n [field]: !displayState[e.value][field],\r\n },\r\n })\r\n } else {\r\n // otherwise, we simply toggle the field\r\n setDisplayState({\r\n ...displayState,\r\n [e.value]: {\r\n ...displayState[e.value],\r\n [field]: !displayState[e.value][field],\r\n },\r\n })\r\n }\r\n }\r\n },\r\n [displayState, setDisplayState]\r\n )\r\n\r\n const onShowLegendChange = useCallback(\r\n (showLegend) => {\r\n if (\r\n showLegend === 'all' &&\r\n Object.keys(displayState).some(\r\n (x) => displayState[x].hidden === true\r\n )\r\n ) {\r\n setDisplayState(resetStateField(displayState, 'hidden', false))\r\n }\r\n if (\r\n showLegend === 'none' &&\r\n Object.keys(displayState).some(\r\n (x) => displayState[x].hidden === false\r\n )\r\n ) {\r\n const resetHiddenField = resetStateField(\r\n displayState,\r\n 'hidden',\r\n true\r\n )\r\n const newDisplayState = resetStateField(\r\n resetHiddenField,\r\n 'highlight',\r\n false\r\n )\r\n setDisplayState(newDisplayState)\r\n }\r\n },\r\n [setDisplayState, displayState]\r\n )\r\n\r\n useEffect(() => {\r\n updateColorMap(groupKey, uniqueGroups)\r\n }, [uniqueGroups, groupKey])\r\n\r\n useEffect(() => {\r\n onShowLegendChange(showLegend)\r\n }, [showLegend])\r\n\r\n const colors = useMemo(\r\n () =>\r\n uniqueGroups.reduce((acc, curr, idx) => {\r\n return {\r\n ...acc,\r\n [curr]: getAssociatedColor(curr, groupKey),\r\n }\r\n }, {}),\r\n [uniqueGroups, groupKey, colorMap]\r\n )\r\n\r\n const displayGroups = useMemo(\r\n () =>\r\n uniqueGroups\r\n .filter((groupName) => !displayState[groupName].hidden)\r\n .sort(),\r\n [uniqueGroups, displayState]\r\n )\r\n\r\n const cells = useMemo(\r\n () =>\r\n displayGroups.map((groupName, idx) => {\r\n return (\r\n \r\n )\r\n }),\r\n [displayGroups, colors]\r\n )\r\n\r\n // legend includes all groups, so the active index for the\r\n // legend is the uniquegroups idx which is highlighted\r\n const activeLegendIndex = useMemo(\r\n () => uniqueGroups.findIndex((x) => displayState[x].highlight === true && !displayState[x].hidden === true),\r\n [displayState, uniqueGroups]\r\n )\r\n\r\n // pie chart does not include all groups, so the active index for the\r\n // legend is the displayGroups idx which is highlighted\r\n const activeIndex = useMemo(\r\n () =>\r\n displayGroups.findIndex((x) => displayState[x].highlight === true),\r\n [displayState, displayGroups]\r\n )\r\n\r\n const chartData = useMemo(\r\n () =>\r\n data\r\n .filter((d) => !displayState[d[groupKey]].hidden)\r\n .sort((a, b) =>\r\n typeof a[groupKey] === 'string' &&\r\n typeof b[groupKey] === 'string'\r\n ? a[groupKey]\r\n .toLowerCase()\r\n .localeCompare(b[groupKey].toLowerCase())\r\n : a[groupKey] - b[groupKey]\r\n ),\r\n [displayState, groupKey, data]\r\n )\r\n\r\n const legendPayload = useMemo(\r\n () =>\r\n uniqueGroups.map((groupName) => ({\r\n color: !displayState[groupName].hidden\r\n ? colors[groupName]\r\n : 'rgb(204, 204, 204)',\r\n type: 'rect',\r\n value: groupName,\r\n id: groupName,\r\n })),\r\n [displayState, colors, uniqueGroups]\r\n )\r\n\r\n return (\r\n \r\n \r\n \r\n {cells}\r\n \r\n \r\n }\r\n />\r\n \r\n }\r\n verticalAlign=\"top\"\r\n formatter={(a, b) => {\r\n return b.value ? b.value : 'Null'\r\n }}\r\n data={data}\r\n wrapperStyle={{\r\n display: showLegend ? '' : 'none',\r\n top: 1,\r\n left: 0,\r\n overflowX: 'hidden',\r\n overflowY: 'scroll',\r\n alignItems: 'center',\r\n width: '100%',\r\n }}\r\n />\r\n \r\n \r\n )\r\n}\r\n\r\nexport default () => {\r\n const { widgetData: widget, showLegend } = useContext(WidgetDataContext)\r\n const data = widget ? widget.Data : null\r\n //added to prevent errors from groupKeys with null values\r\n\r\n const noNullData = data.map((x) => {\r\n Object.keys(x).map((y) => (x[y] === null ? (x[y] = 'Null') : x[y]))\r\n return x\r\n })\r\n return \r\n}\r\n","import React, { useContext } from 'react'\r\n\r\nimport { WidgetDataContext } from '../../../wrappers/WidgetDataContext'\r\n\r\nimport formatValue from '../../../../utils/valueFormatting'\r\nimport stringFields from '../../../../utils/constants/widgets/stringFields'\r\n\r\nexport default () => {\r\n const { widgetData: widget } = useContext(WidgetDataContext)\r\n\r\n // data is the first row of the widget.Data field\r\n const data = (widget && widget.Data && widget.Data.length) ? widget.Data[0] : null\r\n\r\n // map the data ({: , : , ...})\r\n // into an array of field, value pairs\r\n const fieldData = Object.keys(data).map(field => ({field, value: data[field]}))\r\n\r\n // arrange the field data and display\r\n return (\r\n
\r\n
\r\n
\r\n {fieldData.map((f, idx) => (\r\n
\r\n
\r\n \r\n
{stringFields.includes(f.field) ? f.value : formatValue(f.value)}
\r\n
\r\n
\r\n ))}\r\n
\r\n
\r\n
\r\n )\r\n}","import React from 'react'\r\nimport { dateToString } from '../../../../utils/dateFormatting'\r\n\r\nexport default ({ active, payload, label }) => {\r\n if (active) {\r\n const formattedLabel = dateToString(label)\r\n return (\r\n
\r\n

{formattedLabel}

\r\n
    \r\n {payload && payload.map((x, idx) =>\r\n x.name !== 'NoTooltipItem' ? (\r\n
  • \r\n \r\n {x.name}\r\n \r\n : \r\n \r\n {Math.round(x.value * 100) / 100}\r\n \r\n
  • \r\n ) : null\r\n )}\r\n
\r\n
\r\n )\r\n }\r\n return null\r\n}\r\n","import React, { useContext, useEffect, useState, useMemo } from 'react'\r\nimport {\r\n XAxis,\r\n Line,\r\n YAxis,\r\n Label,\r\n CartesianGrid,\r\n Tooltip,\r\n Legend,\r\n ResponsiveContainer,\r\n Scatter,\r\n ComposedChart\r\n} from 'recharts'\r\nimport dayjs from 'dayjs'\r\n\r\nimport { WidgetDataContext } from '../../../wrappers/WidgetDataContext'\r\nimport CustomTooltip from './CustomTooltip'\r\nimport { formatNumber } from '../../../../utils/numberFormatting'\r\nimport { dateToString } from '../../../../utils/dateFormatting'\r\nimport getHiddenColumns from '../../../../utils/widgets/getHiddenColumns'\r\nimport { ColorContext } from '../../../wrappers/ColorContext'\r\n\r\nconst CustomLegend = ({ legendPayload, bold, setBold, updateHiddenState }) => {\r\n return (\r\n
    \r\n {legendPayload.map((item, index) => (\r\n \r\n updateHiddenState(item, index)}\r\n >\r\n \r\n \r\n \r\n bold && bold === item.value\r\n ? setBold(null)\r\n : setBold(item.value)\r\n }\r\n >\r\n {item.value}\r\n \r\n \r\n ))}\r\n
\r\n )\r\n}\r\n\r\nconst getSeriesFromData = (data, hiddenColumns) => {\r\n // if there is not a 'Value' column, then the series\r\n // values are stored in a column for each series name\r\n const seriesAreDistinctColumns =\r\n typeof Object.keys(data[0]).find((x) => x.includes('Value')) ===\r\n 'undefined'\r\n\r\n if (seriesAreDistinctColumns) {\r\n // get the line chart series names, eg in { Date: , Series A: , Series B: }\r\n // => groupKeys == ['Series A', 'Series B']\r\n\r\n // filter out Date and any hiddenColumns\r\n const groupKeys = data.reduce(\r\n (acc, curr) => [\r\n ...acc,\r\n ...Object.keys(curr).filter((x) => !x.includes('Date')).filter(x => !hiddenColumns.includes(x)),\r\n ],\r\n []\r\n )\r\n\r\n // get a list of all unique groups that are present in the data\r\n // => ['Series A', 'Series B']\r\n const uniqueGroups = [...new Set([...groupKeys])].sort()\r\n\r\n // return data + group names\r\n return [data, uniqueGroups, null]\r\n } else {\r\n // otherwise, the group key is just the column that is not Value or Date\r\n // eg data[0] = {'Value': 0, 'Date': '12/12/12', 'Form Type': 'Wow'}\r\n // => groupKey = 'Form Type'\r\n const groupKey = Object.keys(data[0]).find(\r\n (x) => !(x.includes('Date') || x.includes('Value')) && !(hiddenColumns.includes(x))\r\n )\r\n\r\n // get the set of all unique values in the column specified by groupKey\r\n const uniqueGroups = [...new Set(data.map((x) => x[groupKey]))].sort()\r\n\r\n // aggregate line chart data using unique dates. eg\r\n // [{Date: date1, District: 1, Value: 100}, {Date: date1, District: 2, Value: 200}]\r\n // turns into [{Date: date1, \"1\": 100, \"2\": 200}]\r\n const chartData = [...new Set(data.map((d) => d.Date))].map((date) => {\r\n const dateEntry = { Date: date }\r\n return data\r\n .filter((x) => x.Date === date) // get entries associated w/ the current date\r\n .reduce((acc, curr) => {\r\n const groupName = curr[groupKey]\r\n const value = curr['Value']\r\n return {\r\n ...acc,\r\n [groupName]: value,\r\n }\r\n }, dateEntry)\r\n })\r\n\r\n return [chartData, uniqueGroups, groupKey]\r\n }\r\n}\r\n\r\n\r\nexport default () => {\r\n const { widgetData: widget, showLegend } = useContext(WidgetDataContext)\r\n const { colorMap, updateColorMap, getAssociatedColor } = useContext(ColorContext)\r\n const data = widget ? widget.Data : null\r\n const [legend, setLegend] = useState([])\r\n\r\n const preparedData = data\r\n .filter((d) => !!d.Date) // remove data w/out dates\r\n .map((d) => ({\r\n ...d,\r\n Date: dayjs(d.Date).toDate().getTime(),\r\n })) // transform dates to MM/DD/YYYY format\r\n\r\n const hiddenColumns = getHiddenColumns(widget)\r\n const [chartData, uniqueGroups, groupKey] = getSeriesFromData(preparedData, hiddenColumns)\r\n\r\n // create state to track hidden prop for each individual line\r\n const [hiddenState, setHiddenState] = useState(\r\n uniqueGroups.reduce((acc, curr) => ({ ...acc, [curr]: false }), {})\r\n )\r\n const [bold, setBold] = useState(null)\r\n\r\n useEffect(() => {\r\n updateColorMap(groupKey, uniqueGroups)\r\n }, [uniqueGroups, groupKey])\r\n\r\n \r\n useEffect(() => {\r\n if (showLegend === 'all' && Object.values(hiddenState).includes(true)) {\r\n setHiddenState(\r\n uniqueGroups.reduce(\r\n (acc, curr) => ({ ...acc, [curr]: false }),\r\n {}\r\n )\r\n )\r\n }\r\n if (\r\n showLegend === 'none' &&\r\n Object.values(hiddenState).includes(false)\r\n ) {\r\n setHiddenState(\r\n uniqueGroups.reduce(\r\n (acc, curr) => ({ ...acc, [curr]: true }),\r\n {}\r\n )\r\n )\r\n }\r\n }, [showLegend])\r\n\r\n useEffect(() => {\r\n setLegend(() =>\r\n uniqueGroups.map((groupName, idx) => ({\r\n color: !hiddenState[groupName]\r\n ? getAssociatedColor(groupName, groupKey)\r\n : 'rgb(204, 204, 204)',\r\n type: 'line',\r\n dataKey: groupName,\r\n value: groupName,\r\n hide: hiddenState[groupName] ? true : false,\r\n }))\r\n )\r\n }, [hiddenState, colorMap])\r\n\r\n const colors = useMemo(\r\n () =>\r\n uniqueGroups.reduce((acc, curr, idx) => {\r\n return {\r\n ...acc,\r\n [curr]: getAssociatedColor(curr, groupKey),\r\n }\r\n }, {}),\r\n [uniqueGroups, groupKey, colorMap]\r\n )\r\n\r\n const updateHiddenState = (e) => {\r\n setHiddenState((previousState) => ({\r\n ...previousState,\r\n [e.dataKey]: !previousState[e.dataKey],\r\n }))\r\n }\r\n\r\n const dataMax = Math.max(\r\n ...chartData.map((entry) =>\r\n Math.max(\r\n ...Object.keys(entry).map((key) =>\r\n key !== 'Date' && !hiddenState[key] ? entry[key] : 0\r\n )\r\n )\r\n )\r\n )\r\n const dataMin = Math.min(\r\n ...chartData.map((entry) =>\r\n Math.min(\r\n ...Object.keys(entry).map((key) =>\r\n key !== 'Date' && !hiddenState[key] ? entry[key] : Infinity\r\n )\r\n )\r\n )\r\n )\r\n\r\n // generate a line component for each\r\n // individual line\r\n const Lines = uniqueGroups.map((groupName, idx) => (\r\n \r\n ))\r\n\r\n\r\n // // generate a line component for each\r\n // // individual line\r\n const Scatters = uniqueGroups.map((groupName, idx) => {\r\n return (\r\n !!x[groupName])}\r\n key={`best-fit-${groupName}`}\r\n dataKey={groupName}\r\n lineType=\"fitting\"\r\n name={'NoTooltipItem'}\r\n line={{\r\n stroke: colors[groupName],\r\n strokeWidth: bold === groupName ? 3 : 1,\r\n }}\r\n fill=\"none\"\r\n hide={hiddenState[groupName]}\r\n />\r\n )\r\n })\r\n\r\n return (\r\n \r\n \r\n \r\n dateToString(unixTime)}\r\n >\r\n \r\n \r\n formatNumber(value, 'compact')}\r\n domain={[dataMin, dataMax]}\r\n allowDataOverflow={true}\r\n >\r\n \r\n \r\n \r\n }\r\n verticalAlign=\"top\"\r\n wrapperStyle={{\r\n display: showLegend ? '' : 'none',\r\n top: 1,\r\n left: 0,\r\n overflowX: 'hidden',\r\n overflowY: 'scroll',\r\n alignItems: 'center',\r\n width: '100%',\r\n }}\r\n />\r\n }\r\n formatter={(value) => formatNumber(value)}\r\n labelFormatter={(label) => dateToString(label)}\r\n isAnimationActive={false}\r\n wrapperStyle={\r\n Object.values(hiddenState).filter((x) => x === false)\r\n .length > 10\r\n ? { fontSize: '.75rem' }\r\n : { fontSize: '1rem' }\r\n }\r\n itemStyle={{ padding: '0px' }}\r\n />\r\n {Lines}\r\n {Scatters}\r\n \r\n \r\n )\r\n}\r\n","import React, { useContext, useEffect, useRef, useMemo } from 'react'\r\n\r\nimport { WidgetDataContext } from '../../../wrappers/WidgetDataContext'\r\nimport NoDataComponent from '../NoDataComponent'\r\n\r\nconst TextWidget = () => {\r\n const { widgetData: widget } = useContext(WidgetDataContext)\r\n const textRef = useRef(null)\r\n const data = widget ? widget.Data : null\r\n const options = widget ? widget.WidgetOptions : null\r\n const style = useMemo(() => {\r\n if (options) {\r\n const json = JSON.parse(options)\r\n if (json) {\r\n return json.style\r\n }\r\n }\r\n return null\r\n }, [options])\r\n\r\n useEffect(() => {\r\n textRef.current.setAttribute('style', style)\r\n }, [style])\r\n\r\n if (!(data && data.length && data[0].Value)) {\r\n return \r\n }\r\n\r\n return (\r\n
\r\n
\r\n {data[0].Value}\r\n
\r\n
\r\n )\r\n\r\n}\r\n\r\nexport default TextWidget","import React, { useContext } from 'react'\r\n\r\nimport { WidgetDataContext } from '../../wrappers/WidgetDataContext'\r\n\r\nimport WidgetWrapper from './WidgetWrapper'\r\nimport Number from './number/Number'\r\nimport Grid from './grid/Grid'\r\nimport BarChart from './bar/BarChart'\r\nimport LineChart from './line/LineChart'\r\nimport ThemeMap from './map/theme-map/ThemeMap'\r\nimport FeatureMap from './map/feature-map/FeatureMap'\r\nimport ThreeDimensionalMap from './map/3d-map/ThreeDimensionalMap'\r\nimport PieChart from './pie/PieChart'\r\nimport Form from './form/Form'\r\nimport ScatterChart from './scatter/ScatterChart'\r\nimport TextWidget from './text/Text'\r\n\r\nconst getWidgetComponentFromWidgetType = (widgetType) => {\r\n switch (widgetType) {\r\n case 'Number':\r\n return Number\r\n case 'Grid':\r\n return Grid\r\n case 'BarChart':\r\n return BarChart\r\n case 'LineChart':\r\n return LineChart\r\n case 'ScatterChart':\r\n return ScatterChart\r\n case 'ThemeMap':\r\n return ThemeMap\r\n case 'PieChart':\r\n return PieChart\r\n case 'Form':\r\n return Form\r\n case '2DFeatureMap':\r\n return FeatureMap\r\n case '3DFeatureMap':\r\n return ThreeDimensionalMap\r\n case 'Text':\r\n return TextWidget\r\n default:\r\n return 'div'\r\n }\r\n}\r\n\r\nexport default () => {\r\n const { widgetType } = useContext(WidgetDataContext)\r\n const WidgetComponent = getWidgetComponentFromWidgetType(widgetType)\r\n return (\r\n \r\n {React.createElement(WidgetComponent)}\r\n \r\n )\r\n}\r\n","import React, { useContext } from 'react'\r\nimport { Responsive, WidthProvider } from 'react-grid-layout'\r\n\r\nimport { CurrentDashboardContext } from '../../wrappers/CurrentDashboardContext'\r\nimport WidgetDataContextProvider from '../../wrappers/WidgetDataContext'\r\nimport { cols, breakpoints, rowHeight } from '../../../utils/widgets/getLayouts'\r\nimport Widget from './Widget'\r\nimport { Spinner } from '../LoadingSpinner'\r\n\r\nconst ResponsiveGridLayout = WidthProvider(Responsive)\r\n\r\nexport default () => {\r\n const {\r\n currentWidgetGroup: { Widgets: widgets },\r\n editingLayout,\r\n setLayoutState,\r\n layoutState,\r\n expandedWidgetId,\r\n pageLoading,\r\n } = useContext(CurrentDashboardContext)\r\n\r\n const children = React.useMemo(() => {\r\n if (!widgets) {\r\n return null\r\n }\r\n return widgets.map((widget) => {\r\n return (\r\n \r\n \r\n \r\n \r\n \r\n )\r\n })\r\n }, [expandedWidgetId, widgets, editingLayout])\r\n\r\n if (!widgets || !layoutState || !Object.keys(layoutState).length) {\r\n if (pageLoading) {\r\n return \r\n } else {\r\n return null\r\n }\r\n }\r\n\r\n const onLayoutChange = (layout, allLayouts) => {\r\n setLayoutState(allLayouts)\r\n }\r\n\r\n return (\r\n
\r\n \r\n {children}\r\n \r\n
\r\n )\r\n}\r\n\r\n","import React from 'react'\r\nimport Widgets from '../../elem/widgets/Widgets'\r\n\r\nexport default () => (\r\n
\r\n \r\n
\r\n)\r\n","import React, { useContext, useState } from 'react'\r\nimport { Redirect } from 'react-router-dom'\r\nimport toast from '../../elem/Toast'\r\nimport AdminLayout from '../../elem/admin/AdminLayout'\r\nimport { FaCheckCircle, FaTimesCircle } from 'react-icons/fa'\r\nimport withConfig from '../../wrappers/withConfig'\r\nimport { APIRequestContext } from '../../wrappers/APIRequestContext'\r\n\r\n\r\n\r\nconst DeleteItem = ({config, location}) => {\r\n const {deleteProps: item} = location\r\n const itemType = item.itemType\r\n const [redirect, setRedirect] = useState(null)\r\n const { authenticatedFetch } = useContext(APIRequestContext)\r\n const { API_URL } = config\r\n\r\n const DELETE = () => {\r\n return {\r\n method: 'DELETE',\r\n }\r\n }\r\n\r\n const deleteItem = (id) => {\r\n authenticatedFetch(`${API_URL}/admin/${itemType}/delete/${id}`, DELETE())\r\n .then(async (response) => {\r\n if (response.ok) {\r\n return\r\n } else {\r\n const error = await response.text()\r\n throw new Error(error)\r\n }\r\n })\r\n .catch((e) => {\r\n toast({\r\n level: 'error',\r\n message:\r\n `Delete ${itemType}:` +\r\n (e.message ? e.message : `${itemType} delete failed`),\r\n })\r\n })\r\n .finally(() => {\r\n setRedirect(itemType)\r\n })\r\n }\r\n\r\n if (redirect === 'widget') {\r\n return (\r\n \r\n )\r\n }\r\n \r\n if (redirect === 'page') {\r\n return (\r\n \r\n )\r\n }\r\n\r\n if (redirect === 'dashboard') {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return (\r\n \r\n \r\n {\r\n if (item.id >= 3) {\r\n deleteItem(item.id)\r\n }\r\n }}\r\n >\r\n \r\n \r\n setRedirect(itemType)}\r\n >\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default withConfig(DeleteItem)\r\n","import React, {useState, useEffect, useContext} from 'react'\r\nimport Select from '../form/Select'\r\nimport toast from '../Toast'\r\nimport withConfig from '../../wrappers/withConfig'\r\nimport { APIRequestContext } from '../../wrappers/APIRequestContext'\r\n\r\n\r\nconst WidgetTypes = ({\r\n config,\r\n control,\r\n initialValue,\r\n disabled,\r\n value,\r\n onChange,\r\n helper,\r\n errors\r\n\r\n}) => {\r\n const { authenticatedFetch } = useContext(APIRequestContext)\r\n const { API_URL } = config\r\n const [widgetTypes, setWidgetTypes] = useState([])\r\n const widgetOptions = widgetTypes.map((x) => ({ label: x, value: x }))\r\n \r\n useEffect(() => {\r\n authenticatedFetch(`${API_URL}/widget/getWidgetTypes`)\r\n .then(async (response) => {\r\n if (response.ok) {\r\n return response.json()\r\n } else {\r\n const error = await response.text()\r\n throw new Error(error)\r\n }\r\n })\r\n .then((response) => {\r\n setWidgetTypes(response)\r\n })\r\n .catch((e) => {\r\n toast({\r\n level: 'error',\r\n message:\r\n 'Widget Types:' +\r\n (e.message\r\n ? e.message\r\n : 'Unable to connect to the server'),\r\n })\r\n })\r\n }, [API_URL])\r\n \r\n return(\r\n \r\n)\r\n }\r\n\r\nexport default withConfig(WidgetTypes)\r\n","import React, { useState, useEffect, useContext } from 'react'\r\nimport Select from '../form/Select'\r\nimport toast from '../Toast'\r\nimport withConfig from '../../wrappers/withConfig'\r\nimport { APIRequestContext } from '../../wrappers/APIRequestContext'\r\n\r\nconst Databases = ({\r\n config,\r\n control,\r\n initialValue,\r\n disabled,\r\n value,\r\n onChange,\r\n errors,\r\n helper\r\n}) => {\r\n const { API_URL } = config\r\n const { authenticatedFetch } = useContext(APIRequestContext)\r\n const [databases, setDatabases] = useState([])\r\n const databaseOptions = databases.map((x) => ({ label: x, value: x }))\r\n\r\n useEffect(() => {\r\n authenticatedFetch(`${API_URL}/admin/getTargetDatabases`)\r\n .then(async (response) => {\r\n if (response.ok) {\r\n return response.json()\r\n } else {\r\n const error = await response.text()\r\n throw new Error(error)\r\n }\r\n })\r\n .then((response) => {\r\n setDatabases(response.data)\r\n })\r\n .catch((e) => {\r\n toast({\r\n level: 'error',\r\n message:\r\n 'Get Databases:' +\r\n (e.message\r\n ? e.message\r\n : 'Unable to connect to the server'),\r\n })\r\n })\r\n }, [API_URL])\r\n\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport default withConfig(Databases)\r\n","import React from 'react'\r\nimport CreatableSelect from 'react-select/creatable'\r\nimport { Controller } from 'react-hook-form'\r\nimport { FaInfoCircle } from 'react-icons/fa'\r\nimport { DefaultTooltip as Tooltip } from '../Tooltip'\r\n\r\nexport default ({\r\n options,\r\n control,\r\n initialValue,\r\n name,\r\n disabled,\r\n label,\r\n helper,\r\n rules,\r\n example,\r\n onChange,\r\n className,\r\n errors,\r\n value,\r\n}) => {\r\n return (\r\n
\r\n
\r\n
\r\n \r\n
\r\n
\r\n
\r\n {helper && (\r\n
\r\n \r\n
\r\n )}\r\n
\r\n \r\n }\r\n name={name}\r\n control={control}\r\n defaultValue={\r\n initialValue ? initialValue : null\r\n }\r\n key={`my_unique_select_key__${JSON.stringify(\r\n value\r\n )}`}\r\n value={value}\r\n rules={rules}\r\n onChange={onChange}\r\n />\r\n
\r\n
\r\n
\r\n
\r\n\r\n

\r\n {errors && errors[name] ? errors[name].message : null}\r\n

\r\n
\r\n )\r\n}\r\n","import React, { useMemo } from 'react'\r\nimport { useTable, usePagination } from 'react-table'\r\n\r\nimport NoDataComponent from '../../../elem/widgets/NoDataComponent'\r\n\r\nconst createColumns = (data) => {\r\n const keys = data && data.length ? Object.keys(data[0]) : []\r\n return keys.map((key) => ({ Header: key, accessor: key }))\r\n}\r\n\r\nconst PreviewQueryTable = ({ data }) => {\r\n const removeEmpty = (array) => {\r\n array.forEach((obj) => {\r\n Object.keys(obj).forEach((k) => {\r\n if (typeof obj[k] === 'object') {\r\n obj[k] = ''\r\n }\r\n })\r\n })\r\n return array\r\n }\r\n\r\n const columns = useMemo(() => createColumns(data), [data])\r\n const tableData = useMemo(() => removeEmpty(data), [data])\r\n const {\r\n getTableProps,\r\n getTableBodyProps,\r\n headerGroups,\r\n prepareRow,\r\n page,\r\n canPreviousPage,\r\n canNextPage,\r\n pageOptions,\r\n nextPage,\r\n previousPage,\r\n state: { pageIndex },\r\n } = useTable(\r\n {\r\n columns,\r\n data: tableData,\r\n initialState: { pageIndex: 0, pageSize: 5 },\r\n },\r\n usePagination\r\n )\r\n\r\n if (!(data && data.length)) {\r\n return \r\n }\r\n\r\n return (\r\n
\r\n

Response Data Preview

\r\n \r\n
\r\n {headerGroups.map((headerGroup) => (\r\n \r\n {headerGroup.headers.map((column) => (\r\n \r\n ))}\r\n \r\n ))}\r\n \r\n \r\n {page.map((row, i) => {\r\n prepareRow(row)\r\n return (\r\n \r\n {row.cells.map((cell) => {\r\n return (\r\n \r\n )\r\n })}\r\n \r\n )\r\n })}\r\n \r\n
{cell.render('Cell')}
\r\n {column.render('Header')}\r\n
\r\n {cell.render('Cell')}\r\n
\r\n
\r\n previousPage()}\r\n disabled={!canPreviousPage}\r\n >\r\n {'<'}\r\n {' '}\r\n \r\n Page{' '}\r\n \r\n {pageIndex + 1} of {pageOptions.length}\r\n {' '}\r\n \r\n nextPage()}\r\n disabled={!canNextPage}\r\n >\r\n {'>'}\r\n {' '}\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default PreviewQueryTable\r\n","import React, { useContext, useState } from 'react'\r\nimport toast from '../../../elem/Toast'\r\nimport { useForm } from 'react-hook-form'\r\nimport Select from '../../../elem/form/Select'\r\nimport WidgetTypes from '../../../elem/admin/SelectWidgetTypes'\r\nimport Databases from '../../../elem/admin/SelectDatabases'\r\nimport Input from '../../../elem/form/TextInput'\r\nimport Checkbox from '../../../elem/form/Checkbox'\r\nimport NumberInput from '../../../elem/form/NumberInput'\r\nimport MultiSelect from '../../../elem/form/MultiSelect'\r\nimport PreviewQueryTable from './PreviewQueryTable'\r\nimport { Link } from 'react-router-dom'\r\nimport withConfig from '../../../wrappers/withConfig'\r\nimport { APIRequestContext } from '../../../wrappers/APIRequestContext'\r\n\r\nconst CreateWidgetForm = ({ config, closeForm, back, page, dateFilter }) => {\r\n const { authenticatedFetch } = useContext(APIRequestContext)\r\n const { register, unregister, handleSubmit, control, errors } = useForm({\r\n mode: 'onChange',\r\n })\r\n const { API_URL } = config\r\n const [id, setId] = useState(null)\r\n const [type, setType] = useState('')\r\n const [query, setQuery] = useState(null)\r\n const [string, setString] = useState(null)\r\n const [preview, setPreview] = useState(null)\r\n const functionOptions = [\r\n { value: 'COUNT', label: 'Count (COUNT)' },\r\n { value: 'SUM', label: 'Sum (SUM)' },\r\n { value: 'AVG', label: 'Average (AVG)' },\r\n { value: 'MIN', label: 'Minimum (MIN)' },\r\n { value: 'MAX', label: 'Maximum (MAX)' },\r\n ]\r\n const initialState = {\r\n AggregateFunction: 'COUNT',\r\n AggregateColumn: '*',\r\n ApplyFiltersToBaseQuery: false,\r\n ApplyDateFilter: dateFilter,\r\n DetailKey: '',\r\n DetailKeyValue: '',\r\n GroupBy: '',\r\n NumRows: null,\r\n }\r\n\r\n const [state, setState] = useState(initialState)\r\n\r\n if (id) {\r\n closeForm(id)\r\n }\r\n\r\n const POST = (widget) => {\r\n return {\r\n method: 'POST',\r\n mode: 'cors',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Access-Control-Allow-Origin': '*',\r\n 'Access-Control-Allow-Headers':\r\n 'Access-Control-Allow-Origin, X-Requested-With, Content-Type, Accept',\r\n },\r\n body: JSON.stringify(widget),\r\n }\r\n }\r\n\r\n const generateQueryString = (data) => {\r\n authenticatedFetch(`${API_URL}/widget/generate`, POST(data))\r\n .then(async (response) => {\r\n const queryString = await response.text()\r\n if (response.ok) {\r\n return queryString\r\n } else {\r\n throw new Error(queryString)\r\n }\r\n })\r\n .then((response) => {\r\n setString(response)\r\n setQuery(response)\r\n })\r\n .catch((e) => {\r\n setString(e.message)\r\n })\r\n }\r\n\r\n const previewQuery = (queryString) => {\r\n setPreview(null)\r\n authenticatedFetch(`${API_URL}/widget/preview`, POST(queryString))\r\n .then(async (response) => {\r\n if (response.ok) {\r\n return response.json()\r\n } else {\r\n const error = await response.text()\r\n throw new Error(error)\r\n }\r\n })\r\n .then((response) => {\r\n setPreview(response.data)\r\n })\r\n .catch((e) => {\r\n toast({\r\n level: 'error',\r\n message:\r\n 'Create Widget:' +\r\n (e.message ? e.message : 'Query preview failed'),\r\n })\r\n })\r\n }\r\n\r\n const createWidget = (widget) => {\r\n authenticatedFetch(`${API_URL}/admin/widget/create`, POST(widget))\r\n .then(async (response) => {\r\n if (response.ok) {\r\n return response.json()\r\n } else {\r\n const error = await response.text()\r\n throw new Error(error)\r\n }\r\n })\r\n .then((response) => {\r\n setId(response)\r\n })\r\n .catch((e) => {\r\n toast({\r\n level: 'error',\r\n message:\r\n 'Create Widget:' +\r\n (e.message ? e.message : 'Widget create failed'),\r\n })\r\n })\r\n }\r\n\r\n const handleSelectChange = (event) => {\r\n setState({ ...state, [event[1].name]: event[0].value })\r\n if (event[1].name === 'WidgetType') {\r\n setType(event[0].value)\r\n }\r\n return event\r\n }\r\n\r\n const handleMultiChange = (event) => {\r\n event[0]\r\n ? setState({\r\n ...state,\r\n [event[1].name]: event[0]\r\n .map((x) => x.value)\r\n .toString()\r\n .replaceAll(',', '|'),\r\n })\r\n : delete state[event[1].name]\r\n return event[0]\r\n }\r\n\r\n const formChange = (event) => {\r\n if (event.target.name !== '') {\r\n setState({\r\n ...state,\r\n [event.target.name]: event.target.value,\r\n })\r\n }\r\n if (event.target.type === 'checkbox') {\r\n setState({\r\n ...state,\r\n [event.target.name]: event.target.checked,\r\n })\r\n }\r\n if (event.target.name === 'NumRows') {\r\n setState({\r\n ...state,\r\n NumRows:\r\n event.target.value !== ''\r\n ? Number(event.target.value)\r\n : null,\r\n })\r\n }\r\n }\r\n\r\n const handleClick = () => {\r\n const queryString = {\r\n TargetDatabase: state.TargetDatabase,\r\n QueryString: string,\r\n }\r\n previewQuery(queryString)\r\n }\r\n\r\n const trimData = (data) => {\r\n Object.keys(data).map((key) =>\r\n typeof data[key] === 'string'\r\n ? (data[key] = data[key].replace(/\\s\\s+/g, ' ').trim())\r\n : data[key]\r\n )\r\n return data\r\n }\r\n\r\n const onSubmit = (data) => {\r\n createWidget({ ...trimData(state), PageId: page })\r\n }\r\n\r\n const validateOptions = (value) => {\r\n try {\r\n JSON.parse(value)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n generateQueryString(state)}\r\n >\r\n \r\n \r\n \r\n \r\n\r\n \r\n \r\n \r\n \r\n ”, “style”: {“fillColor”: “fillColor1”, “strokeColor”: “strokeColor1”, “zIndex”: “zIndex1”}}, {“layerName”: “”, “style”: {“fillColor”: “fillColor2”, “strokeColor”: “strokeColor2”, “zIndex”: “zIndex2”}, …]}'\r\n For 3DFeatureMap, shape should be:\r\n '{“layers”: [{“layerName”: “”, “style”: {“color”: “color1”, “width”: “width1”, “zIndex”: “zIndex1”}}, {“layerName”: “”, “style”: {“color”: “color2”, “width”: “width2”, “zIndex”: “zIndex2”}, …]}'\"\r\n />\r\n \r\n \r\n \r\n \r\n \r\n {string ? `Query String: ${string}` : null}\r\n
\r\n \r\n Preview Query\r\n \r\n \r\n \r\n
\r\n \r\n
\r\n \r\n
\r\n \r\n {preview ? : null}\r\n \r\n )\r\n}\r\n\r\nexport default withConfig(CreateWidgetForm)\r\n","import React, { useState, useContext } from 'react'\r\nimport CreateWidgetForm from './CreateWidgetForm'\r\nimport { Redirect } from 'react-router-dom'\r\nimport AdminLayout from '../../../elem/admin/AdminLayout'\r\nimport {CurrentDashboardContext} from '../../../wrappers/CurrentDashboardContext'\r\n\r\nconst CreateWidget = () => {\r\n\r\n const [widgetId, setWidgetId] = useState(null)\r\n const { currentWidgetGroup, currentDashboard, pageId, setNewObject } = useContext(CurrentDashboardContext)\r\n const id = Number(pageId)\r\n\r\n if (!currentDashboard || !Object.keys(currentWidgetGroup).length) {\r\n return null\r\n }\r\n \r\n const closeForm = (response) => {\r\n setWidgetId(response)\r\n }\r\n \r\n if (widgetId) {\r\n setNewObject(widgetId)\r\n return (\r\n \r\n )\r\n }\r\n return (\r\n \r\n \r\n \r\n )\r\n}\r\n\r\nexport default CreateWidget","import React, { useContext, useState } from 'react'\r\nimport toast from '../../../elem/Toast'\r\nimport { useForm } from 'react-hook-form'\r\nimport Select from '../../../elem/form/Select'\r\nimport WidgetTypes from '../../../elem/admin/SelectWidgetTypes'\r\nimport Databases from '../../../elem/admin/SelectDatabases'\r\nimport Input from '../../../elem/form/TextInput'\r\nimport Checkbox from '../../../elem/form/Checkbox'\r\nimport NumberInput from '../../../elem/form/NumberInput'\r\nimport MultiSelect from '../../../elem/form/MultiSelect'\r\nimport PreviewQueryTable from './PreviewQueryTable'\r\nimport withConfig from '../../../wrappers/withConfig'\r\n\r\nimport { FaEdit, FaCheckCircle, FaTimesCircle } from 'react-icons/fa'\r\nimport { APIRequestContext } from '../../../wrappers/APIRequestContext'\r\n\r\nconst EditWidgetForm = ({ config, widget, closeForm }) => {\r\n const { authenticatedFetch } = useContext(APIRequestContext)\r\n const { register, handleSubmit, control, errors, unregister } = useForm({\r\n mode: 'onChange',\r\n })\r\n const { API_URL } = config\r\n const [type, setType] = useState(widget.WidgetType)\r\n const [query, setQuery] = useState(null)\r\n const [string, setString] = useState(null)\r\n const [preview, setPreview] = useState(null)\r\n const functionOptions = [\r\n { value: 'COUNT', label: 'Count (COUNT)' },\r\n { value: 'SUM', label: 'Sum (SUM)' },\r\n { value: 'AVG', label: 'Average (AVG)' },\r\n { value: 'MIN', label: 'Minimum (MIN)' },\r\n { value: 'MAX', label: 'Maximum (MAX)' },\r\n ]\r\n\r\n const [editing, setEditing] = useState(false)\r\n\r\n const deleteKeys = (object) => {\r\n Object.keys(object).forEach((key) => {\r\n if (object[key] === null && key !== 'NumRows') {\r\n object[key] = ''\r\n }\r\n })\r\n return object\r\n }\r\n\r\n const [state, setState] = useState(deleteKeys(widget))\r\n\r\n const initialFunction = functionOptions.filter(\r\n (option) => option.value === state.AggregateFunction\r\n )[0]\r\n\r\n let formClass = editing ? 'button is-info is-small' : 'hidden'\r\n let textClass = editing ? 'hidden' : 'button is-info is-small'\r\n\r\n const POST = (widget) => {\r\n return {\r\n method: 'POST',\r\n mode: 'cors',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Access-Control-Allow-Origin': '*',\r\n 'Access-Control-Allow-Headers':\r\n 'Access-Control-Allow-Origin, X-Requested-With, Content-Type, Accept',\r\n },\r\n body: JSON.stringify(widget),\r\n }\r\n }\r\n\r\n const PUT = (page) => {\r\n return {\r\n method: 'PUT',\r\n mode: 'cors',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Access-Control-Allow-Origin': '*',\r\n 'Access-Control-Allow-Headers':\r\n 'Access-Control-Allow-Origin, X-Requested-With, Content-Type, Accept',\r\n },\r\n body: JSON.stringify(page),\r\n }\r\n }\r\n\r\n const generateQueryString = (data) => {\r\n authenticatedFetch(`${API_URL}/widget/generate`, POST(data))\r\n .then(async (response) => {\r\n const responseText = await response.text()\r\n if (response.ok) {\r\n return responseText\r\n } else {\r\n throw new Error(responseText)\r\n }\r\n })\r\n .then((response) => {\r\n setString(response)\r\n setQuery(response)\r\n })\r\n .catch((e) => {\r\n setString(e.message)\r\n })\r\n }\r\n\r\n const previewQuery = (queryString) => {\r\n setPreview(null)\r\n authenticatedFetch(`${API_URL}/widget/preview`, POST(queryString))\r\n .then(async (response) => {\r\n if (response.ok) {\r\n return response.json()\r\n } else {\r\n const error = await response.text()\r\n throw new Error(error)\r\n }\r\n })\r\n .then((response) => {\r\n setPreview(response.data)\r\n })\r\n .catch((e) => {\r\n toast({\r\n level: 'error',\r\n message:\r\n 'Create Widget:' +\r\n (e.message ? e.message : 'Query preview failed'),\r\n })\r\n })\r\n }\r\n\r\n const editWidget = (editedWidget) => {\r\n authenticatedFetch(\r\n `${API_URL}/admin/widget/edit/${widget.WidgetId}`,\r\n PUT(editedWidget)\r\n )\r\n .then(async (response) => {\r\n if (response.ok) {\r\n return\r\n } else {\r\n const error = await response.text()\r\n throw new Error(error)\r\n }\r\n })\r\n .catch((e) => {\r\n toast({\r\n level: 'error',\r\n message:\r\n 'Edit Dashboard:' +\r\n (e.message ? e.message : 'Dashboard edit failed'),\r\n })\r\n })\r\n .then(() => {\r\n setState(editedWidget)\r\n setEditing(false)\r\n closeForm(editedWidget)\r\n })\r\n }\r\n\r\n const handleSelectChange = (event) => {\r\n setType(event[0].value)\r\n setState({ ...state, [event[1].name]: event[0].value })\r\n return event\r\n }\r\n\r\n const handleMultiChange = (event) => {\r\n event[0]\r\n ? setState({\r\n ...state,\r\n [event[1].name]: event[0]\r\n .map((x) => x.value)\r\n .toString()\r\n .replaceAll(',', '|'),\r\n })\r\n : setState({ ...state, [event[1].name]: null })\r\n return event[0]\r\n }\r\n\r\n const formChange = (event) => {\r\n if (event.target.name !== '') {\r\n setState({\r\n ...state,\r\n [event.target.name]: event.target.value,\r\n })\r\n }\r\n if (event.target.type === 'checkbox') {\r\n setState({\r\n ...state,\r\n [event.target.name]: event.target.checked,\r\n })\r\n }\r\n if (event.target.name === 'NumRows') {\r\n setState({\r\n ...state,\r\n NumRows:\r\n event.target.value !== ''\r\n ? Number(event.target.value)\r\n : null,\r\n })\r\n }\r\n }\r\n\r\n const handleClick = () => {\r\n const queryString = {\r\n TargetDatabase: state.TargetDatabase,\r\n QueryString: string,\r\n }\r\n previewQuery(queryString)\r\n }\r\n\r\n const trimData = (data) => {\r\n Object.keys(data).map((key) =>\r\n typeof data[key] === 'string'\r\n ? (data[key] = data[key].replace(/\\s\\s+/g, ' ').trim())\r\n : data[key]\r\n )\r\n return data\r\n }\r\n\r\n const onSubmit = (data) => {\r\n editWidget(trimData(state))\r\n }\r\n\r\n const cancel = () => {\r\n setState(widget)\r\n setEditing(false)\r\n }\r\n\r\n const validateOptions = (value) => {\r\n try {\r\n JSON.parse(value)\r\n return true\r\n } catch {\r\n return false\r\n }\r\n }\r\n\r\n return (\r\n <>\r\n generateQueryString(state)}\r\n >\r\n
\r\n setEditing(true)}\r\n className={textClass}\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 \r\n \r\n \r\n\r\n \r\n ”, “style”: {“fillColor”: “fillColor1”, “strokeColor”: “strokeColor1”, “zIndex”: “zIndex1”}}, {“layerName”: “”, “style”: {“fillColor”: “fillColor2”, “strokeColor”: “strokeColor2”, “zIndex”: “zIndex2”}, …]}'\r\n // For 3DFeatureMap, shape should be:\r\n // '{“layers”: [{“layerName”: “”, “style”: {“color”: “color1”, “width”: “width1”, “zIndex”: “zIndex1”}}, {“layerName”: “”, “style”: {“color”: “color2”, “width”: “width2”, “zIndex”: “zIndex2”}, …]}'\"\r\n />\r\n \r\n ({\r\n label: item,\r\n value: item,\r\n }))\r\n : null\r\n }\r\n value={state && state.GroupBy ? state.GroupBy.split('|').map((item) => ({\r\n label: item,\r\n value: item,\r\n })) : null}\r\n className={\r\n type.match(/Form|2DFeatureMap|3DFeatureMap/)\r\n ? 'hidden'\r\n : null\r\n }\r\n control={control}\r\n rules={\r\n type.match(/BarChart|ThemeMap/)\r\n ? {\r\n required: {\r\n value: true,\r\n message: 'This field is required.',\r\n },\r\n }\r\n : null\r\n }\r\n errors={errors}\r\n onChange={handleMultiChange}\r\n // helper=\"The type of the Widget. This determines the format in which the Widget data is displayed.\"\r\n // example=\"if you wish to see a Grid that has counts of Permits which can be grouped by District, County, or Township, District + County + Township should each be entered as individual options in this field.\"\r\n />\r\n \r\n ({\r\n label: item,\r\n value: item,\r\n }))\r\n : null\r\n }\r\n value={state && state.FeatureFiles ? state.FeatureFiles.split('|').map((item) => ({\r\n label: item,\r\n value: item,\r\n })) : null}\r\n disabled={!editing}\r\n control={control}\r\n className={type !== 'ThemeMap' ? 'hidden' : null}\r\n rules={\r\n type === 'ThemeMap'\r\n ? {\r\n required: {\r\n value: true,\r\n message: 'This field is required.',\r\n },\r\n }\r\n : null\r\n }\r\n onChange={handleMultiChange}\r\n errors={errors}\r\n // helper=\"This is the name of the .json file in the /public directory that contains the GEOJSON features that you wish to associate with the values returned by the Widget Query (in order to create a theme map). There should be exactly one file for every value in the Group By field, and the files should be in the same order listed as Group By.\"\r\n // example=\"We wish to visualize Permit count over Districts or Counties. Group By has values 1) District and 2) County. We have districts.json and counties.json as the corresponding GEOJSON files. So the values in this field should be 1) districts.json and 2) counties.json. If you do not know the names of the .json files associated with different geographical features, or wish to request one, please contact your system administrator.\"\r\n />\r\n \r\n {string ? `Query String: ${string}` : null}\r\n\r\n
\r\n \r\n Preview Query\r\n \r\n
\r\n
\r\n \r\n {preview ? : null}\r\n \r\n )\r\n}\r\n\r\nexport default withConfig(EditWidgetForm)\r\n","import React, { useEffect, useState, useContext } from 'react'\r\nimport EditWidgetForm from './EditWidgetForm'\r\nimport toast from '../../../elem/Toast'\r\nimport { Redirect } from 'react-router-dom'\r\nimport { CurrentDashboardContext } from '../../../wrappers/CurrentDashboardContext'\r\nimport AdminLayout from '../../../elem/admin/AdminLayout'\r\nimport withConfig from '../../../wrappers/withConfig'\r\nimport { APIRequestContext } from '../../../wrappers/APIRequestContext'\r\n\r\nconst EditWidget = ({config}) => {\r\n const {API_URL} = config\r\n const [widget, setWidget] = useState(null)\r\n const [edited, setEdited] = useState(false)\r\n const {widgetId, setNewObject} = useContext(CurrentDashboardContext)\r\n const { authenticatedFetch } = useContext(APIRequestContext)\r\n \r\n useEffect(() => {\r\n authenticatedFetch(`${API_URL}/Widget/${widgetId}?noData`)\r\n .then(async (response) => {\r\n if (response.ok) {\r\n return response.json()\r\n } else {\r\n const error = await response.text()\r\n throw new Error(error)\r\n }\r\n })\r\n .then((response) => {\r\n setWidget(response.data)\r\n })\r\n .catch((e) => {\r\n toast({\r\n level: 'error',\r\n message:\r\n 'Widget Types:' +\r\n (e.message\r\n ? e.message\r\n : 'Unable to connect to the server'),\r\n })\r\n })\r\n }, [API_URL, widgetId])\r\n\r\n if (!widget) {\r\n return null\r\n }\r\n\r\n const closeForm = () => {\r\n setEdited(true)\r\n }\r\n\r\n if(edited){\r\n setNewObject(widget)\r\n return\r\n }\r\n\r\n return (\r\n
\r\n \r\n \r\n \r\n
\r\n )\r\n}\r\n\r\nexport default withConfig(EditWidget)","import React, { useEffect, useState, useContext } from 'react'\r\nimport toast from '../../../elem/Toast'\r\nimport AdminLayout from '../../../elem/admin/AdminLayout'\r\nimport { CurrentDashboardContext } from '../../../wrappers/CurrentDashboardContext'\r\nimport Widgets from '../../../elem/widgets/Widgets'\r\nimport getLayouts from '../../../../utils/widgets/getLayouts'\r\nimport { Redirect } from 'react-router-dom'\r\nimport withConfig from '../../../wrappers/withConfig'\r\nimport { APIRequestContext } from '../../../wrappers/APIRequestContext'\r\n\r\nconst PageLayoutEditor = ({config}) => {\r\n const {API_URL} = config\r\n const {\r\n currentWidgetGroup,\r\n setLayoutState,\r\n layoutState,\r\n setLayoutEditingState,\r\n } = useContext(CurrentDashboardContext)\r\n const { authenticatedFetch } = useContext(APIRequestContext)\r\n const [edited, setEdited] = useState(null)\r\n const { Widgets: widgets } = currentWidgetGroup\r\n const [initialState, setInitialState] = useState(getLayouts(widgets))\r\n\r\n useEffect(() => {\r\n setLayoutEditingState(true)\r\n !Object.keys(layoutState).length\r\n ? setInitialState(getLayouts(currentWidgetGroup.Widgets))\r\n : setInitialState(layoutState)\r\n }, [currentWidgetGroup])\r\n\r\n if (!widgets && !Object.keys(layoutState).length) {\r\n return null\r\n }\r\n\r\n const PUT = (page) => {\r\n return {\r\n method: 'PUT',\r\n mode: 'cors',\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n 'Access-Control-Allow-Origin': '*',\r\n 'Access-Control-Allow-Headers':\r\n 'Access-Control-Allow-Origin, X-Requested-With, Content-Type, Accept',\r\n },\r\n body: JSON.stringify(page),\r\n }\r\n }\r\n\r\n const updateLayout = (layouts) => {\r\n const pageLayout = {\r\n PageId: widgets[0].PageId,\r\n Widgets: layouts.map((layout) => ({\r\n Width: layout.w,\r\n Height: layout.h,\r\n X: layout.x,\r\n Y: layout.y,\r\n WidgetId: Number(layout.i.replace(/[^0-9.]+/g, '')),\r\n })),\r\n }\r\n \r\n authenticatedFetch(`${API_URL}/admin/updatePageLayout`, PUT(pageLayout))\r\n .then(async (response) => {\r\n if (response.ok) {\r\n return\r\n } else {\r\n const error = await response.text()\r\n throw new Error(error)\r\n }\r\n })\r\n .then(() => {\r\n setLayoutState(layoutState)\r\n setInitialState(layoutState)\r\n setEdited(true)\r\n })\r\n .catch((e) => {\r\n toast({\r\n level: 'error',\r\n message:\r\n 'Page Layout:' +\r\n (e.message\r\n ? e.message\r\n : 'Unable to connect to the server'),\r\n })\r\n })\r\n }\r\n\r\n if (edited) {\r\n return (\r\n \r\n )\r\n }\r\n\r\n return (\r\n
\r\n \r\n
\r\n \r\n
\r\n
\r\n {\r\n setLayoutState(initialState)\r\n }}\r\n >\r\n Reset\r\n \r\n {\r\n updateLayout(layoutState.lg)\r\n }}\r\n >\r\n Save\r\n \r\n
\r\n
\r\n
\r\n )\r\n}\r\n\r\nexport default withConfig(PageLayoutEditor)\r\n","export default {\r\n background: {},\r\n backgroundMask: {\r\n cover: {\r\n color: {\r\n value: '#fff',\r\n },\r\n opacity: 1,\r\n },\r\n enable: false,\r\n },\r\n detectRetina: true,\r\n fpsLimit: 30,\r\n infection: {\r\n cure: false,\r\n delay: 0,\r\n enable: false,\r\n infections: 0,\r\n stages: [],\r\n },\r\n interactivity: {\r\n detectsOn: 'canvas',\r\n events: {\r\n onClick: {\r\n enable: false,\r\n mode: 'push',\r\n },\r\n onDiv: {\r\n elementId: '',\r\n enable: false,\r\n mode: [],\r\n },\r\n onHover: {\r\n enable: false,\r\n mode: 'repulse',\r\n parallax: {\r\n enable: false,\r\n force: 60,\r\n smooth: 10,\r\n },\r\n },\r\n resize: true,\r\n },\r\n modes: {\r\n bubble: {\r\n distance: 400,\r\n duration: 2,\r\n opacity: 0.8,\r\n size: 40,\r\n },\r\n connect: {\r\n distance: 80,\r\n links: {\r\n opacity: 0.5,\r\n },\r\n radius: 60,\r\n },\r\n grab: {\r\n distance: 400,\r\n links: {\r\n opacity: 1,\r\n },\r\n },\r\n push: {\r\n quantity: 4,\r\n },\r\n remove: {\r\n quantity: 2,\r\n },\r\n repulse: {\r\n distance: 200,\r\n duration: 0.4,\r\n speed: 1,\r\n },\r\n slow: {\r\n factor: 3,\r\n radius: 200,\r\n },\r\n },\r\n },\r\n particles: {\r\n collisions: {\r\n enable: false,\r\n mode: 'bounce',\r\n },\r\n color: {\r\n value: 'rgb(163, 9, 9)',\r\n animation: {\r\n enable: false,\r\n speed: 1,\r\n sync: true,\r\n },\r\n },\r\n links: {\r\n blink: false,\r\n color: {\r\n value: 'rgb(163, 9, 9)',\r\n },\r\n consent: false,\r\n distance: 150,\r\n enable: true,\r\n opacity: 0.4,\r\n shadow: {\r\n blur: 5,\r\n color: {\r\n value: 'lime',\r\n },\r\n enable: false,\r\n },\r\n triangles: {\r\n enable: false,\r\n },\r\n width: 1,\r\n warp: false,\r\n },\r\n move: {\r\n attract: {\r\n enable: false,\r\n rotate: {\r\n x: 600,\r\n y: 1200,\r\n },\r\n },\r\n direction: 'none',\r\n enable: true,\r\n noise: {\r\n delay: {\r\n random: {\r\n enable: false,\r\n minimumValue: 0,\r\n },\r\n value: 0,\r\n },\r\n enable: false,\r\n factor: {\r\n horizontal: {\r\n value: 50,\r\n offset: 0,\r\n },\r\n vertical: {\r\n value: 10,\r\n offset: 40000,\r\n },\r\n },\r\n },\r\n outMode: 'out',\r\n random: false,\r\n speed: 2,\r\n straight: false,\r\n trail: {\r\n enable: false,\r\n length: 10,\r\n fillColor: {\r\n value: '#000000',\r\n },\r\n },\r\n vibrate: false,\r\n warp: false,\r\n },\r\n number: {\r\n density: {\r\n enable: true,\r\n area: 800,\r\n factor: 1000,\r\n },\r\n limit: 0,\r\n value: 80,\r\n },\r\n opacity: {\r\n animation: {\r\n enable: false,\r\n minimumValue: 0.1,\r\n speed: 1,\r\n sync: false,\r\n },\r\n random: {\r\n enable: false,\r\n minimumValue: 1,\r\n },\r\n value: 0.5,\r\n },\r\n rotate: {\r\n animation: {\r\n enable: false,\r\n speed: 0,\r\n sync: false,\r\n },\r\n direction: 'clockwise',\r\n random: false,\r\n value: 0,\r\n },\r\n shadow: {\r\n blur: 0,\r\n color: {\r\n value: '#000000',\r\n },\r\n enable: false,\r\n offset: {\r\n x: 0,\r\n y: 0,\r\n },\r\n },\r\n shape: {\r\n options: {\r\n character: {\r\n fill: true,\r\n close: true,\r\n font: 'Verdana',\r\n style: '',\r\n value: '*',\r\n weight: '400',\r\n },\r\n char: {\r\n fill: true,\r\n close: true,\r\n font: 'Verdana',\r\n style: '',\r\n value: '*',\r\n weight: '400',\r\n },\r\n image: {\r\n fill: true,\r\n close: true,\r\n height: 100,\r\n replaceColor: false,\r\n src:\r\n 'https://cdn.matteobruni.it/images/particles/github.svg',\r\n width: 100,\r\n },\r\n images: {\r\n fill: true,\r\n close: true,\r\n height: 100,\r\n replaceColor: false,\r\n src:\r\n 'https://cdn.matteobruni.it/images/particles/github.svg',\r\n width: 100,\r\n },\r\n polygon: {\r\n fill: true,\r\n close: true,\r\n sides: 5,\r\n },\r\n star: {\r\n fill: true,\r\n close: true,\r\n sides: 5,\r\n },\r\n },\r\n type: 'circle',\r\n },\r\n size: {\r\n animation: {\r\n destroy: 'none',\r\n enable: false,\r\n minimumValue: 0.1,\r\n speed: 40,\r\n startValue: 'max',\r\n sync: false,\r\n },\r\n random: {\r\n enable: true,\r\n minimumValue: 1,\r\n },\r\n value: 5,\r\n },\r\n stroke: {\r\n color: {\r\n value: '#000000',\r\n },\r\n width: 0,\r\n opacity: 1,\r\n },\r\n twinkle: {\r\n lines: {\r\n enable: false,\r\n frequency: 0.05,\r\n opacity: 1,\r\n },\r\n particles: {\r\n enable: false,\r\n frequency: 0.05,\r\n opacity: 1,\r\n },\r\n },\r\n },\r\n pauseOnBlur: true,\r\n}","import React from 'react'\r\n// import { Link } from 'react-router-dom'\r\nimport Particles from 'react-particles-js'\r\nimport particleConfig from './particleConfig'\r\n\r\nconst ErrorFallback = ({ errorMessage }) => {\r\n\r\n\r\n return(\r\n <>\r\n \r\n\r\n
\r\n
\r\n

Something went wrong...

\r\n

{errorMessage}

\r\n {/* resetError()}\r\n to={{\r\n pathname: `/`,\r\n }}\r\n >\r\n Return Home\r\n */}\r\n
\r\n
\r\n \r\n)}\r\n\r\nexport default ErrorFallback\r\n","import React from 'react'\r\nimport ErrorFallback from './ErrorFallback'\r\n\r\n\r\n\r\nexport default class ErrorBoundary extends React.Component {\r\n state = { hasError: false, errorMessage: null, errorKey: 0 }\r\n \r\n componentDidCatch(error) {\r\n const message = error.toString().slice(error.toString().indexOf(\":\") + 2)\r\n this.setState((state) => ({ hasError: true, errorMessage: message, errorKey: state.errorKey + 1 }))\r\n }\r\n\r\n \r\n render() {\r\n if (this.state.hasError) {\r\n return ( \r\n \r\n )\r\n }\r\n \r\n return this.props.children; \r\n }\r\n }","import React from 'react'\r\nimport ErrorFallback from './ErrorFallback'\r\n\r\n\r\nconst PageNotFound = () => (\r\n \r\n)\r\n\r\nexport default PageNotFound\r\n","const urls = {\r\n home: '/',\r\n userCallback: '/user/callback',\r\n login: '/login'\r\n}\r\n\r\nexport default urls","import React, { useEffect } from 'react'\r\n// import { useLocation} from 'react-router-dom'\r\n\r\nimport urls from '../../../utils/constants/urls'\r\nimport LoadingSpinner from '../../elem/LoadingSpinner'\r\n\r\nexport default () => {\r\n // const location = useLocation()\r\n useEffect(() => {\r\n const t = setTimeout(() => {\r\n window.location = urls.home\r\n }, 5000)\r\n return () => clearTimeout(t)\r\n }, [])\r\n // if (location.search.includes('access_denied')) {\r\n // window.location = urls.home\r\n // }\r\n \r\n return \r\n}\r\n","import React, { useContext } from 'react'\r\nimport LandingPageWrapper from '../../elem/landing-page/LandingPageWrapper'\r\nimport { UserContext } from '../../wrappers/UserContext'\r\nimport withConfig from '../../wrappers/withConfig'\r\n\r\nconst LoginPage = withConfig(({ config }) => {\r\n const { client } = useContext(UserContext)\r\n const { CONFIGURED_URLS } = config\r\n\r\n return (\r\n \r\n
\r\n

\r\n Please {' '}\r\n \r\n Login\r\n \r\n {' '} or {' '}\r\n \r\n Register\r\n \r\n {' '}to access dashboards\r\n

\r\n
\r\n
\r\n )\r\n})\r\n\r\nexport default LoginPage\r\n","import React, { useContext, useEffect, useState } from 'react'\r\nimport { UserContext } from '../../wrappers/UserContext'\r\nimport { Redirect } from 'react-router-dom'\r\nimport { checkRole, getRoles } from '../../../utils/user/permissions'\r\nimport urls from '../../../utils/constants/urls'\r\nimport withConfig from '../../wrappers/withConfig'\r\n\r\nconst RestrictedAccess = withConfig(({ allowedRoles, config, children }) => {\r\n const { client } = useContext(UserContext)\r\n const [hasAccess, setHasAccess] = useState(true)\r\n const { USE_AUTHENTICATION } = config\r\n\r\n useEffect(() => {\r\n const checkClientAccess = async allowedRoles => {\r\n await client.getUser().then(user => {\r\n const roles = getRoles(user)\r\n if (allowedRoles.some(role => checkRole(role, roles))) {\r\n setHasAccess(true)\r\n } else {\r\n setHasAccess(false)\r\n }\r\n })\r\n }\r\n if (USE_AUTHENTICATION) {\r\n checkClientAccess(allowedRoles)\r\n }\r\n }, [client, allowedRoles, USE_AUTHENTICATION])\r\n \r\n if (hasAccess) {\r\n return children\r\n } else {\r\n return \r\n }\r\n})\r\n\r\nexport default RestrictedAccess","import React from 'react'\r\nimport { BrowserRouter as Router, Route, Switch } from 'react-router-dom'\r\nimport CurrentDashboardContextProvider from './components/wrappers/CurrentDashboardContext'\r\nimport DateContextProvider from './components/wrappers/DateContext'\r\nimport DashboardContextProvider from './components/wrappers/DashboardContext'\r\nimport LandingPage from './components/features/landing-page/LandingPage'\r\nimport AdminDashboard from './components/features/admin/AdminDashboard'\r\nimport CreateDashboard from './components/features/admin/dashboard/CreateDashboard'\r\nimport EditDashboard from './components/features/admin/dashboard/EditDashboard'\r\nimport CreatePage from './components/features/admin/page/CreatePage'\r\nimport EditPage from './components/features/admin/page/EditPage'\r\nimport Header from './components/elem/Header'\r\nimport SideNav from './components/features/navigation/SideNav'\r\nimport TopBar from './components/elem/TopBar'\r\nimport DateSelector from './components/elem/date/DateSelector'\r\nimport DashboardPanel from './components/features/panel/DashboardPanel'\r\nimport { Toast as ToastContainer } from './components/elem/Toast'\r\nimport DeleteItem from './components/features/admin/DeleteItem'\r\nimport CreateWidget from './components/features/admin/widget/CreateWidget'\r\nimport EditWidget from './components/features/admin/widget/EditWidget'\r\nimport PageLayoutEditor from './components/features/admin/widget/PageLayoutEditor'\r\nimport ErrorBoundary from './components/features/errors/ErrorBoundary'\r\nimport PageNotFound from './components/features/errors/PageNotFound'\r\nimport ColorContextProvider from './components/wrappers/ColorContext'\r\nimport UserContextProvider from './components/wrappers/UserContext'\r\nimport APIRequestContextProvider from './components/wrappers/APIRequestContext'\r\nimport CallbackComponent from './components/features/user/CallbackComponent'\r\nimport urls from './utils/constants/urls'\r\nimport LoginPage from './components/features/user/LoginPage'\r\nimport RestrictedAccess from './components/features/user/RestrictedAccess'\r\n\r\nexport default () => (\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 \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 \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 />\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 \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 \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 \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 \r\n \r\n
\r\n \r\n \r\n)\r\n","import 'react-app-polyfill/ie11'\r\nimport 'react-app-polyfill/stable'\r\nimport React from 'react'\r\nimport ReactDOM from 'react-dom'\r\nimport './styles/index.scss'\r\nimport App from './App'\r\n\r\nReactDOM.render(\r\n \r\n \r\n ,\r\n document.getElementById('root')\r\n)\r\n"],"sourceRoot":""}